Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / functions.py @ 672d445a

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