summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorluxagraf <sng@luxagraf.net>2020-02-05 16:18:53 -0500
committerluxagraf <sng@luxagraf.net>2020-02-05 16:18:53 -0500
commit33209aed7c3e858d95576bdcfefa17c3f5d7597b (patch)
tree08e6877551da29c0b645208c9e9e806c4624cd42 /app
parent932a69ba325fab012630313edcfe697e93d340d7 (diff)
migrated newsletter templates and updated mailing model
Diffstat (limited to 'app')
-rw-r--r--app/lttr/admin.py31
-rw-r--r--app/lttr/migrations/0005_auto_20200205_1606.py31
-rw-r--r--app/lttr/models.py20
-rw-r--r--app/lttr/templates/lttr/confirm_activate.html17
-rw-r--r--app/lttr/templates/lttr/message/subscribe.html24
-rw-r--r--app/lttr/templates/lttr/message/subscribe.txt9
-rw-r--r--app/lttr/templates/lttr/message/subscribe_subject.txt1
-rw-r--r--app/lttr/templates/lttr/message/unsubscribe.html19
-rw-r--r--app/lttr/templates/lttr/message/unsubscribe.txt9
-rw-r--r--app/lttr/templates/lttr/message/unsubscribe_subject.txt1
-rw-r--r--app/lttr/templates/lttr/subscribed.html17
-rw-r--r--app/lttr/templates/lttr/subscriber_form.html39
-rw-r--r--app/lttr/views.py11
13 files changed, 225 insertions, 4 deletions
diff --git a/app/lttr/admin.py b/app/lttr/admin.py
index 1b919d6..4ca30ce 100644
--- a/app/lttr/admin.py
+++ b/app/lttr/admin.py
@@ -1,7 +1,8 @@
from django.contrib import admin
-from .models import NewsletterMailing, Subscriber
+from utils.widgets import AdminImageWidget, LGEntryForm
+from .models import NewsletterMailing, Subscriber
@admin.register(Subscriber)
class SubscriberAdmin(admin.ModelAdmin):
@@ -11,3 +12,31 @@ class SubscriberAdmin(admin.ModelAdmin):
class Media:
js = ('next-prev-links.js',)
+
+
+@admin.register(NewsletterMailing)
+class NewsletterMailingAdmin(admin.ModelAdmin):
+ form = LGEntryForm
+ list_display = ('title', 'pub_date', 'status')
+ fieldsets = (
+ ('Entry', {
+ 'fields': (
+ 'title',
+ 'body_markdown',
+ ('pub_date', 'status'),
+ 'slug',
+ 'featured_image',
+ ),
+ 'classes': (
+ 'show',
+ 'extrapretty',
+ 'wide'
+ )
+ }
+ ),
+ )
+ class Media:
+ js = ('image-loader.js', 'next-prev-links.js')
+ css = {
+ "all": ("my_styles.css",)
+ }
diff --git a/app/lttr/migrations/0005_auto_20200205_1606.py b/app/lttr/migrations/0005_auto_20200205_1606.py
new file mode 100644
index 0000000..0be644e
--- /dev/null
+++ b/app/lttr/migrations/0005_auto_20200205_1606.py
@@ -0,0 +1,31 @@
+# Generated by Django 2.1.2 on 2020-02-05 16:06
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('photos', '0019_auto_20190704_0903'),
+ ('lttr', '0004_auto_20190212_1529'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='newslettermailing',
+ name='body_html',
+ field=models.TextField(blank=True),
+ ),
+ migrations.AddField(
+ model_name='newslettermailing',
+ name='body_markdown',
+ field=models.TextField(default='tk'),
+ preserve_default=False,
+ ),
+ migrations.AddField(
+ model_name='newslettermailing',
+ name='featured_image',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='photos.LuxImage'),
+ ),
+ ]
diff --git a/app/lttr/models.py b/app/lttr/models.py
index ec5e897..4ab6030 100644
--- a/app/lttr/models.py
+++ b/app/lttr/models.py
@@ -12,6 +12,7 @@ from django.utils.crypto import get_random_string
from taggit.managers import TaggableManager
from taxonomy.models import TaggedItems
+from photos.models import LuxImage, LuxImageSize
# Possible actions that user can perform
@@ -101,7 +102,10 @@ class NewsletterMailing(models.Model):
""" A model for Newletter Mailings, the things actually sent out """
title = models.CharField(max_length=250)
slug = models.SlugField(unique_for_date='pub_date', blank=True)
+ body_html = models.TextField(blank=True)
+ body_markdown = models.TextField()
pub_date = models.DateTimeField()
+ featured_image = models.ForeignKey(LuxImage, on_delete=models.CASCADE, null=True, blank=True)
tags = TaggableManager(through=TaggedItems, blank=True, help_text='Topics Covered')
PUB_STATUS = (
(0, 'Not Published'),
@@ -120,8 +124,20 @@ class NewsletterMailing(models.Model):
return reverse("newsletter:mailing-detail", kwargs={"slug": self.slug})
def save(self, *args, **kwargs):
- if not self.id:
+ created = self.pk is None
+ if not created:
+ md = render_images(self.body_markdown)
+ self.body_html = markdown_to_html(md)
self.date_created = timezone.now()
+ if created and not self.featured_image:
+ self.featured_image = LuxImage.objects.latest()
+ old = type(self).objects.get(pk=self.pk) if self.pk else None
+ if old and old.featured_image != self.featured_image: # Field has changed
+ s = LuxImageSize.objects.get(name="featured_jrnl")
+ ss = LuxImageSize.objects.get(name="picwide-med")
+ self.featured_image.sizes.add(s)
+ self.featured_image.sizes.add(ss)
+ self.featured_image.save()
super(NewsletterMailing, self).save()
@@ -298,8 +314,6 @@ class Subscriber(models.Model):
def get_address(name, email):
- # Converting name to ascii for compatibility with django < 1.9.
- # Remove this when django 1.8 is no longer supported.
if name:
return u'%s <%s>' % (name, email)
else:
diff --git a/app/lttr/templates/lttr/confirm_activate.html b/app/lttr/templates/lttr/confirm_activate.html
new file mode 100644
index 0000000..d67ee1b
--- /dev/null
+++ b/app/lttr/templates/lttr/confirm_activate.html
@@ -0,0 +1,17 @@
+{% extends 'base.html' %}
+{% load typogrify_tags %}
+
+{% block pagetitle %}Luxagraf | Friends of a Long Year {% endblock %}
+{% block metadescription %}An infrequesnt mailing list about travel, photography, tools, walking, the natural world and other ephemera.{% endblock %}
+
+{% block primary %}<ul class="bl" id="breadcrumbs" itemscope itemtype="http://data-vocabulary.org/Breadcrumb">
+ <li><a href="/" title="luxagraf homepage" itemprop="url"><span itemprop="title">Home</span></a> &rarr; </li>
+ <li>Lttr</li>
+ </ul>
+ <main role="main" id="essay-archive" class="essay-archive archive-list">
+ <div class="essay-intro">
+ <h2>You're confirmed, thanks for joining.</h2>
+ <p>If you'd like you can <a href="/lttr/">visit the archives</a> of past mailings.</p>
+ </div>
+ </main>
+{%endblock%}
diff --git a/app/lttr/templates/lttr/message/subscribe.html b/app/lttr/templates/lttr/message/subscribe.html
new file mode 100644
index 0000000..3ed34db
--- /dev/null
+++ b/app/lttr/templates/lttr/message/subscribe.html
@@ -0,0 +1,24 @@
+{% load i18n %}<!DOCTYPE html>
+
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>{% blocktrans with title=newsletter.title %}Subscription to {{ title }}{% endblocktrans %}
+</title>
+</head>
+<body>
+{% blocktrans with name=subscription.name title=newsletter.title domain=site.domain url=subscription.subscribe_activate_url %}
+
+<p>Hola-</p>
+
+<p>Someone, hopefully you, asked to subscribe to {{ title }}, a luxagraf.net letter.</p>
+
+<p>To confirm your subscription, please follow this activation link:
+</p>
+
+https://{{ domain }}{{ url }}
+{% endblocktrans %}
+<p>cheers<br />
+Scott</p>
+</body>
+</html>
diff --git a/app/lttr/templates/lttr/message/subscribe.txt b/app/lttr/templates/lttr/message/subscribe.txt
new file mode 100644
index 0000000..2af5378
--- /dev/null
+++ b/app/lttr/templates/lttr/message/subscribe.txt
@@ -0,0 +1,9 @@
+Hola-
+
+Someone, hopefully you, asked to subscribe to {{ newsletter.title }}, a luxagraf.net letter.
+
+If you would like to confirm your subscription, please follow this activation link:
+https://{{ site.domain }}{{ subscription.subscribe_activate_url }}
+
+cheers
+Scott
diff --git a/app/lttr/templates/lttr/message/subscribe_subject.txt b/app/lttr/templates/lttr/message/subscribe_subject.txt
new file mode 100644
index 0000000..f4660e0
--- /dev/null
+++ b/app/lttr/templates/lttr/message/subscribe_subject.txt
@@ -0,0 +1 @@
+Confirm Your Subscription to {{newsletter.title}}
diff --git a/app/lttr/templates/lttr/message/unsubscribe.html b/app/lttr/templates/lttr/message/unsubscribe.html
new file mode 100644
index 0000000..4b1a86b
--- /dev/null
+++ b/app/lttr/templates/lttr/message/unsubscribe.html
@@ -0,0 +1,19 @@
+{% load i18n %}<!DOCTYPE html>
+
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>{% blocktrans with title=newsletter.title %}Unsubscription from {{ title }}{% endblocktrans %}</title>
+</head>
+<body>
+{% blocktrans with name=subscription.name title=newsletter.title domain=site.domain url=subscription.unsubscribe_activate_url %}Dear {{ name }},
+
+you, or someone in your name requested unsubscription from {{ title }}.
+
+If you would like to confirm your unsubscription, please follow this activation link:
+http://{{ domain }}{{ url }}
+
+Kind regards,{% endblocktrans %}
+{{ newsletter.sender }}
+</body>
+</html>
diff --git a/app/lttr/templates/lttr/message/unsubscribe.txt b/app/lttr/templates/lttr/message/unsubscribe.txt
new file mode 100644
index 0000000..ab31fa5
--- /dev/null
+++ b/app/lttr/templates/lttr/message/unsubscribe.txt
@@ -0,0 +1,9 @@
+{% load i18n %}{% blocktrans with name=subscription.name title=newsletter.title domain=site.domain url=subscription.unsubscribe_activate_url %}Dear {{ name }},
+
+you, or someone in your name requested unsubscription from {{ title }}.
+
+If you would like to confirm your unsubscription, please follow this activation link:
+http://{{ domain }}{{ url }}
+
+Kind regards,{% endblocktrans %}
+{{ newsletter.sender }}
diff --git a/app/lttr/templates/lttr/message/unsubscribe_subject.txt b/app/lttr/templates/lttr/message/unsubscribe_subject.txt
new file mode 100644
index 0000000..49c68ef
--- /dev/null
+++ b/app/lttr/templates/lttr/message/unsubscribe_subject.txt
@@ -0,0 +1 @@
+{% load i18n %}{{ newsletter.title }} - {% trans "Confirm unsubscription" %}
diff --git a/app/lttr/templates/lttr/subscribed.html b/app/lttr/templates/lttr/subscribed.html
new file mode 100644
index 0000000..18ad151
--- /dev/null
+++ b/app/lttr/templates/lttr/subscribed.html
@@ -0,0 +1,17 @@
+{% extends 'base.html' %}
+{% load typogrify_tags %}
+
+{% block pagetitle %}Luxagraf | Friends of a Long Year {% endblock %}
+{% block metadescription %}An infrequesnt mailing list about travel, photography, tools, walking, the natural world and other ephemera.{% endblock %}
+
+{% block primary %}<ul class="bl" id="breadcrumbs" itemscope itemtype="http://data-vocabulary.org/Breadcrumb">
+ <li><a href="/" title="luxagraf homepage" itemprop="url"><span itemprop="title">Home</span></a> &rarr; </li>
+ <li>Lttr</li>
+ </ul>
+ <main role="main" id="essay-archive" class="essay-archive archive-list">
+ <div class="essay-intro">
+ <h2>Thanks for joining.</h2>
+ <p>Check your email for a link to confirm your subscription</p>
+ </div>
+ </main>
+{%endblock%}
diff --git a/app/lttr/templates/lttr/subscriber_form.html b/app/lttr/templates/lttr/subscriber_form.html
new file mode 100644
index 0000000..83e1e28
--- /dev/null
+++ b/app/lttr/templates/lttr/subscriber_form.html
@@ -0,0 +1,39 @@
+{% extends 'base.html' %}
+{% load typogrify_tags %}
+
+{% block pagetitle %}Luxagraf | Friends of a Long Year {% endblock %}
+{% block metadescription %}An infrequesnt mailing list about travel, photography, tools, walking, the natural world and other ephemera.{% endblock %}
+
+{% block primary %}<ul class="bl" id="breadcrumbs" itemscope itemtype="http://data-vocabulary.org/Breadcrumb">
+ <li><a href="/" title="luxagraf homepage" itemprop="url"><span itemprop="title">Home</span></a> &rarr; </li>
+ <li>Lttr</li>
+ </ul>
+ <main role="main" id="essay-archive" class="essay-archive archive-list">
+ <div class="essay-intro">
+ <h1 class="list-hed">Join the <em>Friends of a Long Year</em>.</h1>
+ <form action="" method="post" class="generic-form flex newsletter-subscribe">{% csrf_token %}
+ {% for field in form %}
+ <fieldset>
+ {{field.label_tag}}
+ {{field}}
+ </fieldset>
+ {% if forloop.last %}<input type="submit" name="post" class="btn" value="Subscribe" />{%endif%}
+ </form>
+ <small class="alert">{% if field.errors %}{{field.errors}}{% endif %}</small>
+ {%endfor%}
+ <h2 class="subhead">Say what? </h2>
+ <p><em>Friends of a Long Year</em> is an infrequent mailing that will keep you up-to-date with luxagraf and offer some thoughts on topics like travel, photography, the natural world, tools, walking and other ephemera. It comes about twice a month, sometimes less, sometimes more. Unsubscribing is easy. It's all self-hosted, secure, and <a href="/privacy" title="My privacy policy">private</a>.</p>
+ <p>The name comes from the great early 20th century explorer and desert rat, Mary Hunter Austin, whose collected essays, <a href="https://archive.org/details/lostbordersillu00brotgoog/page/n8"><cite>Lost Borders</cite></a> is dedicated to the "Friends of a Long Year". This somewhat inscrutable dedication grabbed me, and seemed like the perfect name for this mailing list.</p>
+ </div>
+ <h3 class="list-title">Letters</h3>
+ <ul>{% for object in object_list %}
+ <li class="h-entry hentry" itemscope itemType="http://schema.org/Article">
+ <span class="date dt-published">{{object.pub_date|date:"F Y"}}</span>
+ <a href="{{object.get_absolute_url}}">
+ <h2>{{object.title|safe|smartypants|widont}}</h2>
+ <p class="p-summary">{% if object.sub_title %}{{object.sub_title|safe|smartypants}}{%else%}{{object.metadescription}}{%endif%}</p>
+ </a>
+ </li>
+ {%endfor%}</ul>
+ </main>
+{%endblock%}
diff --git a/app/lttr/views.py b/app/lttr/views.py
index 0d3dbea..79b8e72 100644
--- a/app/lttr/views.py
+++ b/app/lttr/views.py
@@ -90,3 +90,14 @@ class ConfirmSubscriptionView(DetailView):
if obj.subscribed is False:
obj.update('subscribe')
return obj
+
+
+class UnsubscribeRequestView(DetailView):
+ model = Subscriber
+ template_name = "lttr/unsubscribe.html"
+
+ def get_object(self):
+ obj = Subscriber.objects.get(newsletter__slug=self.kwargs['slug'])
+ if obj.subscribed is True:
+ obj.update('unsubscribe')
+ return obj