Skip to content

Job Posting Section #120

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 7 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 4 additions & 5 deletions src/_data/env.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
const isDev = process.env.ELEVENTY_ENV === 'dev'
const isDev = process.env.ELEVENTY_ENV === "dev";

module.exports = {
baseUrl: isDev
? '/'
: '/2025/'
}
baseUrl: isDev ? "/" : "/2025/",
spreadsheetURL: "https://docs.google.com/spreadsheets/d/1gIGszJWFngjaP4GuEqudAuYg95LGRLm-xO6re-DIKMA/gviz/tq?tqx=out:json"
};
47 changes: 47 additions & 0 deletions src/_data/jobData.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
const env = require("./env");

async function fetchJobPostings(URL) {
try {
const response = await fetch(URL);
const text = await response.text();

const jsonString = text.substring(47).slice(0, -2);
const json = JSON.parse(jsonString);
const rows = json.table.rows;

const ensureHttps = (url) => {
if (!/^https?:\/\//.test(url)) {
return `https://${url}`;
}
return url;
};

const isValidUrl = (url) => {
const pattern = /^(https?:\/\/)?([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}(:\d+)?(\/.*)?$/;
return pattern.test(url);
};

const jobPostings = rows.map((row) => ({
title: row.c[5]?.v || "No title",
company: row.c[2]?.v || "Unknown",
company_website: ensureHttps(row.c[4]?.v) || "#",
job_type: row.c[6]?.v || "N/A",
location: row.c[8]?.v || "Unknown",
description: row.c[7]?.v || "No description available",
link_to_apply: ensureHttps(row.c[9]?.v) || "#",
}))
.filter((job_post) =>
isValidUrl(job_post.company_website) &&
isValidUrl(job_post.link_to_apply)
);

return jobPostings;
} catch (error) {
console.error("Error fetching or processing job postings:", error);
return [];
}
}

module.exports = async function () {
return await fetchJobPostings(env.spreadsheetURL);
};
4 changes: 4 additions & 0 deletions src/_data/menuItems.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@
"name": "Health and Safety",
"link": "attend/health-and-safety"
},
{
"name": "Job Board",
"link": "attend/jobs"
},
{
"name": "FAQ's",
"link": "attend/faqs"
Expand Down
4 changes: 2 additions & 2 deletions src/_includes/components/button.njk
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
{% set bg_class = "bg-pycon-lime hover:bg-pycon-lime/90" %}
{% set text_class = "text-black" %}
{% else %}
{% set bg_class = "bg-transparent border-pycon-lime" %}
{% set text_class = "text-pycon-lime" %}
{% set bg_class = "bg-pycon-purple hover:bg-pycon-purple/90" %}
{% set text_class = "text-black" %}
{% endif %}

<a
Expand Down
110 changes: 110 additions & 0 deletions src/attend/job-board-guidelines.njk
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
---
title: Job Board - Rules and Guildelines
description: PyCon India 2025 Job Board
layout: base.njk
---

<div class="w-full h-auto bg-pycon-blue -mb-24 px-[6%] flex flex-col md:flex-row">
<div class="pt-32 pb-8 md:pb-32 w-full lg:w-[70%]">
<div class="black-han-sans-regular font-normal text-3xl md:text-5xl md:text-center text-[#FFFFFF] text-center lg:text-left">
Job Board - Rules and Guidelines
</div>
</div>
<div class="lg:w-[30%] w-[80%] lg:mt-60 flex items-center justify-center mx-auto">
<img src="{{ env.baseUrl }}img/assets/notepad.svg" alt="Guide" class="w-[40%] lg:w-[60%] transition-transform duration-100" style="animation: floating 2s ease-in-out infinite;">
<img src="{{ env.baseUrl }}img/assets/book-stars.svg" alt="Guide" class="w-[40%] lg:w-[60%] transition-transform duration-100" style="animation: floating 2s ease-in-out infinite;">
</div>
</div>


<div class="main-container pt-16 md:pt-48 bg-lavender w-full h-auto px-[6%]">
<div class="pb-40 md:pb-60 lg:pb-[20%] w-full text-justify lg:w-[70%]">
<div class="text-md lg:text-xl font-light">
<div class="pt-8">
<p class="text-2xl font-bold flex items-center"><span><img src="{{ env.baseUrl }}img/assets/square-lime.svg" alt="Bullet Icon" class="w-5 mr-2"></span>Job Submission & Approval:</p>
<ul class="list-none pt-4 space-y-4">
<li class="flex">
<img src="{{ env.baseUrl }}img/assets/circle-purple.svg" alt="Bullet Icon" class="w-4 h-4 mr-2 mt-2">
<span>We do not impose any restrictions on the industry/technology of the submitted jobs. Any jobs that are helpful to the community are welcome.</span>
</li>
<li class="flex">
<img src="{{ env.baseUrl }}img/assets/circle-purple.svg" alt="Bullet Icon" class="w-4 h-4 mr-2 mt-2">
<span>After successful job submission, each job will undergo a verification process by the PyCon India 2025 team to ensure there are no spam postings.</span>
</li>
<li class="flex">
<img src="{{ env.baseUrl }}img/assets/circle-purple.svg" alt="Bullet Icon" class="w-4 h-4 mr-2 mt-2">
<span>The approval process may take approximately 2-3 hours.</span>
</li>
<li class="flex">
<img src="{{ env.baseUrl }}img/assets/circle-purple.svg" alt="Bullet Icon" class="w-4 h-4 mr-2 mt-2">
<span>Approved jobs will be made visible on the job board once they pass the verification process.</span>
</li>
<li class="flex">
<img src="{{ env.baseUrl }}img/assets/circle-purple.svg" alt="Bullet Icon" class="w-4 h-4 mr-2 mt-1">
<span>Submissions that do not meet the guidelines may be rejected.</span>
</li>
</ul>
</div>

<div class="pt-8">
<p class="text-2xl font-bold flex items-center"><span><img src="{{ env.baseUrl }}img/assets/square-lime.svg" alt="Bullet Icon" class="w-5 mr-2"></span>Job Posts Order:</p>
<ul class="list-none pt-4 space-y-4">
<li class="flex">
<img src="{{ env.baseUrl }}img/assets/circle-purple.svg" alt="Bullet Icon" class="w-4 h-4 mr-2 mt-2">
<span>Job posts are sorted based on the timestamp they are submitted. The first job submitted will be visible first, followed by subsequent submissions in chronological order.</span>
</li>
</ul>
</div>

<div class="pt-8">
<p class="text-2xl font-bold flex items-center"><span><img src="{{ env.baseUrl }}img/assets/square-lime.svg" alt="Bullet Icon" class="w-5 mr-2"></span>Transparency:</p>
<ul class="list-none pt-4 space-y-4">
<li class="flex">
<img src="{{ env.baseUrl }}img/assets/circle-purple.svg" alt="Bullet Icon" class="w-4 h-4 mr-2 mt-2">
<span>After successful job submission, each job will undergo a verification process by the PyCon India 2025 team to ensure there are no spam postings.</span>
</li>
<li class="flex">
<img src="{{ env.baseUrl }}img/assets/circle-purple.svg" alt="Bullet Icon" class="w-4 h-4 mr-2 mt-2">
<span>Job seekers and companies are encouraged to communicate directly with each other for job-related inquiries, applications, and hiring decisions.</span>
</li>
</ul>
</div>

<div class="pt-8">
<p class="text-2xl font-bold flex items-center"><span><img src="{{ env.baseUrl }}img/assets/square-lime.svg" alt="Bullet Icon" class="w-5 mr-2"></span>Content Moderation:</p>
<ul class="list-none pt-4 space-y-4">
<li class="flex">
<img src="{{ env.baseUrl }}img/assets/circle-purple.svg" alt="Bullet Icon" class="w-4 h-4 mr-2 mt-2">
<span>PyCon India 2025 reserves the right to moderate and remove job posts that violate submission guidelines or community standards.</span>
</li>
<li class="flex">
<img src="{{ env.baseUrl }}img/assets/circle-purple.svg" alt="Bullet Icon" class="w-4 h-4 mr-2 mt-2">
<span>Users are encouraged to report any inappropriate content or issues with job posts for review to our team at <a href="mailto:[email protected]" target="_blank" rel="noopener noreferrer" class="underline">[email protected]</a>.</span>
</li>
</ul>
</div>

<div class="pt-8">
<p class="text-2xl font-bold flex items-center"><span><img src="{{ env.baseUrl }}img/assets/square-lime.svg" alt="Bullet Icon" class="w-5 mr-2"></span>Respect and Inclusivity:</p>
<ul class="list-none pt-4 space-y-4">
<li class="flex">
<img src="{{ env.baseUrl }}img/assets/circle-purple.svg" alt="Bullet Icon" class="w-4 h-4 mr-2 mt-2">
<span>Users are expected to maintain a respectful and inclusive environment when interacting with job listings or other users on the platform.</span>
</li>
<li class="flex">
<img src="{{ env.baseUrl }}img/assets/circle-purple.svg" alt="Bullet Icon" class="w-4 h-4 mr-2 mt-2">
<span>Any kind of disrespectful, discriminatory, or offensive behavior against any party will not be tolerated.</span>
</li>
<li class="flex">
<img src="{{ env.baseUrl }}img/assets/circle-purple.svg" alt="Bullet Icon" class="w-4 h-4 mr-2 mt-2">
<span>Please make sure to follow PyCon India's <a href="{{ env.baseUrl }}coc/guidelines" class="underline text-pycon-blue">Code of Conduct</a>.</span>
</li>
<li class="flex">
<img src="{{ env.baseUrl }}img/assets/circle-purple.svg" alt="Bullet Icon" class="w-4 h-4 mr-2 mt-2">
<span>If you feel unsafe during any of the interactions, or feel like someone is violating the rules, please <a href="{{ env.baseUrl }}coc/reporting" class="underline text-pycon-blue">report the incident to the CoC Workgroup</a>.</span>
</li>
</ul>
</div>
</div>
</div>
</div>
136 changes: 136 additions & 0 deletions src/attend/jobs.njk
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
---
title: Job Board - Pycon India 2025
description: PyCon India 2025 Job Board
layout: base.njk
---

{% from "components/flat-card.njk" import flatCard %}
{% from "components/button.njk" import button %}

{% set job_postings = jobData %}

<div class="w-full h-auto bg-pycon-blue px-[6%] pb-32 flex flex-col md:flex-row">
<div class="pt-32 pb-8 md:pb-32 w-full lg:w-[70%]">
<div class="black-han-sans-regular font-normal text-4xl md:text-5xl md:text-center text-[#FFFFFF] text-center lg:text-left">
Job Board
</div>
<div class="pt-10 font-light text-lg md:text-2xl md:text-center text-white text-center lg:text-left">
<p class="mb-0">Submit your job posting <a href="https://docs.google.com/forms/d/e/1FAIpQLSeFiiwkmM1qesa3Ex33K2Tz9qofvZKuG-ZR6PeDHgCK7RzMrg/viewform" target="_blank" rel="noopener noreferrer" class="underline">here</a></p>
<p>Check out the <a href="{{ env.baseUrl }}attend/job-board-guidelines/" class="underline">rules and guidelines</a> </p>
</div>
</div>
<div class="lg:w-[30%] w-[80%] lg:mt-40 flex items-center justify-center mx-auto">
<img src="/img/assets/abstract-obj.svg" alt="Guide" class="w-[40%] lg:w-[60%] transition-transform duration-100" style="animation: floating 2s ease-in-out infinite;">
<img src="/img/assets/star-lime-vector.svg" alt="Guide" class="w-[10%] lg:w-[10%] transition-transform duration-100" style="animation: floating 2s ease-in-out infinite;">
</div>
</div>


<div class="job-container bg-lavender w-full h-auto -pt-20 px-[6%] pb-72 md:pb-40 relative">
<div class="flex flex-wrap -mt-24 -mx-4">
<!-- Column 1 -->
<div class="w-full lg:w-1/3 px-4 flex flex-col gap-8">
{% for job_post in job_postings %}
{% if loop.index0 % 3 == 0 %}
{% set bg_color = 'purple' if loop.index0 // 3 % 2 == 0 else 'lime' %}
{% call flatCard(bg=bg_color) -%}
<div class="p-4">
<div class="text-3xl font-semibold">{{ job_post.title }}</div>
<div class="pt-4">
<span class="text-2xl">
<a href="{{ job_post.company_website }}" class="underline">
{{ job_post.company }}
</a>
</span>
<p class="pt-8 flex items-center gap-x-2 mb-0">
<i class="fa-solid fa-briefcase text-xl text-[#475569]"></i>
<span>{{ job_post.job_type }}</span>
<i class="fa-solid fa-location-dot text-xl text-[#475569]"></i>
<span>{{ job_post.location }}</span>
</p>
</div>
<div class="pt-2 text-gray-700">
<p class="text-justify">
{{ job_post.description }}
</p>
</div>
<div class="pt-4">
{{ button(text="Apply", url=job_post.link_to_apply, lime_bg=(bg_color == "purple"), env=env) }}
</div>
</div>
{%- endcall %}
{% endif %}
{% endfor %}
</div>

<!-- Column 2 -->
<div class="w-full pt-8 lg:pt-16 lg:w-1/3 px-4 flex flex-col gap-8">
{% for job_post in job_postings %}
{% if loop.index0 % 3 == 1 %}
{% set bg_color = 'purple' if loop.index0 // 3 % 2 == 1 else 'lime' %}
{% call flatCard(bg=bg_color) -%}
<div class="p-4">
<div class="text-3xl font-semibold">{{ job_post.title }}</div>
<div class="pt-4">
<span class="text-2xl">
<a href="{{ job_post.company_website }}" class="underline">
{{ job_post.company }}
</a>
</span>
<p class="pt-8 flex items-center gap-x-2 mb-0">
<i class="fa-solid fa-briefcase text-xl text-[#475569]"></i>
<span>{{ job_post.job_type }}</span>
<i class="fa-solid fa-location-dot text-xl text-[#475569]"></i>
<span>{{ job_post.location }}</span>
</p>
</div>
<div class="pt-2 text-gray-700">
<p class="text-justify">
{{ job_post.description }}
</p>
</div>
<div class="pt-4">
{{ button(text="Apply", url=job_post.link_to_apply, lime_bg=(bg_color == "purple"), env=env) }}
</div>
</div>
{%- endcall %}
{% endif %}
{% endfor %}
</div>

<!-- Column 3 -->
<div class="w-full pt-8 lg:pt-0 lg:w-1/3 px-4 flex flex-col gap-8">
{% for job_post in job_postings %}
{% if loop.index0 % 3 == 2 %}
{% set bg_color = 'purple' if loop.index0 // 3 % 2 == 0 else 'lime' %}
{% call flatCard(bg=bg_color) -%}
<div class="p-4">
<div class="text-3xl font-semibold">{{ job_post.title }}</div>
<div class="pt-4">
<span class="text-2xl">
<a href="{{ job_post.company_website }}" class="underline">
{{ job_post.company }}
</a>
</span>
<p class="pt-8 flex items-center gap-x-2 mb-0">
<i class="fa-solid fa-briefcase text-xl text-[#475569]"></i>
<span>{{ job_post.job_type }}</span>
<i class="fa-solid fa-location-dot text-xl text-[#475569]"></i>
<span>{{ job_post.location }}</span>
</p>
</div>
<div class="pt-2 text-gray-700">
<p class="text-justify">
{{ job_post.description }}
</p>
</div>
<div class="pt-4">
{{ button(text="Apply", url=job_post.link_to_apply, lime_bg=(bg_color == "purple"), env=env) }}
</div>
</div>
{%- endcall %}
{% endif %}
{% endfor %}
</div>
</div>
</div>
15 changes: 15 additions & 0 deletions src/static/img/assets/abstract-obj.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.