From c2e5f9a3a28dd609b86695f095eed7a930065794 Mon Sep 17 00:00:00 2001 From: Superredstone Date: Wed, 16 Sep 2026 17:31:04 +0200 Subject: [PATCH] feat(portfolio): add project tags --- portfolio/admin.py | 5 ++++ .../0005_projecttag_project_tags.py | 26 +++++++++++++++++++ portfolio/models.py | 25 ++++++++++++++++++ portfolio/templates/project_list.html | 12 +++++++++ 4 files changed, 68 insertions(+) create mode 100644 portfolio/migrations/0005_projecttag_project_tags.py diff --git a/portfolio/admin.py b/portfolio/admin.py index 0e9c69b..739269e 100644 --- a/portfolio/admin.py +++ b/portfolio/admin.py @@ -21,3 +21,8 @@ class CompanyAdmin(admin.ModelAdmin): @admin.register(models.Project) class ProjectAdmin(admin.ModelAdmin): list_display = ["name", "short_description"] + + +@admin.register(models.ProjectTag) +class ProjectTagAdmin(admin.ModelAdmin): + list_display = ["name", "color"] diff --git a/portfolio/migrations/0005_projecttag_project_tags.py b/portfolio/migrations/0005_projecttag_project_tags.py new file mode 100644 index 0000000..7f30e53 --- /dev/null +++ b/portfolio/migrations/0005_projecttag_project_tags.py @@ -0,0 +1,26 @@ +# Generated by Django 6.1.1 on 2026-09-15 18:04 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('portfolio', '0004_company_color_alter_company_logo'), + ] + + operations = [ + migrations.CreateModel( + name='ProjectTag', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=25, verbose_name='Name')), + ('color', models.CharField(default='000000', max_length=6, verbose_name='Color (hex)')), + ], + ), + migrations.AddField( + model_name='project', + name='tags', + field=models.ManyToManyField(blank=True, related_name='projects', to='portfolio.projecttag', verbose_name='Tags'), + ), + ] diff --git a/portfolio/models.py b/portfolio/models.py index fab38c9..47ea94e 100644 --- a/portfolio/models.py +++ b/portfolio/models.py @@ -57,6 +57,22 @@ class JobTask(models.Model): return self.job.__str__() +class ProjectTag(models.Model): + name = models.CharField( + verbose_name=_("Name"), max_length=25, blank=False, null=False + ) + color = models.CharField( + verbose_name=_("Color (hex)"), + max_length=6, + null=False, + blank=False, + default="000000", + ) + + def __str__(self): + return self.name + + class Project(models.Model): name = models.CharField( verbose_name=_("Name"), max_length=256, null=False, blank=False @@ -65,3 +81,12 @@ class Project(models.Model): verbose_name=_("Short description"), max_length=512, blank=False, null=False ) url = models.URLField(verbose_name=_("URL"), blank=True, null=False) + tags = models.ManyToManyField( + ProjectTag, + verbose_name=_("Tags"), + blank=True, + related_name="projects", + ) + + def __str__(self): + return self.name diff --git a/portfolio/templates/project_list.html b/portfolio/templates/project_list.html index d932faa..a3bfbbd 100644 --- a/portfolio/templates/project_list.html +++ b/portfolio/templates/project_list.html @@ -12,6 +12,12 @@

{{ project.name }}

{{ project.short_description }}

+
+ {% for t in project.tags.all %} +
{{ t }}
+ {% endfor %} +
{% else %} @@ -19,6 +25,12 @@

{{ project.name }}

{{ project.short_description }}

+
+ {% for t in project.tags.all %} +
{{ t }}
+ {% endfor %} +
{% endif %}