Skip to content

Commit 58865cb

Browse files
committed
Add command to calculate score
1 parent 8110192 commit 58865cb

File tree

3 files changed

+95
-2
lines changed

3 files changed

+95
-2
lines changed

backend/Makefile

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,11 +104,15 @@ owasp-process-snapshots:
104104
@CMD="python manage.py owasp_process_snapshots" $(MAKE) exec-backend-command
105105

106106
owasp-update-project-health-metrics:
107-
@echo "Updating OWASP project health requirements"
107+
@echo "Updating OWASP project health metrics"
108108
@CMD="python manage.py owasp_update_project_health_metrics" $(MAKE) exec-backend-command
109109

110+
owasp-update-project-health-metrics-score:
111+
@echo "Updating OWASP project health metrics score"
112+
@CMD="python manage.py owasp_update_project_health_metrics_score" $(MAKE) exec-backend-command
113+
110114
owasp-update-project-health-requirements:
111-
@echo "Updating OWASP project health metrics"
115+
@echo "Updating OWASP project health requirements"
112116
@CMD="python manage.py owasp_update_project_health_requirements" $(MAKE) exec-backend-command
113117

114118
owasp-scrape-chapters:
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
"""A command to update OWASP project health metrics score."""
2+
3+
from django.core.management.base import BaseCommand
4+
5+
from apps.owasp.models.project_health_metrics import ProjectHealthMetrics
6+
from apps.owasp.models.project_health_requirements import ProjectHealthRequirements
7+
8+
9+
class Command(BaseCommand):
10+
help = "Update OWASP project health metrics score."
11+
12+
def handle(self, *args, **options):
13+
metrics = ProjectHealthMetrics.objects.all()
14+
weight_mapping = {
15+
"age_days": 6.0,
16+
"contributors_count": 6.0,
17+
"forks_count": 6.0,
18+
"last_release_days": 6.0,
19+
"last_commit_days": 6.0,
20+
"open_issues_count": 6.0,
21+
"open_pull_requests_count": 6.0,
22+
"owasp_page_last_update_days": 6.0,
23+
"last_pull_request_days": 6.0,
24+
"recent_releases_count": 6.0,
25+
"stars_count": 8.0,
26+
"total_pull_requests_count": 8.0,
27+
"total_releases_count": 8.0,
28+
"unanswered_issues_count": 8.0,
29+
"unassigned_issues_count": 8.0,
30+
}
31+
for metric in metrics:
32+
try:
33+
# Calculate the score based on requirements
34+
requirements = ProjectHealthRequirements.objects.get(level=metric.project.level)
35+
36+
score = 0.0
37+
for field, weight in weight_mapping.items():
38+
metric_value = getattr(metric, field)
39+
requirement_value = getattr(requirements, field)
40+
41+
if metric_value >= requirement_value:
42+
score += weight
43+
44+
metric.score = score
45+
metric.save(update_fields=["score"])
46+
self.stdout.write(
47+
self.style.SUCCESS(f"Updated score for project {metric.project.name}: {score}")
48+
)
49+
50+
except (AttributeError, ValueError, TypeError) as e:
51+
self.stdout.write(
52+
self.style.ERROR(f"Error updating project {metric.project.name}: {e}")
53+
)

backend/apps/owasp/models/project_health_metrics.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from django.core.validators import MaxValueValidator, MinValueValidator
44
from django.db import models
5+
from django.utils import timezone
56

67
from apps.common.models import TimestampedModel
78

@@ -62,6 +63,41 @@ class Meta:
6263
verbose_name="Unassigned issues", default=0
6364
)
6465

66+
@property
67+
def age_days(self) -> int:
68+
"""Calculate project age in days."""
69+
if self.created_at:
70+
return (timezone.now() - self.created_at).days
71+
return 0
72+
73+
@property
74+
def last_commit_days(self) -> int:
75+
"""Calculate days since last commit."""
76+
if self.last_committed_at:
77+
return (timezone.now() - self.last_committed_at).days
78+
return 0
79+
80+
@property
81+
def last_pull_request_days(self) -> int:
82+
"""Calculate days since last pull request."""
83+
if self.pull_request_last_created_at:
84+
return (timezone.now() - self.pull_request_last_created_at).days
85+
return 0
86+
87+
@property
88+
def last_release_days(self) -> int:
89+
"""Calculate days since last release."""
90+
if self.last_released_at:
91+
return (timezone.now() - self.last_released_at).days
92+
return 0
93+
94+
@property
95+
def owasp_page_last_update_days(self) -> int:
96+
"""Calculate days since OWASP page last update."""
97+
if self.owasp_page_last_updated_at:
98+
return (timezone.now() - self.owasp_page_last_updated_at).days
99+
return 0
100+
65101
def __str__(self) -> str:
66102
"""Project health metrics human readable representation."""
67103
return f"Health Metrics for {self.project.name}"

0 commit comments

Comments
 (0)