Statistics
| Branch: | Tag: | Revision:

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

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