Skip to content

Commit 58d4367

Browse files
committed
Add post migration signal to create base template. Add scheduled views for campaigns. Minor adjustements.
1 parent f7177c0 commit 58d4367

22 files changed

+292
-173
lines changed

colossus/apps/campaigns/constants.py

+8
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,14 @@ class CampaignStatus:
2323
DELIVERING = 5
2424
PAUSED = 6
2525

26+
FILTERS = {SENT, SCHEDULED, DRAFT}
27+
28+
ICONS = {
29+
SENT: 'fas fa-check',
30+
SCHEDULED: 'far fa-calendar',
31+
DRAFT: 'fas fa-pencil-alt'
32+
}
33+
2634
LABELS = {
2735
SENT: _('Sent'),
2836
SCHEDULED: _('Scheduled'),

colossus/apps/campaigns/forms.py

+1-17
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,18 @@
11
from django import forms
22
from django.core.exceptions import ValidationError
3-
from django.db import transaction
43
from django.utils import timezone
54
from django.utils.translation import gettext, gettext_lazy as _
65

76
from .api import send_campaign_email_test
87
from .constants import CampaignStatus
9-
from .models import Campaign, Email
8+
from .models import Campaign
109

1110

1211
class CreateCampaignForm(forms.ModelForm):
1312
class Meta:
1413
model = Campaign
1514
fields = ('name',)
1615

17-
def save(self, commit=True):
18-
campaign = super().save(commit=False)
19-
if commit:
20-
with transaction.atomic():
21-
campaign.save()
22-
campaign.email.set_template_content()
23-
campaign.email.save()
24-
return campaign
25-
2616

2717
class ScheduleCampaignForm(forms.ModelForm):
2818
class Meta:
@@ -57,12 +47,6 @@ def save(self, commit=True):
5747
return campaign
5848

5949

60-
class PlainTextEmailForm(forms.ModelForm):
61-
class Meta:
62-
model = Email
63-
fields = ('content_text',)
64-
65-
6650
class CampaignTestEmailForm(forms.Form):
6751
email = forms.EmailField(label=_('Email address'))
6852

colossus/apps/campaigns/models.py

+5-3
Original file line numberDiff line numberDiff line change
@@ -72,19 +72,21 @@ def __str__(self):
7272
def get_absolute_url(self) -> str:
7373
if self.can_edit:
7474
return reverse('campaigns:campaign_edit', kwargs={'pk': self.pk})
75+
elif self.is_scheduled:
76+
return reverse('campaigns:campaign_scheduled', kwargs={'pk': self.pk})
7577
return reverse('campaigns:campaign_detail', kwargs={'pk': self.pk})
7678

7779
def delete(self, using=None, keep_parents=False):
7880
super().delete(using, keep_parents)
7981
update_rates_after_campaign_deletion.delay(self.mailing_list_id)
8082

8183
@property
82-
def is_ongoing(self) -> bool:
83-
return self.status in (CampaignStatus.SCHEDULED,)
84+
def is_scheduled(self) -> bool:
85+
return self.status == CampaignStatus.SCHEDULED
8486

8587
@property
8688
def can_edit(self) -> bool:
87-
return self.status in (CampaignStatus.DRAFT, CampaignStatus.SCHEDULED)
89+
return self.status == CampaignStatus.DRAFT
8890

8991
@property
9092
def can_send(self) -> bool:
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
{% load i18n humanize %}
2+
3+
<dl class="row mb-0">
4+
<dt class="col-sm-3">{% trans 'Date and time' %}</dt>
5+
<dd class="col-sm-9 d-flex align-items-center">
6+
{{ campaign.send_date }} <small class="text-muted mx-3">({{ campaign.send_date|naturaltime }})</small>
7+
{% if campaign.is_scheduled %}
8+
<small>
9+
<a href="{% url 'campaigns:schedule_campaign' campaign.pk %}">
10+
<span class="fa fa-pencil-alt"></span>
11+
{% trans 'Change date and time' %}
12+
</a>
13+
</small>
14+
{% endif %}
15+
</dd>
16+
17+
<dt class="col-sm-3">{% trans 'From' %}</dt>
18+
<dd class="col-sm-9">{{ campaign.email.get_from }}</dd>
19+
20+
<dt class="col-sm-3">{% trans 'Subject' %}</dt>
21+
<dd class="col-sm-9">{{ campaign.email.subject }}</dd>
22+
23+
{% if campaign.email.preview %}
24+
<dt class="col-sm-3">{% trans 'Preview text' %}</dt>
25+
<dd class="col-sm-9">{{ campaign.email.preview }}</dd>
26+
{% endif %}
27+
28+
<dt class="col-sm-3">{% trans 'Recipients' %}</dt>
29+
<dd class="col-sm-9">
30+
{% if campaign.is_scheduled %}{{ campaign.mailing_list.get_active_subscribers.count }}{% else %}{{ campaign.recipients_count }}{% endif %} subscribers from {{ campaign.mailing_list.name }}
31+
</dd>
32+
</dl>
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{% extends 'base.html' %}
22

3-
{% load i18n %}
3+
{% load campaigns i18n %}
44

55
{% block title %}{{ campaign.name }}{% endblock %}
66

@@ -12,37 +12,41 @@
1212
{% endblock %}
1313
</ol>
1414
</nav>
15-
<div class="d-flex align-items-center mb-3">
16-
<h2 class="mb-0 mr-2">{{ campaign.name }}</h2>
17-
<a href="{% url 'campaigns:campaign_edit_name' campaign.pk %}" class="btn btn-sm btn-link" role="button">
18-
<span class="fa fa-pencil-alt"></span>
19-
{% trans 'Rename' %}
20-
</a>
15+
<div class="d-flex justify-content-between align-items-center mb-3">
16+
<div class="d-flex align-items-center">
17+
<h2 class="mb-0 mr-2">{{ campaign.name }}</h2>
18+
<a href="{% url 'campaigns:campaign_edit_name' campaign.pk %}" class="btn btn-sm btn-link" role="button">
19+
<span class="fa fa-pencil-alt"></span>
20+
{% trans 'Rename' %}
21+
</a>
22+
</div>
23+
{{ campaign|campaign_status_badge }}
2124
</div>
22-
<div class="card mb-3">
23-
<div class="card-header">
24-
<ul class="nav nav-tabs card-header-tabs">
25-
<li class="nav-item">
26-
<a class="nav-link{% if submenu == 'details' %} active{% endif %}" href="{% url 'campaigns:campaign_detail' campaign.pk %}">{% trans 'Details' %}</a>
27-
</li>
28-
<li class="nav-item">
29-
<a class="nav-link{% if submenu == 'preview' %} active{% endif %}" href="{% url 'campaigns:campaign_preview' campaign.pk %}">{% trans 'Campaign Preview' %}</a>
30-
</li>
31-
{% if campaign.track_clicks %}
25+
26+
{% block maincontent %}
27+
<div class="card mb-3">
28+
<div class="card-header">
29+
<ul class="nav nav-tabs card-header-tabs">
3230
<li class="nav-item">
33-
<a class="nav-link{% if submenu == 'links' %} active{% endif %}" href="{% url 'campaigns:campaign_links' campaign.pk %}">{% trans 'Links' %}</a>
31+
<a class="nav-link{% if submenu == 'details' %} active{% endif %}" href="{% url 'campaigns:campaign_detail' campaign.pk %}">{% trans 'Details' %}</a>
3432
</li>
35-
{% endif %}
36-
<li class="nav-item">
37-
<a class="nav-link{% if submenu == 'reports' %} active{% endif %}" href="{% url 'campaigns:campaign_reports' campaign.pk %}">{% trans 'Reports' %}</a>
38-
</li>
39-
</ul>
40-
</div>
41-
<div class="card-body">
33+
<li class="nav-item">
34+
<a class="nav-link{% if submenu == 'preview' %} active{% endif %}" href="{% url 'campaigns:campaign_preview' campaign.pk %}">{% trans 'Campaign Preview' %}</a>
35+
</li>
36+
{% if campaign.track_clicks %}
37+
<li class="nav-item">
38+
<a class="nav-link{% if submenu == 'links' %} active{% endif %}" href="{% url 'campaigns:campaign_links' campaign.pk %}">{% trans 'Links' %}</a>
39+
</li>
40+
{% endif %}
41+
<li class="nav-item">
42+
<a class="nav-link{% if submenu == 'reports' %} active{% endif %}" href="{% url 'campaigns:campaign_reports' campaign.pk %}">{% trans 'Reports' %}</a>
43+
</li>
44+
</ul>
45+
</div>
4246
{% block innercontent %}
4347
{% endblock %}
4448
</div>
45-
</div>
46-
{% block outercontent %}
47-
{% endblock %}
49+
{% block outercontent %}
50+
{% endblock outercontent %}
51+
{% endblock maincontent %}
4852
{% endblock %}
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,11 @@
11
{% extends 'campaigns/base.html' %}
22

3-
{% load i18n %}
4-
53
{% block breadcrumb %}
64
<li class="breadcrumb-item active" aria-current="page">{{ campaign.name }}</li>
75
{% endblock %}
86

97
{% block innercontent %}
10-
<dl class="row mb-0">
11-
<dt class="col-sm-3">Date and time</dt>
12-
<dd class="col-sm-9">{{ campaign.send_date }}</dd>
13-
14-
<dt class="col-sm-3">From</dt>
15-
<dd class="col-sm-9">{{ campaign.email.get_from }}</dd>
16-
17-
<dt class="col-sm-3">Subject</dt>
18-
<dd class="col-sm-9">{{ campaign.email.subject }}</dd>
19-
20-
{% if campaign.email.preview %}
21-
<dt class="col-sm-3">Preview text</dt>
22-
<dd class="col-sm-9">{{ campaign.email.preview }}</dd>
23-
{% endif %}
24-
25-
<dt class="col-sm-3">Recipients</dt>
26-
<dd class="col-sm-9">{{ campaign.recipients_count }} subscribers from {{ campaign.mailing_list.name }}</dd>
27-
</dl>
8+
<div class="card-body">
9+
{% include 'campaigns/_campaign_detail.html' %}
10+
</div>
2811
{% endblock %}

colossus/apps/campaigns/templates/campaigns/campaign_form.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ <h2 class="card-title">
6060
{{ form|crispy }}
6161
{% if campaign %}
6262
<button type="submit" class="btn btn-success" role="button">{% trans 'Save changes' %}</button>
63-
<a href="{% url 'campaigns:campaign_edit' campaign.pk %}" class="btn btn-outline-secondary" role="button">{% trans 'Never mind' %}</a>
63+
<a href="{{ campaign.get_absolute_url }}" class="btn btn-outline-secondary" role="button">{% trans 'Never mind' %}</a>
6464
{% else %}
6565
<button type="submit" class="btn btn-success" role="button">{% trans 'Create campaign' %}</button>
6666
<a href="{% url 'campaigns:campaigns' %}" class="btn btn-outline-secondary" role="button">{% trans 'Never mind' %}</a>

colossus/apps/campaigns/templates/campaigns/campaign_links.html

+25-8
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,46 @@
22

33
{% load i18n humanize %}
44

5+
{% block javascript %}
6+
<script>
7+
$(function () {
8+
$("[data-toggle='popover']").popover();
9+
});
10+
</script>
11+
{% endblock %}
12+
513
{% block breadcrumb %}
614
<li class="breadcrumb-item"><a href="{% url 'campaigns:campaign_detail' campaign.pk %}">{{ campaign.name }}</a></li>
715
<li class="breadcrumb-item active" aria-current="page">{% trans 'Links' %}</li>
816
{% endblock %}
917

1018
{% block innercontent %}
11-
<table class="table table-striped table-bordered mb-0">
19+
<table class="table table-striped mb-0" style="border-top:0 none;">
1220
<thead>
1321
<tr>
14-
<th>{% trans 'ID' %}</th>
15-
<th>{% trans 'URL' %}</th>
16-
<th class="text-right">{% trans 'Index' %}</th>
17-
<th class="text-right">{% trans 'Unique clicks' %}</th>
18-
<th class="text-right">{% trans 'Total clicks' %}</th>
19-
<th></th>
22+
<th style="border-top:0 none;">{% trans 'ID' %}</th>
23+
<th style="border-top:0 none;">{% trans 'URL' %}</th>
24+
<th style="border-top:0 none;" class="text-right">{% trans 'Index' %}</th>
25+
<th style="border-top:0 none;" class="text-right">{% trans 'Unique clicks' %}</th>
26+
<th style="border-top:0 none;" class="text-right">{% trans 'Total clicks' %}</th>
27+
<th style="border-top:0 none;"></th>
2028
</tr>
2129
</thead>
2230
<tbody>
2331
{% for link in links %}
2432
<tr>
2533
<td>{{ link.short_uuid }}</td>
2634
<td>
27-
<a href="{{ link.url }}" rel="noopener nofollow" target="_blank" class="text-truncate">{{ link.url }}</a>
35+
<a href="{{ link.url }}"
36+
rel="noopener nofollow"
37+
target="_blank"
38+
class="d-inline-block text-truncate"
39+
style="max-width:350px;"
40+
data-toggle="popover"
41+
data-trigger="hover"
42+
data-placement="bottom"
43+
data-container="body"
44+
data-content="{{ link.url }}">{{ link.url }}</a>
2845
</td>
2946
<td class="text-right">{{ link.index }}</td>
3047
<td class="text-right">{{ link.unique_clicks_count|intcomma }}</td>

colossus/apps/campaigns/templates/campaigns/campaign_list.html

+7-3
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,14 @@ <h2 class="mb-0">{% trans 'Campaigns' %}</h2>
1818
<div class="row">
1919
<div class="col-3">
2020
<div class="list-group">
21-
<a href="?" class="list-group-item list-group-item-action{% if not status %} active{% endif %}">{% trans 'Recent' %}</a>
22-
{% for key, label in campaign_status.LABELS.items %}
21+
<a href="?" class="list-group-item list-group-item-action{% if not status %} active{% endif %}">
22+
<span class="far fa-clock mr-2"></span>
23+
{% trans 'Recent' %}
24+
</a>
25+
{% for key in campaign_status.FILTERS %}
2326
<a href="?{% qs status=key %}" class="list-group-item list-group-item-action{% if status == key %} active{% endif %}">
24-
{{ label }}
27+
<span class="{{ campaign_status.ICONS|get:key }} mr-2"></span>
28+
{{ campaign_status.LABELS|get:key }}
2529
</a>
2630
{% endfor %}
2731
</div>

colossus/apps/campaigns/templates/campaigns/campaign_preview.html

+3-1
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,7 @@
88
{% endblock %}
99

1010
{% block innercontent %}
11-
<iframe src="{% url 'campaigns:campaign_preview_email' campaign.pk %}" class="w-100" style="min-height:500px; border: 0 none;"></iframe>
11+
<div class="card-body">
12+
<iframe src="{% url 'campaigns:campaign_preview_email' campaign.pk %}" class="w-100" style="min-height:500px; border: 0 none;"></iframe>
13+
</div>
1214
{% endblock %}

0 commit comments

Comments
 (0)