diff --git a/hub/services/admin/articles.py b/hub/services/admin/articles.py
index e6dad8c..90298a4 100644
--- a/hub/services/admin/articles.py
+++ b/hub/services/admin/articles.py
@@ -45,7 +45,7 @@ class ArticleAdmin(admin.ModelAdmin):
"image_preview",
"is_published",
"is_featured",
- "created_at",
+ "article_date",
)
list_filter = (
"is_published",
@@ -54,11 +54,12 @@ class ArticleAdmin(admin.ModelAdmin):
"related_service",
"related_consulting_partner",
"related_cloud_provider",
- "created_at",
+ "article_date",
)
search_fields = ("title", "excerpt", "content", "meta_keywords")
prepopulated_fields = {"slug": ("title",)}
readonly_fields = ("created_at", "updated_at")
+ ordering = ("-article_date",)
def image_preview(self, obj):
"""Display image preview in admin list view"""
diff --git a/hub/services/migrations/0039_article_article_date.py b/hub/services/migrations/0039_article_article_date.py
new file mode 100644
index 0000000..69acc86
--- /dev/null
+++ b/hub/services/migrations/0039_article_article_date.py
@@ -0,0 +1,22 @@
+# Generated by Django 5.2 on 2025-07-04 13:48
+
+import django.utils.timezone
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("services", "0038_add_plan_ordering_and_best"),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name="article",
+ name="article_date",
+ field=models.DateField(
+ default=django.utils.timezone.now,
+ help_text="Date of the article publishing",
+ ),
+ ),
+ ]
diff --git a/hub/services/models/articles.py b/hub/services/models/articles.py
index 781c54c..b1b85e7 100644
--- a/hub/services/models/articles.py
+++ b/hub/services/models/articles.py
@@ -3,6 +3,7 @@ from django.urls import reverse
from django.utils.text import slugify
from django.contrib.auth.models import User
from django_prose_editor.fields import ProseEditorField
+from django.utils import timezone
from .base import validate_image_size
from .services import Service
from .providers import CloudProvider, ConsultingPartner
@@ -23,6 +24,9 @@ class Article(models.Model):
help_text="Title picture for the article",
)
author = models.ForeignKey(User, on_delete=models.CASCADE, related_name="articles")
+ article_date = models.DateField(
+ default=timezone.now, help_text="Date of the article publishing"
+ )
# Relations to other models
related_service = models.ForeignKey(
diff --git a/hub/services/templates/services/article_detail.html b/hub/services/templates/services/article_detail.html
index 44af754..9721513 100644
--- a/hub/services/templates/services/article_detail.html
+++ b/hub/services/templates/services/article_detail.html
@@ -16,9 +16,7 @@
By {{ article.author.get_full_name|default:article.author.username }}
•
- {{ article.created_at|date:"M d, Y" }}
- {% if article.updated_at != article.created_at %}
- {% endif %}
+ {{ article.article_date|date:"M d, Y" }}
diff --git a/hub/services/templates/services/article_list.html b/hub/services/templates/services/article_list.html
index edb0989..ac86df4 100644
--- a/hub/services/templates/services/article_list.html
+++ b/hub/services/templates/services/article_list.html
@@ -169,7 +169,7 @@
By {{ article.author.get_full_name|default:article.author.username }}
- {{ article.created_at|date:"M d, Y" }}
+ {{ article.article_date|date:"M d, Y" }}
diff --git a/hub/services/views/articles.py b/hub/services/views/articles.py
index 6589d6f..4b8117f 100644
--- a/hub/services/views/articles.py
+++ b/hub/services/views/articles.py
@@ -23,7 +23,7 @@ def article_list(request):
# Apply filters based on request parameters
if search_query:
articles = articles.filter(
- Q(title__icontains=search_query)
+ Q(title__icontains=search_query)
| Q(excerpt__icontains=search_query)
| Q(content__icontains=search_query)
| Q(meta_keywords__icontains=search_query)
@@ -41,7 +41,7 @@ def article_list(request):
# Order articles: featured first, then by creation date (newest first)
articles = articles.order_by(
"-is_featured", # Featured first (True before False)
- "-created_at", # Newest first
+ "-article_date", # Newest first
)
# Create base querysets for each filter type that apply all OTHER current filters
@@ -51,7 +51,7 @@ def article_list(request):
service_filter_base = all_articles
if search_query:
service_filter_base = service_filter_base.filter(
- Q(title__icontains=search_query)
+ Q(title__icontains=search_query)
| Q(excerpt__icontains=search_query)
| Q(content__icontains=search_query)
| Q(meta_keywords__icontains=search_query)
@@ -69,7 +69,7 @@ def article_list(request):
cp_filter_base = all_articles
if search_query:
cp_filter_base = cp_filter_base.filter(
- Q(title__icontains=search_query)
+ Q(title__icontains=search_query)
| Q(excerpt__icontains=search_query)
| Q(content__icontains=search_query)
| Q(meta_keywords__icontains=search_query)
@@ -85,7 +85,7 @@ def article_list(request):
cloud_filter_base = all_articles
if search_query:
cloud_filter_base = cloud_filter_base.filter(
- Q(title__icontains=search_query)
+ Q(title__icontains=search_query)
| Q(excerpt__icontains=search_query)
| Q(content__icontains=search_query)
| Q(meta_keywords__icontains=search_query)
@@ -136,16 +136,14 @@ def article_detail(request, slug):
Article.objects.select_related(
"author",
"related_service",
- "related_consulting_partner",
- "related_cloud_provider"
+ "related_consulting_partner",
+ "related_cloud_provider",
).filter(is_published=True),
slug=slug,
)
# Get related articles (same service, partner, or provider)
- related_articles = Article.objects.filter(
- is_published=True
- ).exclude(id=article.id)
+ related_articles = Article.objects.filter(is_published=True).exclude(id=article.id)
if article.related_service:
related_articles = related_articles.filter(
@@ -164,13 +162,13 @@ def article_detail(request, slug):
related_articles = related_articles.filter(
related_service__isnull=True,
related_consulting_partner__isnull=True,
- related_cloud_provider__isnull=True
+ related_cloud_provider__isnull=True,
)
- related_articles = related_articles.order_by("-created_at")[:3]
+ related_articles = related_articles.order_by("-article_date")[:3]
context = {
"article": article,
"related_articles": related_articles,
}
- return render(request, "services/article_detail.html", context)
\ No newline at end of file
+ return render(request, "services/article_detail.html", context)