Skip to content

Commit 2645451

Browse files
added badge model (#1929)
* refactored badge model * solved linting issues * solved linting issues * solved linting issues * refactored badge model * Update code --------- Co-authored-by: Arkadii Yakovets <[email protected]>
1 parent 8854137 commit 2645451

File tree

4 files changed

+141
-0
lines changed

4 files changed

+141
-0
lines changed

backend/apps/owasp/admin/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from apps.owasp.models.project_health_requirements import ProjectHealthRequirements
66

7+
from .badge import BadgeAdmin
78
from .chapter import ChapterAdmin
89
from .committee import CommitteeAdmin
910
from .event import EventAdmin

backend/apps/owasp/admin/badge.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
"""Admin configuration for the Badge model in the OWASP app."""
2+
3+
from django.contrib import admin
4+
5+
from apps.owasp.models.badge import Badge
6+
7+
8+
class BadgeAdmin(admin.ModelAdmin):
9+
"""Admin for Badge model."""
10+
11+
fieldsets = (
12+
(
13+
"Basic Information",
14+
{
15+
"fields": (
16+
"name",
17+
"description",
18+
"weight",
19+
)
20+
},
21+
),
22+
("Display Settings", {"fields": ("css_class",)}),
23+
(
24+
"Timestamps",
25+
{
26+
"fields": (
27+
"nest_created_at",
28+
"nest_updated_at",
29+
)
30+
},
31+
),
32+
)
33+
list_display = (
34+
"name",
35+
"description",
36+
"weight",
37+
"css_class",
38+
"nest_created_at",
39+
"nest_updated_at",
40+
)
41+
list_filter = ("weight",)
42+
ordering = (
43+
"weight",
44+
"name",
45+
)
46+
readonly_fields = (
47+
"nest_created_at",
48+
"nest_updated_at",
49+
)
50+
search_fields = (
51+
"css_class",
52+
"description",
53+
"name",
54+
)
55+
56+
57+
admin.site.register(Badge, BadgeAdmin)
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# Generated by Django 5.2.4 on 2025-08-09 19:54
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
dependencies = [
8+
("owasp", "0044_chapter_chapter_updated_at_desc_idx_and_more"),
9+
]
10+
11+
operations = [
12+
migrations.CreateModel(
13+
name="Badge",
14+
fields=[
15+
(
16+
"id",
17+
models.BigAutoField(
18+
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
19+
),
20+
),
21+
("nest_created_at", models.DateTimeField(auto_now_add=True)),
22+
("nest_updated_at", models.DateTimeField(auto_now=True)),
23+
(
24+
"css_class",
25+
models.CharField(default="", max_length=255, verbose_name="CSS Class"),
26+
),
27+
(
28+
"description",
29+
models.CharField(
30+
blank=True, default="", max_length=255, verbose_name="Description"
31+
),
32+
),
33+
("name", models.CharField(max_length=255, unique=True, verbose_name="Name")),
34+
("weight", models.PositiveSmallIntegerField(default=0, verbose_name="Weight")),
35+
],
36+
options={
37+
"verbose_name_plural": "Badges",
38+
"db_table": "owasp_badges",
39+
"ordering": ["weight", "name"],
40+
},
41+
),
42+
]

backend/apps/owasp/models/badge.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
"""Badge model for OWASP Nest user achievements and roles."""
2+
3+
from __future__ import annotations
4+
5+
from django.db import models
6+
7+
from apps.common.models import BulkSaveModel, TimestampedModel
8+
9+
10+
class Badge(BulkSaveModel, TimestampedModel):
11+
"""Represents a user badge for roles or achievements."""
12+
13+
class Meta:
14+
db_table = "owasp_badges"
15+
ordering = ["weight", "name"]
16+
verbose_name_plural = "Badges"
17+
18+
css_class = models.CharField(
19+
verbose_name="CSS Class",
20+
max_length=255,
21+
default="",
22+
)
23+
description = models.CharField(
24+
verbose_name="Description",
25+
max_length=255,
26+
blank=True,
27+
default="",
28+
)
29+
name = models.CharField(
30+
verbose_name="Name",
31+
max_length=255,
32+
unique=True,
33+
)
34+
weight = models.PositiveSmallIntegerField(
35+
verbose_name="Weight",
36+
default=0,
37+
)
38+
39+
def __str__(self) -> str:
40+
"""Return the badge string representation."""
41+
return self.name

0 commit comments

Comments
 (0)