Skip to content

Commit ac69330

Browse files
committed
Merge branch 'main' into dashboard/metrics-details-frontend
2 parents 17fc95b + cca15f5 commit ac69330

File tree

109 files changed

+1767
-1305
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

109 files changed

+1767
-1305
lines changed

.pre-commit-config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ repos:
1010
exclude: (.github|pnpm-lock.yaml)
1111

1212
- repo: https://github.com/astral-sh/ruff-pre-commit
13-
rev: v0.12.3
13+
rev: v0.12.4
1414
hooks:
1515
- id: ruff
1616
args:

LEARN.md

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
<div align="center">
2+
3+
<picture>
4+
<source srcset="https://nest.owasp.org/img/owasp_icon_white_sm.png" media="(prefers-color-scheme: dark)">
5+
<img src="https://nest.owasp.org/img/owasp_icon_black_sm.png" alt="OWASP Logo" width="200">
6+
</picture>
7+
8+
# [OWASP Nest](https://nest.owasp.org/)
9+
10+
[![OWASP](https://img.shields.io/badge/OWASP-Incubator-blue?style=for-the-badge)](https://owasp.org/www-project-nest/) ![OWASP](https://img.shields.io/badge/OWASP-Code-blue?style=for-the-badge) [![Project-Nest](https://img.shields.io/badge/OWASP-%23project--nest-blue?logo=slack&logoColor=white&style=for-the-badge)](https://owasp.slack.com/messages/project-nest)
11+
12+
![License](https://img.shields.io/github/license/owasp/nest?color=41BE4A&label=License&style=for-the-badge) ![Last Commit](https://img.shields.io/github/last-commit/owasp/nest/main?style=for-the-badge&label=Last%20commit) ![Contributors](https://img.shields.io/github/contributors/owasp/nest?style=for-the-badge&label=Contributors)
13+
14+
[![CI/CD](https://img.shields.io/github/actions/workflow/status/owasp/nest/run-ci-cd.yaml?branch=main&label=Build&style=for-the-badge)](https://github.com/owasp/nest/actions/workflows/run-ci-cd.yaml?query=branch%3Amain) [![CodeQL](https://img.shields.io/github/actions/workflow/status/owasp/nest/run-code-ql.yaml?branch=main&label=CodeQL&style=for-the-badge)](https://github.com/owasp/nest/actions/workflows/run-code-ql.yaml?query=branch%3Amain) [![Sonarqube](https://img.shields.io/sonar/quality_gate/OWASP_Nest?server=https://sonarcloud.io&style=for-the-badge&label=Sonarqube)](https://sonarcloud.io/project/information?id=OWASP_Nest)
15+
16+
![Issues](https://img.shields.io/github/issues/owasp/nest?color=blue&style=for-the-badge&label=Issues) ![Pull Requests](https://img.shields.io/github/issues-pr/owasp/nest?color=blue&style=for-the-badge&label=Pull%20Requests)
17+
18+
[![OpenSSF](https://img.shields.io/badge/OpenSSF-84%25-blue?style=for-the-badge)](https://www.bestpractices.dev/projects/10174) [![Snyk Security](https://img.shields.io/badge/Snyk-Scanned-blue?style=for-the-badge)](https://snyk.io)
19+
20+
![Forks](https://img.shields.io/github/forks/owasp/nest?style=for-the-badge&label=Forks) ![Stars](https://img.shields.io/github/stars/owasp/nest?style=for-the-badge&label=Stars)
21+
22+
[![CREATED](https://img.shields.io/badge/created-aug,%202024-blue?style=for-the-badge)](https://github.com/OWASP/Nest/commit/2a213c2efcfc2f8889c2f1d330da0d2e6f649fc1)
23+
24+
</div>
25+
26+
**OWASP Nest** is a comprehensive platform designed to enhance collaboration and contribution within the OWASP community. The application serves as a central hub for exploring OWASP projects and ways to contribute to them, empowering contributors to find opportunities that align with their interests and expertise.
27+
28+
Key features of the platform include:
29+
30+
- **Advanced Search Capabilities:** Enables efficient navigation and filtering of projects and issues based on keywords, tags, and contributor preferences.
31+
- **Slack Integration:** Supports seamless communication through a [Slack bot](https://owasp.slack.com/team/U07M1C4JASK) that facilitates direct and channel messaging for updates and discussions.
32+
- **OWASP Chapters Proximity Page:** Offers localized information about nearby OWASP chapters to foster community engagement.
33+
- **AI-Generated Insights:** Provides summarized descriptions and actionable steps for tackling project issues.
34+
35+
OWASP Nest promotes collaboration, making it easier for both new and experienced contributors to engage meaningfully with OWASP's mission to improve software security worldwide.
36+
37+
## Leaders
38+
39+
OWASP Nest is led by a dedicated team committed to fostering collaboration and supporting contributors. The leadership team ensures the platform aligns with OWASP's mission, continually improving its features to serve the community better.
40+
Current Leaders:
41+
42+
- [Arkadii Yakovets](https://github.com/arkid15r/) -- CCSP, CISSP, CSSLP
43+
- [Kate Golovanova](https://github.com/kasya/) -- CC
44+
- [Starr Brown](https://github.com/mamicidal/) -- CISSP
45+
46+
All OWASP Nest leaders are certified ISC2 professionals and adhere to the OWASP Code of Conduct.
47+
For questions or discussions with the leadership team and other contributors, please use the [#project-nest](https://owasp.slack.com/archives/project-nest) channel on OWASP Slack.
48+
49+
## Contributing
50+
51+
OWASP Nest thrives on community contributions. Whether you are a developer, designer, writer, or enthusiast, there are various ways to get involved:
52+
53+
- Code Contributions: Help improve the platform by fixing issues or adding new features.
54+
- Code Review: Review and provide feedback on pull requests to ensure code quality and maintainability.
55+
- Documentation: Enhance user guides or create tutorials to help others navigate the platform.
56+
- Issue Reporting: Identify and report bugs or suggest improvements.
57+
- Engagement: Share feedback, participate in discussions, or promote the project in your network.
58+
59+
To get started, visit the [OWASP Nest Repository](https://github.com/OWASP/Nest), explore the [Contributing Guidelines](https://github.com/OWASP/Nest/blob/main/CONTRIBUTING.md), and [Code of Conduct](https://github.com/OWASP/Nest/blob/main/CODE_OF_CONDUCT.md).
60+
61+
## About
62+
63+
OWASP Nest was **originally created by Arkadii Yakovets** (Ark) to address challenges in navigating OWASP projects. The project was **built from scratch based on Ark's ideas and discussions with Starr Brown** (Starr), ensuring a well-structured system design aligned with OWASP's ecosystem. Ark, an experienced software development professional with over 10 years of expertise in Python, Django, Django REST Framework (DRF), and related backend technologies, led the development of the backend using widely adopted Python **open-source frameworks and libraries**, including DRF, django-filter, OpenAI, Algolia Search, slack-bolt, PyGitHub, pre-commit, pytest, and more. The initial frontend, based on Vue.js, was introduced by **Kateryna Golovanova** (Kate), who later became the project co-leader due to her invaluable frontend and project management skills. The **code is licensed under the MIT License**, encouraging contributions while protecting the authors from legal claims. All OWASP Nest leaders are OWASP members and adhere to the OWASP Code of Conduct.
64+
65+
Over time, OWASP Nest has expanded to address broader OWASP community needs, such as Google Summer of Code (GSoC) student guidance and contribution opportunities discovery. The platform, along with NestBot, has become a popular entry point for various OWASP aspects, including projects, chapters, users, and aggregated contribution opportunities -- with even more features planned. OWASP Nest's success is also the result of many valuable [contributions](https://github.com/OWASP/Nest/graphs/contributors) from the broader [OWASP Nest community](https://owasp.slack.com/archives/project-nest), whose efforts have helped shape and improve the project in countless ways.
66+
67+
**No other OWASP projects' code was used in OWASP Nest's development.** While explicit attribution (other than per MIT license) is not required, contributors and other OWASP project leaders are welcome to provide it at their discretion.
68+
69+
### Community and Social Media
70+
71+
- [BlueSky account](https://bsky.app/profile/nest.owasp.org)
72+
- [LinkedIn group](https://www.linkedin.com/groups/14656108/)
73+
- [Slack channel](https://owasp.slack.com/archives/project-nest) (join [here](https://owasp.org/slack/invite))

backend/Makefile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ include backend/apps/slack/Makefile
66
clean-backend-dependencies:
77
@rm -rf backend/.cache
88
@rm -rf backend/.local
9+
@rm -rf backend/.pytest_cache
10+
@rm -rf backend/.ruff_cache
911
@rm -rf backend/.venv
1012

1113
clean-backend-docker:

backend/apps/common/constants.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@
44
OWASP_BLOG_URL = "https://owasp.org/blog"
55
OWASP_NEST_URL = "https://nest.owasp.org"
66
OWASP_NEWS_URL = "https://owasp.org/news"
7-
OWASP_WEBSITE_URL = "https://owasp.org"
7+
OWASP_URL = "https://owasp.org"
88
TAB = "\t"
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# Generated by Django 5.2.4 on 2025-07-18 01:04
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
dependencies = [
8+
("github", "0031_alter_repository_organization"),
9+
]
10+
11+
operations = [
12+
migrations.AddIndex(
13+
model_name="user",
14+
index=models.Index(fields=["-created_at"], name="github_user_created_at_desc"),
15+
),
16+
migrations.AddIndex(
17+
model_name="user",
18+
index=models.Index(fields=["-updated_at"], name="github_user_updated_at_desc"),
19+
),
20+
]

backend/apps/github/models/user.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ class User(NodeModel, GenericUserModel, TimestampedModel, UserIndexMixin):
2121

2222
class Meta:
2323
db_table = "github_users"
24+
indexes = [
25+
models.Index(fields=["-created_at"], name="github_user_created_at_desc"),
26+
models.Index(fields=["-updated_at"], name="github_user_updated_at_desc"),
27+
]
2428
verbose_name_plural = "Users"
2529

2630
bio = models.TextField(verbose_name="Bio", max_length=1000, default="")

backend/apps/owasp/graphql/queries/chapter.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,4 @@ def chapter(self, key: str) -> ChapterNode | None:
2121
@strawberry.field
2222
def recent_chapters(self, limit: int = 8) -> list[ChapterNode]:
2323
"""Resolve recent chapters."""
24-
return Chapter.objects.filter(is_active=True).order_by("-created_at")[:limit]
24+
return Chapter.active_chapters.order_by("-created_at")[:limit]

backend/apps/owasp/management/commands/owasp_sync_posts.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import yaml.scanner
88
from django.core.management.base import BaseCommand
99

10-
from apps.common.constants import OWASP_BLOG_URL, OWASP_WEBSITE_URL
10+
from apps.common.constants import OWASP_BLOG_URL, OWASP_URL
1111
from apps.github.utils import get_repository_file_content
1212
from apps.owasp.models.post import Post
1313

@@ -23,7 +23,7 @@ def get_author_image_url(self, author_image_url: str) -> str:
2323
str: The full URL of the author's image.
2424
2525
"""
26-
return f"{OWASP_WEBSITE_URL}{author_image_url}" if author_image_url else ""
26+
return f"{OWASP_URL}{author_image_url}" if author_image_url else ""
2727

2828
def get_blog_url(self, path: str) -> str:
2929
"""Return OWASP blog URL for a given path.
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Generated by Django 5.2.4 on 2025-07-18 01:04
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
dependencies = [
8+
("github", "0032_user_github_user_created_at_desc_and_more"),
9+
("owasp", "0043_projecthealthmetrics_unique_daily_project_health_metrics"),
10+
]
11+
12+
operations = [
13+
migrations.AddIndex(
14+
model_name="chapter",
15+
index=models.Index(fields=["-updated_at"], name="chapter_updated_at_desc_idx"),
16+
),
17+
migrations.AddIndex(
18+
model_name="project",
19+
index=models.Index(fields=["-updated_at"], name="project_updated_at_desc_idx"),
20+
),
21+
]

backend/apps/owasp/models/chapter.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ class Meta:
3232
db_table = "owasp_chapters"
3333
indexes = [
3434
models.Index(fields=["-created_at"], name="chapter_created_at_desc_idx"),
35+
models.Index(fields=["-updated_at"], name="chapter_updated_at_desc_idx"),
3536
]
3637
verbose_name_plural = "Chapters"
3738

0 commit comments

Comments
 (0)