Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / functions.py @ 27e26a41

History | View | Annotate | Download (7.7 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 27e26a41 Sofia Papagiannaki
43 683cf244 Sofia Papagiannaki
from urllib import quote
44 f36af44a Antony Chazapis
from urlparse import urljoin
45 8f5a3a06 Sofia Papagiannaki
from smtplib import SMTPException
46 f36af44a Antony Chazapis
47 683cf244 Sofia Papagiannaki
from astakos.im.settings import DEFAULT_CONTACT_EMAIL, DEFAULT_FROM_EMAIL, SITENAME, BASEURL, DEFAULT_ADMIN_EMAIL
48 59f598f1 Sofia Papagiannaki
from astakos.im.models import Invitation, AstakosUser
49 f36af44a Antony Chazapis
50 f36af44a Antony Chazapis
logger = logging.getLogger(__name__)
51 f36af44a Antony Chazapis
52 683cf244 Sofia Papagiannaki
def send_verification(user, template_name='im/activation_email.txt'):
53 f36af44a Antony Chazapis
    """
54 683cf244 Sofia Papagiannaki
    Send email to user to verify his/her email and activate his/her account.
55 f36af44a Antony Chazapis
    
56 8f5a3a06 Sofia Papagiannaki
    Raises SendVerificationError
57 f36af44a Antony Chazapis
    """
58 683cf244 Sofia Papagiannaki
    url = '%s?auth=%s&next=%s' % (urljoin(BASEURL, reverse('astakos.im.views.activate')),
59 683cf244 Sofia Papagiannaki
                                    quote(user.auth_token),
60 683cf244 Sofia Papagiannaki
                                    quote(BASEURL))
61 683cf244 Sofia Papagiannaki
    message = render_to_string(template_name, {
62 683cf244 Sofia Papagiannaki
            'user': user,
63 683cf244 Sofia Papagiannaki
            'url': url,
64 683cf244 Sofia Papagiannaki
            'baseurl': BASEURL,
65 683cf244 Sofia Papagiannaki
            'site_name': SITENAME,
66 683cf244 Sofia Papagiannaki
            'support': DEFAULT_CONTACT_EMAIL})
67 683cf244 Sofia Papagiannaki
    sender = DEFAULT_FROM_EMAIL
68 8f5a3a06 Sofia Papagiannaki
    try:
69 8f5a3a06 Sofia Papagiannaki
        send_mail('%s alpha2 testing account activation is needed' % SITENAME, message, sender, [user.email])
70 8f5a3a06 Sofia Papagiannaki
    except (SMTPException, socket.error) as e:
71 8f5a3a06 Sofia Papagiannaki
        logger.exception(e)
72 8f5a3a06 Sofia Papagiannaki
        raise SendVerificationError()
73 8f5a3a06 Sofia Papagiannaki
    else:
74 8f5a3a06 Sofia Papagiannaki
        logger.info('Sent activation %s', user)
75 683cf244 Sofia Papagiannaki
76 8f5a3a06 Sofia Papagiannaki
def send_admin_notification(user, template_name='im/admin_notification.txt'):
77 683cf244 Sofia Papagiannaki
    """
78 683cf244 Sofia Papagiannaki
    Send email to DEFAULT_ADMIN_EMAIL to notify for a new user registration.
79 683cf244 Sofia Papagiannaki
    
80 8f5a3a06 Sofia Papagiannaki
    Raises SendNotificationError
81 683cf244 Sofia Papagiannaki
    """
82 683cf244 Sofia Papagiannaki
    if not DEFAULT_ADMIN_EMAIL:
83 683cf244 Sofia Papagiannaki
        return
84 683cf244 Sofia Papagiannaki
    message = render_to_string(template_name, {
85 683cf244 Sofia Papagiannaki
            'user': user,
86 683cf244 Sofia Papagiannaki
            'baseurl': BASEURL,
87 683cf244 Sofia Papagiannaki
            'site_name': SITENAME,
88 683cf244 Sofia Papagiannaki
            'support': DEFAULT_CONTACT_EMAIL})
89 683cf244 Sofia Papagiannaki
    sender = DEFAULT_FROM_EMAIL
90 8f5a3a06 Sofia Papagiannaki
    try:
91 8f5a3a06 Sofia Papagiannaki
        send_mail('%s alpha2 testing account notification' % SITENAME, message, sender, [DEFAULT_ADMIN_EMAIL])
92 8f5a3a06 Sofia Papagiannaki
    except (SMTPException, socket.error) as e:
93 8f5a3a06 Sofia Papagiannaki
        logger.exception(e)
94 8f5a3a06 Sofia Papagiannaki
        raise SendNotificationError()
95 8f5a3a06 Sofia Papagiannaki
    else:
96 8f5a3a06 Sofia Papagiannaki
        logger.info('Sent admin notification for user %s', user)
97 683cf244 Sofia Papagiannaki
98 683cf244 Sofia Papagiannaki
def send_invitation(invitation, template_name='im/invitation.txt'):
99 683cf244 Sofia Papagiannaki
    """
100 683cf244 Sofia Papagiannaki
    Send invitation email.
101 683cf244 Sofia Papagiannaki
    
102 8f5a3a06 Sofia Papagiannaki
    Raises SendInvitationError
103 683cf244 Sofia Papagiannaki
    """
104 683cf244 Sofia Papagiannaki
    subject = _('Invitation to %s alpha2 testing' % SITENAME)
105 4e30244e Sofia Papagiannaki
    url = '%s?code=%d' % (urljoin(BASEURL, reverse('astakos.im.views.index')), invitation.code)
106 683cf244 Sofia Papagiannaki
    message = render_to_string('im/invitation.txt', {
107 683cf244 Sofia Papagiannaki
                'invitation': invitation,
108 683cf244 Sofia Papagiannaki
                'url': url,
109 683cf244 Sofia Papagiannaki
                'baseurl': BASEURL,
110 683cf244 Sofia Papagiannaki
                'site_name': SITENAME,
111 683cf244 Sofia Papagiannaki
                'support': DEFAULT_CONTACT_EMAIL})
112 683cf244 Sofia Papagiannaki
    sender = DEFAULT_FROM_EMAIL
113 8f5a3a06 Sofia Papagiannaki
    try:
114 8f5a3a06 Sofia Papagiannaki
        send_mail(subject, message, sender, [invitation.username])
115 8f5a3a06 Sofia Papagiannaki
    except (SMTPException, socket.error) as e:
116 8f5a3a06 Sofia Papagiannaki
        logger.exception(e)
117 8f5a3a06 Sofia Papagiannaki
        raise SendInvitationError()
118 8f5a3a06 Sofia Papagiannaki
    else:
119 8f5a3a06 Sofia Papagiannaki
        logger.info('Sent invitation %s', invitation)
120 683cf244 Sofia Papagiannaki
121 683cf244 Sofia Papagiannaki
def send_greeting(user, email_template_name='im/welcome_email.txt'):
122 683cf244 Sofia Papagiannaki
    """
123 683cf244 Sofia Papagiannaki
    Send welcome email.
124 f36af44a Antony Chazapis
    
125 f36af44a Antony Chazapis
    Raises SMTPException, socket.error
126 f36af44a Antony Chazapis
    """
127 4abc7b29 Sofia Papagiannaki
    subject = _('Welcome to %s alpha2 testing' % SITENAME)
128 f36af44a Antony Chazapis
    message = render_to_string(email_template_name, {
129 f36af44a Antony Chazapis
                'user': user,
130 fc28d013 Sofia Papagiannaki
                'url': urljoin(BASEURL, reverse('astakos.im.views.index')),
131 f36af44a Antony Chazapis
                'baseurl': BASEURL,
132 f36af44a Antony Chazapis
                'site_name': SITENAME,
133 ef0c73c4 Sofia Papagiannaki
                'support': DEFAULT_CONTACT_EMAIL})
134 d552ecb7 Antony Chazapis
    sender = DEFAULT_FROM_EMAIL
135 8f5a3a06 Sofia Papagiannaki
    try:
136 8f5a3a06 Sofia Papagiannaki
        send_mail(subject, message, sender, [user.email])
137 8f5a3a06 Sofia Papagiannaki
    except (SMTPException, socket.error) as e:
138 8f5a3a06 Sofia Papagiannaki
        logger.exception(e)
139 8f5a3a06 Sofia Papagiannaki
        raise SendGreetingError()
140 8f5a3a06 Sofia Papagiannaki
    else:
141 8f5a3a06 Sofia Papagiannaki
        logger.info('Sent greeting %s', user)
142 8f5a3a06 Sofia Papagiannaki
143 8f5a3a06 Sofia Papagiannaki
def send_feedback(msg, data, user, email_template_name='im/feedback_mail.txt'):
144 8f5a3a06 Sofia Papagiannaki
    subject = _("Feedback from %s alpha2 testing" % SITENAME)
145 8f5a3a06 Sofia Papagiannaki
    from_email = user.email
146 8f5a3a06 Sofia Papagiannaki
    recipient_list = [DEFAULT_CONTACT_EMAIL]
147 8f5a3a06 Sofia Papagiannaki
    content = render_to_string(email_template_name, {
148 8f5a3a06 Sofia Papagiannaki
        'message': msg,
149 8f5a3a06 Sofia Papagiannaki
        'data': data,
150 8f5a3a06 Sofia Papagiannaki
        'user': user})
151 8f5a3a06 Sofia Papagiannaki
    try:
152 8f5a3a06 Sofia Papagiannaki
        send_mail(subject, content, from_email, recipient_list)
153 8f5a3a06 Sofia Papagiannaki
    except (SMTPException, socket.error) as e:
154 8f5a3a06 Sofia Papagiannaki
        logger.exception(e)
155 8f5a3a06 Sofia Papagiannaki
        raise SendFeedbackError()
156 8f5a3a06 Sofia Papagiannaki
    else:
157 8f5a3a06 Sofia Papagiannaki
        logger.info('Sent feedback from %s', user.email)
158 f36af44a Antony Chazapis
159 683cf244 Sofia Papagiannaki
def activate(user, email_template_name='im/welcome_email.txt'):
160 683cf244 Sofia Papagiannaki
    """
161 683cf244 Sofia Papagiannaki
    Activates the specific user and sends email.
162 683cf244 Sofia Papagiannaki
    
163 27e26a41 Sofia Papagiannaki
    Raises SendGreetingError, ValidationError
164 683cf244 Sofia Papagiannaki
    """
165 683cf244 Sofia Papagiannaki
    user.is_active = True
166 683cf244 Sofia Papagiannaki
    user.save()
167 683cf244 Sofia Papagiannaki
    send_greeting(user, email_template_name)
168 683cf244 Sofia Papagiannaki
169 8f5a3a06 Sofia Papagiannaki
def invite(invitation, inviter, email_template_name='im/welcome_email.txt'):
170 f36af44a Antony Chazapis
    """
171 f36af44a Antony Chazapis
    Send an invitation email and upon success reduces inviter's invitation by one.
172 f36af44a Antony Chazapis
    
173 8f5a3a06 Sofia Papagiannaki
    Raises SendInvitationError
174 f36af44a Antony Chazapis
    """
175 18ffbee1 Sofia Papagiannaki
    invitation.inviter = inviter
176 18ffbee1 Sofia Papagiannaki
    invitation.save()
177 683cf244 Sofia Papagiannaki
    send_invitation(invitation, email_template_name)
178 f36af44a Antony Chazapis
    inviter.invitations = max(0, inviter.invitations - 1)
179 d552ecb7 Antony Chazapis
    inviter.save()
180 59f598f1 Sofia Papagiannaki
181 59f598f1 Sofia Papagiannaki
def set_user_credibility(email, has_credits):
182 59f598f1 Sofia Papagiannaki
    try:
183 0a569195 Sofia Papagiannaki
        user = AstakosUser.objects.get(email=email, is_active=True)
184 59f598f1 Sofia Papagiannaki
        user.has_credits = has_credits
185 59f598f1 Sofia Papagiannaki
        user.save()
186 59f598f1 Sofia Papagiannaki
    except AstakosUser.DoesNotExist, e:
187 067961d3 Sofia Papagiannaki
        logger.exception(e)
188 27e26a41 Sofia Papagiannaki
    except ValidationError, e:
189 27e26a41 Sofia Papagiannaki
        logger.exception(e)
190 8f5a3a06 Sofia Papagiannaki
191 8f5a3a06 Sofia Papagiannaki
class SendMailError(Exception):
192 18ffbee1 Sofia Papagiannaki
    pass
193 8f5a3a06 Sofia Papagiannaki
194 8f5a3a06 Sofia Papagiannaki
class SendAdminNotificationError(SendMailError):
195 8f5a3a06 Sofia Papagiannaki
    def __init__(self):
196 8f5a3a06 Sofia Papagiannaki
        self.message = _('Failed to send notification')
197 18ffbee1 Sofia Papagiannaki
        super(SendAdminNotificationError, self).__init__()
198 8f5a3a06 Sofia Papagiannaki
199 18ffbee1 Sofia Papagiannaki
class SendVerificationError(SendMailError):
200 8f5a3a06 Sofia Papagiannaki
    def __init__(self):
201 8f5a3a06 Sofia Papagiannaki
        self.message = _('Failed to send verification')
202 18ffbee1 Sofia Papagiannaki
        super(SendVerificationError, self).__init__()
203 8f5a3a06 Sofia Papagiannaki
204 18ffbee1 Sofia Papagiannaki
class SendInvitationError(SendMailError):
205 8f5a3a06 Sofia Papagiannaki
    def __init__(self):
206 8f5a3a06 Sofia Papagiannaki
        self.message = _('Failed to send invitation')
207 18ffbee1 Sofia Papagiannaki
        super(SendInvitationError, self).__init__()
208 8f5a3a06 Sofia Papagiannaki
209 18ffbee1 Sofia Papagiannaki
class SendGreetingError(SendMailError):
210 8f5a3a06 Sofia Papagiannaki
    def __init__(self):
211 8f5a3a06 Sofia Papagiannaki
        self.message = _('Failed to send greeting')
212 18ffbee1 Sofia Papagiannaki
        super(SendGreetingError, self).__init__()
213 8f5a3a06 Sofia Papagiannaki
214 18ffbee1 Sofia Papagiannaki
class SendFeedbackError(SendMailError):
215 8f5a3a06 Sofia Papagiannaki
    def __init__(self):
216 8f5a3a06 Sofia Papagiannaki
        self.message = _('Failed to send feedback')
217 18ffbee1 Sofia Papagiannaki
        super(SendFeedbackError, self).__init__()