Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / functions.py @ 3abf6c78

History | View | Annotate | Download (11.4 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 59f598f1 Sofia Papagiannaki
from astakos.im.models import Invitation, 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 c9e378c7 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 111f3da6 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 3abf6c78 Sofia Papagiannaki
    dictionary={},
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 3abf6c78 Sofia Papagiannaki
    message = render_to_string(template_name, dictionary)
120 683cf244 Sofia Papagiannaki
    sender = DEFAULT_FROM_EMAIL
121 8f5a3a06 Sofia Papagiannaki
    try:
122 3abf6c78 Sofia Papagiannaki
        send_mail(subject, message, sender, [DEFAULT_ADMIN_EMAIL])
123 8f5a3a06 Sofia Papagiannaki
    except (SMTPException, socket.error) as e:
124 8f5a3a06 Sofia Papagiannaki
        logger.exception(e)
125 8f5a3a06 Sofia Papagiannaki
        raise SendNotificationError()
126 8f5a3a06 Sofia Papagiannaki
    else:
127 3abf6c78 Sofia Papagiannaki
        msg = 'Sent admin notification for user %s' % dictionary
128 111f3da6 Sofia Papagiannaki
        logger._log(LOGGING_LEVEL, msg, [])
129 683cf244 Sofia Papagiannaki
130 3abf6c78 Sofia Papagiannaki
def send_helpdesk_notification(user, template_name='im/account_notification.txt'):
131 a0be6a0c Sofia Papagiannaki
    """
132 a0be6a0c Sofia Papagiannaki
    Send email to DEFAULT_CONTACT_EMAIL to notify for a new user activation.
133 a0be6a0c Sofia Papagiannaki
    
134 a0be6a0c Sofia Papagiannaki
    Raises SendNotificationError
135 a0be6a0c Sofia Papagiannaki
    """
136 a0be6a0c Sofia Papagiannaki
    if not DEFAULT_CONTACT_EMAIL:
137 a0be6a0c Sofia Papagiannaki
        return
138 3abf6c78 Sofia Papagiannaki
    message = render_to_string(
139 3abf6c78 Sofia Papagiannaki
        template_name,
140 3abf6c78 Sofia Papagiannaki
        {'user': user}
141 3abf6c78 Sofia Papagiannaki
    )
142 a0be6a0c Sofia Papagiannaki
    sender = DEFAULT_FROM_EMAIL
143 a0be6a0c Sofia Papagiannaki
    try:
144 3abf6c78 Sofia Papagiannaki
        send_mail(
145 3abf6c78 Sofia Papagiannaki
            '%s alpha2 testing account activated' % SITENAME,
146 3abf6c78 Sofia Papagiannaki
            message,
147 3abf6c78 Sofia Papagiannaki
            sender,
148 3abf6c78 Sofia Papagiannaki
            [DEFAULT_CONTACT_EMAIL]
149 3abf6c78 Sofia Papagiannaki
        )
150 a0be6a0c Sofia Papagiannaki
    except (SMTPException, socket.error) as e:
151 a0be6a0c Sofia Papagiannaki
        logger.exception(e)
152 a0be6a0c Sofia Papagiannaki
        raise SendNotificationError()
153 a0be6a0c Sofia Papagiannaki
    else:
154 3abf6c78 Sofia Papagiannaki
        msg = 'Sent helpdesk admin notification for %s' % user.email
155 a0be6a0c Sofia Papagiannaki
        logger._log(LOGGING_LEVEL, msg, [])
156 a0be6a0c Sofia Papagiannaki
157 683cf244 Sofia Papagiannaki
def send_invitation(invitation, template_name='im/invitation.txt'):
158 683cf244 Sofia Papagiannaki
    """
159 683cf244 Sofia Papagiannaki
    Send invitation email.
160 683cf244 Sofia Papagiannaki
    
161 8f5a3a06 Sofia Papagiannaki
    Raises SendInvitationError
162 683cf244 Sofia Papagiannaki
    """
163 683cf244 Sofia Papagiannaki
    subject = _('Invitation to %s alpha2 testing' % SITENAME)
164 6ff7a7ca Sofia Papagiannaki
    url = '%s?code=%d' % (urljoin(BASEURL, reverse('index')), invitation.code)
165 683cf244 Sofia Papagiannaki
    message = render_to_string('im/invitation.txt', {
166 683cf244 Sofia Papagiannaki
                'invitation': invitation,
167 683cf244 Sofia Papagiannaki
                'url': url,
168 683cf244 Sofia Papagiannaki
                'baseurl': BASEURL,
169 683cf244 Sofia Papagiannaki
                'site_name': SITENAME,
170 683cf244 Sofia Papagiannaki
                'support': DEFAULT_CONTACT_EMAIL})
171 683cf244 Sofia Papagiannaki
    sender = DEFAULT_FROM_EMAIL
172 8f5a3a06 Sofia Papagiannaki
    try:
173 8f5a3a06 Sofia Papagiannaki
        send_mail(subject, message, sender, [invitation.username])
174 8f5a3a06 Sofia Papagiannaki
    except (SMTPException, socket.error) as e:
175 8f5a3a06 Sofia Papagiannaki
        logger.exception(e)
176 8f5a3a06 Sofia Papagiannaki
        raise SendInvitationError()
177 8f5a3a06 Sofia Papagiannaki
    else:
178 111f3da6 Sofia Papagiannaki
        msg = 'Sent invitation %s' % invitation
179 111f3da6 Sofia Papagiannaki
        logger._log(LOGGING_LEVEL, msg, [])
180 683cf244 Sofia Papagiannaki
181 683cf244 Sofia Papagiannaki
def send_greeting(user, email_template_name='im/welcome_email.txt'):
182 683cf244 Sofia Papagiannaki
    """
183 683cf244 Sofia Papagiannaki
    Send welcome email.
184 f36af44a Antony Chazapis
    
185 f36af44a Antony Chazapis
    Raises SMTPException, socket.error
186 f36af44a Antony Chazapis
    """
187 4abc7b29 Sofia Papagiannaki
    subject = _('Welcome to %s alpha2 testing' % SITENAME)
188 f36af44a Antony Chazapis
    message = render_to_string(email_template_name, {
189 f36af44a Antony Chazapis
                'user': user,
190 6ff7a7ca Sofia Papagiannaki
                'url': urljoin(BASEURL, reverse('index')),
191 f36af44a Antony Chazapis
                'baseurl': BASEURL,
192 f36af44a Antony Chazapis
                'site_name': SITENAME,
193 ef0c73c4 Sofia Papagiannaki
                'support': DEFAULT_CONTACT_EMAIL})
194 d552ecb7 Antony Chazapis
    sender = DEFAULT_FROM_EMAIL
195 8f5a3a06 Sofia Papagiannaki
    try:
196 8f5a3a06 Sofia Papagiannaki
        send_mail(subject, message, sender, [user.email])
197 8f5a3a06 Sofia Papagiannaki
    except (SMTPException, socket.error) as e:
198 8f5a3a06 Sofia Papagiannaki
        logger.exception(e)
199 8f5a3a06 Sofia Papagiannaki
        raise SendGreetingError()
200 8f5a3a06 Sofia Papagiannaki
    else:
201 111f3da6 Sofia Papagiannaki
        msg = 'Sent greeting %s' % user.email
202 111f3da6 Sofia Papagiannaki
        logger._log(LOGGING_LEVEL, msg, [])
203 8f5a3a06 Sofia Papagiannaki
204 8f5a3a06 Sofia Papagiannaki
def send_feedback(msg, data, user, email_template_name='im/feedback_mail.txt'):
205 8f5a3a06 Sofia Papagiannaki
    subject = _("Feedback from %s alpha2 testing" % SITENAME)
206 8f5a3a06 Sofia Papagiannaki
    from_email = user.email
207 8f5a3a06 Sofia Papagiannaki
    recipient_list = [DEFAULT_CONTACT_EMAIL]
208 8f5a3a06 Sofia Papagiannaki
    content = render_to_string(email_template_name, {
209 8f5a3a06 Sofia Papagiannaki
        'message': msg,
210 8f5a3a06 Sofia Papagiannaki
        'data': data,
211 8f5a3a06 Sofia Papagiannaki
        'user': user})
212 8f5a3a06 Sofia Papagiannaki
    try:
213 8f5a3a06 Sofia Papagiannaki
        send_mail(subject, content, from_email, recipient_list)
214 8f5a3a06 Sofia Papagiannaki
    except (SMTPException, socket.error) as e:
215 8f5a3a06 Sofia Papagiannaki
        logger.exception(e)
216 8f5a3a06 Sofia Papagiannaki
        raise SendFeedbackError()
217 8f5a3a06 Sofia Papagiannaki
    else:
218 111f3da6 Sofia Papagiannaki
        msg = 'Sent feedback from %s' % user.email
219 111f3da6 Sofia Papagiannaki
        logger._log(LOGGING_LEVEL, msg, [])
220 f36af44a Antony Chazapis
221 49790d9d Sofia Papagiannaki
def send_change_email(ec, request, email_template_name='registration/email_change_email.txt'):
222 49790d9d Sofia Papagiannaki
    try:
223 49790d9d Sofia Papagiannaki
        url = reverse('email_change_confirm',
224 49790d9d Sofia Papagiannaki
                      kwargs={'activation_key':ec.activation_key})
225 49790d9d Sofia Papagiannaki
        url = request.build_absolute_uri(url)
226 49790d9d Sofia Papagiannaki
        t = loader.get_template(email_template_name)
227 49790d9d Sofia Papagiannaki
        c = {'url': url, 'site_name': SITENAME}
228 49790d9d Sofia Papagiannaki
        from_email = DEFAULT_FROM_EMAIL
229 49790d9d Sofia Papagiannaki
        send_mail(_("Email change on %s alpha2 testing") % SITENAME,
230 49790d9d Sofia Papagiannaki
            t.render(Context(c)), from_email, [ec.new_email_address])
231 49790d9d Sofia Papagiannaki
    except (SMTPException, socket.error) as e:
232 49790d9d Sofia Papagiannaki
        logger.exception(e)
233 49790d9d Sofia Papagiannaki
        raise ChangeEmailError()
234 49790d9d Sofia Papagiannaki
    else:
235 111f3da6 Sofia Papagiannaki
        msg = 'Sent change email for %s' % ec.user.email
236 111f3da6 Sofia Papagiannaki
        logger._log(LOGGING_LEVEL, msg, [])
237 f36af44a Antony Chazapis
238 23b9b72f Sofia Papagiannaki
def activate(user, email_template_name='im/welcome_email.txt',
239 23b9b72f Sofia Papagiannaki
                helpdesk_email_template_name='im/helpdesk_notification.txt', verify_email=False):
240 683cf244 Sofia Papagiannaki
    """
241 683cf244 Sofia Papagiannaki
    Activates the specific user and sends email.
242 683cf244 Sofia Papagiannaki
    
243 27e26a41 Sofia Papagiannaki
    Raises SendGreetingError, ValidationError
244 683cf244 Sofia Papagiannaki
    """
245 683cf244 Sofia Papagiannaki
    user.is_active = True
246 23b9b72f Sofia Papagiannaki
    if verify_email:
247 23b9b72f Sofia Papagiannaki
        user.email_verified = True
248 683cf244 Sofia Papagiannaki
    user.save()
249 23b9b72f Sofia Papagiannaki
    send_helpdesk_notification(user, helpdesk_email_template_name)
250 683cf244 Sofia Papagiannaki
    send_greeting(user, email_template_name)
251 683cf244 Sofia Papagiannaki
252 142e3647 Sofia Papagiannaki
def switch_account_to_shibboleth(user, local_user, greeting_template_name='im/welcome_email.txt'):
253 23b9b72f Sofia Papagiannaki
    if not user or not isinstance(user, AstakosUser):
254 23b9b72f Sofia Papagiannaki
        return
255 23b9b72f Sofia Papagiannaki
    
256 23b9b72f Sofia Papagiannaki
    if not local_user or not isinstance(user, AstakosUser):
257 23b9b72f Sofia Papagiannaki
        return
258 23b9b72f Sofia Papagiannaki
    
259 23b9b72f Sofia Papagiannaki
    if not user.provider == 'shibboleth':
260 23b9b72f Sofia Papagiannaki
        return
261 23b9b72f Sofia Papagiannaki
    
262 23b9b72f Sofia Papagiannaki
    user.delete()
263 23b9b72f Sofia Papagiannaki
    local_user.provider = 'shibboleth'
264 23b9b72f Sofia Papagiannaki
    local_user.third_party_identifier = user.third_party_identifier
265 23b9b72f Sofia Papagiannaki
    local_user.save()
266 142e3647 Sofia Papagiannaki
    send_greeting(local_user, greeting_template_name)
267 23b9b72f Sofia Papagiannaki
    return local_user
268 23b9b72f Sofia Papagiannaki
269 8f5a3a06 Sofia Papagiannaki
def invite(invitation, inviter, email_template_name='im/welcome_email.txt'):
270 f36af44a Antony Chazapis
    """
271 f36af44a Antony Chazapis
    Send an invitation email and upon success reduces inviter's invitation by one.
272 f36af44a Antony Chazapis
    
273 8f5a3a06 Sofia Papagiannaki
    Raises SendInvitationError
274 f36af44a Antony Chazapis
    """
275 18ffbee1 Sofia Papagiannaki
    invitation.inviter = inviter
276 18ffbee1 Sofia Papagiannaki
    invitation.save()
277 683cf244 Sofia Papagiannaki
    send_invitation(invitation, email_template_name)
278 f36af44a Antony Chazapis
    inviter.invitations = max(0, inviter.invitations - 1)
279 d552ecb7 Antony Chazapis
    inviter.save()
280 59f598f1 Sofia Papagiannaki
281 59f598f1 Sofia Papagiannaki
def set_user_credibility(email, has_credits):
282 59f598f1 Sofia Papagiannaki
    try:
283 0a569195 Sofia Papagiannaki
        user = AstakosUser.objects.get(email=email, is_active=True)
284 59f598f1 Sofia Papagiannaki
        user.has_credits = has_credits
285 59f598f1 Sofia Papagiannaki
        user.save()
286 59f598f1 Sofia Papagiannaki
    except AstakosUser.DoesNotExist, e:
287 067961d3 Sofia Papagiannaki
        logger.exception(e)
288 27e26a41 Sofia Papagiannaki
    except ValidationError, e:
289 27e26a41 Sofia Papagiannaki
        logger.exception(e)
290 8f5a3a06 Sofia Papagiannaki
291 8f5a3a06 Sofia Papagiannaki
class SendMailError(Exception):
292 18ffbee1 Sofia Papagiannaki
    pass
293 8f5a3a06 Sofia Papagiannaki
294 8f5a3a06 Sofia Papagiannaki
class SendAdminNotificationError(SendMailError):
295 8f5a3a06 Sofia Papagiannaki
    def __init__(self):
296 8f5a3a06 Sofia Papagiannaki
        self.message = _('Failed to send notification')
297 18ffbee1 Sofia Papagiannaki
        super(SendAdminNotificationError, self).__init__()
298 8f5a3a06 Sofia Papagiannaki
299 18ffbee1 Sofia Papagiannaki
class SendVerificationError(SendMailError):
300 8f5a3a06 Sofia Papagiannaki
    def __init__(self):
301 8f5a3a06 Sofia Papagiannaki
        self.message = _('Failed to send verification')
302 18ffbee1 Sofia Papagiannaki
        super(SendVerificationError, self).__init__()
303 8f5a3a06 Sofia Papagiannaki
304 18ffbee1 Sofia Papagiannaki
class SendInvitationError(SendMailError):
305 8f5a3a06 Sofia Papagiannaki
    def __init__(self):
306 8f5a3a06 Sofia Papagiannaki
        self.message = _('Failed to send invitation')
307 18ffbee1 Sofia Papagiannaki
        super(SendInvitationError, self).__init__()
308 8f5a3a06 Sofia Papagiannaki
309 18ffbee1 Sofia Papagiannaki
class SendGreetingError(SendMailError):
310 8f5a3a06 Sofia Papagiannaki
    def __init__(self):
311 8f5a3a06 Sofia Papagiannaki
        self.message = _('Failed to send greeting')
312 18ffbee1 Sofia Papagiannaki
        super(SendGreetingError, self).__init__()
313 8f5a3a06 Sofia Papagiannaki
314 18ffbee1 Sofia Papagiannaki
class SendFeedbackError(SendMailError):
315 8f5a3a06 Sofia Papagiannaki
    def __init__(self):
316 8f5a3a06 Sofia Papagiannaki
        self.message = _('Failed to send feedback')
317 49790d9d Sofia Papagiannaki
        super(SendFeedbackError, self).__init__()
318 49790d9d Sofia Papagiannaki
319 49790d9d Sofia Papagiannaki
class ChangeEmailError(SendMailError):
320 49790d9d Sofia Papagiannaki
    def __init__(self):
321 49790d9d Sofia Papagiannaki
        self.message = _('Failed to send change email')
322 35f8ccf1 Sofia Papagiannaki
        super(ChangeEmailError, self).__init__()
323 a0be6a0c Sofia Papagiannaki
324 a0be6a0c Sofia Papagiannaki
class SendNotificationError(SendMailError):
325 a0be6a0c Sofia Papagiannaki
    def __init__(self):
326 a0be6a0c Sofia Papagiannaki
        self.message = _('Failed to send notification email')
327 a0be6a0c Sofia Papagiannaki
        super(SendNotificationError, self).__init__()