From 65cb80c4f846361aae9714818b350051fae6af0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Castillo?= Date: Wed, 18 Oct 2023 06:19:13 -0300 Subject: [PATCH 01/31] Previous election page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Castillo --- gatsby-node.js | 179 +++++++++++++++++- src/pages/election/index.md | 2 +- .../2022}/candidates/gold/index.md | 1 + .../2022}/candidates/index.md | 1 + .../2022}/index.md | 10 +- .../2023/candidates/gold/index.md | 23 +++ .../2023/candidates/index.md | 26 +++ .../election/previous-elections/2023/index.md | 73 +++++++ src/templates/election-page-previous.js | 74 ++++---- 9 files changed, 338 insertions(+), 51 deletions(-) rename src/pages/election/{2022-election => previous-elections/2022}/candidates/gold/index.md (98%) rename src/pages/election/{2022-election => previous-elections/2022}/candidates/index.md (98%) rename src/pages/election/{2022-election => previous-elections/2022}/index.md (93%) create mode 100644 src/pages/election/previous-elections/2023/candidates/gold/index.md create mode 100644 src/pages/election/previous-elections/2023/candidates/index.md create mode 100644 src/pages/election/previous-elections/2023/index.md diff --git a/gatsby-node.js b/gatsby-node.js index 01dde4864..2d77206fc 100644 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -107,6 +107,50 @@ const SSR_getSponsoredProjects = async (baseUrl) => { .catch(e => console.log('ERROR: ', e)); } +const SSR_getPreviousElections = async (baseUrl, accessToken, page = 1) => { + return await axios.get( + `${baseUrl}/api/v1/elections/`, + { + params: { + access_token: accessToken, + per_page: 50, + page: page, + } + }).then((response) => response.data) + .catch(e => console.log('ERROR: ', e)); +}; + +const SSR_getPreviousElectionCandidates = async (baseUrl, accessToken, electionId, page = 1) => { + return await axios.get( + `${baseUrl}/api/v1/elections/${electionId}/candidates/`, + { + params: { + access_token: accessToken, + per_page: 100, + page: page, + order: '+first_name,+last_name', + expand: 'member, member.election_applications, member.election_applications.nominator', + fields: 'member.election_applications.nominator.first_name, member.election_applications.nominator.last_name' + } + }).then((response) => response.data) + .catch(e => console.log('ERROR: ', e)); +}; + +const SSR_getPreviousElectionGoldCandidates = async (baseUrl, accessToken, electionId, page = 1) => { + return await axios.get( + `${baseUrl}/api/v1/elections/${electionId}/candidates/gold`, + { + params: { + access_token: accessToken, + per_page: 100, + page: page, + order: '+first_name,+last_name', + expand: 'member', + } + }).then((response) => response.data) + .catch(e => console.log('ERROR: ', e)); +}; + exports.onPreBootstrap = async () => { const apiBaseUrl = process.env.GATSBY_API_BASE_URL; const buildScopes = process.env.GATSBY_BUILD_SCOPES; @@ -169,9 +213,92 @@ exports.onPreBootstrap = async () => { const sponsoredProjects = await SSR_getSponsoredProjects(apiBaseUrl); if (sponsoredProjects) { writeToJson('src/content/sponsored-projects.json', sponsoredProjects); - } + } } +exports.sourceNodes = async ({ actions, createNodeId, createContentDigest }) => { + const { createNode } = actions; + + const apiBaseUrl = process.env.GATSBY_API_BASE_URL; + const buildScopes = process.env.GATSBY_BUILD_SCOPES; + + console.log(`onSourceNodes...`); + + const config = { + client: { + id: process.env.GATSBY_OAUTH2_CLIENT_ID_BUILD, + secret: process.env.GATSBY_OAUTH2_CLIENT_SECRET_BUILD + }, + auth: { + tokenHost: process.env.GATSBY_IDP_BASE_URL, + tokenPath: process.env.GATSBY_OAUTH_TOKEN_PATH + }, + options: { + authorizationMethod: 'header' + } + }; + + const accessToken = await getAccessToken(config, buildScopes).then(({token}) => token.access_token).catch(e => console.log('Access Token error', e)); + + // data for previous elections + const previousElections = await SSR_getPreviousElections(apiBaseUrl, accessToken); + if (previousElections) { + // get last 2 past elections + const lastElections = previousElections.data.filter(e => e.status === "Closed").slice(-2); + let candidates = []; + let goldCandidates = []; + for (const election of lastElections) { + const electionCandidates = await SSR_getPreviousElectionCandidates(apiBaseUrl, accessToken, election.id); + const electionGoldCandidates = await SSR_getPreviousElectionGoldCandidates(apiBaseUrl, accessToken, election.id); + + if (Array.isArray(electionCandidates.data) && electionCandidates.data.length > 0) candidates = [...candidates, ...electionCandidates.data]; + if (Array.isArray(electionGoldCandidates.data) && electionGoldCandidates.data.length > 0) goldCandidates = [...goldCandidates, ...electionGoldCandidates.data]; + } + + lastElections.forEach(election => { + createNode({ + ...election, + id: `${election.id}`, + parent: null, + children: [], + internal: { + type: 'ElectionData', // Replace with an appropriate type + contentDigest: createContentDigest(election), + }, + }); + }) + + candidates.forEach(candidate => { + createNode({ + ...candidate, + id: createNodeId(`CandidateData-${candidate.member_id}`), + election_id: `${candidate.member_id}`, + parent: null, + children: [], + internal: { + type: 'CandidateData', // Replace with an appropriate type + contentDigest: createContentDigest(candidate), + }, + }); + }) + + goldCandidates.forEach(candidate => { + createNode({ + ...candidate, + id: createNodeId(`GoldCandidateData-${candidate.member_id}`), + election_id: `${candidate.member_id}`, + parent: null, + children: [], + internal: { + type: 'GoldCandidateData', // Replace with an appropriate type + contentDigest: createContentDigest(candidate), + }, + }); + }) + } + +}; + // explicit Frontmatter declaration to make category, author and date, optionals. exports.createSchemaCustomization = ({actions}) => { const {createTypes} = actions @@ -239,6 +366,13 @@ exports.createSchemaCustomization = ({actions}) => { col1: String col2: Date @dateformat } + type ElectionData implements Node { + opens: Int + closes: Int + nominationOpens: Int + nominationCloses: Int + nominationApplicationDeadline: Int + } ` createTypes(typeDefs) } @@ -262,6 +396,7 @@ exports.createPages = ({actions, graphql}) => { title author templateKey + electionId seo { url } @@ -277,12 +412,13 @@ exports.createPages = ({actions, graphql}) => { return Promise.reject(result.errors) } - const pages = result.data.allMarkdownRemark.edges + const pages = result.data.allMarkdownRemark.edges; pages.forEach(edge => { if (edge.node.frontmatter.templateKey) { const id = edge.node.id const SEO = edge.node.frontmatter.seo ? edge.node.frontmatter.seo : null; + const electionId = edge.node.frontmatter.electionId ? `${edge.node.frontmatter.electionId}` : null const slug = SEO && SEO.url ? SEO.url.replace('https://osf.dev', '').replace('https://openinfra.dev', '') : edge.node.fields.slug; createPage({ path: slug, @@ -293,6 +429,7 @@ exports.createPages = ({actions, graphql}) => { // additional data can be passed via context context: { id, + electionId }, }) } @@ -350,6 +487,44 @@ exports.onCreateNode = ({node, actions, getNode}) => { */ // fmImagesToRelative(node); // convert image paths for gatsby images if (node.internal.type === `MarkdownRemark`) { + + // Extract the electionId from the frontmatter + const { frontmatter } = node; + const electionId = frontmatter?.electionId; + + // Find the corresponding election node based on electionId + const electionNode = getNode(`${electionId}`); + + if (electionNode) { + // Update the frontmatter properties based on the election node + createNodeField({ + node, + name: 'opens', + value: electionNode.opens, + }); + + createNodeField({ + node, + name: 'closes', + value: electionNode.closes, + }); + createNodeField({ + node, + name: 'nominationOpens', + value: electionNode.nomination_opens + }); + createNodeField({ + node, + name: 'nominationCloses', + value: electionNode.nomination_closes + }); + createNodeField({ + node, + name: 'nominationApplicationDeadline', + value: electionNode.nomination_application_deadline + }); + } + const value = createFilePath({node, getNode}) createNodeField({ name: `slug`, diff --git a/src/pages/election/index.md b/src/pages/election/index.md index 8dd01b44a..7da3090d7 100644 --- a/src/pages/election/index.md +++ b/src/pages/election/index.md @@ -7,7 +7,7 @@ seo: image: /img/OpenInfra-icon-white.jpg title: 2023 Board Elections twitterUsername: "@OpenInfraDev" - url: https://openinfra.dev/election/2023-individual-director-election + url: https://openinfra.dev/election/2024-individual-director-election title: January 2023 Board Elections subTitle: Individual and Gold Member elections menu: diff --git a/src/pages/election/2022-election/candidates/gold/index.md b/src/pages/election/previous-elections/2022/candidates/gold/index.md similarity index 98% rename from src/pages/election/2022-election/candidates/gold/index.md rename to src/pages/election/previous-elections/2022/candidates/gold/index.md index 752ebf6a3..a189a6877 100644 --- a/src/pages/election/2022-election/candidates/gold/index.md +++ b/src/pages/election/previous-elections/2022/candidates/gold/index.md @@ -9,6 +9,7 @@ seo: twitterUsername: "@OpenInfraDev" url: https://openinfra.dev/election/2022-individual-director-election/candidates/gold title: 2022 Board Elections - Gold Candidates List +electionId: 44599 menu: - text: CODE OF CONDUCT link: ../../../../legal/code-of-conduct diff --git a/src/pages/election/2022-election/candidates/index.md b/src/pages/election/previous-elections/2022/candidates/index.md similarity index 98% rename from src/pages/election/2022-election/candidates/index.md rename to src/pages/election/previous-elections/2022/candidates/index.md index bc549d60b..b72d79897 100644 --- a/src/pages/election/2022-election/candidates/index.md +++ b/src/pages/election/previous-elections/2022/candidates/index.md @@ -9,6 +9,7 @@ seo: twitterUsername: "@OpenInfraDev" url: https://openinfra.dev/election/2022-individual-director-election/candidates title: 2022 Board Elections - Candidates List +electionId: 44599 menu: - text: CODE OF CONDUCT link: ../../../legal/code-of-conduct diff --git a/src/pages/election/2022-election/index.md b/src/pages/election/previous-elections/2022/index.md similarity index 93% rename from src/pages/election/2022-election/index.md rename to src/pages/election/previous-elections/2022/index.md index 9091dda86..8a071ca29 100644 --- a/src/pages/election/2022-election/index.md +++ b/src/pages/election/previous-elections/2022/index.md @@ -9,16 +9,8 @@ seo: twitterUsername: "@OpenInfraDev" url: https://openinfra.dev/election/2022-individual-director-election title: January 2022 Board Elections -subTitle: Individual and Gold Member elections -menu: - - text: CODE OF CONDUCT - link: ../../legal/code-of-conduct - - text: REPORT A BUG - link: mailto:info@openinfra.dev +electionId: 44599 --- - -Individual Member Director elections for the January 2022 Board Elections will be held **Monday January 10, 2022 to Friday January 14, 2022**. Nominations occur between **November 15 and December 17, 2021**. - #### About the Board The Board of Directors is ultimately legally responsible for the Foundation as a corporate entity. Board activities include oversight of the Foundation and its budget, strategy and goals according to the mission and responsibilities. The 2022 Board will be composed of 27 directors elected by the Individual Members (9), directors elected by the Gold Members (9) and directors appointed by the Platinum Members (9). diff --git a/src/pages/election/previous-elections/2023/candidates/gold/index.md b/src/pages/election/previous-elections/2023/candidates/gold/index.md new file mode 100644 index 000000000..134f7f6e5 --- /dev/null +++ b/src/pages/election/previous-elections/2023/candidates/gold/index.md @@ -0,0 +1,23 @@ +--- +templateKey: election-gold-candidates-page-previous +seo: + description: Individual Member Director elections for the 2022 Board of + Directors will be held *Monday January 10, 2022 to * *Friday January 18, + 2022*. Nominations occur between *November 15 and December 15, 2020*. + image: /img/OpenInfra-icon-white.jpg + title: 2022 Board Elections - Gold Candidates List + twitterUsername: "@OpenInfraDev" + url: https://openinfra.dev/election/2023-individual-director-election/candidates/gold +title: 2022 Board Elections - Gold Candidates List +electionId: 44601 +menu: + - text: CODE OF CONDUCT + link: ../../../../legal/code-of-conduct + - text: REPORT A BUG + link: mailto:info@openinfra.dev +intro: + title: Gold Director Selector Candidates + description: + "The candidates on this list are the intended Gold Directors from the Gold Member companies who are + running for election as Gold Director Selectors." +--- diff --git a/src/pages/election/previous-elections/2023/candidates/index.md b/src/pages/election/previous-elections/2023/candidates/index.md new file mode 100644 index 000000000..100275216 --- /dev/null +++ b/src/pages/election/previous-elections/2023/candidates/index.md @@ -0,0 +1,26 @@ +--- +templateKey: election-candidates-page-previous +seo: + description: Individual Member Director elections for the 2022 Board of + Directors will be held *Monday January 10, 2022 to * *Friday January 18, + 2022*. Nominations occur between *November 15 and December 15, 2020*. + image: /img/OpenInfra-icon-white.jpg + title: 2022 Board Elections - Candidates List + twitterUsername: "@OpenInfraDev" + url: https://openinfra.dev/election/2023-individual-director-election/candidates +title: 2022 Board Elections - Candidates List +electionId: 44601 +menu: + - text: CODE OF CONDUCT + link: ../../../legal/code-of-conduct + - text: REPORT A BUG + link: mailto:info@openinfra.dev +howToVote: + title: HOW TO VOTE + description: + "If you are an eligible voter, you will receive an email with the subject + Open Infrastructure Foundation - {$ElectionName} from + secretary@openinfra.dev. This email includes your unique voting link. If you do + not receive an email, please contact + secretary@openinfra.dev." +--- diff --git a/src/pages/election/previous-elections/2023/index.md b/src/pages/election/previous-elections/2023/index.md new file mode 100644 index 000000000..acf5a2c1a --- /dev/null +++ b/src/pages/election/previous-elections/2023/index.md @@ -0,0 +1,73 @@ +--- +templateKey: election-page-previous +seo: + description: Individual Member Director elections for the 2022 Board of + Directors will be held *Monday January 10, 2022 to * *Friday January 18, + 2022*. Nominations occur between *November 15 and December 17, 2020*. + image: /img/OpenInfra-icon-white.jpg + title: 2022 Board Elections + twitterUsername: "@OpenInfraDev" + url: https://openinfra.dev/election/2023-individual-director-election +title: January 2023 Board Elections +electionId: 44601 +--- +#### About the Board + +The Board of Directors is ultimately legally responsible for the Foundation as a corporate entity. Board activities include oversight of the Foundation and its budget, strategy and goals according to the mission and responsibilities. The 2023 Board will be composed of 21 directors elected by the Individual Members (7), directors elected by the Gold Members (7) and directors appointed by the Platinum Members (7). + +As a true corporate board, Board members are responsible for fiduciary duties and adhering to an expanded code of conduct. All Directors need to attend regular quarterly Board meetings and any special meetings that come up. The meetings will be held in a way that allows for remote participation. + +#### Individual Member Director board seats + +- Individual Member Directors are there to represent the Individual Members of the Foundation +- These Directors act as the link between the thousands of members of the Foundation and the Board, and are not representing the companies for which they work + +When considering which candidates are best equipped to serve in this capacity, voters can review each candidate's application on the [candidate](/election/candidates) page prior to the start of the election. + +We ask that you give every candidate on the ballot careful consideration, and not base your vote **solely** on the fact that a particular candidate works for your employer. + +#### Code of Conduct Reminder + +Members should review and comply with the the [Community Code of Conduct](/legal/code-of-conduct), which states: "**Respect the election process**. Members should not attempt to manipulate election results. Open debate is welcome, but vote trading, ballot stuffing and other forms of abuse are not acceptable." + +#### Election Overview: + +Individual Member Director elections for the 2023 Board will be held **Monday January 9, 2023 to  Froday January 13, 2023**. You must have joined the Open Infrastructure Foundation as an Individual Member by Tuesday, July 17, 2022 to vote in the January 2023 election, per the bylaws. + +In accordance with the Open Infrastructure Foundation Bylaws, Board elections will take place online using a cumulative voting method. No more than three members of the Board may be affiliated with the same company, which means the candidate receiving the next highest votes would assume the seat if the election results in too many employees from a single company. Individual Member Directors elected in 2023 will serve a one-year term, but they may be nominated and re-elected indefinitely. The next election for Individual Member Directors will take place during January 2023. + +If you are an eligible voter, you will receive an email with a link to complete your ballot when the elections open on January 9, 2023. To ensure you receive the ballot, please log on to the website at [openinfra.dev/a/profile](/a/profile) and make sure your information is current. + +#### Nomination Process + +- Between November 14 and December 16, members can visit [this page](/a/community/members) and nominate candidates. +- Whenever a member is nominated, they will receive a notification (via the email listed in their member profile) +- Nominees must then log in and 1) accept the initial nomination, and 2) fill out the application +- Members who have received 10 nominations by December 16 must also complete the candidate application by December 21 in order to appear on the ballot + +#### Candidate Application + +All candidates must complete the application by December 21 in order to appear on the ballot. Questions: + +1. Bio +2. What is your relationship to OpenInfra, and why is its success important to you? What would you say is your biggest contribution to OpenInfra and/or OpenStack's success to date? +3. Describe your experience with other non profits or serving as a board member. How does your experience prepare you for the role of a board member? +4. What do you see as the Board's role in OpenInfra's success? +5. What do you think the top priority of the Board should be in 2023? + +A candidate's responses will appear on their public profile, as well as on [the candidates page](/election/candidates). + +#### Election Timeline Summary: + +- November 14: Individual Member nominations open, election details live on [openinfra.dev](/elections/current) +- December 16: Individual Member nominations close +- December 21: Deadline for Individual Member Nominees to complete application +- January 4: Gold Member Director Selector Election (1 day) +- January 9: Individual Member Elections open +- January 13: Individual Member Elections close + +Note that the Gold Member process will complete prior to the start of the Individual Member elections. Each Platinum Member has already appointed a Board Member, although they can change that appointment at any time during their membership. + +#### Questions? + +If you have any questions regarding membership, the nomination process, or any other matter regarding the elections, please contact the Secretary (Jonathan Bryce) at [secretary@openinfra.dev](mailto:secretary@openinfra.dev). Additionally, if you have an election problem to report, contact the election inspectors: [electioninspectors@openinfra.dev](mailto:electioninspectors@openinfra.dev) (led by Lisa Miller, one of the Foundation's corporate attorneys). diff --git a/src/templates/election-page-previous.js b/src/templates/election-page-previous.js index 07102bf3d..c1f3f32e2 100644 --- a/src/templates/election-page-previous.js +++ b/src/templates/election-page-previous.js @@ -1,6 +1,7 @@ import React, { useEffect } from "react" import { connect } from 'react-redux' import { graphql } from 'gatsby'; +import moment from 'moment-timezone'; import Content, { HTMLContent } from '../components/Content' import Layout from '../components/Layout' import TopBar from "../components/TopBar"; @@ -8,25 +9,25 @@ import NavbarV2 from '../components/NavbarV2'; import Header from "../components/Header"; import SEO from "../components/SEO"; -import { getElectionStatus } from "../actions/election-actions" -import LinkComponent from "../components/LinkComponent"; - export const ElectionPagePreviousTemplate = ({ - electionStatus, isLoggedUser, title, - menu, + electionData, content, contentComponent }) => { - const PageContent = contentComponent || Content + const PageContent = contentComponent || Content + + const { closes, nomination_closes, nomination_opens, opens } = electionData + + const electionYear = moment(closes * 1000).utc().format('YYYY'); return (
-
+
@@ -40,21 +41,21 @@ export const ElectionPagePreviousTemplate = ({
+

+ Individual Member Director elections for the {title} will be held + {` ${moment(opens * 1000).utc().format('dddd MMMM DD, YYYY')} to + ${moment(closes * 1000).utc().format('dddd MMMM DD, YYYY')}`}. + Nominations occur between + {` ${moment(nomination_opens * 1000).utc().format('MMMM DD')} and + ${moment(nomination_closes * 1000).utc().format('MMMM DD, YYYY')}`}. +

@@ -66,22 +67,18 @@ export const ElectionPagePreviousTemplate = ({ ) } -const ElectionPagePrevious = ({ electionStatus, isLoggedUser, location, data, getElectionStatus }) => { - const { markdownRemark: post } = data; - - useEffect(() => { - getElectionStatus(); - }, []) +const ElectionPagePrevious = ({ isLoggedUser, location, data }) => { + const { markdownRemark: post, electionData } = data; return ( @@ -91,14 +88,10 @@ const ElectionPagePrevious = ({ electionStatus, isLoggedUser, location, data, ge export default connect(state => ({ isLoggedUser: state.loggedUserState.isLoggedUser, - electionStatus: state.electionState.election_status, -}), { - getElectionStatus -} -)(ElectionPagePrevious) +}), {})(ElectionPagePrevious) export const electionPagePreviousQuery = graphql` - query ElectionPagePrevious($id: String!) { + query ElectionPagePrevious($id: String!, $electionId: String) { markdownRemark(id: { eq: $id }) { html frontmatter { @@ -117,12 +110,15 @@ export const electionPagePreviousQuery = graphql` twitterUsername } title - subTitle - menu { - text - link - } + electionId } } + electionData(id: {eq: $electionId}) { + id + opens + closes + nomination_closes + nomination_opens + } } ` From 433b4b748187a2086af79d79a50feb22cccedccc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Castillo?= Date: Wed, 18 Oct 2023 07:05:28 -0300 Subject: [PATCH 02/31] Change in templates for previous candidates pages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Castillo --- gatsby-node.js | 8 +- .../2022/candidates/gold/index.md | 5 - .../2022/candidates/index.md | 13 - .../2023/candidates/gold/index.md | 15 +- .../2023/candidates/index.md | 23 +- .../election-candidates-page-previous.js | 366 +++--------------- .../election-gold-candidates-page-previous.js | 236 +++-------- 7 files changed, 129 insertions(+), 537 deletions(-) diff --git a/gatsby-node.js b/gatsby-node.js index 2d77206fc..c78302aed 100644 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -271,8 +271,8 @@ exports.sourceNodes = async ({ actions, createNodeId, createContentDigest }) => candidates.forEach(candidate => { createNode({ ...candidate, - id: createNodeId(`CandidateData-${candidate.member_id}`), - election_id: `${candidate.member_id}`, + id: createNodeId(`CandidateData-${candidate.member.id}`), + election_id: `${candidate.election_id}`, parent: null, children: [], internal: { @@ -285,8 +285,8 @@ exports.sourceNodes = async ({ actions, createNodeId, createContentDigest }) => goldCandidates.forEach(candidate => { createNode({ ...candidate, - id: createNodeId(`GoldCandidateData-${candidate.member_id}`), - election_id: `${candidate.member_id}`, + id: createNodeId(`GoldCandidateData-${candidate.member.id}`), + election_id: `${candidate.election_id}`, parent: null, children: [], internal: { diff --git a/src/pages/election/previous-elections/2022/candidates/gold/index.md b/src/pages/election/previous-elections/2022/candidates/gold/index.md index a189a6877..b2bf473e3 100644 --- a/src/pages/election/previous-elections/2022/candidates/gold/index.md +++ b/src/pages/election/previous-elections/2022/candidates/gold/index.md @@ -10,11 +10,6 @@ seo: url: https://openinfra.dev/election/2022-individual-director-election/candidates/gold title: 2022 Board Elections - Gold Candidates List electionId: 44599 -menu: - - text: CODE OF CONDUCT - link: ../../../../legal/code-of-conduct - - text: REPORT A BUG - link: mailto:info@openinfra.dev intro: title: Gold Director Selector Candidates description: diff --git a/src/pages/election/previous-elections/2022/candidates/index.md b/src/pages/election/previous-elections/2022/candidates/index.md index b72d79897..34d734b4c 100644 --- a/src/pages/election/previous-elections/2022/candidates/index.md +++ b/src/pages/election/previous-elections/2022/candidates/index.md @@ -10,17 +10,4 @@ seo: url: https://openinfra.dev/election/2022-individual-director-election/candidates title: 2022 Board Elections - Candidates List electionId: 44599 -menu: - - text: CODE OF CONDUCT - link: ../../../legal/code-of-conduct - - text: REPORT A BUG - link: mailto:info@openinfra.dev -howToVote: - title: HOW TO VOTE - description: - "If you are an eligible voter, you will receive an email with the subject - Open Infrastructure Foundation - {$ElectionName} from - secretary@openinfra.dev. This email includes your unique voting link. If you do - not receive an email, please contact - secretary@openinfra.dev." --- diff --git a/src/pages/election/previous-elections/2023/candidates/gold/index.md b/src/pages/election/previous-elections/2023/candidates/gold/index.md index 134f7f6e5..423d8cd0e 100644 --- a/src/pages/election/previous-elections/2023/candidates/gold/index.md +++ b/src/pages/election/previous-elections/2023/candidates/gold/index.md @@ -1,20 +1,15 @@ --- templateKey: election-gold-candidates-page-previous seo: - description: Individual Member Director elections for the 2022 Board of - Directors will be held *Monday January 10, 2022 to * *Friday January 18, - 2022*. Nominations occur between *November 15 and December 15, 2020*. + description: Individual Member Director elections for the 2023 Board of + Directors will be held *Monday January 10, 2023 to * *Friday January 18, + 2023*. Nominations occur between *November 15 and December 15, 2020*. image: /img/OpenInfra-icon-white.jpg - title: 2022 Board Elections - Gold Candidates List + title: 2023 Board Elections - Gold Candidates List twitterUsername: "@OpenInfraDev" url: https://openinfra.dev/election/2023-individual-director-election/candidates/gold -title: 2022 Board Elections - Gold Candidates List +title: 2023 Board Elections - Gold Candidates List electionId: 44601 -menu: - - text: CODE OF CONDUCT - link: ../../../../legal/code-of-conduct - - text: REPORT A BUG - link: mailto:info@openinfra.dev intro: title: Gold Director Selector Candidates description: diff --git a/src/pages/election/previous-elections/2023/candidates/index.md b/src/pages/election/previous-elections/2023/candidates/index.md index 100275216..fcefdc1cc 100644 --- a/src/pages/election/previous-elections/2023/candidates/index.md +++ b/src/pages/election/previous-elections/2023/candidates/index.md @@ -1,26 +1,13 @@ --- templateKey: election-candidates-page-previous seo: - description: Individual Member Director elections for the 2022 Board of - Directors will be held *Monday January 10, 2022 to * *Friday January 18, - 2022*. Nominations occur between *November 15 and December 15, 2020*. + description: Individual Member Director elections for the 2023 Board of + Directors will be held *Monday January 10, 2023 to * *Friday January 18, + 2023*. Nominations occur between *November 15 and December 15, 2020*. image: /img/OpenInfra-icon-white.jpg - title: 2022 Board Elections - Candidates List + title: 2023 Board Elections - Candidates List twitterUsername: "@OpenInfraDev" url: https://openinfra.dev/election/2023-individual-director-election/candidates -title: 2022 Board Elections - Candidates List +title: 2023 Board Elections - Candidates List electionId: 44601 -menu: - - text: CODE OF CONDUCT - link: ../../../legal/code-of-conduct - - text: REPORT A BUG - link: mailto:info@openinfra.dev -howToVote: - title: HOW TO VOTE - description: - "If you are an eligible voter, you will receive an email with the subject - Open Infrastructure Foundation - {$ElectionName} from - secretary@openinfra.dev. This email includes your unique voting link. If you do - not receive an email, please contact - secretary@openinfra.dev." --- diff --git a/src/templates/election-candidates-page-previous.js b/src/templates/election-candidates-page-previous.js index f3bfa3af8..55f04ba5a 100644 --- a/src/templates/election-candidates-page-previous.js +++ b/src/templates/election-candidates-page-previous.js @@ -9,47 +9,28 @@ import Header from "../components/Header"; import SEO from "../components/SEO"; import LinkComponent from "../components/LinkComponent"; -import { getCandidates, getElectionStatus } from "../actions/election-actions"; +const ElectionCandidatesPagePreviousTemplate = ({ candidates, electionData }) => { -import { AjaxLoader } from "openstack-uicore-foundation/lib/components"; - -const ElectionCandidatesPagePreviousTemplate = ({ candidates, electionStatus, today, loading, menu, howToVote }) => { - - const acceptedCandidates = candidates.filter(c => c.member.election_applications.length >= 10); - const noBallotCandidates = candidates.filter(c => c.member.election_applications.length < 10 && c.member.election_applications.length > 0); + const {closes} = electionData; + const electionYear = moment(closes * 1000).utc().format('YYYY'); + return (
-
{
-
-
-
-

{howToVote.title}

- -
-
+

Candidates On The Ballot

@@ -58,234 +39,35 @@ const ElectionCandidatesPagePreviousTemplate = ({ candidates, electionStatus, to
-
- Allison Randal -

Allison Randal

-
Nominated by:Jonathan BryceTim BellMark CollierAllison PriceThierry CarrezAmy MarrichRamon SampangGhanshyam MannJean-Philippe EvrardJesse Pretorius
-
-
- About Allison Randal - -

Allison is a software developer and open source strategist. She is a board member and board chair (2021) of the Open Infrastructure Foundation, a board member of the Software Freedom Conservancy, a board member of Open Usage Commons, and co-founder of the FLOSS Foundations group for open source leaders. She previously served as president and board member of the Open Source Initiative, president and board member of the Perl Foundation, board member at the Python Software Foundation, chief architect of the Parrot virtual machine, chair of the board at the Parrot Foundation, Open Source Evangelist at O'Reilly Media, Conference Chair of OSCON, Technical Architect of Ubuntu, Open Source Advisor at Canonical, Distinguished Technologist and Open Source Strategist at Hewlett Packard Enterprise, and Distinguished Engineer at SUSE. She participates in the Debian and OpenStack projects, and is currently taking a mid-career research sabbatical to complete a PhD at the University of Cambridge.

-
-
- View Allison Randal's full candidate profile and Q&A >> -
-
-
- Amy Marrich -

Amy Marrich

-
Nominated by:Allison RandalEliad CohenBernard CafarelliDennis DeMarcoJean-Philippe EvrardDmitriy RabotyagovJesse PretoriusSean CohenEgle SiglerJulia Kreger
-
-
- About Amy Marrich - -

Amy Marrich is a Principal Technical Marketing Manager at Red Hat. She - previously worked at a small Open Source e-assessment company in - Luxembourg where she was the Open Source Community and Global Training - Manager.  Previously she was the OpenStack Instructor at Linux Academy - and a Linux System Engineer on the Platform Engineering Cloud Operations - team at Rackspace. She currently serves on the OpenStack Board, is an - active member of the Openstack Ansible project, chair of the OSF - Diversity and Inclusion Working Group, and previously the chair of the - OpenStack User Committee. Amy spends her free time competing in - performance events (agility, FASt Cat, and dock diving) with her - Dalmatians and competing in Dressage with her Connemara pony. -

-
-
- View Amy Marrich's full candidate profile and Q&A >> -
-
-
- Belmiro Moreira -

Belmiro Moreira

-
Nominated by:Graeme MossMarcos BenedictoJan van EldikErik Olof Gunnar AnderssonTadas SutkaitisDavid HollandBrendan ConlanTristan GoodeArne WiebalckTim Bell
-
-
- About Belmiro Moreira - -

Belmiro Moreira is an enthusiastic mathematician and computer engineer passionate about the challenges and complexities of architecting and deploying large scale open Cloud Infrastructures. 

-

Belmiro works at CERN and during the last 10 years he has been responsible for the design, deployment and maintenance of the CERN Cloud Infrastructure based on Openstack.

-

Previously he worked in different virtualization projects to improve the efficiency of the large Batch farm at CERN. 

-

Belmiro is from the beginning an active member of the OpenStack community. 

-

Currently, he is a member of the OpenStack TC (Technical Committee) and the co-chair of the OpenStack Large Scale SIG. Previously he was also a member of the OpenStack UC (User Committee). 

-

Belmiro is particularly interested in the challenges that cloud operators face when maintaining large scale open infrastructures. He talks regularly about his experience in several conferences and events, (OpenStack Summits, OpenStack User Groups, OpenInfra Live, CentOS Dojo, ...) and helps in the organization of many other events.

-

Belmiro is committed to continue to support the OpenInfra community.

-
-
- View Belmiro Moreira's full candidate profile and Q&A >> -
-
-
- Erik Olof Gunnar Andersson -

Erik Olof Gunnar Andersson

-
Nominated by:Julia KregerDuc TruongWes WilsonAmy MarrichMarcin KarpikJonathan BryceBelmiro MoreiraThierry CarrezTim BellAllison Randal
-
-
- About Erik Olof Gunnar Andersson - -

Erik (He/Him) works at Blizzard Entertainment as Lead Site Reliability Engineer for World of Warcraft. He started working for Blizzard back in 2009 and has since contributed to multiple iterations of the Blizzard infrastructure.
-
- Blizzard runs an on-prem OpenStack Cloud with over 12,000 nodes has been in production since the release of Overwatch in 2015. -

-

He has also been an active contributor to OpenStack since 2015, and is currently a Core Reviewer for Designate and Senlin.

-
-
- View Erik Olof Gunnar Andersson's full candidate profile and Q&A >> -
-
-
- Ghanshyam Mann -

Ghanshyam Mann

-
Nominated by:Prakash RamchandranIgnesius ThambyrajRuturaj KadikarTrinath SomanchiVaidyanath ManogaranDigambar PatilMark CollierAmy MarrichJean-Philippe EvrardAllison Price
-
-
- About Ghanshyam Mann - -

Ghanshyam is currently serving as a Chair of the OpenStack Technical Committee and Core developer in various OpenStack projects (Nova, QA and a few more) and served as PTL of the OpenStack QA. project. He started working in OpenStack with NEC in 2012 as a cloud support engineer, and since 2014 he has been involved in upstream development. His main upstream focus is on Nova, QA, API stability, and CI/CD. In addition, he is passionate about bringing more contributors to the Open Infra family and helping them in onboarding in the community via different programs like First Contact SIG, Upstream Institute Trainings, mentorship. Before OpenStack Upstream, he worked in different domains like Avionics, Storage, Cloud, and Virtualization. Ghanshyam started his career in technology as a software developer in the Avionic domain with the C++ language.

-

He has also been a frequent speaker in various Open Source events such as OpenStack, Open Infra, Open source summit, Open Infra Days and LinuxCon on various topics like RESTful API, QA, Cloud Backup, Open Source Community Building, Open Source Governance. In addition, he has been actively involved in various PoC and solutions designs around Cloud OSS and currently serving as Cloud Consultant in NEC.

-

More Details: https://ghanshyammann.com/

-
-
- View Ghanshyam Mann's full candidate profile and Q&A >> -
-
-
- Jean-Philippe Evrard -

Jean-Philippe Evrard

-
Nominated by:Dmitriy RabotyagovJesse PretoriusAndy McCraeChandan KumarHosam Al AliJoshua HeskethErik JohanssonRomain GuichardJaesuk AhnGhanshyam Mann
-
-
- About Jean-Philippe Evrard - -

I am a learner, problem solver, solutions bringer. I started to contribute in OpenStack in 2015. I was the PTL of OpenStack-Ansible during the Queens and Rocky cycle. I was member and chair of the OpenStack Technical Committee, and core reviewer on multiple projects. I was also an OpenStack release manager. I also worked on other projects of the OpenInfra foundation (outside OpenStack). 

-

I have my own company, and I focus on helping companies in their Open Source strategy.

-

I currently support City Network, as their CTO.

-

I am a lover of open source software, and am involved in other open source communities when I can (for example, Kubernetes).

-

If you missed me in OpenStack events or meetups, you can still meet me every year at the FOSDEM (when those happen in real life...), handling the openstack booth with fellow OpenStackers.

-
-
- View Jean-Philippe Evrard's full candidate profile and Q&A >> -
-
-
- Julia Kreger -

Julia Kreger

-
Nominated by:Allison RandalAmy MarrichEliad CohenBernard CafarelliAllison PriceMark CollierJean-Philippe EvrardJesse PretoriusSean CohenJonathan Bryce
-
-
- About Julia Kreger - -

Julia started her career in technology over twenty years ago. It has surely not been an average career, but a career where I've continually learned and evolved to fulfill the need. In a sense, it all started with Linux and answering some questions about installing Linux. This started a journey into computer networking and eventually shifted to a systems engineering focus with a stop-over in data center operations.

-

The DevOps movement lead Julia more into software development and the operationalization of software due to the need to automate large scale systems deployments. This required bringing an operational perspective while bridging to the requirements, and often required digging deep into the underlying code to solve the problem of the day.

-

In a sense, Julia found a home in OpenStack in 2014 and the Ironic project in 2015 because of many years spent working with physical hardware in data centers. 

-

Julia presently works for Red Hat as a Senior Principal Software Engineer, where her upstream focus has been Ironic for the past few years, and her downstream focus has been on helping lead adoption and use of Ironic. 

-

 

-
-
- View Julia Kreger's full candidate profile and Q&A >> -
-
-
- Kurt Garloff -

Kurt Garloff

-
Nominated by:Kurt GarloffClemens HardewigSebastian WennerJean-Philippe EvrardArtem GoncharovThierry CarrezJohn GarbuttMathias FechnerTim BellAmy Marrich
-
-
- About Kurt Garloff - -

I'm currently leading the European Cloud initiative Sovereign  Cloud Stack (SCS) as CTO - we have been able to get a grant from the  German government to fund the coordination and some of the development  work for this project. It's hosted by the Open Source Business Alliance  (OSBA), a non-profit that represents the open source industry in  Germany. The OSBA has joined the Open Infra Foundation as Associate  Member. SCS is closely linked to the European initiative Gaia-X. 

-

The idea behind SCS is to network the various Infra DevOps teams in  the industry that build Open Source cloud and container stacks for their  internal consumption or as public clouds. This avoids the duplication  of work and the slight incompatibility that all of these efforts would  have if not interlinked closely. SCS clouds are very compatible and can  be easily federated. SCS also puts a lot of focus on operational tooling  and processes, as high quality day 2 operations remains a challenge for  many operator.

-

Dec 2018 - Dec 2019, I was responsible for the Cloud and Storage  Departments in SUSE R&D. SUSE was a strong long-time supporter and  platinum member of the OIF, also hosting the HP Helion team after the  M&A transaction.

-

Before SUSE, I was leading the architecture, community and consulting teams in Deutsche Telekom's Open Telekom Cloud Team.
- DT has been a vocal supporter of OpenStack since I joined in early 2012.  -

-

I have personally supported the InterOp Workig Group. I was serving  in the board of the OIF in 2018 as Gold member director for DT and in  2020 and 2021 as individual director.

-

Before joining DT end of 2011 I was a long-time contributor to the  Linux kernel, which also gave me the privilege of building up and  leading SUSE Labs and work with a number of great engineers in- and  outside my company, contributing to the success of the Open Source technology.

-
-
- View Kurt Garloff's full candidate profile and Q&A >> -
-
-
- Mark Baker -

Mark Baker

-
Nominated by:Mark BakerBen RoederVictor EstivalHardik DalwadiHendricus KesselsTytus KurekEgle SiglerDave WalkerJonathan BryceMark Collier
-
-
About Mark BakerPreviously Product Manager in AWS EC2 and OpenStack PM at Canonical before that. Involved OpenStack since 2011, I helped design and release Canonical's OpenStack distribution from 2011 to 2018 and was an OpenStack Board Director for several years. A 25 year career in infrastructure software with Product Management, Product Marketings and Solutions architecture roles at Oracle, Red Hat, Canonical, MySQL and a couple of startups. Now recently joined Neo4j as lead PM for SaaS products running across a number of different clouds. I love spending time with Open Source infrastructure technology learning about the differing models, communities and the challenges of each. 
- View Mark Baker's full candidate profile and Q&A >> -
-
-
- Mohammed Naser -

Mohammed Naser

-
Nominated by:Julia KregerErik Olof Gunnar AnderssonHassan Jamil SyedMichiel PiscaerAbdenour YahiaouiChandan KumarSimon LeinenWes WilsonClemens HardewigJonathan BryceAbhisak Chulya
-
-
- About Mohammed Naser - -

Over the past 10 years, I’m happy to have watched the hosting industry transform and be part of the transformation process as it evolved from traditional physical hardware to cloud-native infrastructure, powered by OpenStack.  Since the creation of VEXXHOST, I have had the chance to work with different sorts of customers, ranging from growing small businesses to helping architect solutions for large Fortune 500 companies, based on OpenStack.  I've helped integrate other open infrastructure projects into our commercial offering.

-

By fostering OpenStack at it’s early days in 2011, it has helped improve the project and our service as a whole. I’ve been a contributor to the project since and I have contributed code to almost every release of OpenStack since then.  I've also served as PTL for Puppet OpenStack, continue to serve as a PTL for OpenStack-Ansible and serve on the technical commitee, chairing tthe commitee for a term.

-
-
- View Mohammed Naser's full candidate profile and Q&A >> -
-
-
- Rico Lin -

Rico Lin

-
Nominated by:Jonathan BryceAllison PriceWes WilsonMark CollierRico LinHorace LiGhanshyam MannJulia KregerAmy MarrichEric Guo
-
-
- About Rico Lin - -

Rico Lin, OpenStack Technical Committee (TC) member, Individual Board of Director for OpenInfra Foundation, Heat PTL, char for Multi-arch SIG, Senior Software Engineer at EasyStack.

-

Experienced in OpenStack development (infra and app), Cloud architect, Container(docker and k8s), community(contribute and event host), and customer tech consults and supports.

-

Goals in OpenStack:

-

* Improve experiences of Cloud-native application on top of OpenStack(by improving infra and user experiences).
- * Blending OpenStack with other cloud solutions to make it become one indispensable layer.
- * Leverage the community differences across global (Include let Asia community get more actively join to others). -

-
-
- View Rico Lin's full candidate profile and Q&A >> -
-
-
- Shane Wang -

Shane Wang

-
Nominated by:Jonathan BryceAllison PriceWes WilsonMark CollierHorace LiRuoyu YingRuijing GuoHuang HaibinJF DingRui Zang
-
-
- About Shane Wang - -

Shane Wang is an Engineering Director of Cloud Infrastructure Software at Software and Advanced Technology Group at Intel. He has participated in or led his team on research and development of open source software projects such as Xen, tboot, Yocto and OpenStack before. He has been serving as an Individual Director of OpenStack Foundation Board since 2015, with years of commitment to community development and building. Currently he and his team is focusing on cloud native, cloud workloads and benchmarking, software-defined networking (SDN) and software-defined storage (SDS) technologies, edge computing, including OpenStack, Ceph, Kubernetes, Istio/Envoy, containerd, SODA (also known as OpenSDS), ONAP, Akraino, StarlingX, Smart Edge Open (also known as OpenNESS), OpenDaylight, OPNFV, DPDK, and so forth.

-

He got his PhD degree on Computer Science from Fudan University at Shanghai in 2004, and joined Intel after graduating from the school.

-
-
- View Shane Wang's full candidate profile and Q&A >> -
-
-
- Vipin Rathi -

Vipin Rathi

-
Nominated by:Prakash RamchandranIgnesius ThambyrajRuturaj KadikarTrinath SomanchiSajid AkhtarVaidyanath ManogaranAnantha Padmanabhan CBDigambar PatilKavit MunshiGeetika Batra
-
-
- About Vipin Rathi - -

 Vipin Rathi is an Assistant Professor at the University of Delhi. He is Chairperson of Linux Foundation Hyperledger Telecom SIG. He has board level experience as VP at Emerging Open Tech Foundation. He is the organizer of Openstack India, Magma India, CNCF Delhi, Open Edge Computing, Open Source Networking, Hyperledger Meetups. His research interest focus on 5G, Multi-Domain Orchestration. He is guiding a Research team to develop a Kubernetes-based Cloud-Native OpenStack named as KupenStack. He is an active member of Anuket, Magma Core. He attended and delivered presentations at various Open Source summits.

-
-
- View Vipin Rathi's full candidate profile and Q&A >> -
-
+ {candidates.map((candidate, index) => { + return ( + <> +
+ {candidate.member.pic && {`${candidate.member.first_name}} +

{`${candidate.member.first_name} ${candidate.member.last_name}`}

+
+ {/* Nominated by: + {candidate.member.election_applications.map(({ nominator }, i) => { + return ( + {`${nominator.first_name} ${nominator.last_name}`} + ) + })} */} +
+
+
+ About {`${candidate.member.first_name} ${candidate.member.last_name}`} + +
+ + {`View ${candidate.member.first_name} ${candidate.member.last_name}'s full candidate profile and Q&A >>`} + +
+
+ + ) + })}
- - -
} @@ -296,33 +78,11 @@ const ElectionCandidatesPagePreviousTemplate = ({ candidates, electionStatus, to ) } -const ElectionCandidatesPagePrevious = ({ data, isLoggedUser, candidates, location, - getCandidates, electionStatus, getElectionStatus, loading }) => { - - useState(() => { - getCandidates(); - getElectionStatus(); - }, []) - - const [today, setToday] = useState(moment().utc().unix()) - const [ready, setReady] = useState(false) - - useEffect(() => { - fetch(`https://timeintervalsince1970.appspot.com/`) - .then(response => response.json()) - .then(resultData => { - if (resultData.timestamp) { - setToday(Math.trunc(resultData.timestamp) - 7200); - setReady(true); - } - }) - .catch(() => { - setToday(moment().utc().unix()); - setReady(true); - }) - }, []) - - const { markdownRemark: post } = data; +const ElectionCandidatesPagePrevious = ({ data, isLoggedUser, location }) => { + + const { markdownRemark: post, allCandidateData: { edges: candidateArray }, electionData } = data; + + const candidates = candidateArray.map(c => c.node); return ( @@ -335,12 +95,8 @@ const ElectionCandidatesPagePrevious = ({ data, isLoggedUser, candidates, locati
@@ -350,18 +106,12 @@ const ElectionCandidatesPagePrevious = ({ data, isLoggedUser, candidates, locati export default connect(state => ({ isLoggedUser: state.loggedUserState.isLoggedUser, - electionStatus: state.electionState.election_status, - candidates: state.electionState.candidates, - loading: state.electionState.loading -}), { - getCandidates, - getElectionStatus -} +}), {} )(ElectionCandidatesPagePrevious) export const electionCandidatesPagePreviousQuery = graphql` - query ElectionCandidatesPagePrevious($id: String!) { + query ElectionCandidatesPagePrevious($id: String!, $electionId: String) { markdownRemark(id: { eq: $id }) { html frontmatter { @@ -380,15 +130,23 @@ export const electionCandidatesPagePreviousQuery = graphql` twitterUsername } - menu { - text - link - } - title - howToVote { - title - description - } + title + } + } + electionData(id: {eq: $electionId}) { + closes + } + allCandidateData(filter: {election_id: {eq: $electionId}}) { + edges { + node { + id + bio + member { + first_name + last_name + pic + } + } } } } diff --git a/src/templates/election-gold-candidates-page-previous.js b/src/templates/election-gold-candidates-page-previous.js index 85672f271..d13221777 100644 --- a/src/templates/election-gold-candidates-page-previous.js +++ b/src/templates/election-gold-candidates-page-previous.js @@ -1,6 +1,7 @@ import React, { useState } from "react" import { graphql } from 'gatsby'; import { connect } from 'react-redux' +import moment from 'moment-timezone'; import LinkComponent from "../components/LinkComponent" import Layout from '../components/Layout' import TopBar from "../components/TopBar"; @@ -8,34 +9,25 @@ import Navbar from "../components/Navbar"; import Header from "../components/Header"; import SEO from "../components/SEO"; -import { getGoldCandidates, getElectionStatus } from "../actions/election-actions"; +const ElectionGoldCandidatesPagePreviousTemplate = ({ intro, goldCandidates, electionData }) => { -import { AjaxLoader } from "openstack-uicore-foundation/lib/components"; + const {closes} = electionData; -const ElectionGoldCandidatesPagePreviousTemplate = ({ intro, goldCandidates, loading, menu }) => { + const electionYear = moment(closes * 1000).utc().format('YYYY'); return (
-
- {!loading && goldCandidates && + {goldCandidates &&
@@ -43,152 +35,25 @@ const ElectionGoldCandidatesPagePreviousTemplate = ({ intro, goldCandidates, loa
- -
- Abhisak Chulya -

Abhisak Chulya

-
-
- About Abhisak Chulya - -

Dr. Abhisak has been involved in Internet circle in Asia Pacific since 1999. He was the secretariat of ccTLD for three years during which he had participated in almost every ICANN meetings through out the world. He has experienced and understanding of how big impact of Internet has on this region. He single-handedly organized APRICOT 2002 in Bangkok (https://www.apricot.net/apricot2002/about/index.html) and was a chairman of APIA serving for three terms from 2004 – 2006 (https://www.apia.org/pdf/AGM2004.pdf) Here is more details of Dr. Abhisak qualifications and work history: 

-

Abhisak received his doctoral degree in Engineering from Cleveland State University, USA and spent 8 years as a senior research scientist at NASA John H. Glenn Research Center in Cleveland, Ohio, USA. He published over 20 international publications as lead author including presentations in France, Japan, and USA.

-

Moving back home in 1996, he worked as a Director of Thailand Science Park. He later turned entrepreneur setting up his own company called NIPA Technology Co., Ltd. He is the former Executive Director for ccTLD Secretariat for Country Code Top Level Domain Name. He was also in charge of ccTLD Name Server Training Program which is part of AP Outreach Seminar - ccTLD Secretariat. 

-

He has been appointed by the Cabinet of Thai Government on 17 June 2003 to be a member of Board of Directors of National Science and Technology Development Agency, Ministry of Science and Technology, Thailand.

-
-
- View Abhisak Chulya's full candidate profile and Q&A >> -
-
-
- Clemens Hardewig -

Clemens Hardewig

-
-
- About Clemens Hardewig - -

Clemens is born in Germany and married with three kids, I have a PhD in computer science and worked in the communication industry in different managerial roles in IT.

-

Working for Deutsche Telekom-T-Systems since 1997,  IT wise Clemens grew up in the **ix space and became excited with Opensource and community work already early in my carrier. Since then, the use and promotion of Opensource Technology in the different stations of my carrier is one of the red lines Clemens always tried to facilitate and develop.

-

Being with Deutsche Telekom in different managerial roles, Clemens has been involved in depth  in Community Work as eg in the early days of Mobile Internet where I helped to develop the Wireless Application Protocol (WAP) Community as a accounable representative for DT.

-

After several years in Mobile Communications and traditional IT as Technical Manager, Clemens took the opportunity and leads since 2014 the Technology team within T-Systems which builds and delivers the Open Telekom Cloud (OTC), a public cloud offering in Europe based on Openstack and being currently accountable for the teams of architects, engineers, operations and consultants, all together being accountable for the technical delivery of the OTC service offering.

-
-
- View Clemens Hardewig's full candidate profile and Q&A >> -
-
-
- Edward Lee -

Edward Lee

-
-
About Edward LeeI am Edward Lee, I have nearly 15 years of R&D Product and open source experience in multiple fields, such as cloud, storage, big data and so on. - Currently I am the head of open source team in EasyStack inc, my major job is leading team members work in community including OpenInfra, CNCF, Linux as well as product development. I am going to setup the OSPO following the todogroup’s guides and willing to make much more efforts on communities. - Prior to that, I have two work experiences, the one is as the leader of development team for more than five years in Huawei. I was in charge of open source strategy making and leading a team with full-time engineers working in several projects e.g. Cinder, Manila, Swift, Kubernetes and so on, we made much effort on contribution and got some core members/maintainers. And also I was the founder and infrastructure architect of several new open source projects related Huawei, such as openEuler, openGauss. The another one is as developer with several years of experience in storage system, big data product development and design. -
- View Edward Lee's full candidate profile and Q&A >> -
-
-
- Grace Lian -

Grace Lian

-
-
- About Grace Lian - -

Grace Lian is a senior director of Cloud Software Engineering team in Intel. She leads a global team to work on open source cloud software technologies, including OpenStack, k8s, Kata containers, Cloud Hypervisor, Envoy, Istio, Ceph, and Akraino etc. She also drives the strategy in the cloud native software domains for Intel.

-

Grace is an open source veteran. She started to work on open source software from Carrier Grade Linux project back to 2001. She was engineering manager for the first Linux team in Intel China. The team became OTC (Open Source Technology Center) China and has grown many open source talents for the community. She has long time experience leading global engineering teams on open source software development, touching layers of system software (OS, Web/HTML5, virtualization, orchestration, SDN/NFV, SDS, cloud and edge etc.), bringing open source values to business and successfully supporting many customers.

-

Grace's team started to work on OpenStack since 2012. In the past years, her team has contributed significantly to OpenStack and Kata Containers upstream development, actively led, participated and promoted many community activities. Intel is also one of the members who started Kata Container project and StarlingX project, and contributed them to Open Infrastructure Foundation.

-
-
- View Grace Lian's full candidate profile and Q&A >> -
-
-
- Johan Christenson -

Johan Christenson

-
-
- About Johan Christenson - -

Johan Christenson is an entrepreneur whom has successfully exited multiple companies he founded. After receiving a graduate degree in Engineering, from Florida Institute of Technology, his focus turned to the digital space.

-

Johan is the founder and CEO of City Network (a part of Iver), which offers a global public cloud as well as private clouds for enterprises - all based on OpenStack. City Networks mission is to enable innovation and focuses on enterprises with regulatory challenges.

-

Johan sees OpenStack and open infrastructure as critical for all enterprises in order to provide options and create competition in an ever more centralized infrastructure world. He, and the team at City, empower new types of industries and markets to use the power of OpenStack, to enable and increase innovation in their organizations.

-
-
- View Johan Christenson's full candidate profile and Q&A >> -
-
-
- Li Kai -

Li Kai

-
-
- About Li Kai - -

I am Kai and am the CSO/Co-founder from 99CLOUD. I had been devoting myself for OpenStack for more than 9 years from 2012.  99CLOUD is one of the top code committer orgnization in OIF foundation.  We believe with Open Infra tech, we can some how change the world and help client better in their IT and bussiness transformation. I am currently in the OpenStack board in 2020. I am also in EdgeGallery (a MEC opensource project) as a baord member. Prior to 99CLOUD, I worked for Intel from 2006~2012 as a SW engineer and Accenture 2012~2014 as Cloud Manager.  

-
-
- View Li Kai's full candidate profile and Q&A >> -
-
-
- Pengju Jiao -

Pengju Jiao

-
-
- About Pengju Jiao - -

Pengju Jiao comes from China Mobile SuZhou R&D Center and he has been working here for 7 years. He currently serves as the leader of the Computing Product Group of the IaaS product department, taking responsibility for the R&D of the OpenStack team. ECloud has become the fastest-growing public cloud in China with the highest revenue growth rate in the past two years. As a member of the China Mobile Public Cloud architecture team, he participated in multi-phase projects of the ECloud and could be considered as the main contributor for guiding ECloud to join the Million Core Club. Pengju Jiao has considerable rich work experience in the development and operation of hyperscale public clouds. In these years, he led the OpenStack R&D team to achieve multiple great achievements, implementing the scheduling and concurrency optimization for hyperscale clusters carrying more than 100,000 servers. With this optimization, the delivery of 5 thousand cloud hosts could be completed in several minutes. 

-

Pengju Jiao is also very active to join community events. He once deeply joins many core community projects and make contributions as the Core and PTL for the Karbor. In addition, he is a frequenter in OpenStack Summit, China Day and Meet-up activities. His team has published dozens of speeches in OpenStack-related community activities based on his lead, sharing China Mobile’s practical and innovation experience in OpenStack.

-
-
- View Pengju Jiao's full candidate profile and Q&A >> -
-
-
- Shannon McFarland -

Shannon McFarland

-
-
- About Shannon McFarland - -

Shannon McFarland, CCIE #5245, is a Distinguished Engineer and Cloud Architect for Cloud Native and Application Infrastructure technologies at Cisco. He has been at Cisco for 22+ years. Shannon worked as a systems engineer at a system integrator for many years and as an end-user engineer in the medical industry prior to that.
-  
- Shannon has been involved with OpenStack since the Diablo release and has historically focused on Neutron, Heat, and Magnum related work. In addition, to OpenStack-specific projects, Shannon has been involved in the Kata Containers project. He is also working in the CNCF (Kubernetes, Network Service Mesh, Linkerd and OpenTelemetry) and Istio communities, with a distinct focus on all-things networking and observability. He is an author (“IPv6 for Enterprise Networks”) and a frequent speaker at various industry and community conferences to include OpenStack/Open Infrastructure Summits, Cisco Live, etc.
-  
- LinkedIn: https://www.linkedin.com/in/smcfarland/ -

-

 

-
-
- View Shannon McFarland's full candidate profile and Q&A >> -
-
-
- Tytus Kurek -

Tytus Kurek

-
-
- About Tytus Kurek - -

Tytus has been a member of the OpenInfra Foundation Board of Directors since 2020. He is a member of the Finance Committee and is actively involved in the OpenStack community. Over years he contributed numerous patches to the OpenStack codebase. He was also participating in the events organised by the OpenInfra Foundation, including summits and PTGs, supporting the foundation in its efforts to spread the awareness of open-source benefits.

-

As a Product Manager at Canonical, Tytus drives the evolution of Canonical’s products and services in the data centre space, including Canonical's Charmed OpenStack distribution. Tytus received his PhD with honours in telecommunications in 2018. His background is data centre administration and cloud engineering. His research interests focus on 5G networks, network function virtualisation, container network functions and unikernels.

-
-
- View Tytus Kurek's full candidate profile and Q&A >> -
-
-
- Xin Zhong -

Xin Zhong

-
-
- About Xin Zhong - -

Xin Zhong got his Master Degree from Tsinghua University in 2003. He has nearly 20 years of open source related experience. He is an expert in Linux OS, distributed storage and cloud computing. He has been involved in development and operation of several large-scale internet and enterprise cloud platform as technical director or chief architect. Currently, he is the Senior Architect of China Unicom Cloud (new brand of Wo Cloud). He represents China Unicom in all the foundation events. He and his team are very active in open source projects like openstack, ceph, etc. He has been Board Director in 2020.

-
-
- View Xin Zhong's full candidate profile and Q&A >> -
+ {goldCandidates.map((candidate, index) => { + return ( + <> +
+ {candidate.member.pic && {`${candidate.member.first_name}} +

{`${candidate.member.first_name} ${candidate.member.last_name}`}

+
+
+ About {`${candidate.member.first_name} ${candidate.member.last_name}`} + +
+ + {`View ${candidate.member.first_name} ${candidate.member.last_name}'s full candidate profile and Q&A >>`} + + {index + 1 < goldCandidates.length &&
} +
+ + ) + })}
@@ -201,14 +66,11 @@ const ElectionGoldCandidatesPagePreviousTemplate = ({ intro, goldCandidates, loa ) } -const ElectionGoldCandidatesPagePrevious = ({ data, isLoggedUser, goldCandidates, loading, location, getGoldCandidates, electionStatus, getElectionStatus }) => { +const ElectionGoldCandidatesPagePrevious = ({ data, isLoggedUser, location }) => { + + const { markdownRemark: post, allGoldCandidateData: { edges: candidateArray }, electionData } = data; - useState(() => { - getGoldCandidates(); - getElectionStatus(); - }, []) - - const { markdownRemark: post } = data; + const goldCandidates = candidateArray.map(c => c.node); return ( @@ -222,9 +84,7 @@ const ElectionGoldCandidatesPagePrevious = ({ data, isLoggedUser, goldCandidates isLoggedUser={isLoggedUser} location={location} goldCandidates={goldCandidates} - electionStatus={electionStatus} - loading={loading} - menu={post.frontmatter.menu} + electionData={electionData} intro={post.frontmatter.intro} />
@@ -235,17 +95,11 @@ const ElectionGoldCandidatesPagePrevious = ({ data, isLoggedUser, goldCandidates export default connect(state => ({ isLoggedUser: state.loggedUserState.isLoggedUser, - electionStatus: state.electionState.election_status, - goldCandidates: state.electionState.gold_candidates, - loading: state.electionState.loading -}), { - getGoldCandidates, - getElectionStatus -} +}), {} )(ElectionGoldCandidatesPagePrevious) export const electionGoldCandidatesPagePreviousQuery = graphql` - query ElectionGoldCandidatesPagePrevious($id: String!) { + query ElectionGoldCandidatesPagePrevious($id: String!, $electionId: String) { markdownRemark(id: { eq: $id }) { html frontmatter { @@ -271,7 +125,23 @@ export const electionGoldCandidatesPagePreviousQuery = graphql` intro { title description - } + } + } + } + electionData(id: {eq: $electionId}) { + closes + } + allGoldCandidateData(filter: {election_id: {eq: $electionId}}) { + edges { + node { + id + bio + member { + first_name + last_name + pic + } + } } } } From 23909e761fe03d03bd79103c025ff2d2e0d462f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Castillo?= Date: Wed, 18 Oct 2023 15:55:30 -0300 Subject: [PATCH 03/31] Update branch-deploy env vars MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Castillo --- netlify.toml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/netlify.toml b/netlify.toml index 1c4cf0f4c..ec76b35bf 100644 --- a/netlify.toml +++ b/netlify.toml @@ -9,7 +9,12 @@ [build.environment] NODE_VERSION = "14.20.1" YARN_VERSION = "1.22.4" - YARN_FLAGS = "--no-ignore-optional" + YARN_FLAGS = "--no-ignore-optional" +[context.branch-deploy.environment] + GATSBY_API_BASE_URL="https://testresource-server.openstack.org" + GATSBY_BUILD_SCOPES="https://testresource-server.openstack.org/summits/read elections/read" + GATSBY_OAUTH2_CLIENT_ID_BUILD="_fJKILOprSj4MYY6~6rhoPJeRT7_5616.openstack.client" + GATSBY_OAUTH2_CLIENT_SECRET_BUILD="PFssJ_QNT_YjW9Uuk_dLqK9kx9ke.ndH4zAY-FBc59PzotI.0J18jPYXZ1snTkr4" [[headers]] for = "/*" [headers.values] From faa4553b9114961cbbf71d211581d3f7c7cef9a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Castillo?= Date: Wed, 18 Oct 2023 16:02:23 -0300 Subject: [PATCH 04/31] Add missing env variables to branch deploy context MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Castillo --- netlify.toml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/netlify.toml b/netlify.toml index ec76b35bf..88338cf9f 100644 --- a/netlify.toml +++ b/netlify.toml @@ -11,10 +11,18 @@ YARN_VERSION = "1.22.4" YARN_FLAGS = "--no-ignore-optional" [context.branch-deploy.environment] + GATSBY_IDP_BASE_URL="https://testopenstackid.openstack.org" + GATSBY_OAUTH2_CLIENT_ID="h1wVTVm75TJSmVcKtVXtYeqc-NKqMH86.openstack.client" GATSBY_API_BASE_URL="https://testresource-server.openstack.org" + GATSBY_SCOPES="openid profile email address https://testresource-server.openstack.org/members/write/me https://testresource-server.openstack.org/members/read/me https://testresource-server.openstack.org/organizations/read https://testresource-server.openstack.org/organizations/write elections/candidates/nominate elections/candidates/write/me https://testresource-server.openstack.org/me/read https://testresource-server.openstack.org/me/summits/events/schedule/add https://testresource-server.openstack.org/me/summits/events/schedule/delete https://testresource-server.openstack.org/me/summits/events/schedule/shareable/delete https://testresource-server.openstack.org/me/summits/events/schedule/shareable/add me/write https://testresource-server.openstack.org/speakers/write/me https://testresource-server.openstack.org/speakers/read/me" + GATSBY_SPONSORED_PROJECT_ID=1 GATSBY_BUILD_SCOPES="https://testresource-server.openstack.org/summits/read elections/read" GATSBY_OAUTH2_CLIENT_ID_BUILD="_fJKILOprSj4MYY6~6rhoPJeRT7_5616.openstack.client" GATSBY_OAUTH2_CLIENT_SECRET_BUILD="PFssJ_QNT_YjW9Uuk_dLqK9kx9ke.ndH4zAY-FBc59PzotI.0J18jPYXZ1snTkr4" + GATSBY_OAUTH_TOKEN_PATH="/oauth2/token" + GATSBY_SF_OID="00DG0000000lhAF" + GATSBY_FRIENDLY_CAPTCHA_SITE_KEY="FCMLO9OV7A0PENUN" + GATSBY_FRIENDLY_CAPTCHA_API_KEY="A1DIAJU833CPQ4P1HU2CMI75PIOMC3LPG4BG12RN93R1PC3QH41FNNQ4MM" [[headers]] for = "/*" [headers.values] From 9a978431e98ba80cb9ece92d0c75ae5d9c886538 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Castillo?= Date: Wed, 18 Oct 2023 16:07:45 -0300 Subject: [PATCH 05/31] Change context to deploy-preview MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Castillo --- netlify.toml | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/netlify.toml b/netlify.toml index 88338cf9f..b93054448 100644 --- a/netlify.toml +++ b/netlify.toml @@ -10,19 +10,6 @@ NODE_VERSION = "14.20.1" YARN_VERSION = "1.22.4" YARN_FLAGS = "--no-ignore-optional" -[context.branch-deploy.environment] - GATSBY_IDP_BASE_URL="https://testopenstackid.openstack.org" - GATSBY_OAUTH2_CLIENT_ID="h1wVTVm75TJSmVcKtVXtYeqc-NKqMH86.openstack.client" - GATSBY_API_BASE_URL="https://testresource-server.openstack.org" - GATSBY_SCOPES="openid profile email address https://testresource-server.openstack.org/members/write/me https://testresource-server.openstack.org/members/read/me https://testresource-server.openstack.org/organizations/read https://testresource-server.openstack.org/organizations/write elections/candidates/nominate elections/candidates/write/me https://testresource-server.openstack.org/me/read https://testresource-server.openstack.org/me/summits/events/schedule/add https://testresource-server.openstack.org/me/summits/events/schedule/delete https://testresource-server.openstack.org/me/summits/events/schedule/shareable/delete https://testresource-server.openstack.org/me/summits/events/schedule/shareable/add me/write https://testresource-server.openstack.org/speakers/write/me https://testresource-server.openstack.org/speakers/read/me" - GATSBY_SPONSORED_PROJECT_ID=1 - GATSBY_BUILD_SCOPES="https://testresource-server.openstack.org/summits/read elections/read" - GATSBY_OAUTH2_CLIENT_ID_BUILD="_fJKILOprSj4MYY6~6rhoPJeRT7_5616.openstack.client" - GATSBY_OAUTH2_CLIENT_SECRET_BUILD="PFssJ_QNT_YjW9Uuk_dLqK9kx9ke.ndH4zAY-FBc59PzotI.0J18jPYXZ1snTkr4" - GATSBY_OAUTH_TOKEN_PATH="/oauth2/token" - GATSBY_SF_OID="00DG0000000lhAF" - GATSBY_FRIENDLY_CAPTCHA_SITE_KEY="FCMLO9OV7A0PENUN" - GATSBY_FRIENDLY_CAPTCHA_API_KEY="A1DIAJU833CPQ4P1HU2CMI75PIOMC3LPG4BG12RN93R1PC3QH41FNNQ4MM" [[headers]] for = "/*" [headers.values] @@ -241,3 +228,16 @@ to="https://openinfra.dev/blog/openinfra-foundation-cyber-resilience-act" status=301 force=true +[context.deploy-preview.environment] + GATSBY_IDP_BASE_URL="https://testopenstackid.openstack.org" + GATSBY_OAUTH2_CLIENT_ID="h1wVTVm75TJSmVcKtVXtYeqc-NKqMH86.openstack.client" + GATSBY_API_BASE_URL="https://testresource-server.openstack.org" + GATSBY_SCOPES="openid profile email address https://testresource-server.openstack.org/members/write/me https://testresource-server.openstack.org/members/read/me https://testresource-server.openstack.org/organizations/read https://testresource-server.openstack.org/organizations/write elections/candidates/nominate elections/candidates/write/me https://testresource-server.openstack.org/me/read https://testresource-server.openstack.org/me/summits/events/schedule/add https://testresource-server.openstack.org/me/summits/events/schedule/delete https://testresource-server.openstack.org/me/summits/events/schedule/shareable/delete https://testresource-server.openstack.org/me/summits/events/schedule/shareable/add me/write https://testresource-server.openstack.org/speakers/write/me https://testresource-server.openstack.org/speakers/read/me" + GATSBY_SPONSORED_PROJECT_ID=1 + GATSBY_BUILD_SCOPES="https://testresource-server.openstack.org/summits/read elections/read" + GATSBY_OAUTH2_CLIENT_ID_BUILD="_fJKILOprSj4MYY6~6rhoPJeRT7_5616.openstack.client" + GATSBY_OAUTH2_CLIENT_SECRET_BUILD="PFssJ_QNT_YjW9Uuk_dLqK9kx9ke.ndH4zAY-FBc59PzotI.0J18jPYXZ1snTkr4" + GATSBY_OAUTH_TOKEN_PATH="/oauth2/token" + GATSBY_SF_OID="00DG0000000lhAF" + GATSBY_FRIENDLY_CAPTCHA_SITE_KEY="FCMLO9OV7A0PENUN" + GATSBY_FRIENDLY_CAPTCHA_API_KEY="A1DIAJU833CPQ4P1HU2CMI75PIOMC3LPG4BG12RN93R1PC3QH41FNNQ4MM" \ No newline at end of file From 31e5838d6e5de35105c929c171227d615f073f3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Castillo?= Date: Wed, 18 Oct 2023 16:15:18 -0300 Subject: [PATCH 06/31] Change .toml indentation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Castillo --- netlify.toml | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/netlify.toml b/netlify.toml index b93054448..c45750a26 100644 --- a/netlify.toml +++ b/netlify.toml @@ -228,16 +228,18 @@ to="https://openinfra.dev/blog/openinfra-foundation-cyber-resilience-act" status=301 force=true +# Deploy Preview context: all deploys resulting from a pull/merge request will +# inherit these settings. [context.deploy-preview.environment] - GATSBY_IDP_BASE_URL="https://testopenstackid.openstack.org" - GATSBY_OAUTH2_CLIENT_ID="h1wVTVm75TJSmVcKtVXtYeqc-NKqMH86.openstack.client" - GATSBY_API_BASE_URL="https://testresource-server.openstack.org" - GATSBY_SCOPES="openid profile email address https://testresource-server.openstack.org/members/write/me https://testresource-server.openstack.org/members/read/me https://testresource-server.openstack.org/organizations/read https://testresource-server.openstack.org/organizations/write elections/candidates/nominate elections/candidates/write/me https://testresource-server.openstack.org/me/read https://testresource-server.openstack.org/me/summits/events/schedule/add https://testresource-server.openstack.org/me/summits/events/schedule/delete https://testresource-server.openstack.org/me/summits/events/schedule/shareable/delete https://testresource-server.openstack.org/me/summits/events/schedule/shareable/add me/write https://testresource-server.openstack.org/speakers/write/me https://testresource-server.openstack.org/speakers/read/me" - GATSBY_SPONSORED_PROJECT_ID=1 - GATSBY_BUILD_SCOPES="https://testresource-server.openstack.org/summits/read elections/read" - GATSBY_OAUTH2_CLIENT_ID_BUILD="_fJKILOprSj4MYY6~6rhoPJeRT7_5616.openstack.client" - GATSBY_OAUTH2_CLIENT_SECRET_BUILD="PFssJ_QNT_YjW9Uuk_dLqK9kx9ke.ndH4zAY-FBc59PzotI.0J18jPYXZ1snTkr4" - GATSBY_OAUTH_TOKEN_PATH="/oauth2/token" - GATSBY_SF_OID="00DG0000000lhAF" - GATSBY_FRIENDLY_CAPTCHA_SITE_KEY="FCMLO9OV7A0PENUN" - GATSBY_FRIENDLY_CAPTCHA_API_KEY="A1DIAJU833CPQ4P1HU2CMI75PIOMC3LPG4BG12RN93R1PC3QH41FNNQ4MM" \ No newline at end of file + GATSBY_IDP_BASE_URL = "https://testopenstackid.openstack.org" + GATSBY_OAUTH2_CLIENT_ID = "h1wVTVm75TJSmVcKtVXtYeqc-NKqMH86.openstack.client" + GATSBY_API_BASE_URL = "https://testresource-server.openstack.org" + GATSBY_SCOPES = "openid profile email address https://testresource-server.openstack.org/members/write/me https://testresource-server.openstack.org/members/read/me https://testresource-server.openstack.org/organizations/read https://testresource-server.openstack.org/organizations/write elections/candidates/nominate elections/candidates/write/me https://testresource-server.openstack.org/me/read https://testresource-server.openstack.org/me/summits/events/schedule/add https://testresource-server.openstack.org/me/summits/events/schedule/delete https://testresource-server.openstack.org/me/summits/events/schedule/shareable/delete https://testresource-server.openstack.org/me/summits/events/schedule/shareable/add me/write https://testresource-server.openstack.org/speakers/write/me https://testresource-server.openstack.org/speakers/read/me" + GATSBY_SPONSORED_PROJECT_ID = 1 + GATSBY_BUILD_SCOPES = "https://testresource-server.openstack.org/summits/read elections/read" + GATSBY_OAUTH2_CLIENT_ID_BUILD = "_fJKILOprSj4MYY6~6rhoPJeRT7_5616.openstack.client" + GATSBY_OAUTH2_CLIENT_SECRET_BUILD = "PFssJ_QNT_YjW9Uuk_dLqK9kx9ke.ndH4zAY-FBc59PzotI.0J18jPYXZ1snTkr4" + GATSBY_OAUTH_TOKEN_PATH = "/oauth2/token" + GATSBY_SF_OID = "00DG0000000lhAF" + GATSBY_FRIENDLY_CAPTCHA_SITE_KEY = "FCMLO9OV7A0PENUN" + GATSBY_FRIENDLY_CAPTCHA_API_KEY = "A1DIAJU833CPQ4P1HU2CMI75PIOMC3LPG4BG12RN93R1PC3QH41FNNQ4MM" \ No newline at end of file From fcedc2eee3a34eecbfe69cfa9588685b4c5046f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Castillo?= Date: Wed, 18 Oct 2023 18:58:29 -0300 Subject: [PATCH 07/31] Changes in netlify.toml file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Castillo --- netlify.toml | 261 +++++++++++++++++++++++++++------------------------ 1 file changed, 137 insertions(+), 124 deletions(-) diff --git a/netlify.toml b/netlify.toml index c45750a26..5cb1d6f2e 100644 --- a/netlify.toml +++ b/netlify.toml @@ -10,6 +10,34 @@ NODE_VERSION = "14.20.1" YARN_VERSION = "1.22.4" YARN_FLAGS = "--no-ignore-optional" +# Deploy Preview context: all deploys resulting from a pull/merge request will +# inherit these settings. +[context.deploy-preview.environment] + GATSBY_IDP_BASE_URL = "https://testopenstackid.openstack.org" + GATSBY_OAUTH2_CLIENT_ID = "h1wVTVm75TJSmVcKtVXtYeqc-NKqMH86.openstack.client" + GATSBY_API_BASE_URL = "https://testresource-server.openstack.org" + GATSBY_SCOPES = "openid profile email address https://testresource-server.openstack.org/members/write/me https://testresource-server.openstack.org/members/read/me https://testresource-server.openstack.org/organizations/read https://testresource-server.openstack.org/organizations/write elections/candidates/nominate elections/candidates/write/me https://testresource-server.openstack.org/me/read https://testresource-server.openstack.org/me/summits/events/schedule/add https://testresource-server.openstack.org/me/summits/events/schedule/delete https://testresource-server.openstack.org/me/summits/events/schedule/shareable/delete https://testresource-server.openstack.org/me/summits/events/schedule/shareable/add me/write https://testresource-server.openstack.org/speakers/write/me https://testresource-server.openstack.org/speakers/read/me" + GATSBY_SPONSORED_PROJECT_ID = 1 + GATSBY_BUILD_SCOPES = "https://testresource-server.openstack.org/summits/read elections/read" + GATSBY_OAUTH2_CLIENT_ID_BUILD = "_fJKILOprSj4MYY6~6rhoPJeRT7_5616.openstack.client" + GATSBY_OAUTH2_CLIENT_SECRET_BUILD = "PFssJ_QNT_YjW9Uuk_dLqK9kx9ke.ndH4zAY-FBc59PzotI.0J18jPYXZ1snTkr4" + GATSBY_OAUTH_TOKEN_PATH = "/oauth2/token" + GATSBY_SF_OID = "00DG0000000lhAF" + GATSBY_FRIENDLY_CAPTCHA_SITE_KEY = "FCMLO9OV7A0PENUN" + GATSBY_FRIENDLY_CAPTCHA_API_KEY = "A1DIAJU833CPQ4P1HU2CMI75PIOMC3LPG4BG12RN93R1PC3QH41FNNQ4MM" +[context.dev.environment] + GATSBY_IDP_BASE_URL = "https://testopenstackid.openstack.org" + GATSBY_OAUTH2_CLIENT_ID = "h1wVTVm75TJSmVcKtVXtYeqc-NKqMH86.openstack.client" + GATSBY_API_BASE_URL = "https://testresource-server.openstack.org" + GATSBY_SCOPES = "openid profile email address https://testresource-server.openstack.org/members/write/me https://testresource-server.openstack.org/members/read/me https://testresource-server.openstack.org/organizations/read https://testresource-server.openstack.org/organizations/write elections/candidates/nominate elections/candidates/write/me https://testresource-server.openstack.org/me/read https://testresource-server.openstack.org/me/summits/events/schedule/add https://testresource-server.openstack.org/me/summits/events/schedule/delete https://testresource-server.openstack.org/me/summits/events/schedule/shareable/delete https://testresource-server.openstack.org/me/summits/events/schedule/shareable/add me/write https://testresource-server.openstack.org/speakers/write/me https://testresource-server.openstack.org/speakers/read/me" + GATSBY_SPONSORED_PROJECT_ID = 1 + GATSBY_BUILD_SCOPES = "https://testresource-server.openstack.org/summits/read elections/read" + GATSBY_OAUTH2_CLIENT_ID_BUILD = "_fJKILOprSj4MYY6~6rhoPJeRT7_5616.openstack.client" + GATSBY_OAUTH2_CLIENT_SECRET_BUILD = "PFssJ_QNT_YjW9Uuk_dLqK9kx9ke.ndH4zAY-FBc59PzotI.0J18jPYXZ1snTkr4" + GATSBY_OAUTH_TOKEN_PATH = "/oauth2/token" + GATSBY_SF_OID = "00DG0000000lhAF" + GATSBY_FRIENDLY_CAPTCHA_SITE_KEY = "FCMLO9OV7A0PENUN" + GATSBY_FRIENDLY_CAPTCHA_API_KEY = "A1DIAJU833CPQ4P1HU2CMI75PIOMC3LPG4BG12RN93R1PC3QH41FNNQ4MM" [[headers]] for = "/*" [headers.values] @@ -119,127 +147,112 @@ status = 301 force = true [[redirects]] - from="https://summit.openinfra.dev/*" - to="https://openinfra.dev/summit" - status=301 - force=true -[[redirects]] - from="http://summit.openinfra.dev/*" - to="https://openinfra.dev/summit" - status=301 - force=true -[[redirects]] - from="http://summit.openstack.cn/*" - to="https://openinfra.dev/summit" - status=301 - force=true -[[redirects]] - from="/ptg/rooms/austin" - to="https://zoom.us/j/96906327910?pwd=aE51d1FtM0R3dDY1Vk0xUTJKaEZtUT09" - status=301 - force=true -[[redirects]] - from="/ptg/rooms/bexar" - to="https://zoom.us/j/98905969859?pwd=a0NFajNCSFFSQm93TFIrdDE1ditpdz09" - status=301 - force=true -[[redirects]] - from="/ptg/rooms/cactus" - to="https://zoom.us/j/91349816875?pwd=MXhBa3gxY280QVVwZzkwQk9JY0xldz09" - status=301 - force=true -[[redirects]] - from="/ptg/rooms/diablo" - to="https://zoom.us/j/96494117185?pwd=NGhya0NpeWppMEc1OUNKdlFPbDNYdz09" - status=301 - force=true -[[redirects]] - from="/ptg/rooms/essex" - to="https://zoom.us/j/98071109978?pwd=NlA5dVQxaEVucHZ4NjlOUmp6U0VvQT09" - status=301 - force=true -[[redirects]] - from="/ptg/rooms/folsom" - to="https://zoom.us/j/92793625777?pwd=dWRMR3E0OWM1V2kxT1dBUGJtMlU0Zz09" - status=301 - force=true -[[redirects]] - from="/ptg/rooms/grizzly" - to="https://zoom.us/j/95205115859?pwd=RUpBanhpK0NCbUlsNFYxQVJHYTQwQT09" - status=301 - force=true -[[redirects]] - from="/ptg/rooms/havana" - to="https://zoom.us/j/97381453385?pwd=bmYwcXltOVdSYS9SUzg3Zm9GWHZhZz09" - status=301 - force=true -[[redirects]] - from="/ptg/rooms/icehouse" - to="https://zoom.us/j/94855376980?pwd=MzMzVDE3MGdVWXQwVS81eEREMjdVZz09" - status=301 - force=true -[[redirects]] - from="/ptg/rooms/juno" - to="https://zoom.us/j/91509365720?pwd=QVJINGlHK0QwNk1ISVNFbnJBOVRYdz09" - status=301 - force=true -[[redirects]] - from="/ptg/rooms/kilo" - to="https://zoom.us/j/97156435772?pwd=a0xnZ1pwcXBXZU9oTkxWQ3JPRi81UT09" - status=301 - force=true -[[redirects]] - from="/ptg/rooms/liberty" - to="https://zoom.us/j/94265628858?pwd=YXllU3VFQzhaVWVRdmI3V0xJUERZdz09" - status=301 - force=true -[[redirects]] - from="/ptg/rooms/mitaka" - to="https://zoom.us/j/96239912151?pwd=b2NLMTdQeThjdW0vMzZWV3RPRHVidz09" - status=301 - force=true -[[redirects]] - from="/ptg/rooms/newton" - to="https://zoom.us/j/96855299345?pwd=bG5KZHloRzA3bkhCQVJBNmZCQUltZz09" - status=301 - force=true -[[redirects]] - from="/ptg/rooms/ocata" - to="https://zoom.us/j/99841882395?pwd=RzBnSXQwWURIU3prbGhqSFdxVXg2Zz09" - status=301 - force=true -[[redirects]] - from="/legal/code-of-conduct/events" - to="https://openinfra.dev/legal/code-of-conduct" - status=301 - force=true -[[redirects]] - from="/careers/marketing-coordinator" - to="https://openinfra.dev/careers" - status=301 - force=true -[[redirects]] - from="/experience" - to="https://openinfrafoundation.formstack.com/forms/my_open_source_experience" - status=301 - force=true -[[redirects]] - from="/blog/openinfra-foundation-cyber-resilience-act." - to="https://openinfra.dev/blog/openinfra-foundation-cyber-resilience-act" - status=301 - force=true -# Deploy Preview context: all deploys resulting from a pull/merge request will -# inherit these settings. -[context.deploy-preview.environment] - GATSBY_IDP_BASE_URL = "https://testopenstackid.openstack.org" - GATSBY_OAUTH2_CLIENT_ID = "h1wVTVm75TJSmVcKtVXtYeqc-NKqMH86.openstack.client" - GATSBY_API_BASE_URL = "https://testresource-server.openstack.org" - GATSBY_SCOPES = "openid profile email address https://testresource-server.openstack.org/members/write/me https://testresource-server.openstack.org/members/read/me https://testresource-server.openstack.org/organizations/read https://testresource-server.openstack.org/organizations/write elections/candidates/nominate elections/candidates/write/me https://testresource-server.openstack.org/me/read https://testresource-server.openstack.org/me/summits/events/schedule/add https://testresource-server.openstack.org/me/summits/events/schedule/delete https://testresource-server.openstack.org/me/summits/events/schedule/shareable/delete https://testresource-server.openstack.org/me/summits/events/schedule/shareable/add me/write https://testresource-server.openstack.org/speakers/write/me https://testresource-server.openstack.org/speakers/read/me" - GATSBY_SPONSORED_PROJECT_ID = 1 - GATSBY_BUILD_SCOPES = "https://testresource-server.openstack.org/summits/read elections/read" - GATSBY_OAUTH2_CLIENT_ID_BUILD = "_fJKILOprSj4MYY6~6rhoPJeRT7_5616.openstack.client" - GATSBY_OAUTH2_CLIENT_SECRET_BUILD = "PFssJ_QNT_YjW9Uuk_dLqK9kx9ke.ndH4zAY-FBc59PzotI.0J18jPYXZ1snTkr4" - GATSBY_OAUTH_TOKEN_PATH = "/oauth2/token" - GATSBY_SF_OID = "00DG0000000lhAF" - GATSBY_FRIENDLY_CAPTCHA_SITE_KEY = "FCMLO9OV7A0PENUN" - GATSBY_FRIENDLY_CAPTCHA_API_KEY = "A1DIAJU833CPQ4P1HU2CMI75PIOMC3LPG4BG12RN93R1PC3QH41FNNQ4MM" \ No newline at end of file + from = "https://summit.openinfra.dev/*" + to = "https://openinfra.dev/summit" + status = 301 + force = true +[[redirects]] + from = "http://summit.openinfra.dev/*" + to = "https://openinfra.dev/summit" + status = 301 + force = true +[[redirects]] + from = "http://summit.openstack.cn/*" + to = "https://openinfra.dev/summit" + status = 301 + force = true +[[redirects]] + from = "/ptg/rooms/austin" + to = "https://zoom.us/j/96906327910?pwd=aE51d1FtM0R3dDY1Vk0xUTJKaEZtUT09" + status = 301 + force = true +[[redirects]] + from = "/ptg/rooms/bexar" + to = "https://zoom.us/j/98905969859?pwd=a0NFajNCSFFSQm93TFIrdDE1ditpdz09" + status = 301 + force = true +[[redirects]] + from = "/ptg/rooms/cactus" + to = "https://zoom.us/j/91349816875?pwd=MXhBa3gxY280QVVwZzkwQk9JY0xldz09" + status = 301 + force = true +[[redirects]] + from = "/ptg/rooms/diablo" + to = "https://zoom.us/j/96494117185?pwd=NGhya0NpeWppMEc1OUNKdlFPbDNYdz09" + status = 301 + force = true +[[redirects]] + from = "/ptg/rooms/essex" + to = "https://zoom.us/j/98071109978?pwd=NlA5dVQxaEVucHZ4NjlOUmp6U0VvQT09" + status = 301 + force = true +[[redirects]] + from = "/ptg/rooms/folsom" + to = "https://zoom.us/j/92793625777?pwd=dWRMR3E0OWM1V2kxT1dBUGJtMlU0Zz09" + status = 301 + force = true +[[redirects]] + from = "/ptg/rooms/grizzly" + to = "https://zoom.us/j/95205115859?pwd=RUpBanhpK0NCbUlsNFYxQVJHYTQwQT09" + status = 301 + force = true +[[redirects]] + from = "/ptg/rooms/havana" + to = "https://zoom.us/j/97381453385?pwd=bmYwcXltOVdSYS9SUzg3Zm9GWHZhZz09" + status = 301 + force = true +[[redirects]] + from = "/ptg/rooms/icehouse" + to = "https://zoom.us/j/94855376980?pwd=MzMzVDE3MGdVWXQwVS81eEREMjdVZz09" + status = 301 + force = true +[[redirects]] + from = "/ptg/rooms/juno" + to = "https://zoom.us/j/91509365720?pwd=QVJINGlHK0QwNk1ISVNFbnJBOVRYdz09" + status = 301 + force = true +[[redirects]] + from = "/ptg/rooms/kilo" + to = "https://zoom.us/j/97156435772?pwd=a0xnZ1pwcXBXZU9oTkxWQ3JPRi81UT09" + status = 301 + force = true +[[redirects]] + from = "/ptg/rooms/liberty" + to = "https://zoom.us/j/94265628858?pwd=YXllU3VFQzhaVWVRdmI3V0xJUERZdz09" + status = 301 + force = true +[[redirects]] + from = "/ptg/rooms/mitaka" + to = "https://zoom.us/j/96239912151?pwd=b2NLMTdQeThjdW0vMzZWV3RPRHVidz09" + status = 301 + force = true +[[redirects]] + from = "/ptg/rooms/newton" + to = "https://zoom.us/j/96855299345?pwd=bG5KZHloRzA3bkhCQVJBNmZCQUltZz09" + status = 301 + force = true +[[redirects]] + from = "/ptg/rooms/ocata" + to = "https://zoom.us/j/99841882395?pwd=RzBnSXQwWURIU3prbGhqSFdxVXg2Zz09" + status = 301 + force = true +[[redirects]] + from = "/legal/code-of-conduct/events" + to = "https://openinfra.dev/legal/code-of-conduct" + status = 301 + force = true +[[redirects]] + from = "/careers/marketing-coordinator" + to = "https://openinfra.dev/careers" + status = 301 + force = true +[[redirects]] + from = "/experience" + to = "https://openinfrafoundation.formstack.com/forms/my_open_source_experience" + status = 301 + force = true +[[redirects]] + from = "/blog/openinfra-foundation-cyber-resilience-act." + to = "https://openinfra.dev/blog/openinfra-foundation-cyber-resilience-act" + status = 301 + force = true \ No newline at end of file From 7d5ebfc5a02b2cbd60fa20b9b97c3340b6c5bf28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Castillo?= Date: Wed, 18 Oct 2023 19:46:55 -0300 Subject: [PATCH 08/31] Pass sponsored project id as string on toml file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Castillo --- netlify.toml | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/netlify.toml b/netlify.toml index 5cb1d6f2e..98af25e33 100644 --- a/netlify.toml +++ b/netlify.toml @@ -17,20 +17,7 @@ GATSBY_OAUTH2_CLIENT_ID = "h1wVTVm75TJSmVcKtVXtYeqc-NKqMH86.openstack.client" GATSBY_API_BASE_URL = "https://testresource-server.openstack.org" GATSBY_SCOPES = "openid profile email address https://testresource-server.openstack.org/members/write/me https://testresource-server.openstack.org/members/read/me https://testresource-server.openstack.org/organizations/read https://testresource-server.openstack.org/organizations/write elections/candidates/nominate elections/candidates/write/me https://testresource-server.openstack.org/me/read https://testresource-server.openstack.org/me/summits/events/schedule/add https://testresource-server.openstack.org/me/summits/events/schedule/delete https://testresource-server.openstack.org/me/summits/events/schedule/shareable/delete https://testresource-server.openstack.org/me/summits/events/schedule/shareable/add me/write https://testresource-server.openstack.org/speakers/write/me https://testresource-server.openstack.org/speakers/read/me" - GATSBY_SPONSORED_PROJECT_ID = 1 - GATSBY_BUILD_SCOPES = "https://testresource-server.openstack.org/summits/read elections/read" - GATSBY_OAUTH2_CLIENT_ID_BUILD = "_fJKILOprSj4MYY6~6rhoPJeRT7_5616.openstack.client" - GATSBY_OAUTH2_CLIENT_SECRET_BUILD = "PFssJ_QNT_YjW9Uuk_dLqK9kx9ke.ndH4zAY-FBc59PzotI.0J18jPYXZ1snTkr4" - GATSBY_OAUTH_TOKEN_PATH = "/oauth2/token" - GATSBY_SF_OID = "00DG0000000lhAF" - GATSBY_FRIENDLY_CAPTCHA_SITE_KEY = "FCMLO9OV7A0PENUN" - GATSBY_FRIENDLY_CAPTCHA_API_KEY = "A1DIAJU833CPQ4P1HU2CMI75PIOMC3LPG4BG12RN93R1PC3QH41FNNQ4MM" -[context.dev.environment] - GATSBY_IDP_BASE_URL = "https://testopenstackid.openstack.org" - GATSBY_OAUTH2_CLIENT_ID = "h1wVTVm75TJSmVcKtVXtYeqc-NKqMH86.openstack.client" - GATSBY_API_BASE_URL = "https://testresource-server.openstack.org" - GATSBY_SCOPES = "openid profile email address https://testresource-server.openstack.org/members/write/me https://testresource-server.openstack.org/members/read/me https://testresource-server.openstack.org/organizations/read https://testresource-server.openstack.org/organizations/write elections/candidates/nominate elections/candidates/write/me https://testresource-server.openstack.org/me/read https://testresource-server.openstack.org/me/summits/events/schedule/add https://testresource-server.openstack.org/me/summits/events/schedule/delete https://testresource-server.openstack.org/me/summits/events/schedule/shareable/delete https://testresource-server.openstack.org/me/summits/events/schedule/shareable/add me/write https://testresource-server.openstack.org/speakers/write/me https://testresource-server.openstack.org/speakers/read/me" - GATSBY_SPONSORED_PROJECT_ID = 1 + GATSBY_SPONSORED_PROJECT_ID = "1" GATSBY_BUILD_SCOPES = "https://testresource-server.openstack.org/summits/read elections/read" GATSBY_OAUTH2_CLIENT_ID_BUILD = "_fJKILOprSj4MYY6~6rhoPJeRT7_5616.openstack.client" GATSBY_OAUTH2_CLIENT_SECRET_BUILD = "PFssJ_QNT_YjW9Uuk_dLqK9kx9ke.ndH4zAY-FBc59PzotI.0J18jPYXZ1snTkr4" From fd122b9ed43eb347d5c661e0cc7bb4fd67fa503f Mon Sep 17 00:00:00 2001 From: smarcet Date: Thu, 19 Oct 2023 12:20:15 -0300 Subject: [PATCH 09/31] Tweaks for real dynmamic pages --- gatsby-node.js | 103 +++++++++++++++++- package.json | 25 +++-- src/content/settings.json | 2 +- .../2022/candidates/gold/index.md | 18 --- .../2022/candidates/index.md | 13 --- .../2023/candidates/gold/index.md | 18 --- .../2023/candidates/index.md | 13 --- .../election/previous-elections/2023/index.md | 73 ------------- .../{2022/index.md => 44599.md} | 17 +-- .../election/previous-elections/44601.md | 6 + .../candidates/44599_candidates.md | 5 + .../candidates/44601_candidates.md | 5 + .../candidates/gold/44599_candidates.md | 5 + .../candidates/gold/44601_candidates.md | 5 + src/templates/election-page-previous.js | 1 + static/admin/config.yml | 55 ++++++++++ yarn.lock | 5 + 17 files changed, 210 insertions(+), 159 deletions(-) delete mode 100644 src/pages/election/previous-elections/2022/candidates/gold/index.md delete mode 100644 src/pages/election/previous-elections/2022/candidates/index.md delete mode 100644 src/pages/election/previous-elections/2023/candidates/gold/index.md delete mode 100644 src/pages/election/previous-elections/2023/candidates/index.md delete mode 100644 src/pages/election/previous-elections/2023/index.md rename src/pages/election/previous-elections/{2022/index.md => 44599.md} (80%) create mode 100644 src/pages/election/previous-elections/44601.md create mode 100644 src/pages/election/previous-elections/candidates/44599_candidates.md create mode 100644 src/pages/election/previous-elections/candidates/44601_candidates.md create mode 100644 src/pages/election/previous-elections/candidates/gold/44599_candidates.md create mode 100644 src/pages/election/previous-elections/candidates/gold/44601_candidates.md diff --git a/gatsby-node.js b/gatsby-node.js index c78302aed..70ccdb070 100644 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -6,6 +6,9 @@ const axios = require('axios') const {createFilePath} = require('gatsby-source-filesystem') const {fmImagesToRelative} = require('gatsby-remark-relative-images') const {ClientCredentials} = require('simple-oauth2'); +const yaml = require("yaml") +const moment = require("moment-timezone"); +const prevElectionsBasePath = 'src/pages/election/previous-elections'; const myEnv = require("dotenv").config({ path: `.env`, @@ -240,14 +243,49 @@ exports.sourceNodes = async ({ actions, createNodeId, createContentDigest }) => const accessToken = await getAccessToken(config, buildScopes).then(({token}) => token.access_token).catch(e => console.log('Access Token error', e)); - // data for previous elections + // data for previous electionsfilePath const previousElections = await SSR_getPreviousElections(apiBaseUrl, accessToken); if (previousElections) { // get last 2 past elections const lastElections = previousElections.data.filter(e => e.status === "Closed").slice(-2); let candidates = []; let goldCandidates = []; + // create paths + fs.mkdirSync(prevElectionsBasePath, { recursive: true } ); + fs.mkdirSync(`${prevElectionsBasePath}/candidates`, { recursive: true } ); + fs.mkdirSync(`${prevElectionsBasePath}/candidates/gold`, { recursive: true } ); + for (const election of lastElections) { + + function formatMarkdown(post) { + const { body } = post + delete post.body + return + } + const electionYear = moment(election.closes * 1000).utc().format('YYYY'); + // create MD file using yaml ... + if(!fs.existsSync(`${prevElectionsBasePath}/${election.id}.md`)) + fs.writeFileSync(`${prevElectionsBasePath}/${election.id}.md`, `---\n${yaml.stringify({templateKey: 'election-page-previous',electionYear: electionYear,electionId:election.id, title: election.name})}---\n`, 'utf8', function (err) { + if (err) { + console.log(err); + } + }); + + // create MD file using yaml ... + if(!fs.existsSync(`${prevElectionsBasePath}/candidates/${election.id}_candidates.md`)) + fs.writeFileSync(`${prevElectionsBasePath}/candidates/${election.id}_candidates.md`, `---\n${yaml.stringify({templateKey: 'election-candidates-page-previous', electionId:election.id, title: election.name + ' Candidates'})}---\n`, 'utf8', function (err) { + if (err) { + console.log(err); + } + }); + + if(!fs.existsSync(`${prevElectionsBasePath}/candidates/gold/${election.id}_candidates.md`)) + fs.writeFileSync(`${prevElectionsBasePath}/candidates/gold/${election.id}_candidates.md`, `---\n${yaml.stringify({templateKey: 'election-gold-candidates-page-previous', electionId:election.id, title: election.name + ' Gold Candidates'})}---\n`, 'utf8', function (err) { + if (err) { + console.log(err); + } + }); + const electionCandidates = await SSR_getPreviousElectionCandidates(apiBaseUrl, accessToken, election.id); const electionGoldCandidates = await SSR_getPreviousElectionGoldCandidates(apiBaseUrl, accessToken, election.id); @@ -255,6 +293,8 @@ exports.sourceNodes = async ({ actions, createNodeId, createContentDigest }) => if (Array.isArray(electionGoldCandidates.data) && electionGoldCandidates.data.length > 0) goldCandidates = [...goldCandidates, ...electionGoldCandidates.data]; } + // ingest api data on graphql ... + lastElections.forEach(election => { createNode({ ...election, @@ -380,9 +420,65 @@ exports.createSchemaCustomization = ({actions}) => { exports.createPages = ({actions, graphql}) => { const {createPage} = actions + graphql(` + { + allMarkdownRemark( + limit: 1000 + filter: {frontmatter: {templateKey: {eq: "election-page-previous"}}} + ) { + edges { + node { + id + fields { + slug + } + frontmatter { + title + templateKey + electionId + electionYear + } + } + } + } + } + `).then(result => { + + console.log(`createPage res ${JSON.stringify(result)}`); + + if (result.errors) { + result.errors.forEach(e => console.error(e.toString())) + return Promise.reject(result.errors) + } + + const electionsPages = result.data.allMarkdownRemark.edges; + + electionsPages.forEach(edge => { + + const id = edge.node.id + const electionId = edge.node.frontmatter.electionId.toString(); + const electionYear = edge.node.frontmatter.electionYear; + const electionPath = `/election/${electionYear}-individual-director-election`; + console.log(`createPage processing edge ${JSON.stringify(edge)} path ${electionPath}`); + createPage({ + path: electionPath, + component: path.resolve( + `src/templates/${String(edge.node.frontmatter.templateKey)}.js` + ), + // additional data can be passed via context + context: { + id, + electionId + }, + }) + + }) + + }); + return graphql(` { - allMarkdownRemark(limit: 1000) { + allMarkdownRemark(limit: 1000, filter: {frontmatter: {electionId: {eq: null}}}) { edges { node { id @@ -490,7 +586,7 @@ exports.onCreateNode = ({node, actions, getNode}) => { // Extract the electionId from the frontmatter const { frontmatter } = node; - const electionId = frontmatter?.electionId; + const electionId = frontmatter?.electionId; // Find the corresponding election node based on electionId const electionNode = getNode(`${electionId}`); @@ -534,6 +630,7 @@ exports.onCreateNode = ({node, actions, getNode}) => { } } + exports.onCreateWebpackConfig = ({actions, plugins, loaders}) => { actions.setWebpackConfig({ resolve: { diff --git a/package.json b/package.json index 8db3043ae..7c5587477 100644 --- a/package.json +++ b/package.json @@ -23,31 +23,31 @@ "friendly-challenge": "^0.9.2", "full-schedule-widget": "^2.0.0", "gatsby": "4.24.0", + "gatsby-plugin-anchor-links": "^1.2.1", + "gatsby-plugin-feed": "^4.24.0", + "gatsby-plugin-google-analytics": "^4.24.0", + "gatsby-plugin-google-gtag": "^4.24.0", + "gatsby-plugin-google-tagmanager": "^4.24.0", "gatsby-plugin-image": "^2.10.1", + "gatsby-plugin-linkedin-insight": "^1.0.1", + "gatsby-plugin-manifest": "^4.24.0", "gatsby-plugin-netlify": "^4.1.0", "gatsby-plugin-netlify-cms": "^6.10.0", "gatsby-plugin-purgecss": "^6.1.1", "gatsby-plugin-react-helmet": "^5.10.0", + "gatsby-plugin-remove-serviceworker": "^1.0.0", "gatsby-plugin-sass": "^5.10.2", "gatsby-plugin-sharp": "^4.10.2", "gatsby-plugin-webfonts": "^2.2.1", + "gatsby-remark-classes": "^1.0.0", "gatsby-remark-copy-linked-files": "^5.10.0", "gatsby-remark-images": "^6.10.2", + "gatsby-remark-images-medium-zoom": "^1.7.0", "gatsby-remark-relative-images": "^2.0.2", "gatsby-source-filesystem": "^4.10.1", + "gatsby-source-medium": "^4.24.0", "gatsby-transformer-remark": "^5.10.2", "gatsby-transformer-sharp": "^4.10.0", - "gatsby-plugin-anchor-links": "^1.2.1", - "gatsby-plugin-feed": "^4.24.0", - "gatsby-plugin-google-analytics": "^4.24.0", - "gatsby-plugin-google-gtag": "^4.24.0", - "gatsby-plugin-google-tagmanager": "^4.24.0", - "gatsby-plugin-linkedin-insight": "^1.0.1", - "gatsby-plugin-manifest": "^4.24.0", - "gatsby-plugin-remove-serviceworker": "^1.0.0", - "gatsby-remark-classes": "^1.0.0", - "gatsby-remark-images-medium-zoom": "^1.7.0", - "gatsby-source-medium": "^4.24.0", "gsap": "^3.11.3", "history": "^4.10.1", "i18n-react": "^0.6.4", @@ -98,7 +98,8 @@ "uuid": "^7.0.0", "validator": "^9.4.1", "video.js": "^7.8.2", - "xmlhttprequest": "^1.8.0" + "xmlhttprequest": "^1.8.0", + "yaml": "^2.3.3" }, "devDependencies": { "@babel/core": "^7.17.8", diff --git a/src/content/settings.json b/src/content/settings.json index 56d9b0100..333d4ed15 100644 --- a/src/content/settings.json +++ b/src/content/settings.json @@ -1 +1 @@ -{"lastBuild":1673877303227} \ No newline at end of file +{"lastBuild":1697727997236} \ No newline at end of file diff --git a/src/pages/election/previous-elections/2022/candidates/gold/index.md b/src/pages/election/previous-elections/2022/candidates/gold/index.md deleted file mode 100644 index b2bf473e3..000000000 --- a/src/pages/election/previous-elections/2022/candidates/gold/index.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -templateKey: election-gold-candidates-page-previous -seo: - description: Individual Member Director elections for the 2022 Board of - Directors will be held *Monday January 10, 2022 to * *Friday January 18, - 2022*. Nominations occur between *November 15 and December 15, 2020*. - image: /img/OpenInfra-icon-white.jpg - title: 2022 Board Elections - Gold Candidates List - twitterUsername: "@OpenInfraDev" - url: https://openinfra.dev/election/2022-individual-director-election/candidates/gold -title: 2022 Board Elections - Gold Candidates List -electionId: 44599 -intro: - title: Gold Director Selector Candidates - description: - "The candidates on this list are the intended Gold Directors from the Gold Member companies who are - running for election as Gold Director Selectors." ---- diff --git a/src/pages/election/previous-elections/2022/candidates/index.md b/src/pages/election/previous-elections/2022/candidates/index.md deleted file mode 100644 index 34d734b4c..000000000 --- a/src/pages/election/previous-elections/2022/candidates/index.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -templateKey: election-candidates-page-previous -seo: - description: Individual Member Director elections for the 2022 Board of - Directors will be held *Monday January 10, 2022 to * *Friday January 18, - 2022*. Nominations occur between *November 15 and December 15, 2020*. - image: /img/OpenInfra-icon-white.jpg - title: 2022 Board Elections - Candidates List - twitterUsername: "@OpenInfraDev" - url: https://openinfra.dev/election/2022-individual-director-election/candidates -title: 2022 Board Elections - Candidates List -electionId: 44599 ---- diff --git a/src/pages/election/previous-elections/2023/candidates/gold/index.md b/src/pages/election/previous-elections/2023/candidates/gold/index.md deleted file mode 100644 index 423d8cd0e..000000000 --- a/src/pages/election/previous-elections/2023/candidates/gold/index.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -templateKey: election-gold-candidates-page-previous -seo: - description: Individual Member Director elections for the 2023 Board of - Directors will be held *Monday January 10, 2023 to * *Friday January 18, - 2023*. Nominations occur between *November 15 and December 15, 2020*. - image: /img/OpenInfra-icon-white.jpg - title: 2023 Board Elections - Gold Candidates List - twitterUsername: "@OpenInfraDev" - url: https://openinfra.dev/election/2023-individual-director-election/candidates/gold -title: 2023 Board Elections - Gold Candidates List -electionId: 44601 -intro: - title: Gold Director Selector Candidates - description: - "The candidates on this list are the intended Gold Directors from the Gold Member companies who are - running for election as Gold Director Selectors." ---- diff --git a/src/pages/election/previous-elections/2023/candidates/index.md b/src/pages/election/previous-elections/2023/candidates/index.md deleted file mode 100644 index fcefdc1cc..000000000 --- a/src/pages/election/previous-elections/2023/candidates/index.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -templateKey: election-candidates-page-previous -seo: - description: Individual Member Director elections for the 2023 Board of - Directors will be held *Monday January 10, 2023 to * *Friday January 18, - 2023*. Nominations occur between *November 15 and December 15, 2020*. - image: /img/OpenInfra-icon-white.jpg - title: 2023 Board Elections - Candidates List - twitterUsername: "@OpenInfraDev" - url: https://openinfra.dev/election/2023-individual-director-election/candidates -title: 2023 Board Elections - Candidates List -electionId: 44601 ---- diff --git a/src/pages/election/previous-elections/2023/index.md b/src/pages/election/previous-elections/2023/index.md deleted file mode 100644 index acf5a2c1a..000000000 --- a/src/pages/election/previous-elections/2023/index.md +++ /dev/null @@ -1,73 +0,0 @@ ---- -templateKey: election-page-previous -seo: - description: Individual Member Director elections for the 2022 Board of - Directors will be held *Monday January 10, 2022 to * *Friday January 18, - 2022*. Nominations occur between *November 15 and December 17, 2020*. - image: /img/OpenInfra-icon-white.jpg - title: 2022 Board Elections - twitterUsername: "@OpenInfraDev" - url: https://openinfra.dev/election/2023-individual-director-election -title: January 2023 Board Elections -electionId: 44601 ---- -#### About the Board - -The Board of Directors is ultimately legally responsible for the Foundation as a corporate entity. Board activities include oversight of the Foundation and its budget, strategy and goals according to the mission and responsibilities. The 2023 Board will be composed of 21 directors elected by the Individual Members (7), directors elected by the Gold Members (7) and directors appointed by the Platinum Members (7). - -As a true corporate board, Board members are responsible for fiduciary duties and adhering to an expanded code of conduct. All Directors need to attend regular quarterly Board meetings and any special meetings that come up. The meetings will be held in a way that allows for remote participation. - -#### Individual Member Director board seats - -- Individual Member Directors are there to represent the Individual Members of the Foundation -- These Directors act as the link between the thousands of members of the Foundation and the Board, and are not representing the companies for which they work - -When considering which candidates are best equipped to serve in this capacity, voters can review each candidate's application on the [candidate](/election/candidates) page prior to the start of the election. - -We ask that you give every candidate on the ballot careful consideration, and not base your vote **solely** on the fact that a particular candidate works for your employer. - -#### Code of Conduct Reminder - -Members should review and comply with the the [Community Code of Conduct](/legal/code-of-conduct), which states: "**Respect the election process**. Members should not attempt to manipulate election results. Open debate is welcome, but vote trading, ballot stuffing and other forms of abuse are not acceptable." - -#### Election Overview: - -Individual Member Director elections for the 2023 Board will be held **Monday January 9, 2023 to  Froday January 13, 2023**. You must have joined the Open Infrastructure Foundation as an Individual Member by Tuesday, July 17, 2022 to vote in the January 2023 election, per the bylaws. - -In accordance with the Open Infrastructure Foundation Bylaws, Board elections will take place online using a cumulative voting method. No more than three members of the Board may be affiliated with the same company, which means the candidate receiving the next highest votes would assume the seat if the election results in too many employees from a single company. Individual Member Directors elected in 2023 will serve a one-year term, but they may be nominated and re-elected indefinitely. The next election for Individual Member Directors will take place during January 2023. - -If you are an eligible voter, you will receive an email with a link to complete your ballot when the elections open on January 9, 2023. To ensure you receive the ballot, please log on to the website at [openinfra.dev/a/profile](/a/profile) and make sure your information is current. - -#### Nomination Process - -- Between November 14 and December 16, members can visit [this page](/a/community/members) and nominate candidates. -- Whenever a member is nominated, they will receive a notification (via the email listed in their member profile) -- Nominees must then log in and 1) accept the initial nomination, and 2) fill out the application -- Members who have received 10 nominations by December 16 must also complete the candidate application by December 21 in order to appear on the ballot - -#### Candidate Application - -All candidates must complete the application by December 21 in order to appear on the ballot. Questions: - -1. Bio -2. What is your relationship to OpenInfra, and why is its success important to you? What would you say is your biggest contribution to OpenInfra and/or OpenStack's success to date? -3. Describe your experience with other non profits or serving as a board member. How does your experience prepare you for the role of a board member? -4. What do you see as the Board's role in OpenInfra's success? -5. What do you think the top priority of the Board should be in 2023? - -A candidate's responses will appear on their public profile, as well as on [the candidates page](/election/candidates). - -#### Election Timeline Summary: - -- November 14: Individual Member nominations open, election details live on [openinfra.dev](/elections/current) -- December 16: Individual Member nominations close -- December 21: Deadline for Individual Member Nominees to complete application -- January 4: Gold Member Director Selector Election (1 day) -- January 9: Individual Member Elections open -- January 13: Individual Member Elections close - -Note that the Gold Member process will complete prior to the start of the Individual Member elections. Each Platinum Member has already appointed a Board Member, although they can change that appointment at any time during their membership. - -#### Questions? - -If you have any questions regarding membership, the nomination process, or any other matter regarding the elections, please contact the Secretary (Jonathan Bryce) at [secretary@openinfra.dev](mailto:secretary@openinfra.dev). Additionally, if you have an election problem to report, contact the election inspectors: [electioninspectors@openinfra.dev](mailto:electioninspectors@openinfra.dev) (led by Lisa Miller, one of the Foundation's corporate attorneys). diff --git a/src/pages/election/previous-elections/2022/index.md b/src/pages/election/previous-elections/44599.md similarity index 80% rename from src/pages/election/previous-elections/2022/index.md rename to src/pages/election/previous-elections/44599.md index 8a071ca29..1870f2152 100644 --- a/src/pages/election/previous-elections/2022/index.md +++ b/src/pages/election/previous-elections/44599.md @@ -1,5 +1,7 @@ --- templateKey: election-page-previous +electionYear: "2022" +electionId: 44599 seo: description: Individual Member Director elections for the 2022 Board of Directors will be held *Monday January 10, 2022 to * *Friday January 18, @@ -9,7 +11,6 @@ seo: twitterUsername: "@OpenInfraDev" url: https://openinfra.dev/election/2022-individual-director-election title: January 2022 Board Elections -electionId: 44599 --- #### About the Board @@ -22,25 +23,25 @@ As a true corporate board, Board members are responsible for fiduciary duties an - Individual Member Directors are there to represent the Individual Members of the Foundation - These Directors act as the link between the thousands of members of the Foundation and the Board, and are not representing the companies for which they work -When considering which candidates are best equipped to serve in this capacity, voters can review each candidate's application on the [candidate](/election/candidates) page prior to the start of the election. +When considering which candidates are best equipped to serve in this capacity, voters can review each candidate's application on the [candidate](/election/candidates) page prior to the start of the election. -We ask that you give every candidate on the ballot careful consideration, and not base your vote **solely** on the fact that a particular candidate works for your employer. +We ask that you give every candidate on the ballot careful consideration, and not base your vote **solely** on the fact that a particular candidate works for your employer. #### Code of Conduct Reminder -Members should review and comply with the the [Community Code of Conduct](/legal/code-of-conduct), which states: "**Respect the election process**. Members should not attempt to manipulate election results. Open debate is welcome, but vote trading, ballot stuffing and other forms of abuse are not acceptable." +Members should review and comply with the the [Community Code of Conduct](/legal/code-of-conduct), which states: "**Respect the election process**. Members should not attempt to manipulate election results. Open debate is welcome, but vote trading, ballot stuffing and other forms of abuse are not acceptable." #### Election Overview: -Individual Member Director elections for the 2022 Board will be held **Monday January 10, 2022 to  Friday January 14, 2022**. You must have joined the Open Infrastructure Foundation as an Individual Member by Tuesday, July 18, 2021 to vote in the January 2022 election, per the bylaws. +Individual Member Director elections for the 2022 Board will be held **Monday January 10, 2022 to Friday January 14, 2022**. You must have joined the Open Infrastructure Foundation as an Individual Member by Tuesday, July 18, 2021 to vote in the January 2022 election, per the bylaws. -In accordance with the Open Infrastructure Foundation Bylaws, Board elections will take place online using a cumulative voting method. No more than three members of the Board may be affiliated with the same company, which means the candidate receiving the next highest votes would assume the seat if the election results in too many employees from a single company. Individual Member Directors elected in 2022 will serve a one-year term, but they may be nominated and re-elected indefinitely. The next election for Individual Member Directors will take place during January 2023. +In accordance with the Open Infrastructure Foundation Bylaws, Board elections will take place online using a cumulative voting method. No more than three members of the Board may be affiliated with the same company, which means the candidate receiving the next highest votes would assume the seat if the election results in too many employees from a single company. Individual Member Directors elected in 2022 will serve a one-year term, but they may be nominated and re-elected indefinitely. The next election for Individual Member Directors will take place during January 2023. If you are an eligible voter, you will receive an email with a link to complete your ballot when the elections open on January 10, 2022. To ensure you receive the ballot, please log on to the website at [openinfra.dev/a/profile](/a/profile) and make sure your information is current. #### Nomination Process -- Between November 15 and December 17, members can visit [this page](/a/community/members) and nominate candidates. +- Between November 15 and December 17, members can visit [this page](/a/community/members) and nominate candidates. - Whenever a member is nominated, they will receive a notification (via the email listed in their member profile) - Nominees must then log in and 1) accept the initial nomination, and 2) fill out the application - Members who have received 10 nominations by December 17 must also complete the candidate application by December 17 in order to appear on the ballot @@ -55,7 +56,7 @@ All candidates must complete the application by December 17 in order to appear o 4. What do you see as the Board's role in OpenInfra's success? 5. What do you think the top priority of the Board should be in 2022? -A candidate's responses will appear on their public profile, as well as on [the candidates page](/election/candidates). +A candidate's responses will appear on their public profile, as well as on [the candidates page](/election/candidates). #### Election Timeline Summary: diff --git a/src/pages/election/previous-elections/44601.md b/src/pages/election/previous-elections/44601.md new file mode 100644 index 000000000..4a9b5f321 --- /dev/null +++ b/src/pages/election/previous-elections/44601.md @@ -0,0 +1,6 @@ +--- +templateKey: election-page-previous +electionYear: "2023" +electionId: 44601 +title: January 2023 Board Elections +--- diff --git a/src/pages/election/previous-elections/candidates/44599_candidates.md b/src/pages/election/previous-elections/candidates/44599_candidates.md new file mode 100644 index 000000000..b13be4fb2 --- /dev/null +++ b/src/pages/election/previous-elections/candidates/44599_candidates.md @@ -0,0 +1,5 @@ +--- +templateKey: election-candidates-page-previous +electionId: 44599 +title: January 2022 Board Elections Candidates +--- diff --git a/src/pages/election/previous-elections/candidates/44601_candidates.md b/src/pages/election/previous-elections/candidates/44601_candidates.md new file mode 100644 index 000000000..aada63f7b --- /dev/null +++ b/src/pages/election/previous-elections/candidates/44601_candidates.md @@ -0,0 +1,5 @@ +--- +templateKey: election-candidates-page-previous +electionId: 44601 +title: January 2023 Board Elections Candidates +--- diff --git a/src/pages/election/previous-elections/candidates/gold/44599_candidates.md b/src/pages/election/previous-elections/candidates/gold/44599_candidates.md new file mode 100644 index 000000000..cc0627bae --- /dev/null +++ b/src/pages/election/previous-elections/candidates/gold/44599_candidates.md @@ -0,0 +1,5 @@ +--- +templateKey: election-gold-candidates-page-previous +electionId: 44599 +title: January 2022 Board Elections Gold Candidates +--- diff --git a/src/pages/election/previous-elections/candidates/gold/44601_candidates.md b/src/pages/election/previous-elections/candidates/gold/44601_candidates.md new file mode 100644 index 000000000..bd073ae11 --- /dev/null +++ b/src/pages/election/previous-elections/candidates/gold/44601_candidates.md @@ -0,0 +1,5 @@ +--- +templateKey: election-gold-candidates-page-previous +electionId: 44601 +title: January 2023 Board Elections Gold Candidates +--- diff --git a/src/templates/election-page-previous.js b/src/templates/election-page-previous.js index c1f3f32e2..da205adfe 100644 --- a/src/templates/election-page-previous.js +++ b/src/templates/election-page-previous.js @@ -68,6 +68,7 @@ export const ElectionPagePreviousTemplate = ({ } const ElectionPagePrevious = ({ isLoggedUser, location, data }) => { + debugger; const { markdownRemark: post, electionData } = data; return ( diff --git a/static/admin/config.yml b/static/admin/config.yml index 34ab18776..61991dff9 100644 --- a/static/admin/config.yml +++ b/static/admin/config.yml @@ -11,6 +11,7 @@ backend: media_folder: static/img public_folder: /img +local_backend: true collections: - name: "authors" @@ -1203,3 +1204,57 @@ collections: - { label: "Title", name: title, widget: string } - { label: "Sub Title", name: subTitle, widget: string } - { label: "Body", name: body, widget: markdown } + - name: "previous-election-pages" + label: "Previous Election Main Pages" + folder: "/src/pages/election/previous-elections" + create: true + editor: + preview: false + identifier_field: title + fields: + - { label: "Election Id", name: electionId, widget: string, required: true} + - { label: SEO, name: seo, widget: object, fields: [ + { label: "Title", name: "title", widget: string }, + { label: "Description", name: "description", widget: string }, + { label: "Url", name: "url", widget: string }, + { label: "Image", name: "image", widget: image }, + { label: "Twitter Username", name: "twitterUsername", widget: string }, + ] } + - { label: "Title", name: title, widget: string, required: true } + - { label: "Body", name: body, widget: markdown, required: true } + - name: "previous-election-page-candidates" + label: "Previous Election Candidate Pages" + folder: "/src/pages/election/previous-elections/candidates" + create: true + editor: + preview: false + identifier_field: title + fields: + - { label: "Election Id", name: electionId, widget: string, required: true } + - { label: SEO, name: seo, widget: object, fields: [ + { label: "Title", name: "title", widget: string }, + { label: "Description", name: "description", widget: string }, + { label: "Url", name: "url", widget: string }, + { label: "Image", name: "image", widget: image }, + { label: "Twitter Username", name: "twitterUsername", widget: string }, + ] } + - { label: "Title", name: title, widget: string, required: true } + - { label: "Body", name: body, widget: markdown, required: true } + - name: "previous-election-page-gold-candidates" + label: "Previous Election Gold Candidates Pages" + folder: "/src/pages/election/previous-elections/candidates/gold" + create: true + editor: + preview: false + identifier_field: title + fields: + - { label: "Election Id", name: electionId, widget: string, required: true } + - { label: SEO, name: seo, widget: object, fields: [ + { label: "Title", name: "title", widget: string }, + { label: "Description", name: "description", widget: string }, + { label: "Url", name: "url", widget: string }, + { label: "Image", name: "image", widget: image }, + { label: "Twitter Username", name: "twitterUsername", widget: string }, + ] } + - { label: "Title", name: title, widget: string, required: true } + - { label: "Body", name: body, widget: markdown, required: true } diff --git a/yarn.lock b/yarn.lock index 36b96d75e..9b18d8e6a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -21947,6 +21947,11 @@ yaml@^1.7.2, yaml@^1.8.3: dependencies: "@babel/runtime" "^7.9.2" +yaml@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.3.tgz#01f6d18ef036446340007db8e016810e5d64aad9" + integrity sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ== + yargs-parser@^18.1.2: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" From bc2e5f2276ceca5c034f1b59d9ec8472aefcaab0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Castillo?= Date: Fri, 20 Oct 2023 02:39:49 -0300 Subject: [PATCH 10/31] Adjusting elections qty to generate pages, add SEO to markdown files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Castillo --- gatsby-node.js | 119 ++++++++++-------- src/pages/election/candidates/gold/index.md | 8 +- src/pages/election/candidates/index.md | 8 +- src/pages/election/index.md | 8 +- .../election/previous-elections/44599.md | 8 +- .../election/previous-elections/44601.md | 66 ++++++++++ .../candidates/44599_candidates.md | 7 ++ .../candidates/44601_candidates.md | 7 ++ .../candidates/gold/44599_candidates.md | 5 - .../candidates/gold/44599_gold_candidates.md | 12 ++ .../candidates/gold/44601_candidates.md | 5 - .../candidates/gold/44601_gold_candidates.md | 12 ++ .../election-gold-candidates-page-previous.js | 14 ++- src/templates/election-page-previous.js | 1 - static/admin/config.yml | 4 - 15 files changed, 194 insertions(+), 90 deletions(-) delete mode 100644 src/pages/election/previous-elections/candidates/gold/44599_candidates.md create mode 100644 src/pages/election/previous-elections/candidates/gold/44599_gold_candidates.md delete mode 100644 src/pages/election/previous-elections/candidates/gold/44601_candidates.md create mode 100644 src/pages/election/previous-elections/candidates/gold/44601_gold_candidates.md diff --git a/gatsby-node.js b/gatsby-node.js index 70ccdb070..ee04624e7 100644 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -9,6 +9,11 @@ const {ClientCredentials} = require('simple-oauth2'); const yaml = require("yaml") const moment = require("moment-timezone"); const prevElectionsBasePath = 'src/pages/election/previous-elections'; +const electionsSinceYear = 2023; +const currentYear = new Date().getFullYear(); +const minimunElectionsToShow = 2; + +const electionsToShow = (currentYear - electionsSinceYear) + minimunElectionsToShow; const myEnv = require("dotenv").config({ path: `.env`, @@ -111,13 +116,18 @@ const SSR_getSponsoredProjects = async (baseUrl) => { } const SSR_getPreviousElections = async (baseUrl, accessToken, page = 1) => { + const currentDate = parseInt(Date.now()/1000); + // minimun per page is 5 + const perPage = electionsToShow > 5 ? electionsToShow : 5; return await axios.get( `${baseUrl}/api/v1/elections/`, { params: { access_token: accessToken, - per_page: 50, page: page, + per_page: perPage, + filter: `closes<${currentDate}`, + order: '-closes' } }).then((response) => response.data) .catch(e => console.log('ERROR: ', e)); @@ -244,10 +254,10 @@ exports.sourceNodes = async ({ actions, createNodeId, createContentDigest }) => const accessToken = await getAccessToken(config, buildScopes).then(({token}) => token.access_token).catch(e => console.log('Access Token error', e)); // data for previous electionsfilePath - const previousElections = await SSR_getPreviousElections(apiBaseUrl, accessToken); - if (previousElections) { - // get last 2 past elections - const lastElections = previousElections.data.filter(e => e.status === "Closed").slice(-2); + const previousElections = await SSR_getPreviousElections(apiBaseUrl, accessToken) + console.log('check previous election...', previousElections) + const lastElections = previousElections.data.slice(0, electionsToShow); + if (lastElections && lastElections.length > 0) { let candidates = []; let goldCandidates = []; // create paths @@ -262,10 +272,27 @@ exports.sourceNodes = async ({ actions, createNodeId, createContentDigest }) => delete post.body return } + + const seoObject = { + image: "/img/OpenInfra-icon-white.jpg", + twitterUsername: "@OpenInfraDev" + } + const electionYear = moment(election.closes * 1000).utc().format('YYYY'); // create MD file using yaml ... if(!fs.existsSync(`${prevElectionsBasePath}/${election.id}.md`)) - fs.writeFileSync(`${prevElectionsBasePath}/${election.id}.md`, `---\n${yaml.stringify({templateKey: 'election-page-previous',electionYear: electionYear,electionId:election.id, title: election.name})}---\n`, 'utf8', function (err) { + fs.writeFileSync(`${prevElectionsBasePath}/${election.id}.md`, `---\n${yaml.stringify({ + templateKey: 'election-page-previous', + electionYear:electionYear, + electionId:election.id, + title:election.name, + seo: { + ...seoObject, + title: election.name, + url: `https://openinfra.dev/election/${electionYear}-individual-director-election`, + description: `Individual Member Director elections for the ${electionYear} Board of Directors` + } + })}---\n`, 'utf8', function (err) { if (err) { console.log(err); } @@ -273,14 +300,34 @@ exports.sourceNodes = async ({ actions, createNodeId, createContentDigest }) => // create MD file using yaml ... if(!fs.existsSync(`${prevElectionsBasePath}/candidates/${election.id}_candidates.md`)) - fs.writeFileSync(`${prevElectionsBasePath}/candidates/${election.id}_candidates.md`, `---\n${yaml.stringify({templateKey: 'election-candidates-page-previous', electionId:election.id, title: election.name + ' Candidates'})}---\n`, 'utf8', function (err) { + fs.writeFileSync(`${prevElectionsBasePath}/candidates/${election.id}_candidates.md`, `---\n${yaml.stringify({ + templateKey: 'election-candidates-page-previous', + electionYear:electionYear, + electionId:election.id, + title:election.name + ' Candidates', + seo: { + ...seoObject, + title: election.name, + url: `https://openinfra.dev/election/${electionYear}-individual-director-election/candidates`, + description: `Individual Member Director elections for the ${electionYear} Board of Directors` + }})}---\n`, 'utf8', function (err) { if (err) { console.log(err); } }); - if(!fs.existsSync(`${prevElectionsBasePath}/candidates/gold/${election.id}_candidates.md`)) - fs.writeFileSync(`${prevElectionsBasePath}/candidates/gold/${election.id}_candidates.md`, `---\n${yaml.stringify({templateKey: 'election-gold-candidates-page-previous', electionId:election.id, title: election.name + ' Gold Candidates'})}---\n`, 'utf8', function (err) { + if(!fs.existsSync(`${prevElectionsBasePath}/candidates/gold/${election.id}_gold_candidates.md`)) + fs.writeFileSync(`${prevElectionsBasePath}/candidates/gold/${election.id}_gold_candidates.md`, `---\n${yaml.stringify({ + templateKey: 'election-gold-candidates-page-previous', + electionYear:electionYear, + electionId:election.id, + title:election.name + ' Gold Candidates', + seo: { + ...seoObject, + title: election.name, + url: `https://openinfra.dev/election/${electionYear}-individual-director-election/candidates/gold`, + description: `Individual Member Director elections for the ${electionYear} Board of Directors` + }})}---\n`, 'utf8', function (err) { if (err) { console.log(err); } @@ -417,14 +464,14 @@ exports.createSchemaCustomization = ({actions}) => { createTypes(typeDefs) } -exports.createPages = ({actions, graphql}) => { +exports.createPages = async ({actions, graphql}) => { const {createPage} = actions - graphql(` + await graphql(` { - allMarkdownRemark( + allMarkdownRemark( limit: 1000 - filter: {frontmatter: {templateKey: {eq: "election-page-previous"}}} + filter: {frontmatter: {templateKey: {in: ["election-page-previous", "election-candidates-page-previous", "election-gold-candidates-page-previous"]}}} ) { edges { node { @@ -455,10 +502,14 @@ exports.createPages = ({actions, graphql}) => { electionsPages.forEach(edge => { - const id = edge.node.id + const id = edge.node.id; const electionId = edge.node.frontmatter.electionId.toString(); const electionYear = edge.node.frontmatter.electionYear; - const electionPath = `/election/${electionYear}-individual-director-election`; + const electionPath = edge.node.frontmatter.templateKey === 'election-page-previous' ? + `/election/${electionYear}-individual-director-election`: + edge.node.frontmatter.templateKey === 'election-candidates-page-previous' ? + `/election/${electionYear}-individual-director-election/candidates`: + `/election/${electionYear}-individual-director-election/candidates/gold`; console.log(`createPage processing edge ${JSON.stringify(edge)} path ${electionPath}`); createPage({ path: electionPath, @@ -583,44 +634,6 @@ exports.onCreateNode = ({node, actions, getNode}) => { */ // fmImagesToRelative(node); // convert image paths for gatsby images if (node.internal.type === `MarkdownRemark`) { - - // Extract the electionId from the frontmatter - const { frontmatter } = node; - const electionId = frontmatter?.electionId; - - // Find the corresponding election node based on electionId - const electionNode = getNode(`${electionId}`); - - if (electionNode) { - // Update the frontmatter properties based on the election node - createNodeField({ - node, - name: 'opens', - value: electionNode.opens, - }); - - createNodeField({ - node, - name: 'closes', - value: electionNode.closes, - }); - createNodeField({ - node, - name: 'nominationOpens', - value: electionNode.nomination_opens - }); - createNodeField({ - node, - name: 'nominationCloses', - value: electionNode.nomination_closes - }); - createNodeField({ - node, - name: 'nominationApplicationDeadline', - value: electionNode.nomination_application_deadline - }); - } - const value = createFilePath({node, getNode}) createNodeField({ name: `slug`, diff --git a/src/pages/election/candidates/gold/index.md b/src/pages/election/candidates/gold/index.md index 14606e236..6f392ee62 100644 --- a/src/pages/election/candidates/gold/index.md +++ b/src/pages/election/candidates/gold/index.md @@ -7,19 +7,19 @@ seo: image: /img/OpenInfra-icon-white.jpg title: 2023 Board Elections - Gold Candidates List twitterUsername: "@OpenInfraDev" - url: https://openinfra.dev/election/2023-individual-director-election/candidates/gold + url: https://openinfra.dev/election/individual-director-election/candidates/gold title: 2023 Board Elections - Gold Candidates List menu: - text: ELECTION DETAILS - link: /election/2023-individual-director-election + link: /election/individual-director-election - text: SEE THE CANDIDATES - link: /election/2023-individual-director-election/candidates + link: /election/individual-director-election/candidates - text: NOMINATE A MEMBER link: /a/community/members - text: BE A CANDIDATE link: /profile - text: GOLD MEMBER ELECTION CANDIDATES - link: /election/2023-individual-director-election/candidates/gold + link: /election/individual-director-election/candidates/gold - text: CODE OF CONDUCT link: ../../../../legal/code-of-conduct - text: REPORT A BUG diff --git a/src/pages/election/candidates/index.md b/src/pages/election/candidates/index.md index 8312b269b..11a8668f8 100644 --- a/src/pages/election/candidates/index.md +++ b/src/pages/election/candidates/index.md @@ -7,19 +7,19 @@ seo: image: /img/OpenInfra-icon-white.jpg title: 2023 Board Elections - Candidates List twitterUsername: "@OpenInfraDev" - url: https://openinfra.dev/election/2023-individual-director-election/candidates + url: https://openinfra.dev/election/individual-director-election/candidates title: 2023 Board Elections - Candidates List menu: - text: ELECTION DETAILS - link: /election/2023-individual-director-election + link: /election/individual-director-election - text: SEE THE CANDIDATES - link: /election/2023-individual-director-election/candidates + link: /election/individual-director-election/candidates - text: NOMINATE A MEMBER link: /a/community/members - text: BE A CANDIDATE link: /profile - text: GOLD MEMBER ELECTION CANDIDATES - link: /election/2023-individual-director-election/candidates/gold + link: /election/individual-director-election/candidates/gold - text: CODE OF CONDUCT link: ../../../legal/code-of-conduct - text: REPORT A BUG diff --git a/src/pages/election/index.md b/src/pages/election/index.md index 7da3090d7..47a08d835 100644 --- a/src/pages/election/index.md +++ b/src/pages/election/index.md @@ -7,20 +7,20 @@ seo: image: /img/OpenInfra-icon-white.jpg title: 2023 Board Elections twitterUsername: "@OpenInfraDev" - url: https://openinfra.dev/election/2024-individual-director-election + url: https://openinfra.dev/election/individual-director-election title: January 2023 Board Elections subTitle: Individual and Gold Member elections menu: - text: ELECTION DETAILS - link: /election/2023-individual-director-election + link: /election/individual-director-election - text: SEE THE CANDIDATES - link: /election/2023-individual-director-election/candidates + link: /election/individual-director-election/candidates - text: NOMINATE A MEMBER link: /a/community/members - text: BE A CANDIDATE link: /profile - text: GOLD MEMBER ELECTION CANDIDATES - link: /election/2023-individual-director-election/candidates/gold + link: /election/individual-director-election/candidates/gold - text: CODE OF CONDUCT link: ../../legal/code-of-conduct - text: REPORT A BUG diff --git a/src/pages/election/previous-elections/44599.md b/src/pages/election/previous-elections/44599.md index 1870f2152..ec206bb5c 100644 --- a/src/pages/election/previous-elections/44599.md +++ b/src/pages/election/previous-elections/44599.md @@ -2,15 +2,13 @@ templateKey: election-page-previous electionYear: "2022" electionId: 44599 +title: January 2022 Board Elections seo: - description: Individual Member Director elections for the 2022 Board of - Directors will be held *Monday January 10, 2022 to * *Friday January 18, - 2022*. Nominations occur between *November 15 and December 17, 2020*. image: /img/OpenInfra-icon-white.jpg - title: 2022 Board Elections twitterUsername: "@OpenInfraDev" + title: January 2022 Board Elections url: https://openinfra.dev/election/2022-individual-director-election -title: January 2022 Board Elections + description: Individual Member Director elections for the 2022 Board of Directors --- #### About the Board diff --git a/src/pages/election/previous-elections/44601.md b/src/pages/election/previous-elections/44601.md index 4a9b5f321..8b7e5db83 100644 --- a/src/pages/election/previous-elections/44601.md +++ b/src/pages/election/previous-elections/44601.md @@ -3,4 +3,70 @@ templateKey: election-page-previous electionYear: "2023" electionId: 44601 title: January 2023 Board Elections +seo: + image: /img/OpenInfra-icon-white.jpg + twitterUsername: "@OpenInfraDev" + title: January 2023 Board Elections + url: https://openinfra.dev/election/2023-individual-director-election + description: Individual Member Director elections for the 2023 Board of Directors --- +#### About the Board + +The Board of Directors is ultimately legally responsible for the Foundation as a corporate entity. Board activities include oversight of the Foundation and its budget, strategy and goals according to the mission and responsibilities. The 2023 Board will be composed of 21 directors elected by the Individual Members (7), directors elected by the Gold Members (7) and directors appointed by the Platinum Members (7). + +As a true corporate board, Board members are responsible for fiduciary duties and adhering to an expanded code of conduct. All Directors need to attend regular quarterly Board meetings and any special meetings that come up. The meetings will be held in a way that allows for remote participation. + +#### Individual Member Director board seats + +- Individual Member Directors are there to represent the Individual Members of the Foundation +- These Directors act as the link between the thousands of members of the Foundation and the Board, and are not representing the companies for which they work + +When considering which candidates are best equipped to serve in this capacity, voters can review each candidate's application on the [candidate](/election/candidates) page prior to the start of the election. + +We ask that you give every candidate on the ballot careful consideration, and not base your vote **solely** on the fact that a particular candidate works for your employer. + +#### Code of Conduct Reminder + +Members should review and comply with the the [Community Code of Conduct](/legal/code-of-conduct), which states: "**Respect the election process**. Members should not attempt to manipulate election results. Open debate is welcome, but vote trading, ballot stuffing and other forms of abuse are not acceptable." + +#### Election Overview: + +Individual Member Director elections for the 2023 Board will be held **Monday January 9, 2023 to  Froday January 13, 2023**. You must have joined the Open Infrastructure Foundation as an Individual Member by Tuesday, July 17, 2022 to vote in the January 2023 election, per the bylaws. + +In accordance with the Open Infrastructure Foundation Bylaws, Board elections will take place online using a cumulative voting method. No more than three members of the Board may be affiliated with the same company, which means the candidate receiving the next highest votes would assume the seat if the election results in too many employees from a single company. Individual Member Directors elected in 2023 will serve a one-year term, but they may be nominated and re-elected indefinitely. The next election for Individual Member Directors will take place during January 2023. + +If you are an eligible voter, you will receive an email with a link to complete your ballot when the elections open on January 9, 2023. To ensure you receive the ballot, please log on to the website at [openinfra.dev/a/profile](/a/profile) and make sure your information is current. + +#### Nomination Process + +- Between November 14 and December 16, members can visit [this page](/a/community/members) and nominate candidates. +- Whenever a member is nominated, they will receive a notification (via the email listed in their member profile) +- Nominees must then log in and 1) accept the initial nomination, and 2) fill out the application +- Members who have received 10 nominations by December 16 must also complete the candidate application by December 21 in order to appear on the ballot + +#### Candidate Application + +All candidates must complete the application by December 21 in order to appear on the ballot. Questions: + +1. Bio +2. What is your relationship to OpenInfra, and why is its success important to you? What would you say is your biggest contribution to OpenInfra and/or OpenStack's success to date? +3. Describe your experience with other non profits or serving as a board member. How does your experience prepare you for the role of a board member? +4. What do you see as the Board's role in OpenInfra's success? +5. What do you think the top priority of the Board should be in 2023? + +A candidate's responses will appear on their public profile, as well as on [the candidates page](/election/candidates). + +#### Election Timeline Summary: + +- November 14: Individual Member nominations open, election details live on [openinfra.dev](/elections/current) +- December 16: Individual Member nominations close +- December 21: Deadline for Individual Member Nominees to complete application +- January 4: Gold Member Director Selector Election (1 day) +- January 9: Individual Member Elections open +- January 13: Individual Member Elections close + +Note that the Gold Member process will complete prior to the start of the Individual Member elections. Each Platinum Member has already appointed a Board Member, although they can change that appointment at any time during their membership. + +#### Questions? + +If you have any questions regarding membership, the nomination process, or any other matter regarding the elections, please contact the Secretary (Jonathan Bryce) at [secretary@openinfra.dev](mailto:secretary@openinfra.dev). Additionally, if you have an election problem to report, contact the election inspectors: [electioninspectors@openinfra.dev](mailto:electioninspectors@openinfra.dev) (led by Lisa Miller, one of the Foundation's corporate attorneys). diff --git a/src/pages/election/previous-elections/candidates/44599_candidates.md b/src/pages/election/previous-elections/candidates/44599_candidates.md index b13be4fb2..d9b7db79b 100644 --- a/src/pages/election/previous-elections/candidates/44599_candidates.md +++ b/src/pages/election/previous-elections/candidates/44599_candidates.md @@ -1,5 +1,12 @@ --- templateKey: election-candidates-page-previous +electionYear: "2022" electionId: 44599 title: January 2022 Board Elections Candidates +seo: + image: /img/OpenInfra-icon-white.jpg + twitterUsername: "@OpenInfraDev" + title: January 2022 Board Elections + url: https://openinfra.dev/election/2022-individual-director-election/candidates + description: Individual Member Director elections for the 2022 Board of Directors --- diff --git a/src/pages/election/previous-elections/candidates/44601_candidates.md b/src/pages/election/previous-elections/candidates/44601_candidates.md index aada63f7b..645c8e694 100644 --- a/src/pages/election/previous-elections/candidates/44601_candidates.md +++ b/src/pages/election/previous-elections/candidates/44601_candidates.md @@ -1,5 +1,12 @@ --- templateKey: election-candidates-page-previous +electionYear: "2023" electionId: 44601 title: January 2023 Board Elections Candidates +seo: + image: /img/OpenInfra-icon-white.jpg + twitterUsername: "@OpenInfraDev" + title: January 2023 Board Elections + url: https://openinfra.dev/election/2023-individual-director-election/candidates + description: Individual Member Director elections for the 2023 Board of Directors --- diff --git a/src/pages/election/previous-elections/candidates/gold/44599_candidates.md b/src/pages/election/previous-elections/candidates/gold/44599_candidates.md deleted file mode 100644 index cc0627bae..000000000 --- a/src/pages/election/previous-elections/candidates/gold/44599_candidates.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -templateKey: election-gold-candidates-page-previous -electionId: 44599 -title: January 2022 Board Elections Gold Candidates ---- diff --git a/src/pages/election/previous-elections/candidates/gold/44599_gold_candidates.md b/src/pages/election/previous-elections/candidates/gold/44599_gold_candidates.md new file mode 100644 index 000000000..93df6f6b2 --- /dev/null +++ b/src/pages/election/previous-elections/candidates/gold/44599_gold_candidates.md @@ -0,0 +1,12 @@ +--- +templateKey: election-gold-candidates-page-previous +electionYear: "2022" +electionId: 44599 +title: January 2022 Board Elections Gold Candidates +seo: + image: /img/OpenInfra-icon-white.jpg + twitterUsername: "@OpenInfraDev" + title: January 2022 Board Elections + url: https://openinfra.dev/election/2022-individual-director-election/candidates/gold + description: Individual Member Director elections for the 2022 Board of Directors +--- diff --git a/src/pages/election/previous-elections/candidates/gold/44601_candidates.md b/src/pages/election/previous-elections/candidates/gold/44601_candidates.md deleted file mode 100644 index bd073ae11..000000000 --- a/src/pages/election/previous-elections/candidates/gold/44601_candidates.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -templateKey: election-gold-candidates-page-previous -electionId: 44601 -title: January 2023 Board Elections Gold Candidates ---- diff --git a/src/pages/election/previous-elections/candidates/gold/44601_gold_candidates.md b/src/pages/election/previous-elections/candidates/gold/44601_gold_candidates.md new file mode 100644 index 000000000..79ad5e86c --- /dev/null +++ b/src/pages/election/previous-elections/candidates/gold/44601_gold_candidates.md @@ -0,0 +1,12 @@ +--- +templateKey: election-gold-candidates-page-previous +electionYear: "2023" +electionId: 44601 +title: January 2023 Board Elections Gold Candidates +seo: + image: /img/OpenInfra-icon-white.jpg + twitterUsername: "@OpenInfraDev" + title: January 2023 Board Elections + url: https://openinfra.dev/election/2023-individual-director-election/candidates/gold + description: Individual Member Director elections for the 2023 Board of Directors +--- diff --git a/src/templates/election-gold-candidates-page-previous.js b/src/templates/election-gold-candidates-page-previous.js index d13221777..533e59309 100644 --- a/src/templates/election-gold-candidates-page-previous.js +++ b/src/templates/election-gold-candidates-page-previous.js @@ -9,7 +9,7 @@ import Navbar from "../components/Navbar"; import Header from "../components/Header"; import SEO from "../components/SEO"; -const ElectionGoldCandidatesPagePreviousTemplate = ({ intro, goldCandidates, electionData }) => { +const ElectionGoldCandidatesPagePreviousTemplate = ({ goldCandidates, electionData }) => { const {closes} = electionData; @@ -31,8 +31,11 @@ const ElectionGoldCandidatesPagePreviousTemplate = ({ intro, goldCandidates, ele
-

{intro.title}

- +

Gold Director Selector Candidates

+ + "The candidates on this list are the intended Gold Directors from the Gold + Member companies who are running for election as Gold Director Selectors." +
{goldCandidates.map((candidate, index) => { @@ -70,11 +73,13 @@ const ElectionGoldCandidatesPagePrevious = ({ data, isLoggedUser, location }) => const { markdownRemark: post, allGoldCandidateData: { edges: candidateArray }, electionData } = data; + console.log('data', data); + const goldCandidates = candidateArray.map(c => c.node); return ( - +
@@ -85,7 +90,6 @@ const ElectionGoldCandidatesPagePrevious = ({ data, isLoggedUser, location }) => location={location} goldCandidates={goldCandidates} electionData={electionData} - intro={post.frontmatter.intro} />
diff --git a/src/templates/election-page-previous.js b/src/templates/election-page-previous.js index da205adfe..c1f3f32e2 100644 --- a/src/templates/election-page-previous.js +++ b/src/templates/election-page-previous.js @@ -68,7 +68,6 @@ export const ElectionPagePreviousTemplate = ({ } const ElectionPagePrevious = ({ isLoggedUser, location, data }) => { - debugger; const { markdownRemark: post, electionData } = data; return ( diff --git a/static/admin/config.yml b/static/admin/config.yml index 61991dff9..899f599da 100644 --- a/static/admin/config.yml +++ b/static/admin/config.yml @@ -11,7 +11,6 @@ backend: media_folder: static/img public_folder: /img -local_backend: true collections: - name: "authors" @@ -1207,7 +1206,6 @@ collections: - name: "previous-election-pages" label: "Previous Election Main Pages" folder: "/src/pages/election/previous-elections" - create: true editor: preview: false identifier_field: title @@ -1225,7 +1223,6 @@ collections: - name: "previous-election-page-candidates" label: "Previous Election Candidate Pages" folder: "/src/pages/election/previous-elections/candidates" - create: true editor: preview: false identifier_field: title @@ -1243,7 +1240,6 @@ collections: - name: "previous-election-page-gold-candidates" label: "Previous Election Gold Candidates Pages" folder: "/src/pages/election/previous-elections/candidates/gold" - create: true editor: preview: false identifier_field: title From 9d8318c1edcbb35b5c3e723a44aa2fc82ec25569 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Castillo?= Date: Fri, 20 Oct 2023 02:41:32 -0300 Subject: [PATCH 11/31] Remove console log on election gold previos page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Castillo --- src/templates/election-gold-candidates-page-previous.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/templates/election-gold-candidates-page-previous.js b/src/templates/election-gold-candidates-page-previous.js index 533e59309..85d53d7b4 100644 --- a/src/templates/election-gold-candidates-page-previous.js +++ b/src/templates/election-gold-candidates-page-previous.js @@ -73,13 +73,11 @@ const ElectionGoldCandidatesPagePrevious = ({ data, isLoggedUser, location }) => const { markdownRemark: post, allGoldCandidateData: { edges: candidateArray }, electionData } = data; - console.log('data', data); - const goldCandidates = candidateArray.map(c => c.node); return ( - +
From 88957f932dc36e34c1c26c62f6a8db1652f8655f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Castillo?= Date: Fri, 20 Oct 2023 10:56:25 -0300 Subject: [PATCH 12/31] Rollback current election .md files, adjust env variables and cms --- gatsby-node.js | 23 +++++++++------------ netlify.toml | 2 ++ src/pages/election/candidates/gold/index.md | 8 +++---- src/pages/election/candidates/index.md | 8 +++---- src/pages/election/index.md | 8 +++---- static/admin/config.yml | 6 +++--- 6 files changed, 27 insertions(+), 28 deletions(-) diff --git a/gatsby-node.js b/gatsby-node.js index ee04624e7..7b90d872e 100644 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -9,9 +9,9 @@ const {ClientCredentials} = require('simple-oauth2'); const yaml = require("yaml") const moment = require("moment-timezone"); const prevElectionsBasePath = 'src/pages/election/previous-elections'; -const electionsSinceYear = 2023; const currentYear = new Date().getFullYear(); -const minimunElectionsToShow = 2; +const electionsSinceYear = process.env.GATSBY_ELECTION_SINCE_YEAR; +const minimunElectionsToShow = process.env.GATSBY_ELECTION_TO_SHOW; const electionsToShow = (currentYear - electionsSinceYear) + minimunElectionsToShow; @@ -226,7 +226,7 @@ exports.onPreBootstrap = async () => { const sponsoredProjects = await SSR_getSponsoredProjects(apiBaseUrl); if (sponsoredProjects) { writeToJson('src/content/sponsored-projects.json', sponsoredProjects); - } + } } exports.sourceNodes = async ({ actions, createNodeId, createContentDigest }) => { @@ -304,7 +304,7 @@ exports.sourceNodes = async ({ actions, createNodeId, createContentDigest }) => templateKey: 'election-candidates-page-previous', electionYear:electionYear, electionId:election.id, - title:election.name + ' Candidates', + title:`${election.name} Candidates`, seo: { ...seoObject, title: election.name, @@ -320,8 +320,8 @@ exports.sourceNodes = async ({ actions, createNodeId, createContentDigest }) => fs.writeFileSync(`${prevElectionsBasePath}/candidates/gold/${election.id}_gold_candidates.md`, `---\n${yaml.stringify({ templateKey: 'election-gold-candidates-page-previous', electionYear:electionYear, - electionId:election.id, - title:election.name + ' Gold Candidates', + electionId:election.id, + title:`${election.name} Gold Candidates`, seo: { ...seoObject, title: election.name, @@ -464,10 +464,10 @@ exports.createSchemaCustomization = ({actions}) => { createTypes(typeDefs) } -exports.createPages = async ({actions, graphql}) => { +exports.createPages = ({actions, graphql}) => { const {createPage} = actions - await graphql(` + graphql(` { allMarkdownRemark( limit: 1000 @@ -543,7 +543,6 @@ exports.createPages = async ({actions, graphql}) => { title author templateKey - electionId seo { url } @@ -564,8 +563,7 @@ exports.createPages = async ({actions, graphql}) => { pages.forEach(edge => { if (edge.node.frontmatter.templateKey) { const id = edge.node.id - const SEO = edge.node.frontmatter.seo ? edge.node.frontmatter.seo : null; - const electionId = edge.node.frontmatter.electionId ? `${edge.node.frontmatter.electionId}` : null + const SEO = edge.node.frontmatter.seo ? edge.node.frontmatter.seo : null; const slug = SEO && SEO.url ? SEO.url.replace('https://osf.dev', '').replace('https://openinfra.dev', '') : edge.node.fields.slug; createPage({ path: slug, @@ -575,8 +573,7 @@ exports.createPages = async ({actions, graphql}) => { ), // additional data can be passed via context context: { - id, - electionId + id }, }) } diff --git a/netlify.toml b/netlify.toml index 98af25e33..9c2bca5eb 100644 --- a/netlify.toml +++ b/netlify.toml @@ -25,6 +25,8 @@ GATSBY_SF_OID = "00DG0000000lhAF" GATSBY_FRIENDLY_CAPTCHA_SITE_KEY = "FCMLO9OV7A0PENUN" GATSBY_FRIENDLY_CAPTCHA_API_KEY = "A1DIAJU833CPQ4P1HU2CMI75PIOMC3LPG4BG12RN93R1PC3QH41FNNQ4MM" + GATSBY_ELECTION_SINCE_YEAR="2023" + GATSBY_ELECTION_TO_SHOW="2" [[headers]] for = "/*" [headers.values] diff --git a/src/pages/election/candidates/gold/index.md b/src/pages/election/candidates/gold/index.md index 6f392ee62..14606e236 100644 --- a/src/pages/election/candidates/gold/index.md +++ b/src/pages/election/candidates/gold/index.md @@ -7,19 +7,19 @@ seo: image: /img/OpenInfra-icon-white.jpg title: 2023 Board Elections - Gold Candidates List twitterUsername: "@OpenInfraDev" - url: https://openinfra.dev/election/individual-director-election/candidates/gold + url: https://openinfra.dev/election/2023-individual-director-election/candidates/gold title: 2023 Board Elections - Gold Candidates List menu: - text: ELECTION DETAILS - link: /election/individual-director-election + link: /election/2023-individual-director-election - text: SEE THE CANDIDATES - link: /election/individual-director-election/candidates + link: /election/2023-individual-director-election/candidates - text: NOMINATE A MEMBER link: /a/community/members - text: BE A CANDIDATE link: /profile - text: GOLD MEMBER ELECTION CANDIDATES - link: /election/individual-director-election/candidates/gold + link: /election/2023-individual-director-election/candidates/gold - text: CODE OF CONDUCT link: ../../../../legal/code-of-conduct - text: REPORT A BUG diff --git a/src/pages/election/candidates/index.md b/src/pages/election/candidates/index.md index 11a8668f8..8312b269b 100644 --- a/src/pages/election/candidates/index.md +++ b/src/pages/election/candidates/index.md @@ -7,19 +7,19 @@ seo: image: /img/OpenInfra-icon-white.jpg title: 2023 Board Elections - Candidates List twitterUsername: "@OpenInfraDev" - url: https://openinfra.dev/election/individual-director-election/candidates + url: https://openinfra.dev/election/2023-individual-director-election/candidates title: 2023 Board Elections - Candidates List menu: - text: ELECTION DETAILS - link: /election/individual-director-election + link: /election/2023-individual-director-election - text: SEE THE CANDIDATES - link: /election/individual-director-election/candidates + link: /election/2023-individual-director-election/candidates - text: NOMINATE A MEMBER link: /a/community/members - text: BE A CANDIDATE link: /profile - text: GOLD MEMBER ELECTION CANDIDATES - link: /election/individual-director-election/candidates/gold + link: /election/2023-individual-director-election/candidates/gold - text: CODE OF CONDUCT link: ../../../legal/code-of-conduct - text: REPORT A BUG diff --git a/src/pages/election/index.md b/src/pages/election/index.md index 47a08d835..8dd01b44a 100644 --- a/src/pages/election/index.md +++ b/src/pages/election/index.md @@ -7,20 +7,20 @@ seo: image: /img/OpenInfra-icon-white.jpg title: 2023 Board Elections twitterUsername: "@OpenInfraDev" - url: https://openinfra.dev/election/individual-director-election + url: https://openinfra.dev/election/2023-individual-director-election title: January 2023 Board Elections subTitle: Individual and Gold Member elections menu: - text: ELECTION DETAILS - link: /election/individual-director-election + link: /election/2023-individual-director-election - text: SEE THE CANDIDATES - link: /election/individual-director-election/candidates + link: /election/2023-individual-director-election/candidates - text: NOMINATE A MEMBER link: /a/community/members - text: BE A CANDIDATE link: /profile - text: GOLD MEMBER ELECTION CANDIDATES - link: /election/individual-director-election/candidates/gold + link: /election/2023-individual-director-election/candidates/gold - text: CODE OF CONDUCT link: ../../legal/code-of-conduct - text: REPORT A BUG diff --git a/static/admin/config.yml b/static/admin/config.yml index 899f599da..90392e99f 100644 --- a/static/admin/config.yml +++ b/static/admin/config.yml @@ -1210,7 +1210,7 @@ collections: preview: false identifier_field: title fields: - - { label: "Election Id", name: electionId, widget: string, required: true} + - { label: "Election Id", name: electionId, widget: read-only, required: true} - { label: SEO, name: seo, widget: object, fields: [ { label: "Title", name: "title", widget: string }, { label: "Description", name: "description", widget: string }, @@ -1227,7 +1227,7 @@ collections: preview: false identifier_field: title fields: - - { label: "Election Id", name: electionId, widget: string, required: true } + - { label: "Election Id", name: electionId, widget: read-only, required: true } - { label: SEO, name: seo, widget: object, fields: [ { label: "Title", name: "title", widget: string }, { label: "Description", name: "description", widget: string }, @@ -1244,7 +1244,7 @@ collections: preview: false identifier_field: title fields: - - { label: "Election Id", name: electionId, widget: string, required: true } + - { label: "Election Id", name: electionId, widget: read-only, required: true } - { label: SEO, name: seo, widget: object, fields: [ { label: "Title", name: "title", widget: string }, { label: "Description", name: "description", widget: string }, From 9c2fca9b9d0e65b1ddede6681a6a71d6c0552eff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Castillo?= Date: Fri, 20 Oct 2023 11:08:34 -0300 Subject: [PATCH 13/31] Eletion id field on cms hidden MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Castillo --- static/admin/config.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/static/admin/config.yml b/static/admin/config.yml index 90392e99f..ddc8ffaa0 100644 --- a/static/admin/config.yml +++ b/static/admin/config.yml @@ -1210,7 +1210,7 @@ collections: preview: false identifier_field: title fields: - - { label: "Election Id", name: electionId, widget: read-only, required: true} + - { label: "Election Id", name: electionId, widget: hidden, required: true} - { label: SEO, name: seo, widget: object, fields: [ { label: "Title", name: "title", widget: string }, { label: "Description", name: "description", widget: string }, @@ -1227,7 +1227,7 @@ collections: preview: false identifier_field: title fields: - - { label: "Election Id", name: electionId, widget: read-only, required: true } + - { label: "Election Id", name: electionId, widget: hidden, required: true } - { label: SEO, name: seo, widget: object, fields: [ { label: "Title", name: "title", widget: string }, { label: "Description", name: "description", widget: string }, @@ -1244,7 +1244,7 @@ collections: preview: false identifier_field: title fields: - - { label: "Election Id", name: electionId, widget: read-only, required: true } + - { label: "Election Id", name: electionId, widget: hidden, required: true } - { label: SEO, name: seo, widget: object, fields: [ { label: "Title", name: "title", widget: string }, { label: "Description", name: "description", widget: string }, From a5db7064ab716116bc2c3f54576c4740abc73117 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Castillo?= Date: Fri, 20 Oct 2023 11:11:34 -0300 Subject: [PATCH 14/31] Remove console log MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Castillo --- gatsby-node.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/gatsby-node.js b/gatsby-node.js index 7b90d872e..fad965652 100644 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -254,8 +254,7 @@ exports.sourceNodes = async ({ actions, createNodeId, createContentDigest }) => const accessToken = await getAccessToken(config, buildScopes).then(({token}) => token.access_token).catch(e => console.log('Access Token error', e)); // data for previous electionsfilePath - const previousElections = await SSR_getPreviousElections(apiBaseUrl, accessToken) - console.log('check previous election...', previousElections) + const previousElections = await SSR_getPreviousElections(apiBaseUrl, accessToken) const lastElections = previousElections.data.slice(0, electionsToShow); if (lastElections && lastElections.length > 0) { let candidates = []; From 2ce8ab869bad812a346cb6cc1092cfffc18daac6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Castillo?= Date: Mon, 23 Oct 2023 18:22:02 -0300 Subject: [PATCH 15/31] Default values for elections variables, add env template MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Castillo --- env.template | 14 ++++++++++++++ gatsby-node.js | 4 ++-- 2 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 env.template diff --git a/env.template b/env.template new file mode 100644 index 000000000..7d1790a9b --- /dev/null +++ b/env.template @@ -0,0 +1,14 @@ +GATSBY_IDP_BASE_URL= +GATSBY_OAUTH2_CLIENT_ID= +GATSBY_API_BASE_URL= +GATSBY_SCOPES= +GATSBY_SPONSORED_PROJECT_ID= +GATSBY_BUILD_SCOPES= +GATSBY_OAUTH2_CLIENT_ID_BUILD= +GATSBY_OAUTH2_CLIENT_SECRET_BUILD= +GATSBY_OAUTH_TOKEN_PATH= +GATSBY_SF_OID= +GATSBY_FRIENDLY_CAPTCHA_SITE_KEY= +GATSBY_FRIENDLY_CAPTCHA_API_KEY= +GATSBY_ELECTION_SINCE_YEAR= +GATSBY_ELECTION_TO_SHOW= \ No newline at end of file diff --git a/gatsby-node.js b/gatsby-node.js index fad965652..54981590a 100644 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -10,8 +10,8 @@ const yaml = require("yaml") const moment = require("moment-timezone"); const prevElectionsBasePath = 'src/pages/election/previous-elections'; const currentYear = new Date().getFullYear(); -const electionsSinceYear = process.env.GATSBY_ELECTION_SINCE_YEAR; -const minimunElectionsToShow = process.env.GATSBY_ELECTION_TO_SHOW; +const electionsSinceYear = process.env.GATSBY_ELECTION_SINCE_YEAR || 2023; +const minimunElectionsToShow = process.env.GATSBY_ELECTION_TO_SHOW || 2; const electionsToShow = (currentYear - electionsSinceYear) + minimunElectionsToShow; From 37f128290b078c7c9932aeb244e022230933f000 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Castillo?= Date: Mon, 23 Oct 2023 21:04:34 -0300 Subject: [PATCH 16/31] Adjust package.json file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Castillo --- package.json | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 7c5587477..5d437c1fc 100644 --- a/package.json +++ b/package.json @@ -23,31 +23,31 @@ "friendly-challenge": "^0.9.2", "full-schedule-widget": "^2.0.0", "gatsby": "4.24.0", - "gatsby-plugin-anchor-links": "^1.2.1", - "gatsby-plugin-feed": "^4.24.0", - "gatsby-plugin-google-analytics": "^4.24.0", - "gatsby-plugin-google-gtag": "^4.24.0", - "gatsby-plugin-google-tagmanager": "^4.24.0", "gatsby-plugin-image": "^2.10.1", - "gatsby-plugin-linkedin-insight": "^1.0.1", - "gatsby-plugin-manifest": "^4.24.0", "gatsby-plugin-netlify": "^4.1.0", "gatsby-plugin-netlify-cms": "^6.10.0", "gatsby-plugin-purgecss": "^6.1.1", "gatsby-plugin-react-helmet": "^5.10.0", - "gatsby-plugin-remove-serviceworker": "^1.0.0", "gatsby-plugin-sass": "^5.10.2", "gatsby-plugin-sharp": "^4.10.2", "gatsby-plugin-webfonts": "^2.2.1", - "gatsby-remark-classes": "^1.0.0", "gatsby-remark-copy-linked-files": "^5.10.0", "gatsby-remark-images": "^6.10.2", - "gatsby-remark-images-medium-zoom": "^1.7.0", "gatsby-remark-relative-images": "^2.0.2", "gatsby-source-filesystem": "^4.10.1", - "gatsby-source-medium": "^4.24.0", "gatsby-transformer-remark": "^5.10.2", "gatsby-transformer-sharp": "^4.10.0", + "gatsby-plugin-anchor-links": "^1.2.1", + "gatsby-plugin-feed": "^4.24.0", + "gatsby-plugin-google-analytics": "^4.24.0", + "gatsby-plugin-google-gtag": "^4.24.0", + "gatsby-plugin-google-tagmanager": "^4.24.0", + "gatsby-plugin-linkedin-insight": "^1.0.1", + "gatsby-plugin-manifest": "^4.24.0", + "gatsby-plugin-remove-serviceworker": "^1.0.0", + "gatsby-remark-classes": "^1.0.0", + "gatsby-remark-images-medium-zoom": "^1.7.0", + "gatsby-source-medium": "^4.24.0", "gsap": "^3.11.3", "history": "^4.10.1", "i18n-react": "^0.6.4", From 195290ba661c0f16be42b6f7022802f0549fc0d3 Mon Sep 17 00:00:00 2001 From: smarcet Date: Mon, 23 Oct 2023 22:59:43 -0300 Subject: [PATCH 17/31] repointed CMS branch --- static/admin/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/admin/config.yml b/static/admin/config.yml index ddc8ffaa0..ce5e5cbd7 100644 --- a/static/admin/config.yml +++ b/static/admin/config.yml @@ -1,7 +1,7 @@ backend: name: github repo: OpenStackweb/osf-website - branch: master + branch: hotfix/previous-elections-pages commit_messages: create: 'Create {{collection}} “{{slug}}”' update: 'Update {{collection}} “{{slug}}”' From c966e12e19b9c9b096db5e7edf922a13b6c62517 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Castillo?= Date: Tue, 24 Oct 2023 19:07:14 -0300 Subject: [PATCH 18/31] Fix cms files, add current election data, add redirects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Castillo --- gatsby-node.js | 115 +++++++++++++++++++++++++++++++++++++--- static/admin/config.yml | 6 +-- 2 files changed, 112 insertions(+), 9 deletions(-) diff --git a/gatsby-node.js b/gatsby-node.js index 54981590a..fc76e3178 100644 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -133,6 +133,20 @@ const SSR_getPreviousElections = async (baseUrl, accessToken, page = 1) => { .catch(e => console.log('ERROR: ', e)); }; +const SSR_getCurrentElection = async (baseUrl, accessToken, page = 1, perPage = 5) => { + return await axios.get( + `${baseUrl}/api/v1/elections/`, + { + params: { + access_token: accessToken, + page: page, + per_page: perPage, + order: '-closes' + } + }).then((response) => response.data) + .catch(e => console.log('ERROR: ', e)); +}; + const SSR_getPreviousElectionCandidates = async (baseUrl, accessToken, electionId, page = 1) => { return await axios.get( `${baseUrl}/api/v1/elections/${electionId}/candidates/`, @@ -254,7 +268,7 @@ exports.sourceNodes = async ({ actions, createNodeId, createContentDigest }) => const accessToken = await getAccessToken(config, buildScopes).then(({token}) => token.access_token).catch(e => console.log('Access Token error', e)); // data for previous electionsfilePath - const previousElections = await SSR_getPreviousElections(apiBaseUrl, accessToken) + const previousElections = await SSR_getPreviousElections(apiBaseUrl, accessToken) const lastElections = previousElections.data.slice(0, electionsToShow); if (lastElections && lastElections.length > 0) { let candidates = []; @@ -339,8 +353,22 @@ exports.sourceNodes = async ({ actions, createNodeId, createContentDigest }) => if (Array.isArray(electionGoldCandidates.data) && electionGoldCandidates.data.length > 0) goldCandidates = [...goldCandidates, ...electionGoldCandidates.data]; } - // ingest api data on graphql ... + // data for current election + const currentElection = await SSR_getCurrentElection(apiBaseUrl, accessToken).then((res) => res.data[0]); + + createNode({ + ...currentElection, + id: `${currentElection.id}`, + electionYear: moment(currentElection.closes * 1000).utc().format('YYYY'), + parent: null, + children: [], + internal: { + type: 'CurrentElectionData', // Replace with an appropriate type + contentDigest: createContentDigest(currentElection), + }, + }) + // ingest api data on graphql ... lastElections.forEach(election => { createNode({ ...election, @@ -464,9 +492,82 @@ exports.createSchemaCustomization = ({actions}) => { } exports.createPages = ({actions, graphql}) => { - const {createPage} = actions + const { createPage, createRedirect} = actions - graphql(` + const electionQuery = graphql(` + { + allMarkdownRemark( + limit: 1000 + filter: {frontmatter: {templateKey: {in: ["election-page", "election-candidates-page", "election-gold-candidates-page"]}}} + ) { + edges { + node { + id + fields { + slug + } + frontmatter { + title + templateKey + } + } + } + } + currentElectionData { + electionYear + } + } + `).then(result => { + + console.log(`createPage res ${JSON.stringify(result)}`); + + if (result.errors) { + result.errors.forEach(e => console.error(e.toString())) + return Promise.reject(result.errors) + } + + const electionsPages = result.data.allMarkdownRemark.edges; + const electionYear = result.data.currentElectionData.electionYear; + + electionsPages.forEach(edge => { + const id = edge.node.id; + const electionPath = edge.node.frontmatter.templateKey === 'election-page' ? + `/election/${electionYear}-individual-director-election`: + edge.node.frontmatter.templateKey === 'election-candidates-page' ? + `/election/${electionYear}-individual-director-election/candidates`: + `/election/${electionYear}-individual-director-election/candidates/gold`; + + console.log(`createPage processing edge ${JSON.stringify(edge)} path ${electionPath}`); + + createRedirect({ + fromPath: `/election/`, + toPath: `/election/${electionYear}-individual-director-election`, + }) + + createRedirect({ + fromPath: `/election/candidates`, + toPath: `/election/${electionYear}-individual-director-election/candidates`, + }) + + createRedirect({ + fromPath: `/election/candidates/gold`, + toPath: `/election/${electionYear}-individual-director-election/candidates/gold`, + }) + + createPage({ + path: electionPath, + component: path.resolve( + `src/templates/${String(edge.node.frontmatter.templateKey)}.js` + ), + // additional data can be passed via context + context: { + id + }, + }) + }) + }); + + const previousElectionQuery = graphql(` { allMarkdownRemark( limit: 1000 @@ -526,9 +627,9 @@ exports.createPages = ({actions, graphql}) => { }); - return graphql(` + const allPagesQuery = graphql(` { - allMarkdownRemark(limit: 1000, filter: {frontmatter: {electionId: {eq: null}}}) { + allMarkdownRemark(limit: 1000, filter: {frontmatter: {electionId: {eq: null}, templateKey: {nin: ["election-page", "election-candidates-page", "election-gold-candidates-page"]}}}) { edges { node { id @@ -620,6 +721,8 @@ exports.createPages = ({actions, graphql}) => { }) }) + + return Promise.all([electionQuery, previousElectionQuery, allPagesQuery]); } exports.onCreateNode = ({node, actions, getNode}) => { diff --git a/static/admin/config.yml b/static/admin/config.yml index ce5e5cbd7..973a0be30 100644 --- a/static/admin/config.yml +++ b/static/admin/config.yml @@ -1083,7 +1083,7 @@ collections: - name: "election-pages" label: "Election Pages" files: - - file: "src/pages/elections/current/index.md" + - file: "src/pages/election/current/index.md" label: "Election Page" name: "electionPage" fields: @@ -1102,7 +1102,7 @@ collections: { label: "Link", name: "link", widget: string, required: true } ] } - { label: "Body", name: body, widget: markdown, required: true } - - file: "src/pages/elections/current/candidates/index.md" + - file: "src/pages/election/current/candidates/index.md" label: "Election Page - Candidates" name: "electionCandidatesPage" fields: @@ -1123,7 +1123,7 @@ collections: { label: "Title", name: title, widget: string, required: true }, { label: "Description", name: description, widget: text, required: true } ] } - - file: "src/pages/elections/current/candidates/gold.md" + - file: "src/pages/election/current/candidates/gold.md" label: "Election Page - Candidates Gold" name: "electionGoldCandidatesPage" fields: From 826ce50766a561b089c541f66b7a44369e149ab8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Castillo?= Date: Tue, 24 Oct 2023 19:15:09 -0300 Subject: [PATCH 19/31] Remove redirects from .toml file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Castillo --- netlify.toml | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/netlify.toml b/netlify.toml index 9c2bca5eb..55f57dd60 100644 --- a/netlify.toml +++ b/netlify.toml @@ -102,19 +102,6 @@ from = "/profile" to = "/a/profile" status = 301 -[[redirects]] - from = "/election" - to = "/election/2023-individual-director-election" - status = 301 -[[redirects]] - from = "/election/candidates" - to = "/election/2023-individual-director-election/candidates" - status = 301 -[[redirects]] - from = "/election/candidates/gold" - to = "/election/2023-individual-director-election/candidates/gold" - status = 301 - force = true [[redirects]] from = "/summit/registration" to = "https://vancouver2023.openinfra.dev/" From 022882dee2c821a9ce6d1c7507c12f6c6ce6b74b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Castillo?= Date: Tue, 24 Oct 2023 19:48:03 -0300 Subject: [PATCH 20/31] Fix CMS paths for elections MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Castillo --- static/admin/config.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/static/admin/config.yml b/static/admin/config.yml index 973a0be30..08d41ea3a 100644 --- a/static/admin/config.yml +++ b/static/admin/config.yml @@ -1083,7 +1083,7 @@ collections: - name: "election-pages" label: "Election Pages" files: - - file: "src/pages/election/current/index.md" + - file: "src/pages/election/index.md" label: "Election Page" name: "electionPage" fields: @@ -1102,7 +1102,7 @@ collections: { label: "Link", name: "link", widget: string, required: true } ] } - { label: "Body", name: body, widget: markdown, required: true } - - file: "src/pages/election/current/candidates/index.md" + - file: "src/pages/election/candidates/index.md" label: "Election Page - Candidates" name: "electionCandidatesPage" fields: @@ -1123,7 +1123,7 @@ collections: { label: "Title", name: title, widget: string, required: true }, { label: "Description", name: description, widget: text, required: true } ] } - - file: "src/pages/election/current/candidates/gold.md" + - file: "src/pages/election/candidates/gold.md" label: "Election Page - Candidates Gold" name: "electionGoldCandidatesPage" fields: From efbe9351c8168c2d01f33a969321316983345e66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Castillo?= Date: Wed, 25 Oct 2023 14:04:24 -0300 Subject: [PATCH 21/31] trigger deploy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Castillo --- static/admin/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/admin/config.yml b/static/admin/config.yml index 08d41ea3a..afd928ee9 100644 --- a/static/admin/config.yml +++ b/static/admin/config.yml @@ -1083,7 +1083,7 @@ collections: - name: "election-pages" label: "Election Pages" files: - - file: "src/pages/election/index.md" + - file: "src/pages/election/index.md" label: "Election Page" name: "electionPage" fields: From 03b8b87d5d3fdb95e073e6579999c2fb38adca51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Castillo?= Date: Thu, 26 Oct 2023 13:13:00 -0300 Subject: [PATCH 22/31] Move redirects from forEach, election template paths function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Castillo --- gatsby-node.js | 60 ++++++++++++++++++++++++++------------------------ 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/gatsby-node.js b/gatsby-node.js index fc76e3178..b00afa40e 100644 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -492,7 +492,16 @@ exports.createSchemaCustomization = ({actions}) => { } exports.createPages = ({actions, graphql}) => { - const { createPage, createRedirect} = actions + const { createPage, createRedirect} = actions; + + const getElectionPath = (templateKey, electionYear) => { + const electionTemplates = ['election-page-previous', 'election-page']; + const candidatesTemplates = ['election-candidates-page-previous', 'election-candidates-page']; + const goldCandidatesTemplates = ['election-gold-candidates-page-previous', 'election-gold-candidates-page']; + if(electionTemplates.includes(templateKey)) return `/election/${electionYear}-individual-director-election`; + if(candidatesTemplates.includes(templateKey)) return `/election/${electionYear}-individual-director-election/candidates`; + if(goldCandidatesTemplates.includes(templateKey)) return `/election/${electionYear}-individual-director-election/candidates/gold`; + } const electionQuery = graphql(` { @@ -531,29 +540,10 @@ exports.createPages = ({actions, graphql}) => { electionsPages.forEach(edge => { const id = edge.node.id; - const electionPath = edge.node.frontmatter.templateKey === 'election-page' ? - `/election/${electionYear}-individual-director-election`: - edge.node.frontmatter.templateKey === 'election-candidates-page' ? - `/election/${electionYear}-individual-director-election/candidates`: - `/election/${electionYear}-individual-director-election/candidates/gold`; + const electionPath = getElectionPath(edge.node.frontmatter.templateKey, electionYear); console.log(`createPage processing edge ${JSON.stringify(edge)} path ${electionPath}`); - createRedirect({ - fromPath: `/election/`, - toPath: `/election/${electionYear}-individual-director-election`, - }) - - createRedirect({ - fromPath: `/election/candidates`, - toPath: `/election/${electionYear}-individual-director-election/candidates`, - }) - - createRedirect({ - fromPath: `/election/candidates/gold`, - toPath: `/election/${electionYear}-individual-director-election/candidates/gold`, - }) - createPage({ path: electionPath, component: path.resolve( @@ -564,7 +554,22 @@ exports.createPages = ({actions, graphql}) => { id }, }) - }) + }); + + createRedirect({ + fromPath: `/election/`, + toPath: `/election/${electionYear}-individual-director-election`, + }); + + createRedirect({ + fromPath: `/election/candidates`, + toPath: `/election/${electionYear}-individual-director-election/candidates`, + }); + + createRedirect({ + fromPath: `/election/candidates/gold`, + toPath: `/election/${electionYear}-individual-director-election/candidates/gold`, + }); }); const previousElectionQuery = graphql(` @@ -605,11 +610,8 @@ exports.createPages = ({actions, graphql}) => { const id = edge.node.id; const electionId = edge.node.frontmatter.electionId.toString(); const electionYear = edge.node.frontmatter.electionYear; - const electionPath = edge.node.frontmatter.templateKey === 'election-page-previous' ? - `/election/${electionYear}-individual-director-election`: - edge.node.frontmatter.templateKey === 'election-candidates-page-previous' ? - `/election/${electionYear}-individual-director-election/candidates`: - `/election/${electionYear}-individual-director-election/candidates/gold`; + const electionPath = getElectionPath(edge.node.frontmatter.templateKey, electionYear); + console.log(`createPage processing edge ${JSON.stringify(edge)} path ${electionPath}`); createPage({ path: electionPath, @@ -662,8 +664,8 @@ exports.createPages = ({actions, graphql}) => { pages.forEach(edge => { if (edge.node.frontmatter.templateKey) { - const id = edge.node.id - const SEO = edge.node.frontmatter.seo ? edge.node.frontmatter.seo : null; + const id = edge.node.id; + const SEO = edge.node.frontmatter.seo ? edge.node.frontmatter.seo : null; const slug = SEO && SEO.url ? SEO.url.replace('https://osf.dev', '').replace('https://openinfra.dev', '') : edge.node.fields.slug; createPage({ path: slug, From 8d1c94dd3036f4cfc5767c8280304ff666df65e0 Mon Sep 17 00:00:00 2001 From: sebastian marcet Date: Mon, 30 Oct 2023 10:22:25 -0300 Subject: [PATCH 23/31] =?UTF-8?q?Update=20Election=20Pages=20=E2=80=9Celec?= =?UTF-8?q?tionPage=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/election/index.md | 39 ++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/src/pages/election/index.md b/src/pages/election/index.md index 8dd01b44a..c6c086d90 100644 --- a/src/pages/election/index.md +++ b/src/pages/election/index.md @@ -1,14 +1,14 @@ --- templateKey: election-page seo: - description: Individual Member Director elections for the 2023 Board of - Directors will be held *Monday January 9, 2023 to * *Friday January 13, + description: Individual Member Director elections for the 2024 Board of + Directors will be held *Monday January 9, 2024 to * *Friday January 13, 2023*. Nominations occur between *November 14 and December 16, 2022*. image: /img/OpenInfra-icon-white.jpg - title: 2023 Board Elections + title: 2024 Board Elections twitterUsername: "@OpenInfraDev" - url: https://openinfra.dev/election/2023-individual-director-election -title: January 2023 Board Elections + url: https://openinfra.dev/election/2024-individual-director-election +title: January 2024 Board Elections subTitle: Individual and Gold Member elections menu: - text: ELECTION DETAILS @@ -26,17 +26,16 @@ menu: - text: REPORT A BUG link: mailto:info@openinfra.dev --- - #### About the Board -The Board of Directors is ultimately legally responsible for the Foundation as a corporate entity. Board activities include oversight of the Foundation and its budget, strategy and goals according to the mission and responsibilities. The 2023 Board will be composed of 21 directors elected by the Individual Members (7), directors elected by the Gold Members (7) and directors appointed by the Platinum Members (7). +The Board of Directors is ultimately legally responsible for the Foundation as a corporate entity. Board activities include oversight of the Foundation and its budget, strategy and goals according to the mission and responsibilities. The 2024 Board will be composed of 21 directors elected by the Individual Members (7), directors elected by the Gold Members (7) and directors appointed by the Platinum Members (7). As a true corporate board, Board members are responsible for fiduciary duties and adhering to an expanded code of conduct. All Directors need to attend regular quarterly Board meetings and any special meetings that come up. The meetings will be held in a way that allows for remote participation. #### Individual Member Director board seats -- Individual Member Directors are there to represent the Individual Members of the Foundation -- These Directors act as the link between the thousands of members of the Foundation and the Board, and are not representing the companies for which they work +* Individual Member Directors are there to represent the Individual Members of the Foundation +* These Directors act as the link between the thousands of members of the Foundation and the Board, and are not representing the companies for which they work When considering which candidates are best equipped to serve in this capacity, voters can review each candidate's application on the [candidate](/election/candidates) page prior to the start of the election. @@ -56,10 +55,10 @@ If you are an eligible voter, you will receive an email with a link to complete #### Nomination Process -- Between November 14 and December 16, members can visit [this page](/a/community/members) and nominate candidates. -- Whenever a member is nominated, they will receive a notification (via the email listed in their member profile) -- Nominees must then log in and 1) accept the initial nomination, and 2) fill out the application -- Members who have received 10 nominations by December 16 must also complete the candidate application by December 21 in order to appear on the ballot +* Between November 14 and December 16, members can visit [this page](/a/community/members) and nominate candidates. +* Whenever a member is nominated, they will receive a notification (via the email listed in their member profile) +* Nominees must then log in and 1) accept the initial nomination, and 2) fill out the application +* Members who have received 10 nominations by December 16 must also complete the candidate application by December 21 in order to appear on the ballot #### Candidate Application @@ -75,15 +74,15 @@ A candidate's responses will appear on their public profile, as well as on [the #### Election Timeline Summary: -- November 14: Individual Member nominations open, election details live on [openinfra.dev](/elections/current) -- December 16: Individual Member nominations close -- December 21: Deadline for Individual Member Nominees to complete application -- January 4: Gold Member Director Selector Election (1 day) -- January 9: Individual Member Elections open -- January 13: Individual Member Elections close +* November 14: Individual Member nominations open, election details live on [openinfra.dev](/elections/current) +* December 16: Individual Member nominations close +* December 21: Deadline for Individual Member Nominees to complete application +* January 4: Gold Member Director Selector Election (1 day) +* January 9: Individual Member Elections open +* January 13: Individual Member Elections close Note that the Gold Member process will complete prior to the start of the Individual Member elections. Each Platinum Member has already appointed a Board Member, although they can change that appointment at any time during their membership. #### Questions? -If you have any questions regarding membership, the nomination process, or any other matter regarding the elections, please contact the Secretary (Jonathan Bryce) at [secretary@openinfra.dev](mailto:secretary@openinfra.dev). Additionally, if you have an election problem to report, contact the election inspectors: [electioninspectors@openinfra.dev](mailto:electioninspectors@openinfra.dev) (led by Lisa Miller, one of the Foundation's corporate attorneys). +If you have any questions regarding membership, the nomination process, or any other matter regarding the elections, please contact the Secretary (Jonathan Bryce) at [secretary@openinfra.dev](mailto:secretary@openinfra.dev). Additionally, if you have an election problem to report, contact the election inspectors: [electioninspectors@openinfra.dev](mailto:electioninspectors@openinfra.dev) (led by Lisa Miller, one of the Foundation's corporate attorneys). \ No newline at end of file From 4cc87506634b03d956f145c968f84c692491a0fa Mon Sep 17 00:00:00 2001 From: Wes Wilson Date: Mon, 30 Oct 2023 11:54:36 -0700 Subject: [PATCH 24/31] =?UTF-8?q?Update=20Election=20Pages=20=E2=80=9Celec?= =?UTF-8?q?tionPage=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/election/index.md | 38 ++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/pages/election/index.md b/src/pages/election/index.md index c6c086d90..5a086e97c 100644 --- a/src/pages/election/index.md +++ b/src/pages/election/index.md @@ -2,8 +2,8 @@ templateKey: election-page seo: description: Individual Member Director elections for the 2024 Board of - Directors will be held *Monday January 9, 2024 to * *Friday January 13, - 2023*. Nominations occur between *November 14 and December 16, 2022*. + Directors will be held *Monday January 8, 2024 to * *Friday January 12, + 2024*. Nominations occur between *November 13, 2023 and December 15, 2023*. image: /img/OpenInfra-icon-white.jpg title: 2024 Board Elections twitterUsername: "@OpenInfraDev" @@ -12,15 +12,15 @@ title: January 2024 Board Elections subTitle: Individual and Gold Member elections menu: - text: ELECTION DETAILS - link: /election/2023-individual-director-election + link: /election/2024-individual-director-election - text: SEE THE CANDIDATES - link: /election/2023-individual-director-election/candidates + link: /election/2024-individual-director-election/candidates - text: NOMINATE A MEMBER link: /a/community/members - text: BE A CANDIDATE link: /profile - text: GOLD MEMBER ELECTION CANDIDATES - link: /election/2023-individual-director-election/candidates/gold + link: /election/2024-individual-director-election/candidates/gold - text: CODE OF CONDUCT link: ../../legal/code-of-conduct - text: REPORT A BUG @@ -28,7 +28,7 @@ menu: --- #### About the Board -The Board of Directors is ultimately legally responsible for the Foundation as a corporate entity. Board activities include oversight of the Foundation and its budget, strategy and goals according to the mission and responsibilities. The 2024 Board will be composed of 21 directors elected by the Individual Members (7), directors elected by the Gold Members (7) and directors appointed by the Platinum Members (7). +The Board of Directors is ultimately legally responsible for the Foundation as a corporate entity. Board activities include oversight of the Foundation and its budget, strategy and goals according to the mission and responsibilities. The 2024 Board will be composed of 18 directors elected by the Individual Members (6), directors elected by the Gold Members (6) and directors appointed by the Platinum Members (6). As a true corporate board, Board members are responsible for fiduciary duties and adhering to an expanded code of conduct. All Directors need to attend regular quarterly Board meetings and any special meetings that come up. The meetings will be held in a way that allows for remote participation. @@ -47,39 +47,39 @@ Members should review and comply with the the [Community Code of Conduct](/lega #### Election Overview: -Individual Member Director elections for the 2023 Board will be held **Monday January 9, 2023 to  Froday January 13, 2023**. You must have joined the Open Infrastructure Foundation as an Individual Member by Tuesday, July 17, 2022 to vote in the January 2023 election, per the bylaws. +Individual Member Director elections for the 2024 Board will be held **Monday January 8, 2024 to  Friday January 12, 2024**. You must have joined the Open Infrastructure Foundation as an Individual Member by Sunday, July 16, 2023 to vote in the January 2024 election, per the bylaws. -In accordance with the Open Infrastructure Foundation Bylaws, Board elections will take place online using a cumulative voting method. No more than three members of the Board may be affiliated with the same company, which means the candidate receiving the next highest votes would assume the seat if the election results in too many employees from a single company. Individual Member Directors elected in 2023 will serve a one-year term, but they may be nominated and re-elected indefinitely. The next election for Individual Member Directors will take place during January 2023. +In accordance with the Open Infrastructure Foundation Bylaws, Board elections will take place online using a cumulative voting method. No more than three members of the Board may be affiliated with the same company, which means the candidate receiving the next highest votes would assume the seat if the election results in too many employees from a single company. Individual Member Directors elected in 2024 will serve a one-year term, but they may be nominated and re-elected indefinitely. The next election for Individual Member Directors will take place during January 2024. -If you are an eligible voter, you will receive an email with a link to complete your ballot when the elections open on January 9, 2023. To ensure you receive the ballot, please log on to the website at [openinfra.dev/a/profile](/a/profile) and make sure your information is current. +If you are an eligible voter, you will receive an email with a link to complete your ballot when the elections open on January 8, 2024. To ensure you receive the ballot, please log on to the website at [openinfra.dev/a/profile](/a/profile) and make sure your information is current. #### Nomination Process -* Between November 14 and December 16, members can visit [this page](/a/community/members) and nominate candidates. +* Between November 13 and December 15, members can visit [this page](/a/community/members) and nominate candidates. * Whenever a member is nominated, they will receive a notification (via the email listed in their member profile) * Nominees must then log in and 1) accept the initial nomination, and 2) fill out the application -* Members who have received 10 nominations by December 16 must also complete the candidate application by December 21 in order to appear on the ballot +* Members who have received 10 nominations by December 15 must also complete the candidate application by December 20 in order to appear on the ballot #### Candidate Application -All candidates must complete the application by December 21 in order to appear on the ballot. Questions: +All candidates must complete the application by December 20 in order to appear on the ballot. Questions: 1. Bio 2. What is your relationship to OpenInfra, and why is its success important to you? What would you say is your biggest contribution to OpenInfra and/or OpenStack's success to date? 3. Describe your experience with other non profits or serving as a board member. How does your experience prepare you for the role of a board member? 4. What do you see as the Board's role in OpenInfra's success? -5. What do you think the top priority of the Board should be in 2023? +5. What do you think the top priority of the Board should be in 2024? A candidate's responses will appear on their public profile, as well as on [the candidates page](/election/candidates). #### Election Timeline Summary: -* November 14: Individual Member nominations open, election details live on [openinfra.dev](/elections/current) -* December 16: Individual Member nominations close -* December 21: Deadline for Individual Member Nominees to complete application -* January 4: Gold Member Director Selector Election (1 day) -* January 9: Individual Member Elections open -* January 13: Individual Member Elections close +* November 13: Individual Member nominations open, election details live on [openinfra.dev](/elections/current) +* December 15: Individual Member nominations close +* December 20: Deadline for Individual Member Nominees to complete application +* January 3: Gold Member Director Selector Election (1 day) +* January 8: Individual Member Elections open +* January 12: Individual Member Elections close Note that the Gold Member process will complete prior to the start of the Individual Member elections. Each Platinum Member has already appointed a Board Member, although they can change that appointment at any time during their membership. From 34a876ba402f55ecd8f0804c090f7f8c93e7dce8 Mon Sep 17 00:00:00 2001 From: sebastian marcet Date: Tue, 31 Oct 2023 10:09:33 -0300 Subject: [PATCH 25/31] Update config.yml --- static/admin/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/admin/config.yml b/static/admin/config.yml index afd928ee9..afcd15840 100644 --- a/static/admin/config.yml +++ b/static/admin/config.yml @@ -1123,7 +1123,7 @@ collections: { label: "Title", name: title, widget: string, required: true }, { label: "Description", name: description, widget: text, required: true } ] } - - file: "src/pages/election/candidates/gold.md" + - file: "src/pages/election/candidates/index.md" label: "Election Page - Candidates Gold" name: "electionGoldCandidatesPage" fields: From a4c36447b668eb80fc5d5b584397bc8683fca575 Mon Sep 17 00:00:00 2001 From: sebastian marcet Date: Tue, 31 Oct 2023 12:16:31 -0300 Subject: [PATCH 26/31] Update config.yml --- static/admin/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/admin/config.yml b/static/admin/config.yml index afcd15840..facf9af4e 100644 --- a/static/admin/config.yml +++ b/static/admin/config.yml @@ -1123,7 +1123,7 @@ collections: { label: "Title", name: title, widget: string, required: true }, { label: "Description", name: description, widget: text, required: true } ] } - - file: "src/pages/election/candidates/index.md" + - file: "src/pages/election/candidates/gold/index.md" label: "Election Page - Candidates Gold" name: "electionGoldCandidatesPage" fields: From 53d50ecaaba423e50954bf1fa42065ef3567be8d Mon Sep 17 00:00:00 2001 From: Wes Wilson Date: Tue, 31 Oct 2023 08:30:45 -0700 Subject: [PATCH 27/31] =?UTF-8?q?Update=20Election=20Pages=20=E2=80=9Celec?= =?UTF-8?q?tionGoldCandidatesPage=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/election/candidates/gold/index.md | 28 ++++++++++----------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/pages/election/candidates/gold/index.md b/src/pages/election/candidates/gold/index.md index 14606e236..b1de306aa 100644 --- a/src/pages/election/candidates/gold/index.md +++ b/src/pages/election/candidates/gold/index.md @@ -1,32 +1,32 @@ --- templateKey: election-gold-candidates-page seo: - description: Individual Member Director elections for the 2023 Board of - Directors will be held *Monday January 9, 2022 to * *Monday January 16, - 2023*. Nominations occur between *November 14 and December 16, 2022*. + description: Individual Member Director elections for the 2024 Board of + Directors will be held *Monday January 8, 2024 to * *Monday January 12, + 2024*. Nominations occur between *November 13 and December 15, 2023*. image: /img/OpenInfra-icon-white.jpg - title: 2023 Board Elections - Gold Candidates List + title: 2024 Board Elections - Gold Candidates List twitterUsername: "@OpenInfraDev" - url: https://openinfra.dev/election/2023-individual-director-election/candidates/gold -title: 2023 Board Elections - Gold Candidates List + url: https://openinfra.dev/election/2024-individual-director-election/candidates/gold +title: 2024 Board Elections - Gold Candidates List +intro: + title: Gold Director Selector Candidates + description: The candidates on this list are the intended Gold Directors from + the Gold Member companies who are running for election as Gold Director + Selectors. menu: - text: ELECTION DETAILS - link: /election/2023-individual-director-election + link: /election/2024-individual-director-election - text: SEE THE CANDIDATES - link: /election/2023-individual-director-election/candidates + link: /election/2024-individual-director-election/candidates - text: NOMINATE A MEMBER link: /a/community/members - text: BE A CANDIDATE link: /profile - text: GOLD MEMBER ELECTION CANDIDATES - link: /election/2023-individual-director-election/candidates/gold + link: /election/2024-individual-director-election/candidates/gold - text: CODE OF CONDUCT link: ../../../../legal/code-of-conduct - text: REPORT A BUG link: mailto:info@openinfra.dev -intro: - title: Gold Director Selector Candidates - description: - "The candidates on this list are the intended Gold Directors from the Gold Member companies who are - running for election as Gold Director Selectors." --- From 32c2487eb43b0ec2bb81eda342aff8ef6c55b1f6 Mon Sep 17 00:00:00 2001 From: Wes Wilson Date: Tue, 31 Oct 2023 08:32:08 -0700 Subject: [PATCH 28/31] =?UTF-8?q?Update=20Election=20Pages=20=E2=80=9Celec?= =?UTF-8?q?tionCandidatesPage=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/election/candidates/index.md | 29 +++++++++++++------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/src/pages/election/candidates/index.md b/src/pages/election/candidates/index.md index 8312b269b..0ffdfd81e 100644 --- a/src/pages/election/candidates/index.md +++ b/src/pages/election/candidates/index.md @@ -1,35 +1,34 @@ --- templateKey: election-candidates-page seo: - description: Individual Member Director elections for the 2023 Board of - Directors will be held *Monday January 9, 2022 to * *Monday January 16, - 2023*. Nominations occur between *November 14 and December 16, 2022*. + description: Individual Member Director elections for the 2024 Board of + Directors will be held *Monday January 8, 2024 to * *Friday January 12, + 2024*. Nominations occur between *November 13, 2023 and December 15, 2023*. image: /img/OpenInfra-icon-white.jpg - title: 2023 Board Elections - Candidates List + title: 2024 Board Elections - Candidates List twitterUsername: "@OpenInfraDev" - url: https://openinfra.dev/election/2023-individual-director-election/candidates -title: 2023 Board Elections - Candidates List + url: https://openinfra.dev/election/2024-individual-director-election/candidates +title: 2024 Board Elections - Candidates List menu: - text: ELECTION DETAILS - link: /election/2023-individual-director-election + link: /election/2024-individual-director-election - text: SEE THE CANDIDATES - link: /election/2023-individual-director-election/candidates + link: /election/2024-individual-director-election/candidates - text: NOMINATE A MEMBER link: /a/community/members - text: BE A CANDIDATE link: /profile - text: GOLD MEMBER ELECTION CANDIDATES - link: /election/2023-individual-director-election/candidates/gold + link: /election/2024-individual-director-election/candidates/gold - text: CODE OF CONDUCT link: ../../../legal/code-of-conduct - text: REPORT A BUG link: mailto:info@openinfra.dev howToVote: title: HOW TO VOTE - description: - "If you are an eligible voter, you will receive an email with the subject - OpenInfra Foundation 2023 Individual Director Election from - secretary@openinfra.dev. This email includes your unique voting link. If you do - not receive an email, please contact - secretary@openinfra.dev." + description: If you are an eligible voter, you will receive an email with the + subject OpenInfra Foundation 2024 Individual Director Election from + secretary@openinfra.dev. This email includes your unique voting link. If you + do not receive an email, please contact secretary@openinfra.dev. --- From 3e011096e4473993fe011dcdfba9c4fe25b798d7 Mon Sep 17 00:00:00 2001 From: Wes Wilson Date: Tue, 31 Oct 2023 09:37:57 -0700 Subject: [PATCH 29/31] =?UTF-8?q?Update=20Election=20Pages=20=E2=80=9Celec?= =?UTF-8?q?tionPage=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/election/index.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/pages/election/index.md b/src/pages/election/index.md index 5a086e97c..339d5701a 100644 --- a/src/pages/election/index.md +++ b/src/pages/election/index.md @@ -64,11 +64,11 @@ If you are an eligible voter, you will receive an email with a link to complete All candidates must complete the application by December 20 in order to appear on the ballot. Questions: -1. Bio -2. What is your relationship to OpenInfra, and why is its success important to you? What would you say is your biggest contribution to OpenInfra and/or OpenStack's success to date? -3. Describe your experience with other non profits or serving as a board member. How does your experience prepare you for the role of a board member? -4. What do you see as the Board's role in OpenInfra's success? -5. What do you think the top priority of the Board should be in 2024? +* Bio +* What is your relationship to OpenInfra, and why is its success important to you? What would you say is your biggest contribution to OpenInfra and/or OpenStack's success to date? +* Describe your experience with other non profits or serving as a board member. How does your experience prepare you for the role of a board member? +* What do you see as the Board's role in OpenInfra's success? +* What do you think the top priority of the Board should be in 2024? A candidate's responses will appear on their public profile, as well as on [the candidates page](/election/candidates). From 4c6adb55334d50eec1554727fdf619f1076d1d50 Mon Sep 17 00:00:00 2001 From: Wes Wilson Date: Tue, 31 Oct 2023 09:58:26 -0700 Subject: [PATCH 30/31] =?UTF-8?q?Update=20Election=20Pages=20=E2=80=9Celec?= =?UTF-8?q?tionPage=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/election/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/election/index.md b/src/pages/election/index.md index 339d5701a..61b74938d 100644 --- a/src/pages/election/index.md +++ b/src/pages/election/index.md @@ -77,7 +77,7 @@ A candidate's responses will appear on their public profile, as well as on [the * November 13: Individual Member nominations open, election details live on [openinfra.dev](/elections/current) * December 15: Individual Member nominations close * December 20: Deadline for Individual Member Nominees to complete application -* January 3: Gold Member Director Selector Election (1 day) +* January 4: Gold Member Director Selector Election (1 day) * January 8: Individual Member Elections open * January 12: Individual Member Elections close From 94d349d8da58adc49134dda2230319d25f808ed3 Mon Sep 17 00:00:00 2001 From: sebastian marcet Date: Wed, 8 Nov 2023 21:47:43 -0300 Subject: [PATCH 31/31] Update config.yml repointed cms branch --- static/admin/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/admin/config.yml b/static/admin/config.yml index facf9af4e..0ecdb57bf 100644 --- a/static/admin/config.yml +++ b/static/admin/config.yml @@ -1,7 +1,7 @@ backend: name: github repo: OpenStackweb/osf-website - branch: hotfix/previous-elections-pages + branch: master commit_messages: create: 'Create {{collection}} “{{slug}}”' update: 'Update {{collection}} “{{slug}}”'