Compare commits

...
2 Commits
Author SHA1 Message Date
Superredstone 14118cf438 feat(navbar): add project tab 2026-09-10 16:24:19 +02:00
Superredstone cce932d171 chore: fix pre-commit hook 2026-09-10 13:58:49 +02:00
16 changed files with 150 additions and 46 deletions
-3
View File
@@ -8,9 +8,6 @@ devenv.local.yaml
# direnv # direnv
.direnv .direnv
# pre-commit
.pre-commit-config.yaml
*.sqlite3 *.sqlite3
*.pyc *.pyc
+15
View File
@@ -0,0 +1,15 @@
repos:
- repo: https://github.com/djlint/djLint
rev: v1.46.1
hooks:
- id: djlint-reformat-django
language: system
- id: djlint-django
language: system
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.16.6
hooks:
- id: ruff-check
language: system
- id: ruff-format
language: system
-14
View File
@@ -13,18 +13,4 @@
}; };
}; };
git-hooks.hooks = {
ruff = {
enable = true;
package = pkgs.ruff;
excludes = [ "migrations/" ];
};
djlint = {
enable = true;
name = "djlint";
entry = "djlint --check .";
types = [ "html" ];
};
};
} }
+11 -2
View File
@@ -4,6 +4,7 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Patrick Canal developer website">
<title>Patrick Canal</title> <title>Patrick Canal</title>
<link rel="stylesheet" href="{% static 'css/style.css' %}"> <link rel="stylesheet" href="{% static 'css/style.css' %}">
<link rel="stylesheet" href="{% static 'tabler/tabler.min.css' %}"> <link rel="stylesheet" href="{% static 'tabler/tabler.min.css' %}">
@@ -24,12 +25,20 @@
<span class="navbar-toggler-icon"></span> <span class="navbar-toggler-icon"></span>
</button> </button>
<ul class="navbar-nav"> <ul class="navbar-nav">
<li class="nav-item active"> <li class="nav-item {% if request.path == "/portfolio/" %}active{% endif %}">
<a class="nav-link" href="{% url 'index' %}"> <a class="nav-link" href="{% url 'index' %}">
<span class="nav-link-icon"> <span class="nav-link-icon">
<i class="fa-solid fa-house"></i> <i class="fa-solid fa-house"></i>
</span> </span>
<span class="nav-link-title">Home</span> <span class="nav-link-title">{% trans "Home" %}</span>
</a>
</li>
<li class="nav-item {% if "/portfolio/projects" in request.path %}active{% endif %}">
<a class="nav-link" href="{% url 'projects' %}">
<span class="nav-link-icon">
<i class="fa-solid fa-folder-open"></i>
</span>
<span class="nav-link-title">{% trans "Projects" %}</span>
</a> </a>
</li> </li>
</ul> </ul>
+3 -2
View File
@@ -18,13 +18,14 @@ Including another URLconf
from django.conf import settings from django.conf import settings
from django.conf.urls.static import static from django.conf.urls.static import static
from django.contrib import admin from django.contrib import admin
from django.urls import path from django.urls import include, path
from portfolio.views import IndexView from patrickcanal_it.views import IndexView
urlpatterns = [ urlpatterns = [
path("admin/", admin.site.urls), path("admin/", admin.site.urls),
path("", IndexView.as_view(), name="index"), path("", IndexView.as_view(), name="index"),
path("portfolio/", include("portfolio.urls")),
] ]
if settings.DEBUG: if settings.DEBUG:
+7
View File
@@ -0,0 +1,7 @@
from django.shortcuts import redirect
from django.views.generic import View
class IndexView(View):
def get(self, request, *args, **kwargs):
return redirect("portfolio")
+7
View File
@@ -7,10 +7,17 @@ from portfolio import models
class JobExperienceAdmin(admin.ModelAdmin): class JobExperienceAdmin(admin.ModelAdmin):
pass pass
@admin.register(models.JobTask) @admin.register(models.JobTask)
class JobTaskAdmin(admin.ModelAdmin): class JobTaskAdmin(admin.ModelAdmin):
pass pass
@admin.register(models.Company) @admin.register(models.Company)
class CompanyAdmin(admin.ModelAdmin): class CompanyAdmin(admin.ModelAdmin):
pass pass
@admin.register(models.Project)
class ProjectAdmin(admin.ModelAdmin):
list_display = ["name", "short_description"]
@@ -0,0 +1,28 @@
# Generated by Django 6.1 on 2026-08-30 18:10
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('portfolio', '0002_alter_company_options_jobexperience_position'),
]
operations = [
migrations.CreateModel(
name='Project',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=256, verbose_name='Name')),
('short_description', models.CharField(max_length=512, verbose_name='Short description')),
('url', models.URLField(blank=True, verbose_name='URL')),
],
),
migrations.AlterField(
model_name='jobtask',
name='job',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='job_tasks', to='portfolio.jobexperience'),
),
]
+15 -1
View File
@@ -38,9 +38,23 @@ class JobExperience(models.Model):
class JobTask(models.Model): class JobTask(models.Model):
job = models.ForeignKey( job = models.ForeignKey(
to=JobExperience, null=False, blank=False, on_delete=models.CASCADE, related_name="job_tasks" to=JobExperience,
null=False,
blank=False,
on_delete=models.CASCADE,
related_name="job_tasks",
) )
description = models.TextField(verbose_name=_("Description"), max_length=4192) description = models.TextField(verbose_name=_("Description"), max_length=4192)
def __str__(self): def __str__(self):
return self.job.__str__() return self.job.__str__()
class Project(models.Model):
name = models.CharField(
verbose_name=_("Name"), max_length=256, null=False, blank=False
)
short_description = models.CharField(
verbose_name=_("Short description"), max_length=512, blank=False, null=False
)
url = models.URLField(verbose_name=_("URL"), blank=True, null=False)
+3 -3
View File
@@ -29,7 +29,7 @@
</div> </div>
</div> </div>
<div class="text-center"> <div class="text-center">
<a href="" class="btn btn-primary btn-lg me-2">My projects</a> <a href="{% url 'projects' %}" class="btn btn-primary btn-lg me-2">My projects</a>
<a href="" class="btn btn-outline-secondary btn-lg">Contact me</a> <a href="" class="btn btn-outline-secondary btn-lg">Contact me</a>
</div> </div>
</div> </div>
@@ -67,7 +67,7 @@
</div> </div>
</div> </div>
<div class="col"> <div class="col">
<div class="card"> <div class="card h-full">
<div class="card-body d-flex align-items-center flex-column"> <div class="card-body d-flex align-items-center flex-column">
<div class="w-24 h-30 text-5xl pt-4"> <div class="w-24 h-30 text-5xl pt-4">
<i class="fa-solid fa-server fa-2xl"></i> <i class="fa-solid fa-server fa-2xl"></i>
@@ -96,7 +96,7 @@
<div class="card-body"> <div class="card-body">
<p class="text-primary mb-0">{{ je.start }} - {% if je.end %}{{ je.end }}{% else %}{% trans "today" %}{% endif %}</p> <p class="text-primary mb-0">{{ je.start }} - {% if je.end %}{{ je.end }}{% else %}{% trans "today" %}{% endif %}</p>
<h2 class="fs-2">{{ je.position }}</h2> <h2 class="fs-2">{{ je.position }}</h2>
<div class=""> <div>
<div class="text-danger">{{ je.company.name }}</div> <div class="text-danger">{{ je.company.name }}</div>
<div class="text-secondary">{{ je.company.location }}</div> <div class="text-secondary">{{ je.company.location }}</div>
<div class="mt-2 text-white"> <div class="mt-2 text-white">
+27
View File
@@ -0,0 +1,27 @@
{% extends "base.html" %}
{% load i18n %}
{% block content %}
<div class="container mt-4">
<div class="row row-deck row-cards">
{% for project in object_list %}
<div class="col-md-4">
{% if project.url %}
<a class="card card-link card-link-pop" href="{{ project.url }}">
<div class="card-body">
<h4>{{ project.name }}</h4>
<p>{{ project.short_description }}</p>
</div>
</a>
{% else %}
<div class="card">
<div class="card-body">
<h4>{{ project.name }}</h4>
<p>{{ project.short_description }}</p>
</div>
</div>
{% endif %}
</div>
{% endfor %}
</div>
</div>
{% endblock %}
+8
View File
@@ -0,0 +1,8 @@
from django.urls import path
from portfolio import views
urlpatterns = [
path("", views.PortfolioView.as_view(), name="portfolio"),
path("projects/", views.ProjectList.as_view(), name="projects"),
]
+10 -3
View File
@@ -1,10 +1,17 @@
from django.views.generic import TemplateView from django.views.generic import ListView, TemplateView
from portfolio import models from portfolio import models
class IndexView(TemplateView): class PortfolioView(TemplateView):
template_name = "index.html" template_name = "index.html"
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
return {"job_experiences": models.JobExperience.objects.all().order_by("-start")} return {
"job_experiences": models.JobExperience.objects.all().order_by("-start")
}
class ProjectList(ListView):
template_name = "project_list.html"
model = models.Project
+3 -1
View File
@@ -19,4 +19,6 @@ line-ending = "auto"
[tool.ruff.lint] [tool.ruff.lint]
extend-select = ["I"] extend-select = ["I"]
ignore = [
"RUF012"
]
+6 -6
View File
File diff suppressed because one or more lines are too long
+7 -11
View File
File diff suppressed because one or more lines are too long