Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / functions.py @ fc1e2f02

History | View | Annotate | Download (11.1 kB)

1 f36af44a Antony Chazapis
# Copyright 2011 GRNET S.A. All rights reserved.
2 f36af44a Antony Chazapis
# 
3 f36af44a Antony Chazapis
# Redistribution and use in source and binary forms, with or
4 f36af44a Antony Chazapis
# without modification, are permitted provided that the following
5 f36af44a Antony Chazapis
# conditions are met:
6 f36af44a Antony Chazapis
# 
7 f36af44a Antony Chazapis
#   1. Redistributions of source code must retain the above
8 f36af44a Antony Chazapis
#      copyright notice, this list of conditions and the following
9 f36af44a Antony Chazapis
#      disclaimer.
10 f36af44a Antony Chazapis
# 
11 f36af44a Antony Chazapis
#   2. Redistributions in binary form must reproduce the above
12 f36af44a Antony Chazapis
#      copyright notice, this list of conditions and the following
13 f36af44a Antony Chazapis
#      disclaimer in the documentation and/or other materials
14 f36af44a Antony Chazapis
#      provided with the distribution.
15 f36af44a Antony Chazapis
# 
16 f36af44a Antony Chazapis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 f36af44a Antony Chazapis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 f36af44a Antony Chazapis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 f36af44a Antony Chazapis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 f36af44a Antony Chazapis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 f36af44a Antony Chazapis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 f36af44a Antony Chazapis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 f36af44a Antony Chazapis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 f36af44a Antony Chazapis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 f36af44a Antony Chazapis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 f36af44a Antony Chazapis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 f36af44a Antony Chazapis
# POSSIBILITY OF SUCH DAMAGE.
28 f36af44a Antony Chazapis
# 
29 f36af44a Antony Chazapis
# The views and conclusions contained in the software and
30 f36af44a Antony Chazapis
# documentation are those of the authors and should not be
31 f36af44a Antony Chazapis
# interpreted as representing official policies, either expressed
32 f36af44a Antony Chazapis
# or implied, of GRNET S.A.
33 f36af44a Antony Chazapis
34 f36af44a Antony Chazapis
import logging
35 8f5a3a06 Sofia Papagiannaki
import socket
36 f36af44a Antony Chazapis
37 f36af44a Antony Chazapis
from django.utils.translation import ugettext as _
38 f36af44a Antony Chazapis
from django.template.loader import render_to_string
39 f36af44a Antony Chazapis
from django.core.mail import send_mail
40 f36af44a Antony Chazapis
from django.core.urlresolvers import reverse
41 27e26a41 Sofia Papagiannaki
from django.core.exceptions import ValidationError
42 49790d9d Sofia Papagiannaki
from django.template import Context, loader
43 111f3da6 Sofia Papagiannaki
from django.contrib.auth import login as auth_login, logout as auth_logout
44 111f3da6 Sofia Papagiannaki
from django.http import HttpRequest
45 27e26a41 Sofia Papagiannaki
46 683cf244 Sofia Papagiannaki
from urllib import quote
47 f36af44a Antony Chazapis
from urlparse import urljoin
48 8f5a3a06 Sofia Papagiannaki
from smtplib import SMTPException
49 751d24cf Sofia Papagiannaki
from datetime import datetime
50 111f3da6 Sofia Papagiannaki
from functools import wraps
51 f36af44a Antony Chazapis
52 111f3da6 Sofia Papagiannaki
from astakos.im.settings import DEFAULT_CONTACT_EMAIL, DEFAULT_FROM_EMAIL, \
53 111f3da6 Sofia Papagiannaki
    SITENAME, BASEURL, DEFAULT_ADMIN_EMAIL, LOGGING_LEVEL
54 aab4d540 Sofia Papagiannaki
from astakos.im.models import AstakosUser
55 f36af44a Antony Chazapis
56 f36af44a Antony Chazapis
logger = logging.getLogger(__name__)
57 f36af44a Antony Chazapis
58 111f3da6 Sofia Papagiannaki
def logged(func, msg):
59 111f3da6 Sofia Papagiannaki
    @wraps(func)
60 111f3da6 Sofia Papagiannaki
    def with_logging(*args, **kwargs):
61 111f3da6 Sofia Papagiannaki
        email = ''
62 111f3da6 Sofia Papagiannaki
        user = None
63 111f3da6 Sofia Papagiannaki
        if len(args) == 2 and isinstance(args[1], AstakosUser):
64 111f3da6 Sofia Papagiannaki
            user = args[1]
65 111f3da6 Sofia Papagiannaki
        elif len(args) == 1 and isinstance(args[0], HttpRequest):
66 111f3da6 Sofia Papagiannaki
            request = args[0]
67 111f3da6 Sofia Papagiannaki
            user = request.user
68 111f3da6 Sofia Papagiannaki
        email = user.email if user and user.is_authenticated() else ''
69 111f3da6 Sofia Papagiannaki
        r = func(*args, **kwargs)
70 c9e378c7 Sofia Papagiannaki
        if LOGGING_LEVEL:
71 aab4d540 Sofia Papagiannaki
            logger.log(LOGGING_LEVEL, msg % email)
72 111f3da6 Sofia Papagiannaki
        return r
73 111f3da6 Sofia Papagiannaki
    return with_logging
74 111f3da6 Sofia Papagiannaki
75 111f3da6 Sofia Papagiannaki
login = logged(auth_login, '%s logged in.')
76 111f3da6 Sofia Papagiannaki
logout = logged(auth_logout, '%s logged out.')
77 111f3da6 Sofia Papagiannaki
78 683cf244 Sofia Papagiannaki
def send_verification(user, template_name='im/activation_email.txt'):
79 f36af44a Antony Chazapis
    """
80 683cf244 Sofia Papagiannaki
    Send email to user to verify his/her email and activate his/her account.
81 f36af44a Antony Chazapis
    
82 8f5a3a06 Sofia Papagiannaki
    Raises SendVerificationError
83 f36af44a Antony Chazapis
    """
84 6ff7a7ca Sofia Papagiannaki
    url = '%s?auth=%s&next=%s' % (urljoin(BASEURL, reverse('activate')),
85 683cf244 Sofia Papagiannaki
                                    quote(user.auth_token),
86 6ff7a7ca Sofia Papagiannaki
                                    quote(urljoin(BASEURL, reverse('index'))))
87 683cf244 Sofia Papagiannaki
    message = render_to_string(template_name, {
88 683cf244 Sofia Papagiannaki
            'user': user,
89 683cf244 Sofia Papagiannaki
            'url': url,
90 683cf244 Sofia Papagiannaki
            'baseurl': BASEURL,
91 683cf244 Sofia Papagiannaki
            'site_name': SITENAME,
92 683cf244 Sofia Papagiannaki
            'support': DEFAULT_CONTACT_EMAIL})
93 683cf244 Sofia Papagiannaki
    sender = DEFAULT_FROM_EMAIL
94 8f5a3a06 Sofia Papagiannaki
    try:
95 8f5a3a06 Sofia Papagiannaki
        send_mail('%s alpha2 testing account activation is needed' % SITENAME, message, sender, [user.email])
96 8f5a3a06 Sofia Papagiannaki
    except (SMTPException, socket.error) as e:
97 8f5a3a06 Sofia Papagiannaki
        logger.exception(e)
98 8f5a3a06 Sofia Papagiannaki
        raise SendVerificationError()
99 8f5a3a06 Sofia Papagiannaki
    else:
100 111f3da6 Sofia Papagiannaki
        msg = 'Sent activation %s' % user.email
101 aab4d540 Sofia Papagiannaki
        logger.log(LOGGING_LEVEL, msg)
102 683cf244 Sofia Papagiannaki
103 751d24cf Sofia Papagiannaki
def send_activation(user, template_name='im/activation_email.txt'):
104 751d24cf Sofia Papagiannaki
    send_verification(user, template_name)
105 751d24cf Sofia Papagiannaki
    user.activation_sent = datetime.now()
106 751d24cf Sofia Papagiannaki
    user.save()
107 683cf244 Sofia Papagiannaki
108 3abf6c78 Sofia Papagiannaki
def send_admin_notification(template_name,
109 aab4d540 Sofia Papagiannaki
    dictionary=None,
110 3abf6c78 Sofia Papagiannaki
    subject='alpha2 testing notification',
111 3abf6c78 Sofia Papagiannaki
):
112 683cf244 Sofia Papagiannaki
    """
113 3abf6c78 Sofia Papagiannaki
    Send notification email to DEFAULT_ADMIN_EMAIL.
114 683cf244 Sofia Papagiannaki
    
115 8f5a3a06 Sofia Papagiannaki
    Raises SendNotificationError
116 683cf244 Sofia Papagiannaki
    """
117 683cf244 Sofia Papagiannaki
    if not DEFAULT_ADMIN_EMAIL:
118 683cf244 Sofia Papagiannaki
        return
119 aab4d540 Sofia Papagiannaki
    dictionary = dictionary or {}
120 3abf6c78 Sofia Papagiannaki
    message = render_to_string(template_name, dictionary)
121 683cf244 Sofia Papagiannaki
    sender = DEFAULT_FROM_EMAIL
122 8f5a3a06 Sofia Papagiannaki
    try:
123 3abf6c78 Sofia Papagiannaki
        send_mail(subject, message, sender, [DEFAULT_ADMIN_EMAIL])
124 8f5a3a06 Sofia Papagiannaki
    except (SMTPException, socket.error) as e:
125 8f5a3a06 Sofia Papagiannaki
        logger.exception(e)
126 8f5a3a06 Sofia Papagiannaki
        raise SendNotificationError()
127 8f5a3a06 Sofia Papagiannaki
    else:
128 3abf6c78 Sofia Papagiannaki
        msg = 'Sent admin notification for user %s' % dictionary
129 aab4d540 Sofia Papagiannaki
        logger.log(LOGGING_LEVEL, msg)
130 683cf244 Sofia Papagiannaki
131 3abf6c78 Sofia Papagiannaki
def send_helpdesk_notification(user, template_name='im/account_notification.txt'):
132 a0be6a0c Sofia Papagiannaki
    """
133 a0be6a0c Sofia Papagiannaki
    Send email to DEFAULT_CONTACT_EMAIL to notify for a new user activation.
134 a0be6a0c Sofia Papagiannaki
    
135 a0be6a0c Sofia Papagiannaki
    Raises SendNotificationError
136 a0be6a0c Sofia Papagiannaki
    """
137 a0be6a0c Sofia Papagiannaki
    if not DEFAULT_CONTACT_EMAIL:
138 a0be6a0c Sofia Papagiannaki
        return
139 3abf6c78 Sofia Papagiannaki
    message = render_to_string(
140 3abf6c78 Sofia Papagiannaki
        template_name,
141 3abf6c78 Sofia Papagiannaki
        {'user': user}
142 3abf6c78 Sofia Papagiannaki
    )
143 a0be6a0c Sofia Papagiannaki
    sender = DEFAULT_FROM_EMAIL
144 a0be6a0c Sofia Papagiannaki
    try:
145 3abf6c78 Sofia Papagiannaki
        send_mail(
146 3abf6c78 Sofia Papagiannaki
            '%s alpha2 testing account activated' % SITENAME,
147 3abf6c78 Sofia Papagiannaki
            message,
148 3abf6c78 Sofia Papagiannaki
            sender,
149 3abf6c78 Sofia Papagiannaki
            [DEFAULT_CONTACT_EMAIL]
150 3abf6c78 Sofia Papagiannaki
        )
151 a0be6a0c Sofia Papagiannaki
    except (SMTPException, socket.error) as e:
152 a0be6a0c Sofia Papagiannaki
        logger.exception(e)
153 a0be6a0c Sofia Papagiannaki
        raise SendNotificationError()
154 a0be6a0c Sofia Papagiannaki
    else:
155 3abf6c78 Sofia Papagiannaki
        msg = 'Sent helpdesk admin notification for %s' % user.email
156 aab4d540 Sofia Papagiannaki
        logger.log(LOGGING_LEVEL, msg)
157 a0be6a0c Sofia Papagiannaki
158 683cf244 Sofia Papagiannaki
def send_invitation(invitation, template_name='im/invitation.txt'):
159 683cf244 Sofia Papagiannaki
    """
160 683cf244 Sofia Papagiannaki
    Send invitation email.
161 683cf244 Sofia Papagiannaki
    
162 8f5a3a06 Sofia Papagiannaki
    Raises SendInvitationError
163 683cf244 Sofia Papagiannaki
    """
164 683cf244 Sofia Papagiannaki
    subject = _('Invitation to %s alpha2 testing' % SITENAME)
165 6ff7a7ca Sofia Papagiannaki
    url = '%s?code=%d' % (urljoin(BASEURL, reverse('index')), invitation.code)
166 aab4d540 Sofia Papagiannaki
    message = render_to_string(template_name, {
167 683cf244 Sofia Papagiannaki
                'invitation': invitation,
168 683cf244 Sofia Papagiannaki
                'url': url,
169 683cf244 Sofia Papagiannaki
                'baseurl': BASEURL,
170 683cf244 Sofia Papagiannaki
                'site_name': SITENAME,
171 683cf244 Sofia Papagiannaki
                'support': DEFAULT_CONTACT_EMAIL})
172 683cf244 Sofia Papagiannaki
    sender = DEFAULT_FROM_EMAIL
173 8f5a3a06 Sofia Papagiannaki
    try:
174 8f5a3a06 Sofia Papagiannaki
        send_mail(subject, message, sender, [invitation.username])
175 8f5a3a06 Sofia Papagiannaki
    except (SMTPException, socket.error) as e:
176 8f5a3a06 Sofia Papagiannaki
        logger.exception(e)
177 8f5a3a06 Sofia Papagiannaki
        raise SendInvitationError()
178 8f5a3a06 Sofia Papagiannaki
    else:
179 111f3da6 Sofia Papagiannaki
        msg = 'Sent invitation %s' % invitation
180 aab4d540 Sofia Papagiannaki
        logger.log(LOGGING_LEVEL, msg)
181 683cf244 Sofia Papagiannaki
182 683cf244 Sofia Papagiannaki
def send_greeting(user, email_template_name='im/welcome_email.txt'):
183 683cf244 Sofia Papagiannaki
    """
184 683cf244 Sofia Papagiannaki
    Send welcome email.
185 f36af44a Antony Chazapis
    
186 f36af44a Antony Chazapis
    Raises SMTPException, socket.error
187 f36af44a Antony Chazapis
    """
188 4abc7b29 Sofia Papagiannaki
    subject = _('Welcome to %s alpha2 testing' % SITENAME)
189 f36af44a Antony Chazapis
    message = render_to_string(email_template_name, {
190 f36af44a Antony Chazapis
                'user': user,
191 6ff7a7ca Sofia Papagiannaki
                'url': urljoin(BASEURL, reverse('index')),
192 f36af44a Antony Chazapis
                'baseurl': BASEURL,
193 f36af44a Antony Chazapis
                'site_name': SITENAME,
194 ef0c73c4 Sofia Papagiannaki
                'support': DEFAULT_CONTACT_EMAIL})
195 d552ecb7 Antony Chazapis
    sender = DEFAULT_FROM_EMAIL
196 8f5a3a06 Sofia Papagiannaki
    try:
197 8f5a3a06 Sofia Papagiannaki
        send_mail(subject, message, sender, [user.email])
198 8f5a3a06 Sofia Papagiannaki
    except (SMTPException, socket.error) as e:
199 8f5a3a06 Sofia Papagiannaki
        logger.exception(e)
200 8f5a3a06 Sofia Papagiannaki
        raise SendGreetingError()
201 8f5a3a06 Sofia Papagiannaki
    else:
202 111f3da6 Sofia Papagiannaki
        msg = 'Sent greeting %s' % user.email
203 aab4d540 Sofia Papagiannaki
        logger.log(LOGGING_LEVEL, msg)
204 8f5a3a06 Sofia Papagiannaki
205 8f5a3a06 Sofia Papagiannaki
def send_feedback(msg, data, user, email_template_name='im/feedback_mail.txt'):
206 8f5a3a06 Sofia Papagiannaki
    subject = _("Feedback from %s alpha2 testing" % SITENAME)
207 8f5a3a06 Sofia Papagiannaki
    from_email = user.email
208 8f5a3a06 Sofia Papagiannaki
    recipient_list = [DEFAULT_CONTACT_EMAIL]
209 8f5a3a06 Sofia Papagiannaki
    content = render_to_string(email_template_name, {
210 8f5a3a06 Sofia Papagiannaki
        'message': msg,
211 8f5a3a06 Sofia Papagiannaki
        'data': data,
212 8f5a3a06 Sofia Papagiannaki
        'user': user})
213 8f5a3a06 Sofia Papagiannaki
    try:
214 8f5a3a06 Sofia Papagiannaki
        send_mail(subject, content, from_email, recipient_list)
215 8f5a3a06 Sofia Papagiannaki
    except (SMTPException, socket.error) as e:
216 8f5a3a06 Sofia Papagiannaki
        logger.exception(e)
217 8f5a3a06 Sofia Papagiannaki
        raise SendFeedbackError()
218 8f5a3a06 Sofia Papagiannaki
    else:
219 111f3da6 Sofia Papagiannaki
        msg = 'Sent feedback from %s' % user.email
220 aab4d540 Sofia Papagiannaki
        logger.log(LOGGING_LEVEL, msg)
221 f36af44a Antony Chazapis
222 49790d9d Sofia Papagiannaki
def send_change_email(ec, request, email_template_name='registration/email_change_email.txt'):
223 49790d9d Sofia Papagiannaki
    try:
224 49790d9d Sofia Papagiannaki
        url = reverse('email_change_confirm',
225 49790d9d Sofia Papagiannaki
                      kwargs={'activation_key':ec.activation_key})
226 49790d9d Sofia Papagiannaki
        url = request.build_absolute_uri(url)
227 49790d9d Sofia Papagiannaki
        t = loader.get_template(email_template_name)
228 49790d9d Sofia Papagiannaki
        c = {'url': url, 'site_name': SITENAME}
229 49790d9d Sofia Papagiannaki
        from_email = DEFAULT_FROM_EMAIL
230 49790d9d Sofia Papagiannaki
        send_mail(_("Email change on %s alpha2 testing") % SITENAME,
231 49790d9d Sofia Papagiannaki
            t.render(Context(c)), from_email, [ec.new_email_address])
232 49790d9d Sofia Papagiannaki
    except (SMTPException, socket.error) as e:
233 49790d9d Sofia Papagiannaki
        logger.exception(e)
234 49790d9d Sofia Papagiannaki
        raise ChangeEmailError()
235 49790d9d Sofia Papagiannaki
    else:
236 111f3da6 Sofia Papagiannaki
        msg = 'Sent change email for %s' % ec.user.email
237 aab4d540 Sofia Papagiannaki
        logger.log(LOGGING_LEVEL, msg)
238 f36af44a Antony Chazapis
239 23b9b72f Sofia Papagiannaki
def activate(user, email_template_name='im/welcome_email.txt',
240 23b9b72f Sofia Papagiannaki
                helpdesk_email_template_name='im/helpdesk_notification.txt', verify_email=False):
241 683cf244 Sofia Papagiannaki
    """
242 683cf244 Sofia Papagiannaki
    Activates the specific user and sends email.
243 683cf244 Sofia Papagiannaki
    
244 27e26a41 Sofia Papagiannaki
    Raises SendGreetingError, ValidationError
245 683cf244 Sofia Papagiannaki
    """
246 683cf244 Sofia Papagiannaki
    user.is_active = True
247 23b9b72f Sofia Papagiannaki
    if verify_email:
248 23b9b72f Sofia Papagiannaki
        user.email_verified = True
249 683cf244 Sofia Papagiannaki
    user.save()
250 23b9b72f Sofia Papagiannaki
    send_helpdesk_notification(user, helpdesk_email_template_name)
251 683cf244 Sofia Papagiannaki
    send_greeting(user, email_template_name)
252 683cf244 Sofia Papagiannaki
253 142e3647 Sofia Papagiannaki
def switch_account_to_shibboleth(user, local_user, greeting_template_name='im/welcome_email.txt'):
254 23b9b72f Sofia Papagiannaki
    if not user or not isinstance(user, AstakosUser):
255 23b9b72f Sofia Papagiannaki
        return
256 23b9b72f Sofia Papagiannaki
    
257 23b9b72f Sofia Papagiannaki
    if not local_user or not isinstance(user, AstakosUser):
258 23b9b72f Sofia Papagiannaki
        return
259 23b9b72f Sofia Papagiannaki
    
260 23b9b72f Sofia Papagiannaki
    if not user.provider == 'shibboleth':
261 23b9b72f Sofia Papagiannaki
        return
262 23b9b72f Sofia Papagiannaki
    
263 23b9b72f Sofia Papagiannaki
    user.delete()
264 23b9b72f Sofia Papagiannaki
    local_user.provider = 'shibboleth'
265 23b9b72f Sofia Papagiannaki
    local_user.third_party_identifier = user.third_party_identifier
266 23b9b72f Sofia Papagiannaki
    local_user.save()
267 142e3647 Sofia Papagiannaki
    send_greeting(local_user, greeting_template_name)
268 23b9b72f Sofia Papagiannaki
    return local_user
269 23b9b72f Sofia Papagiannaki
270 8f5a3a06 Sofia Papagiannaki
def invite(invitation, inviter, email_template_name='im/welcome_email.txt'):
271 f36af44a Antony Chazapis
    """
272 f36af44a Antony Chazapis
    Send an invitation email and upon success reduces inviter's invitation by one.
273 f36af44a Antony Chazapis
    
274 8f5a3a06 Sofia Papagiannaki
    Raises SendInvitationError
275 f36af44a Antony Chazapis
    """
276 18ffbee1 Sofia Papagiannaki
    invitation.inviter = inviter
277 18ffbee1 Sofia Papagiannaki
    invitation.save()
278 683cf244 Sofia Papagiannaki
    send_invitation(invitation, email_template_name)
279 f36af44a Antony Chazapis
    inviter.invitations = max(0, inviter.invitations - 1)
280 d552ecb7 Antony Chazapis
    inviter.save()
281 59f598f1 Sofia Papagiannaki
282 8f5a3a06 Sofia Papagiannaki
class SendMailError(Exception):
283 18ffbee1 Sofia Papagiannaki
    pass
284 8f5a3a06 Sofia Papagiannaki
285 8f5a3a06 Sofia Papagiannaki
class SendAdminNotificationError(SendMailError):
286 8f5a3a06 Sofia Papagiannaki
    def __init__(self):
287 8f5a3a06 Sofia Papagiannaki
        self.message = _('Failed to send notification')
288 18ffbee1 Sofia Papagiannaki
        super(SendAdminNotificationError, self).__init__()
289 8f5a3a06 Sofia Papagiannaki
290 18ffbee1 Sofia Papagiannaki
class SendVerificationError(SendMailError):
291 8f5a3a06 Sofia Papagiannaki
    def __init__(self):
292 8f5a3a06 Sofia Papagiannaki
        self.message = _('Failed to send verification')
293 18ffbee1 Sofia Papagiannaki
        super(SendVerificationError, self).__init__()
294 8f5a3a06 Sofia Papagiannaki
295 18ffbee1 Sofia Papagiannaki
class SendInvitationError(SendMailError):
296 8f5a3a06 Sofia Papagiannaki
    def __init__(self):
297 8f5a3a06 Sofia Papagiannaki
        self.message = _('Failed to send invitation')
298 18ffbee1 Sofia Papagiannaki
        super(SendInvitationError, self).__init__()
299 8f5a3a06 Sofia Papagiannaki
300 18ffbee1 Sofia Papagiannaki
class SendGreetingError(SendMailError):
301 8f5a3a06 Sofia Papagiannaki
    def __init__(self):
302 8f5a3a06 Sofia Papagiannaki
        self.message = _('Failed to send greeting')
303 18ffbee1 Sofia Papagiannaki
        super(SendGreetingError, self).__init__()
304 8f5a3a06 Sofia Papagiannaki
305 18ffbee1 Sofia Papagiannaki
class SendFeedbackError(SendMailError):
306 8f5a3a06 Sofia Papagiannaki
    def __init__(self):
307 8f5a3a06 Sofia Papagiannaki
        self.message = _('Failed to send feedback')
308 49790d9d Sofia Papagiannaki
        super(SendFeedbackError, self).__init__()
309 49790d9d Sofia Papagiannaki
310 49790d9d Sofia Papagiannaki
class ChangeEmailError(SendMailError):
311 49790d9d Sofia Papagiannaki
    def __init__(self):
312 49790d9d Sofia Papagiannaki
        self.message = _('Failed to send change email')
313 35f8ccf1 Sofia Papagiannaki
        super(ChangeEmailError, self).__init__()
314 a0be6a0c Sofia Papagiannaki
315 a0be6a0c Sofia Papagiannaki
class SendNotificationError(SendMailError):
316 a0be6a0c Sofia Papagiannaki
    def __init__(self):
317 a0be6a0c Sofia Papagiannaki
        self.message = _('Failed to send notification email')
318 a0be6a0c Sofia Papagiannaki
        super(SendNotificationError, self).__init__()