Skip to content

Commit 34eb490

Browse files
authored
Merge pull request #837 from memeLab/develop
Update 2.0.9
2 parents 9ae8195 + 979aa63 commit 34eb490

63 files changed

Lines changed: 1976 additions & 1400 deletions

Some content is hidden

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

Makefile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ test-all:
1616
docker compose exec django pytest
1717

1818
lint:
19+
uv run djlint ./src/blog/jinja2 --reformat
20+
uv run djlint ./src/core/jinja2 --reformat
21+
uv run djlint ./src/users/jinja2 --reformat
1922
uv run ruff format src
2023
uv run ruff check --extend-select I --fix src
2124

pyproject.toml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "Jandig"
3-
version = "2.0.8"
3+
version = "2.0.9"
44
description = "Add your description here"
55
readme = "README.md"
66
requires-python = ">=3.13"
@@ -33,6 +33,7 @@ dependencies = [
3333
dev = [
3434
"dj-inmemorystorage~=2.1",
3535
"django-debug-toolbar~=5.1",
36+
"djlint>=1.36.4",
3637
"factory-boy~=3.3",
3738
"numpy>=2.3.1",
3839
"playwright~=1.49",
@@ -66,3 +67,7 @@ line-length = 88
6667
# Assume Python 3.13
6768
target-version = "py313"
6869

70+
[tool.djlint]
71+
profile="jinja"
72+
extension="jinja2"
73+

src/blog/admin.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
@admin.register(Post)
1010
class PostAdmin(admin.ModelAdmin):
11-
list_display = ("title", "status", "created", "updated")
11+
list_display = ("title", "status", "created")
1212
raw_id_fields = ("author",)
1313

1414
def get_queryset(self, request):
@@ -17,5 +17,5 @@ def get_queryset(self, request):
1717

1818
@admin.register(Clipping)
1919
class ClippingAdmin(admin.ModelAdmin):
20-
list_display = ("title", "id", "created", "updated")
20+
list_display = ("title", "id", "created", "modified", "display_date")
2121
ordering = ("-created",)
Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,26 @@
11
{% extends '/core/home.jinja2' %}
2-
3-
{% block extra_css %}
4-
<link rel="stylesheet" href="{{ static('css/blog.css') }}">
5-
{% endblock %}
6-
2+
{% block extra_css %}<link rel="stylesheet" href="{{ static('css/blog.css') }}">{% endblock %}
73
{% block content %}
84
<div id="clipping-area">
9-
{% block button %}
10-
{% endblock %}
5+
{% block button %}{% endblock %}
116
{% block page_title %}
127
<h2>{{ _("Clipping") }}</h2>
138
{% endblock page_title %}
14-
<small id="warning">{{_( "The content below is in the original languages.")}}</small>
9+
<small id="warning">{{ _("The content below is in the original languages.") }}</small>
1510
{% for clipping in clippings %}
1611
<div class="clipping">
17-
<h3>{{ clipping.title }}</h3>
18-
<small>{{ clipping.created.date().strftime('%d %B %Y') }}</small>
12+
<h3>{{ clipping.title }}</h3>
13+
<small>{{ clipping.display_date.strftime("%d %B %Y") }}</small>
1914
<p>{{ clipping.description }}</p>
2015
<small><a href="{{ clipping.link }}">{{ clipping.link }}</a></small>
21-
{%if clipping.file.url[-3:] == "pdf" %}
22-
<a href="{{ clipping.file.url }}">{{ _("View as PDF")}}</a>
16+
{% if clipping.file.url[-3:] == "pdf" %}
17+
<a href="{{ clipping.file.url }}">{{ _("View as PDF") }}</a>
2318
{% elif clipping.file.url[-3:] in ["png","jpg"] %}
24-
<a href="{{ clipping.file.url }}">{{ _("View as JPG")}}</a>
19+
<a href="{{ clipping.file.url }}">{{ _("View as JPG") }}</a>
2520
{% else %}
26-
<a href="{{ clipping.file.url }}">{{ _("View File")}}</a>
21+
<a href="{{ clipping.file.url }}">{{ _("View File") }}</a>
2722
{% endif %}
2823
</div>
2924
{% endfor %}
3025
</div>
31-
{% endblock %}
26+
{% endblock %}

src/blog/jinja2/blog/detail.jinja2

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
{% extends "blog/index.jinja2" %}
2-
32
{% block content %}
43
<div id="post-area">
5-
<a id="back-button" href="{{ url('blog_index') }}">{{ _('< Back to Blog') }}</a>
4+
<a id="back-button" href="{{ url('blog_index') }}">{{ _("< Back to Blog") }}</a>
65
<br />
76
{% block page_title %}
87
<h2>{{ post.title }}</h2>
@@ -12,15 +11,11 @@
1211
{% for image in images %}
1312
<div class="post-image">
1413
<img class="post-image" src="{{ image.file.url }}" />
15-
{% if image.description %}
16-
<small>{{ image.description }}</small>
17-
{% endif %}
14+
{% if image.description %}<small>{{ image.description }}</small>{% endif %}
1815
</div>
1916
{% endfor %}
2017
</div>
21-
2218
</div>
2319
<br />
24-
<a href="#" id="back-to-top"> {{_("Back to Top")}}</a>
25-
26-
{% endblock %}
20+
<a href="#" id="back-to-top">{{ _("Back to Top") }}</a>
21+
{% endblock %}

src/blog/jinja2/blog/index.jinja2

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,11 @@
11
{% extends '/core/home.jinja2' %}
2-
3-
{% block extra_css %}
4-
<link rel="stylesheet" href="{{ static('css/blog.css') }}">
5-
{% endblock %}
6-
2+
{% block extra_css %}<link rel="stylesheet" href="{{ static('css/blog.css') }}">{% endblock %}
73
{% block content %}
84
<div id="blog-area">
9-
{% block button %}
10-
{% endblock %}
5+
{% block button %}{% endblock %}
116
{% block page_title %}
127
<h2>{{ _("Memories") }}</h2>
138
{% endblock page_title %}
14-
<div id="posts-area">
15-
{% include "/blog/post_preview.jinja2" %}
16-
</div>
9+
<div id="posts-area">{% include "/blog/post_preview.jinja2" %}</div>
1710
</div>
18-
{% endblock %}
11+
{% endblock %}
Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
11
{% for post in posts %}
22
<div class="post">
3-
<h3><a href="{{ url('post_detail', args=[post.pk])}}">{{ post.title }}</a></h3>
4-
<p>{{ post.body[:PREVIEW_SIZE] | safe }}... <a href="{{ url('post_detail', args=[post.pk])}}">{{ _("Read More") }}</a></p>
3+
<h3>
4+
<a href="{{ url('post_detail', args=[post.pk]) }}">{{ post.title }}</a>
5+
</h3>
6+
<p>
7+
{{ post.body[:PREVIEW_SIZE] | safe }}... <a href="{{ url('post_detail', args=[post.pk]) }}">{{ _("Read More") }}</a>
8+
</p>
59
</div>
610
{% endfor %}
711
{% if next_page_number <= total_pages %}
8-
<button hx-get="{{ page_url }}?page={{ next_page_number }}" hx-trigger="click" hx-swap="outerHTML"> {{_("See more")}}</button>
9-
{% endif %}
12+
<button hx-get="{{ page_url }}?page={{ next_page_number }}"
13+
hx-trigger="click"
14+
hx-swap="outerHTML">{{ _("See more") }}</button>
15+
{% endif %}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
# Generated by Django 6.0 on 2026-01-21 19:32
2+
3+
import django.utils.timezone
4+
import django_extensions.db.fields
5+
from django.db import migrations, models
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
dependencies = [
11+
('blog', '0007_alter_postimage_description'),
12+
]
13+
14+
operations = [
15+
migrations.AlterModelOptions(
16+
name='clipping',
17+
options={'get_latest_by': 'modified'},
18+
),
19+
migrations.AlterModelOptions(
20+
name='post',
21+
options={'get_latest_by': 'modified'},
22+
),
23+
migrations.AlterModelOptions(
24+
name='postimage',
25+
options={'get_latest_by': 'modified'},
26+
),
27+
migrations.RemoveField(
28+
model_name='clipping',
29+
name='updated',
30+
),
31+
migrations.RemoveField(
32+
model_name='post',
33+
name='updated',
34+
),
35+
migrations.AddField(
36+
model_name='clipping',
37+
name='display_date',
38+
field=models.DateField(blank=True, null=True, db_index=True),
39+
),
40+
migrations.AddField(
41+
model_name='clipping',
42+
name='modified',
43+
field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'),
44+
),
45+
migrations.AddField(
46+
model_name='post',
47+
name='modified',
48+
field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'),
49+
),
50+
migrations.AddField(
51+
model_name='postimage',
52+
name='created',
53+
field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='created'),
54+
preserve_default=False,
55+
),
56+
migrations.AddField(
57+
model_name='postimage',
58+
name='modified',
59+
field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'),
60+
),
61+
migrations.AlterField(
62+
model_name='clipping',
63+
name='created',
64+
field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created'),
65+
),
66+
migrations.AlterField(
67+
model_name='post',
68+
name='created',
69+
field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created'),
70+
),
71+
]
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
from django.db import migrations, models
2+
3+
def populate_display_dates(apps, schema_editor):
4+
Clipping = apps.get_model('blog', 'Clipping')
5+
for obj in Clipping.objects.all():
6+
obj.display_date = obj.created
7+
obj.save()
8+
9+
10+
class Migration(migrations.Migration):
11+
12+
dependencies = [
13+
('blog', '0008_alter_clipping_options_alter_post_options_and_more'),
14+
]
15+
16+
operations = [
17+
migrations.RunPython(populate_display_dates, reverse_code=migrations.RunPython.noop),
18+
migrations.AlterField(
19+
model_name='clipping',
20+
name='display_date',
21+
field=models.DateField(),
22+
),
23+
]

src/blog/models.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from django.core.files.storage import default_storage
22
from django.db import models
3+
from django_extensions.db.models import TimeStampedModel
34

45
from users.models import Profile
56

@@ -21,28 +22,27 @@ class Meta:
2122
verbose_name_plural = "categories"
2223

2324

24-
class PostImage(models.Model):
25+
class PostImage(TimeStampedModel):
2526
file = models.FileField(storage=default_storage, upload_to=IMAGE_BASE_PATH)
2627
description = models.CharField(max_length=500, blank=True)
2728

2829
def __str__(self):
2930
return self.file.name.lstrip(IMAGE_BASE_PATH)
3031

3132

32-
class Clipping(models.Model):
33+
class Clipping(TimeStampedModel):
3334
id = models.BigAutoField(primary_key=True)
3435
title = models.CharField(max_length=200)
3536
description = models.CharField(max_length=500)
3637
link = models.URLField()
3738
file = models.FileField(upload_to="clipping_files/")
38-
created = models.DateTimeField(auto_now_add=True, editable=True)
39-
updated = models.DateTimeField(auto_now=True, editable=True)
39+
display_date = models.DateField(db_index=True)
4040

4141
def __str__(self):
4242
return self.title
4343

4444

45-
class Post(models.Model):
45+
class Post(TimeStampedModel):
4646
id = models.BigAutoField(primary_key=True)
4747
title = models.CharField(max_length=200)
4848
status = models.CharField(
@@ -56,8 +56,6 @@ class Post(models.Model):
5656
blank=True,
5757
)
5858
body = models.TextField()
59-
created = models.DateTimeField(auto_now_add=True, editable=True)
60-
updated = models.DateTimeField(auto_now=True, editable=True)
6159
categories = models.ManyToManyField(Category, related_name="posts", blank=True)
6260
images = models.ManyToManyField(PostImage, related_name="posts", blank=True)
6361

0 commit comments

Comments
 (0)