Rafał Pitoń 11 лет назад
Родитель
Сommit
66ebfb6e70

+ 4 - 1
misago/core/context_processors.py

@@ -3,4 +3,7 @@ def site_address(request):
         address_template = 'https://%s'
     else:
         address_template = 'http://%s'
-    return {'SITE_ADDRESS': address_template % request.get_host()}
+    return {
+        'SITE_HOST': request.get_host(),
+        'SITE_ADDRESS': address_template % request.get_host()
+    }

+ 11 - 0
misago/core/migrations/0002_db_settings.py

@@ -48,6 +48,17 @@ class Migration(DataMigration):
                             'max_length': 255
                         },
                     },
+                    {
+                        'setting': 'email_footer',
+                        'name': _("E-mails footer"),
+                        'description': _("Optional short message included "
+                                         "at the end of e-mails sent by "
+                                         "forum"),
+                        'legend': _("Forum e-mails"),
+                        'field_extra': {
+                            'max_length': 255
+                        },
+                    },
                 )
             },
         )

+ 2 - 0
misago/core/testproject/urls.py

@@ -5,6 +5,8 @@ urlpatterns = patterns('',
 )
 
 urlpatterns += patterns('misago.core.testproject.views',
+    url(r'^forum/test-mail-user/$', 'test_mail_user', name='test_mail_user'),
+    url(r'^forum/test-mail-users/$', 'test_mail_users', name='test_mail_users'),
     url(r'^forum/test-pagination/$', 'test_pagination', name='test_pagination'),
     url(r'^forum/test-pagination/(?P<page>[1-9][0-9]*)/$', 'test_pagination', name='test_pagination'),
     url(r'^forum/test-valid-slug/(?P<model_slug>[a-z0-9\-]+)-(?P<model_id>\d+)/$', 'validate_slug_view', name='validate_slug_view'),

+ 25 - 1
misago/core/testproject/views.py

@@ -1,10 +1,34 @@
+from django.contrib.auth import get_user_model
 from django.core.exceptions import PermissionDenied
 from django.http import Http404, HttpResponse
-from misago.core import errorpages
+from misago.core import errorpages, mail
 from misago.core.shortcuts import paginate, validate_slug
 from misago.core.testproject.models import Model
 
 
+def test_mail_user(request):
+    User = get_user_model()
+
+    test_user = User.objects.all().first()
+    mail.mail_user(request,
+                   test_user,
+                   "Misago Test Mail",
+                   "misago/emails/base")
+
+    return HttpResponse("Mailed user!")
+
+
+def test_mail_users(request):
+    User = get_user_model()
+
+    mail.mail_users(request,
+                    User.objects.iterator(),
+                    "Misago Test Spam",
+                    "misago/emails/base")
+
+    return HttpResponse("Mailed users!")
+
+
 def test_pagination(request, page=None):
     items = range(15)
     page = paginate(items, page, 5)

+ 12 - 4
misago/core/tests/test_context_processors.py

@@ -18,11 +18,19 @@ class SiteAddressTests(TestCase):
     def test_site_address_for_http(self):
         """Correct SITE_ADDRESS set for HTTP request"""
         http_somewhere_com = MockRequest(False, 'somewhere.com')
-        self.assertEqual(context_processors.site_address(http_somewhere_com),
-                         {'SITE_ADDRESS': 'http://somewhere.com'})
+        self.assertEqual(
+            context_processors.site_address(http_somewhere_com),
+            {
+                'SITE_ADDRESS': 'http://somewhere.com',
+                'SITE_HOST': 'somewhere.com',
+            })
 
     def test_site_address_for_https(self):
         """Correct SITE_ADDRESS set for HTTPS request"""
         https_somewhere_com = MockRequest(True, 'somewhere.com')
-        self.assertEqual(context_processors.site_address(https_somewhere_com),
-                         {'SITE_ADDRESS': 'https://somewhere.com'})
+        self.assertEqual(
+            context_processors.site_address(https_somewhere_com),
+            {
+                'SITE_ADDRESS': 'https://somewhere.com',
+                'SITE_HOST': 'somewhere.com',
+            })

+ 43 - 0
misago/core/tests/test_mailer.py

@@ -0,0 +1,43 @@
+from django.contrib.auth import get_user_model
+from django.core import mail
+from django.core.urlresolvers import reverse
+from django.test import TestCase
+
+
+class MisagoFormsTests(TestCase):
+    urls = 'misago.core.testproject.urls'
+
+    def test_mail_user(self):
+        """mail_user sets message in backend"""
+        User = get_user_model()
+        test_user = User.objects.create_user('Bob', 'bob@bob.com', 'pass123')
+
+        response = self.client.get(reverse('test_mail_user'))
+        self.assertEqual(response.status_code, 200)
+
+        for message in mail.outbox:
+            if message.subject == 'Misago Test Mail':
+                break
+        else:
+            self.fail("Message was not added to backend.")
+
+    def test_mail_users(self):
+        """mail_users sets messages in backend"""
+        User = get_user_model()
+        test_users = (
+            User.objects.create_user('Alpha', 'alpha@test.com', 'pass123'),
+            User.objects.create_user('Beta', 'beta@test.com', 'pass123'),
+            User.objects.create_user('Niner', 'niner@test.com', 'pass123'),
+            User.objects.create_user('Foxtrot', 'foxtrot@test.com', 'pass123'),
+            User.objects.create_user('Uniform', 'uniform@test.com', 'pass123'),
+        )
+
+        response = self.client.get(reverse('test_mail_users'))
+        self.assertEqual(response.status_code, 200)
+
+        spams_sent = 0
+        for message in mail.outbox:
+            if message.subject == 'Misago Test Spam':
+                spams_sent += 1
+
+        self.assertEqual(spams_sent, len(test_users))

+ 0 - 3
misago/templates/misago/email/base.html

@@ -1,3 +0,0 @@
-<h1>{% block title %}{% endblock %}</h1>
-<hr>
-{% block content %}{% endblock %}

+ 0 - 4
misago/templates/misago/email/base.txt

@@ -1,4 +0,0 @@
-{% block title %}{% endblock %}
-================================================
-
-{% block content %}{% endblock %}

+ 90 - 0
misago/templates/misago/emails/base.html

@@ -0,0 +1,90 @@
+{% load misago_avatars %}
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html lang="en">
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+    <meta name="viewport" content="initial-scale=1.0">    <!-- So that mobile webkit will display zoomed in -->
+    <meta name="format-detection" content="telephone=no"> <!-- disable auto telephone linking in iOS -->
+
+    <style type="text/css">
+
+        /* Resets: see reset.css for details */
+        .ReadMsgBody { width: 100%; background-color: #eff0f1;}
+        .ExternalClass {width: 100%; background-color: #eff0f1;}
+        .ExternalClass, .ExternalClass p, .ExternalClass span, .ExternalClass font, .ExternalClass td, .ExternalClass div {line-height:100%;}
+        body {-webkit-text-size-adjust:none; -ms-text-size-adjust:none;}
+        body {margin:0; padding:0;}
+        table {border-spacing:0;}
+        table td {border-collapse:collapse;}
+        .yshortcuts a {border-bottom: none !important;}
+
+
+        /* Constrain email width for small screens */
+        @media screen and (max-width: 600px) {
+            table[class="container"] {
+                width: 95% !important;
+            }
+        }
+
+        /* Give content more room on mobile */
+        @media screen and (max-width: 480px) {
+            td[class="container-padding"] {
+                padding-left: 12px !important;
+                padding-right: 12px !important;
+            }
+        }
+
+    </style>
+</head>
+<body style="margin:0; padding:10px 0;" bgcolor="#eff0f1" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
+
+<br>
+
+<!-- 100% wrapper (grey background) -->
+<table border="0" width="100%" height="100%" cellpadding="0" cellspacing="0" bgcolor="#eff0f1">
+  <tr>
+    <td align="center" valign="top" bgcolor="#eff0f1" style="background-color: #eff0f1;">
+
+      <!-- 600px container (white background) -->
+      <table border="0" width="600" cellpadding="0" cellspacing="0" class="container" bgcolor="#ffffff">
+        <tr>
+          <td class="container-padding" bgcolor="#ffffff" style="background-color: #ffffff; border: 1px solid #dde0e2; padding-left: 30px; padding-right: 30px; font-size: 13px; line-height: 20px; font-family: Helvetica, sans-serif; color: #333; padding-top: 4px;" align="left">
+            <br>
+
+            <!-- ### BEGIN CONTENT ### -->
+
+              <table border="0" width="100%" height="100%" cellpadding="0" cellspacing="0">
+                <tr>
+                  <td valign="middle" style="font-size: 28px; line-height: 24px; color: #555555;">{{ misago_settings.forum_name }}</td>
+                  <td align="center" valign="middle" width="30"><img src="{{ recipient|avatar:32 }}" width="32" height="32" style="border-radius: 3px;" alt=""></td>
+                </tr>
+              </table>
+            <br>
+
+            <div style="font-weight: bold; font-size: 18px; line-height: 24px; color: #333; border-top: 1px solid #ddd;"><br>{% block title %}{% endblock %}</div>
+            <br>
+
+            {% block content %}{% endblock content %}
+
+            <br>
+            <div style="border-top: 1px solid #ddd; color: #666; font-size: 12px; line-height: 18px;">
+              {% if misago_settings.email_footer %}<br>{{ misago_settings.email_footer }}{% endif %}
+              <br><a href="{{ SITE_ADDRESS }}" style="color: #888; text-decoration: underline;">Sent from {{ SITE_HOST }}</a>
+            </div>
+
+            <!-- ### END CONTENT ### -->
+            <br>
+
+          </td>
+        </tr>
+      </table>
+      <!--/600px container -->
+
+    </td>
+  </tr>
+</table>
+<!--/100% wrapper-->
+<br>
+<br>
+</body>
+</html>

+ 11 - 0
misago/templates/misago/emails/base.txt

@@ -0,0 +1,11 @@
+{{ misago_settings.forum_name }}
+================================================
+
+{% block title %}{% endblock %}
+
+{% block content %}{% endblock content %}
+
+
+------------------------------------------------
+{% if misago_settings.email_footer %}{{ misago_settings.email_footer }}{% endif %}
+Sent from {{ SITE_ADDRESS }}

+ 7 - 1
runtests.py

@@ -13,10 +13,16 @@ def runtests():
 
         settings_path = os.path.join(test_project_path, "settings.py")
         with open(settings_path, "r") as py_file:
-            settings_file = py_file.read().replace("{{ project_name }}",
+            settings_file = py_file.read()
+
+            # Do some configuration magic
+            settings_file = settings_file.replace("{{ project_name }}",
                                                    "testproject")
             settings_file = settings_file.replace("{{ secret_key }}",
                                                   "t3stpr0j3ct")
+            settings_file += """
+EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend'
+"""
 
         with open(settings_path, "w") as py_file:
             py_file.write(settings_file)