From 9b51eb3847851edb5fd64295364c9acf8f24b53d Mon Sep 17 00:00:00 2001
From: George Katsikas <giorgakis.katsikas@gmail.com>
Date: Wed, 24 Apr 2024 14:33:50 +0200
Subject: [PATCH] rename newsletter to newscollection

---
 scipost_django/news/admin.py                  | 16 ++--
 scipost_django/news/factories.py              |  8 +-
 scipost_django/news/forms.py                  | 18 ++---
 ...name_newsletter_newscollection_and_more.py | 33 +++++++++
 scipost_django/news/models.py                 | 16 ++--
 ...nts.html => _newscollection_contents.html} |  8 +-
 .../news/templates/news/news_manage.html      | 32 ++++----
 ...tml => newscollection_confirm_delete.html} | 10 ++-
 ...create.html => newscollection_create.html} | 10 +--
 ...detail.html => newscollection_detail.html} |  6 +-
 ...update.html => newscollection_update.html} | 24 +++---
 ...ml => newscollection_update_ordering.html} |  8 +-
 scipost_django/news/tests/test_factories.py   |  8 +-
 scipost_django/news/urls.py                   | 36 ++++-----
 scipost_django/news/views.py                  | 74 +++++++++----------
 .../scipost/personal_page/_hx_admin.html      |  2 +-
 16 files changed, 172 insertions(+), 137 deletions(-)
 create mode 100644 scipost_django/news/migrations/0003_rename_newsletter_newscollection_and_more.py
 rename scipost_django/news/templates/news/{_newsletter_contents.html => _newscollection_contents.html} (56%)
 rename scipost_django/news/templates/news/{newsletter_confirm_delete.html => newscollection_confirm_delete.html} (74%)
 rename scipost_django/news/templates/news/{newsletter_create.html => newscollection_create.html} (60%)
 rename scipost_django/news/templates/news/{newsletter_detail.html => newscollection_detail.html} (58%)
 rename scipost_django/news/templates/news/{newsletter_update.html => newscollection_update.html} (51%)
 rename scipost_django/news/templates/news/{newsletter_update_ordering.html => newscollection_update_ordering.html} (79%)

diff --git a/scipost_django/news/admin.py b/scipost_django/news/admin.py
index fc84dde0d..001402f7d 100644
--- a/scipost_django/news/admin.py
+++ b/scipost_django/news/admin.py
@@ -4,25 +4,21 @@ __license__ = "AGPL v3"
 
 from django.contrib import admin
 
-from .models import NewsLetter, NewsItem, NewsLetterNewsItemsTable
+from .models import NewsCollection, NewsItem, NewsCollectionNewsItemsTable
 
 
-class NewsLetterNewsItemsTableInline(admin.TabularInline):
-    model = NewsLetterNewsItemsTable
+class NewsCollectionNewsItemsTableInline(admin.TabularInline):
+    model = NewsCollectionNewsItemsTable
 
 
-@admin.register(NewsLetter)
-class NewsLetterAdmin(admin.ModelAdmin):
+@admin.register(NewsCollection)
+class NewsCollectionAdmin(admin.ModelAdmin):
     search_fields = ["intro", "closing"]
     list_display = ["__str__", "published"]
-    inlines = [NewsLetterNewsItemsTableInline]
-
-
+    inlines = [NewsCollectionNewsItemsTableInline]
 
 
 @admin.register(NewsItem)
 class NewsItemAdmin(admin.ModelAdmin):
     search_fields = ["blurb", "followup_link_text"]
     list_display = ["__str__", "published", "on_homepage"]
-
-
diff --git a/scipost_django/news/factories.py b/scipost_django/news/factories.py
index 6b2f5a211..878e8f423 100644
--- a/scipost_django/news/factories.py
+++ b/scipost_django/news/factories.py
@@ -4,19 +4,19 @@ __license__ = "AGPL v3"
 
 import factory
 
-from .models import NewsItem, NewsLetter
+from .models import NewsItem, NewsCollection
 
 
-class NewsLetterFactory(factory.django.DjangoModelFactory):
+class NewsCollectionFactory(factory.django.DjangoModelFactory):
     class Meta:
-        model = NewsLetter
+        model = NewsCollection
 
     date = factory.Faker("date_this_year")
     intro = factory.Faker("paragraph", nb_sentences=2)
     closing = factory.Faker("paragraph", nb_sentences=2)
     published = True
 
-    # Create NewsItems for this NewsLetter linking them through NewsLetterNewsItemsTable
+    # Create NewsItems for this NewsCollection linking them through NewsCollectionNewsItemsTable
     @factory.post_generation
     def news_items(self, create, extracted, **kwargs):
         if not create:
diff --git a/scipost_django/news/forms.py b/scipost_django/news/forms.py
index a0316f786..63108096e 100644
--- a/scipost_django/news/forms.py
+++ b/scipost_django/news/forms.py
@@ -4,12 +4,12 @@ __license__ = "AGPL v3"
 
 from django import forms
 
-from .models import NewsLetter, NewsItem, NewsLetterNewsItemsTable
+from .models import NewsCollection, NewsItem, NewsCollectionNewsItemsTable
 
 
-class NewsLetterForm(forms.ModelForm):
+class NewsCollectionForm(forms.ModelForm):
     class Meta:
-        model = NewsLetter
+        model = NewsCollection
         fields = ["date", "intro", "closing", "published"]
 
 
@@ -30,13 +30,13 @@ class NewsItemForm(forms.ModelForm):
         ]
 
 
-class NewsLetterNewsItemsTableForm(forms.ModelForm):
+class NewsCollectionNewsItemsTableForm(forms.ModelForm):
     class Meta:
-        model = NewsLetterNewsItemsTable
+        model = NewsCollectionNewsItemsTable
         fields = ["newsitem"]
 
 
-class NewsLetterNewsItemsTableFormSet(forms.BaseModelFormSet):
+class NewsCollectionNewsItemsTableFormSet(forms.BaseModelFormSet):
     def save(self, *args, **kwargs):
         objects = super().save(*args, **kwargs)
         for form in self.ordered_forms:
@@ -45,10 +45,10 @@ class NewsLetterNewsItemsTableFormSet(forms.BaseModelFormSet):
         return objects
 
 
-NewsLetterNewsItemsOrderingFormSet = forms.modelformset_factory(
-    NewsLetterNewsItemsTable,
+NewsCollectionNewsItemsOrderingFormSet = forms.modelformset_factory(
+    NewsCollectionNewsItemsTable,
     fields=(),
     can_order=True,
     extra=0,
-    formset=NewsLetterNewsItemsTableFormSet,
+    formset=NewsCollectionNewsItemsTableFormSet,
 )
diff --git a/scipost_django/news/migrations/0003_rename_newsletter_newscollection_and_more.py b/scipost_django/news/migrations/0003_rename_newsletter_newscollection_and_more.py
new file mode 100644
index 000000000..b9ed379d9
--- /dev/null
+++ b/scipost_django/news/migrations/0003_rename_newsletter_newscollection_and_more.py
@@ -0,0 +1,33 @@
+# Generated by Django 4.2.10 on 2024-04-24 10:42
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+    dependencies = [
+        ("news", "0002_auto_20180706_1459"),
+    ]
+
+    operations = [
+        migrations.RenameModel(
+            old_name="NewsLetter",
+            new_name="NewsCollection",
+        ),
+        migrations.RenameModel(
+            old_name="NewsLetterNewsItemsTable",
+            new_name="NewsCollectionNewsItemsTable",
+        ),
+        migrations.RenameField(
+            model_name="newscollectionnewsitemstable",
+            old_name="newsletter",
+            new_name="newscollection",
+        ),
+        migrations.AlterField(
+            model_name="newsitem",
+            name="blurb_short",
+            field=models.TextField(
+                default="",
+                help_text="Short version for use in NewsCollection/emails etc",
+            ),
+        ),
+    ]
diff --git a/scipost_django/news/models.py b/scipost_django/news/models.py
index 035466a86..f3b99d16a 100644
--- a/scipost_django/news/models.py
+++ b/scipost_django/news/models.py
@@ -8,11 +8,11 @@ from django.db import models
 from .managers import NewsManager
 
 
-class NewsLetter(models.Model):
+class NewsCollection(models.Model):
     """
     Container of NewsItems.
     Which NewsItems (and their order) are handled via the auxiliary
-    model NewsLetterNewsItemsTable.
+    model NewsCollectionNewsItemsTable.
     """
 
     date = models.DateField()
@@ -21,11 +21,11 @@ class NewsLetter(models.Model):
     published = models.BooleanField(default=False)
 
     def __str__(self):
-        return "SciPost Newsletter %s" % self.date.strftime("%Y-%m-%d")
+        return "SciPost News Collection %s" % self.date.strftime("%Y-%m-%d")
 
     def get_absolute_url(self):
         return reverse(
-            "news:newsletter_detail",
+            "news:newscollection_detail",
             kwargs={
                 "year": self.date.strftime("%Y"),
                 "month": self.date.strftime("%m"),
@@ -38,7 +38,7 @@ class NewsItem(models.Model):
     date = models.DateField()
     headline = models.CharField(max_length=300)
     blurb_short = models.TextField(
-        default="", help_text="Short version for use in Newsletter/emails etc"
+        default="", help_text="Short version for use in NewsCollection/emails etc"
     )
     blurb = models.TextField()
     image = models.ImageField(upload_to="news/newsitems/%Y/", blank=True)
@@ -63,12 +63,12 @@ class NewsItem(models.Model):
         return reverse("news:newsitem_detail", kwargs={"pk": self.id})
 
 
-class NewsLetterNewsItemsTable(models.Model):
+class NewsCollectionNewsItemsTable(models.Model):
     """
-    Carries the specification of which NewsItem sits in which NewsLetter,
+    Carries the specification of which NewsItem sits in which NewsCollection,
     and in which order.
     """
 
-    newsletter = models.ForeignKey("news.NewsLetter", on_delete=models.CASCADE)
+    newscollection = models.ForeignKey("news.NewsCollection", on_delete=models.CASCADE)
     newsitem = models.ForeignKey("news.NewsItem", on_delete=models.CASCADE)
     order = models.PositiveSmallIntegerField()
diff --git a/scipost_django/news/templates/news/_newsletter_contents.html b/scipost_django/news/templates/news/_newscollection_contents.html
similarity index 56%
rename from scipost_django/news/templates/news/_newsletter_contents.html
rename to scipost_django/news/templates/news/_newscollection_contents.html
index 545aad2fd..71d7764a8 100644
--- a/scipost_django/news/templates/news/_newsletter_contents.html
+++ b/scipost_django/news/templates/news/_newscollection_contents.html
@@ -1,14 +1,14 @@
 <div class="row">
   <div class="col-12">
     <div class="card bg-light card-news p-3 mb-4">
-      <h1>SciPost Newsletter {{ nl.date|date:'Y-m-d' }}</h1>
-      <div>{{ nl.intro|safe }}</div>
+      <h1>SciPost News Collection {{ nc.date|date:'Y-m-d' }}</h1>
+      <div>{{ nc.intro|safe }}</div>
     </div>
-    {% for nt in nl.newsletternewsitemstable_set.all|dictsort:'order' %}
+    {% for nt in nc.newscollectionnewsitemstable_set.all|dictsort:'order' %}
       {% include 'news/news_card_content.html' with news=nt.newsitem %}
     {% endfor %}
     <div class="card bg-light card-news p-3">
-      {{ nl.closing|safe }}
+      {{ nc.closing|safe }}
     </div>
   </div>
 </div>
diff --git a/scipost_django/news/templates/news/news_manage.html b/scipost_django/news/templates/news/news_manage.html
index 2a2f5b104..7d87883b4 100644
--- a/scipost_django/news/templates/news/news_manage.html
+++ b/scipost_django/news/templates/news/news_manage.html
@@ -14,25 +14,25 @@
     <div class="col-12">
       <h1 class="highlight">News Management</h1>
 
-      <h2 class="highlight">Newsletters</h2>
-      <a href="{% url 'news:newsletter_create' %}">Add a Newsletter</a>
+      <h2 class="highlight">NewsCollections</h2>
+      <a href="{% url 'news:newscollection_create' %}">Add a NewsCollection</a>
       <br/>
       <br/>
-      {% for nl in newsletters %}
+      {% for nc in newscollections %}
         <div class="card mb-2">
-          <div class="card-header" data-bs-toggle="collapse" href="#collapse{{ nl.id }}" aria-expanded="false" aria-controls="collapse{{ nl.id }}">
-            {{ nl }}
-            (status: {{ nl.published|yesno:'published,unpublished' }})
+          <div class="card-header" data-bs-toggle="collapse" href="#collapse{{ nc.id }}" aria-expanded="false" aria-controls="collapse{{ nc.id }}">
+            {{ nc }}
+            (status: {{ nc.published|yesno:'published,unpublished' }})
           </div>
-          <div class="card-body collapse" id="collapse{{ nl.id }}">
+          <div class="card-body collapse" id="collapse{{ nc.id }}">
             <div class="row">
               <div class="col-6">
-                <a href="{{ nl.get_absolute_url }}" target="_blank">View this Newsletter in a separate window</a>
+                <a href="{{ nc.get_absolute_url }}" target="_blank">View this NewsCollection in a separate window</a>
                 <br/>
                 <br/>
-                <h3>News Items included in this Newsletter:</h3>
+                <h3>News Items included in this NewsCollection:</h3>
                 <ul>
-                  {% for nt in nl.newsletternewsitemstable_set.all|dictsort:'order' %}
+                  {% for nt in nc.newscollectionnewsitemstable_set.all|dictsort:'order' %}
                     <li>{{ nt.newsitem }}{% if not nt.newsitem.published %}&nbsp;<span class="text-danger">WARNING: unpublished</span>{% endif %}</li>
                   {% empty %}
                     <li>No associated NewsItems found</li>
@@ -42,14 +42,14 @@
               <div class="col-6">
                 <h3>Actions:</h3>
                 <ul>
-                  <li><a href="{% url 'news:newsletter_update' pk=nl.id %}">Update</a></li>
-                  <li><a href="{% url 'news:newsletter_update_ordering' pk=nl.id %}">Update items ordering</a></li>
-                  <li><a href="{% url 'news:newsletter_delete' pk=nl.id %}">Delete</a></li>
+                  <li><a href="{% url 'news:newscollection_update' pk=nc.id %}">Update</a></li>
+                  <li><a href="{% url 'news:newscollection_update_ordering' pk=nc.id %}">Update items ordering</a></li>
+                  <li><a href="{% url 'news:newscollection_delete' pk=nc.id %}">Delete</a></li>
                   <li>
-                    Add a News Item to this Newsletter:
-                    <form class="d-block mt-2 mb-3" action="{% url 'news:add_newsitem_to_newsletter' nlpk=nl.id %}" method="post">
+                    Add a NewsItem to this NewsCollection:
+                    <form class="d-block mt-2 mb-3" action="{% url 'news:add_newsitem_to_newscollection' ncpk=nc.id %}" method="post">
                       {% csrf_token %}
-                      {{ add_ni_to_nl_form|bootstrap }}
+                      {{ add_ni_to_nc_form|bootstrap }}
                       <input type="submit" name="submit" value="Add" class="btn btn-outline-secondary">
                     </form>
                   </li>
diff --git a/scipost_django/news/templates/news/newsletter_confirm_delete.html b/scipost_django/news/templates/news/newscollection_confirm_delete.html
similarity index 74%
rename from scipost_django/news/templates/news/newsletter_confirm_delete.html
rename to scipost_django/news/templates/news/newscollection_confirm_delete.html
index 051254165..806ab445f 100644
--- a/scipost_django/news/templates/news/newsletter_confirm_delete.html
+++ b/scipost_django/news/templates/news/newscollection_confirm_delete.html
@@ -2,12 +2,14 @@
 
 {% load bootstrap %}
 
-{% block pagetitle %}: Delete NewsLetter{% endblock pagetitle %}
+{% block pagetitle %}
+  : Delete NewsCollection
+{% endblock pagetitle %}
 
 {% block content %}
   <div class="row">
     <div class="col-12">
-      <h1 class="highlight">Delete NewsLetter</h1>
+      <h1 class="highlight">Delete NewsCollection</h1>
       {{ object }}
     </div>
   </div>
@@ -15,11 +17,11 @@
     <div class="col-12">
       <form method="post">
         {% csrf_token %}
-        <h3 class="mb-2">Are you sure you want to delete this NewsLetter?</h3>
+        <h3 class="mb-2">Are you sure you want to delete this NewsCollection?</h3>
         <input type="submit" class="btn btn-danger" value="Yes, delete it" />
       </form>
     </ul>
-    </div>
   </div>
+</div>
 
 {% endblock content %}
diff --git a/scipost_django/news/templates/news/newsletter_create.html b/scipost_django/news/templates/news/newscollection_create.html
similarity index 60%
rename from scipost_django/news/templates/news/newsletter_create.html
rename to scipost_django/news/templates/news/newscollection_create.html
index e03c63ca6..04f96c4bd 100644
--- a/scipost_django/news/templates/news/newsletter_create.html
+++ b/scipost_django/news/templates/news/newscollection_create.html
@@ -2,7 +2,7 @@
 
 {% load bootstrap %}
 
-{% block pagetitle %}: Create Newsletter{% endblock pagetitle %}
+{% block pagetitle %}: Create NewsCollection{% endblock pagetitle %}
 
 {% block breadcrumb %}
   <nav class="breadcrumb-nav">
@@ -10,8 +10,8 @@
       <ol class="breadcrumb">
         <li class="breadcrumb-item"><a href="{% url 'scipost:index' %}" >Home</a></li>
         <li class="breadcrumb-item"><a href="{% url 'news:news' %}" >News</a></span>
-          <li class="breadcrumb-item"><a href="{% url 'news:manage' %}">News Management</a></span>
-            <li class="breadcrumb-item active" aria-current="page">Create Newsletter</span>
+        <li class="breadcrumb-item"><a href="{% url 'news:manage' %}">News Management</a></span>
+        <li class="breadcrumb-item active" aria-current="page">Create NewsCollection</span>
       </ol>
     </div>
   </nav>
@@ -22,9 +22,9 @@
 
   <div class="row">
     <div class="col-12">
-      <h1 class="highlight">Create Newsletter</h1>
+      <h1 class="highlight">Create NewsCollection</h1>
 
-      <form action="{% url 'news:newsletter_create' %}" method="post">
+      <form action="{% url 'news:newscollection_create' %}" method="post">
 	{% csrf_token %}
 	{{ form|bootstrap }}
 	<input type="submit" value="Submit" class="btn btn-primary">
diff --git a/scipost_django/news/templates/news/newsletter_detail.html b/scipost_django/news/templates/news/newscollection_detail.html
similarity index 58%
rename from scipost_django/news/templates/news/newsletter_detail.html
rename to scipost_django/news/templates/news/newscollection_detail.html
index 39d96effa..d94fee909 100644
--- a/scipost_django/news/templates/news/newsletter_detail.html
+++ b/scipost_django/news/templates/news/newscollection_detail.html
@@ -2,8 +2,8 @@
 
 {% load bootstrap %}
 
-{% block meta_description %}{{ block.super }} Newsletter{% endblock meta_description %}
-{% block pagetitle %}: NewsLetter{% endblock pagetitle %}
+{% block meta_description %}{{ block.super }} Newscollection{% endblock meta_description %}
+{% block pagetitle %}: Newscollection{% endblock pagetitle %}
 
 {% block content %}
 
@@ -12,7 +12,7 @@
       {% if perms.scipost.can_manage_news %}
 	<p>Go to the <a href="{% url 'news:manage' %}">News management page</a></p>
       {% endif %}
-      {% include 'news/_newsletter_contents.html' with nl=nl %}
+      {% include 'news/_newscollection_contents.html' with nc=nc %}
     </div>
   </div>
 
diff --git a/scipost_django/news/templates/news/newsletter_update.html b/scipost_django/news/templates/news/newscollection_update.html
similarity index 51%
rename from scipost_django/news/templates/news/newsletter_update.html
rename to scipost_django/news/templates/news/newscollection_update.html
index daabd4bb8..05753ae2a 100644
--- a/scipost_django/news/templates/news/newsletter_update.html
+++ b/scipost_django/news/templates/news/newscollection_update.html
@@ -2,13 +2,15 @@
 
 {% load bootstrap %}
 
-{% block pagetitle %}: NewsLetters{% endblock pagetitle %}
+{% block pagetitle %}
+  : NewsCollections
+{% endblock pagetitle %}
 
 {% block breadcrumb_items %}
   {{ block.super }}
   <a href="{% url 'news:news' %}" class="breadcrumb-item">News</a>
   <a href="{% url 'news:manage' %}" class="breadcrumb-item">Manage</a>
-  <span class="breadcrumb-item">Update NewsLetter</span>
+  <span class="breadcrumb-item">Update NewsCollection</span>
 {% endblock breadcrumb_items %}
 
 
@@ -16,20 +18,22 @@
 
   <div class="row">
     <div class="col-12">
-      <h1>Newsletter to update:</h1>
+      <h1>NewsCollection to update:</h1>
       {{ object }}
     </div>
   </div>
 
-  <hr/>
+  <hr />
 
   <div class="row">
     <div class="col-12">
       <h1>Edit it here:</h1>
-      <form action="{% url 'news:newsletter_update' pk=object.id %}" method="post">
-	{% csrf_token %}
-	{{ form|bootstrap }}
-	<input type="submit" value="Submit" class="btn btn-primary">
+      <form action="{% url 'news:newscollection_update' pk=object.id %}"
+            method="post">
+        {% csrf_token %}
+        {{ form|bootstrap }}
+	
+        <input type="submit" value="Submit" class="btn btn-primary" />
+      </div>
     </div>
-  </div>
-{% endblock content %}
+  {% endblock content %}
diff --git a/scipost_django/news/templates/news/newsletter_update_ordering.html b/scipost_django/news/templates/news/newscollection_update_ordering.html
similarity index 79%
rename from scipost_django/news/templates/news/newsletter_update_ordering.html
rename to scipost_django/news/templates/news/newscollection_update_ordering.html
index 5ea154b10..d7729a4f8 100644
--- a/scipost_django/news/templates/news/newsletter_update_ordering.html
+++ b/scipost_django/news/templates/news/newscollection_update_ordering.html
@@ -2,13 +2,13 @@
 
 {% load bootstrap %}
 
-{% block pagetitle %}: NewsLetters{% endblock pagetitle %}
+{% block pagetitle %}: NewsCollections{% endblock pagetitle %}
 
 {% block breadcrumb_items %}
   {{ block.super }}
   <a href="{% url 'news:news' %}" class="breadcrumb-item">News</a>
   <a href="{% url 'news:manage' %}" class="breadcrumb-item">Manage</a>
-  <span class="breadcrumb-item">Update NewsLetter Ordering</span>
+  <span class="breadcrumb-item">Update NewsCollection Ordering</span>
 {% endblock breadcrumb_items %}
 
 
@@ -16,7 +16,7 @@
 
   <div class="row">
     <div class="col-12">
-      <h1>Newsletter to update:</h1>
+      <h1>NewsCollection to update:</h1>
       {{ object }}
     </div>
   </div>
@@ -25,7 +25,7 @@
 
   <div class="row">
     <div class="col-12">
-      <h1>Update the ordering of News Items within this Newsletter:</h1>
+      <h1>Update the ordering of NewsItems within this NewsCollection:</h1>
       <form method="post" enctype="multipart/form-data">
 	{% csrf_token %}
 	{{ ni_formset.management_form }}
diff --git a/scipost_django/news/tests/test_factories.py b/scipost_django/news/tests/test_factories.py
index f175a91fb..3f49c6679 100644
--- a/scipost_django/news/tests/test_factories.py
+++ b/scipost_django/news/tests/test_factories.py
@@ -3,13 +3,13 @@ __license__ = "AGPL v3"
 
 
 from django.test import TestCase
-from ..factories import NewsItemFactory, NewsLetterFactory
+from ..factories import NewsItemFactory, NewsCollectionFactory
 
 
-class TestNewsLetterFactory(TestCase):
+class TestNewsCollectionFactory(TestCase):
     def test_can_create_news_letters(self):
-        news_letter = NewsLetterFactory()
-        self.assertIsNotNone(news_letter)
+        news_collection = NewsCollectionFactory()
+        self.assertIsNotNone(news_collection)
 
 
 class TestNewsItemFactory(TestCase):
diff --git a/scipost_django/news/urls.py b/scipost_django/news/urls.py
index ba7d5d52c..2676aca14 100644
--- a/scipost_django/news/urls.py
+++ b/scipost_django/news/urls.py
@@ -11,29 +11,29 @@ app_name = "news"
 urlpatterns = [
     path("manage/", views.NewsManageView.as_view(), name="manage"),
     path(
-        "newsletter/<YYYY:year>-<MM:month>-<DD:day>/",
-        views.NewsLetterView.as_view(),
-        name="newsletter_detail",
+        "newscollection/<YYYY:year>-<MM:month>-<DD:day>/",
+        views.NewsCollectionView.as_view(),
+        name="newscollection_detail",
     ),
     path(
-        "newsletter/add/",
-        views.NewsLetterCreateView.as_view(),
-        name="newsletter_create",
+        "newscollection/add/",
+        views.NewsCollectionCreateView.as_view(),
+        name="newscollection_create",
     ),
     path(
-        "newsletter/<int:pk>/update/",
-        views.NewsLetterUpdateView.as_view(),
-        name="newsletter_update",
+        "newscollection/<int:pk>/update/",
+        views.NewsCollectionUpdateView.as_view(),
+        name="newscollection_update",
     ),
     path(
-        "newsletter/<int:pk>/update_ordering/",
-        views.newsletter_update_ordering,
-        name="newsletter_update_ordering",
+        "newscollection/<int:pk>/update_ordering/",
+        views.newscollection_update_ordering,
+        name="newscollection_update_ordering",
     ),
     path(
-        "newsletter/<int:pk>/delete/",
-        views.NewsLetterDeleteView.as_view(),
-        name="newsletter_delete",
+        "newscollection/<int:pk>/delete/",
+        views.NewsCollectionDeleteView.as_view(),
+        name="newscollection_delete",
     ),
     path("newsitem/add/", views.NewsItemCreateView.as_view(), name="newsitem_create"),
     path(
@@ -52,9 +52,9 @@ urlpatterns = [
         name="newsitem_delete",
     ),
     path(
-        "add_newsitem_to_newsletter/<int:nlpk>/",
-        views.NewsLetterNewsItemsTableCreateView.as_view(),
-        name="add_newsitem_to_newsletter",
+        "add_newsitem_to_newscollection/<int:ncpk>/",
+        views.NewsCollectionNewsItemsTableCreateView.as_view(),
+        name="add_newsitem_to_newscollection",
     ),
     path("", views.NewsListView.as_view(), name="news"),
 ]
diff --git a/scipost_django/news/views.py b/scipost_django/news/views.py
index 023a6149f..57c9e0e4b 100644
--- a/scipost_django/news/views.py
+++ b/scipost_django/news/views.py
@@ -12,12 +12,12 @@ from django.views.generic.list import ListView
 
 from guardian.decorators import permission_required
 
-from .models import NewsLetter, NewsItem, NewsLetterNewsItemsTable
+from .models import NewsCollection, NewsItem, NewsCollectionNewsItemsTable
 from .forms import (
-    NewsLetterForm,
+    NewsCollectionForm,
     NewsItemForm,
-    NewsLetterNewsItemsTableForm,
-    NewsLetterNewsItemsOrderingFormSet,
+    NewsCollectionNewsItemsTableForm,
+    NewsCollectionNewsItemsOrderingFormSet,
 )
 
 from scipost.mixins import PermissionsMixin
@@ -33,23 +33,23 @@ class NewsManageView(PermissionsMixin, TemplateView):
 
     def get_context_data(self, **kwargs):
         context = super().get_context_data(**kwargs)
-        context["newsletters"] = NewsLetter.objects.all()
+        context["newscollections"] = NewsCollection.objects.all()
         context["newsitems"] = NewsItem.objects.all()
-        context["add_ni_to_nl_form"] = NewsLetterNewsItemsTableForm()
+        context["add_ni_to_nc_form"] = NewsCollectionNewsItemsTableForm()
         return context
 
 
-class NewsLetterView(TemplateView):
+class NewsCollectionView(TemplateView):
     """
-    Newsletter, for public consumption online.
+    NewsCollection, for public consumption online.
     """
 
-    template_name = "news/newsletter_detail.html"
+    template_name = "news/newscollection_detail.html"
 
     def get_context_data(self, **kwargs):
         context = super().get_context_data(**kwargs)
-        context["nl"] = get_object_or_404(
-            NewsLetter,
+        context["nc"] = get_object_or_404(
+            NewsCollection,
             date__year=self.kwargs["year"],
             date__month=self.kwargs["month"],
             date__day=self.kwargs["day"],
@@ -57,53 +57,53 @@ class NewsLetterView(TemplateView):
         return context
 
 
-class NewsLetterCreateView(PermissionsMixin, CreateView):
+class NewsCollectionCreateView(PermissionsMixin, CreateView):
     """
-    Create a NewsLetter.
+    Create a NewsCollection.
     """
 
     permission_required = "scipost.can_manage_news"
-    form_class = NewsLetterForm
-    template_name = "news/newsletter_create.html"
+    form_class = NewsCollectionForm
+    template_name = "news/newscollection_create.html"
     success_url = reverse_lazy("news:manage")
 
 
-class NewsLetterUpdateView(PermissionsMixin, UpdateView):
+class NewsCollectionUpdateView(PermissionsMixin, UpdateView):
     """
-    Update a NewsLetter.
+    Update a NewsCollection.
     """
 
     permission_required = "scipost.can_manage_news"
-    model = NewsLetter
-    form_class = NewsLetterForm
-    template_name = "news/newsletter_update.html"
+    model = NewsCollection
+    form_class = NewsCollectionForm
+    template_name = "news/newscollection_update.html"
     success_url = reverse_lazy("news:news")
 
 
 @permission_required("scipost.can_manage_news", raise_exception=True)
-def newsletter_update_ordering(request, pk):
-    newsletter = get_object_or_404(NewsLetter, pk=pk)
-    ni_formset = NewsLetterNewsItemsOrderingFormSet(
+def newscollection_update_ordering(request, pk):
+    newscollection = get_object_or_404(NewsCollection, pk=pk)
+    ni_formset = NewsCollectionNewsItemsOrderingFormSet(
         request.POST or None,
-        queryset=newsletter.newsletternewsitemstable_set.order_by("order"),
+        queryset=newscollection.newscollectionnewsitemstable_set.order_by("order"),
     )
     if ni_formset.is_valid():
         ni_formset.save()
-        messages.success(request, "Newsletter items ordering updated")
-        return redirect(newsletter.get_absolute_url())
+        messages.success(request, "NewsCollection items ordering updated")
+        return redirect(newscollection.get_absolute_url())
     context = {
         "ni_formset": ni_formset,
     }
-    return render(request, "news/newsletter_update_ordering.html", context)
+    return render(request, "news/newscollection_update_ordering.html", context)
 
 
-class NewsLetterDeleteView(PermissionsMixin, DeleteView):
+class NewsCollectionDeleteView(PermissionsMixin, DeleteView):
     """
-    Delete a NewsLetter.
+    Delete a NewsCollection.
     """
 
     permission_required = "scipost.can_manage_news"
-    model = NewsLetter
+    model = NewsCollection
     success_url = reverse_lazy("news:news")
 
 
@@ -144,20 +144,20 @@ class NewsItemDeleteView(PermissionsMixin, DeleteView):
     success_url = reverse_lazy("news:news")
 
 
-class NewsLetterNewsItemsTableCreateView(PermissionsMixin, CreateView):
+class NewsCollectionNewsItemsTableCreateView(PermissionsMixin, CreateView):
     """
-    Add a NewsItem to a NewsLetter.
+    Add a NewsItem to a NewsCollection.
     """
 
     permission_required = "scipost.can_manage_news"
-    form_class = NewsLetterNewsItemsTableForm
+    form_class = NewsCollectionNewsItemsTableForm
     success_url = reverse_lazy("news:manage")
 
     def form_valid(self, form):
-        nl = get_object_or_404(NewsLetter, id=self.kwargs["nlpk"])
-        form.instance.newsletter = nl
-        form.instance.order = nl.newsletternewsitemstable_set.all().count() + 1
-        messages.success(self.request, "Successfully added News Item to Newsletter")
+        nc = get_object_or_404(NewsCollection, id=self.kwargs["ncpk"])
+        form.instance.newscollection = nc
+        form.instance.order = nc.newscollectionnewsitemstable_set.all().count() + 1
+        messages.success(self.request, "Successfully added NewsItem to NewsCollection")
         return super().form_valid(form)
 
 
diff --git a/scipost_django/scipost/templates/scipost/personal_page/_hx_admin.html b/scipost_django/scipost/templates/scipost/personal_page/_hx_admin.html
index 621e43872..f330ec572 100644
--- a/scipost_django/scipost/templates/scipost/personal_page/_hx_admin.html
+++ b/scipost_django/scipost/templates/scipost/personal_page/_hx_admin.html
@@ -29,7 +29,7 @@
       {% if perms.scipost.can_manage_news %}
 	<h3>News management</h3>
 	<ul>
-	  <li><a href="{% url 'news:manage' %}">Manage News Items and Newsletters</a></li>
+	  <li><a href="{% url 'news:manage' %}">Manage News Items and Collections</a></li>
 	</ul>
       {% endif %}
 
-- 
GitLab