Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / functions.py @ 09122dd8

History | View | Annotate | Download (5.8 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 f36af44a Antony Chazapis
36 f36af44a Antony Chazapis
from django.utils.translation import ugettext as _
37 f36af44a Antony Chazapis
from django.template.loader import render_to_string
38 f36af44a Antony Chazapis
from django.core.mail import send_mail
39 f36af44a Antony Chazapis
from django.core.urlresolvers import reverse
40 683cf244 Sofia Papagiannaki
from urllib import quote
41 f36af44a Antony Chazapis
from urlparse import urljoin
42 f36af44a Antony Chazapis
from random import randint
43 f36af44a Antony Chazapis
44 683cf244 Sofia Papagiannaki
from astakos.im.settings import DEFAULT_CONTACT_EMAIL, DEFAULT_FROM_EMAIL, SITENAME, BASEURL, DEFAULT_ADMIN_EMAIL
45 f36af44a Antony Chazapis
from astakos.im.models import Invitation
46 f36af44a Antony Chazapis
47 f36af44a Antony Chazapis
logger = logging.getLogger(__name__)
48 f36af44a Antony Chazapis
49 683cf244 Sofia Papagiannaki
def send_verification(user, template_name='im/activation_email.txt'):
50 f36af44a Antony Chazapis
    """
51 683cf244 Sofia Papagiannaki
    Send email to user to verify his/her email and activate his/her account.
52 683cf244 Sofia Papagiannaki
    
53 683cf244 Sofia Papagiannaki
    Raises SMTPException, socket.error
54 683cf244 Sofia Papagiannaki
    """
55 683cf244 Sofia Papagiannaki
    url = '%s?auth=%s&next=%s' % (urljoin(BASEURL, reverse('astakos.im.views.activate')),
56 683cf244 Sofia Papagiannaki
                                    quote(user.auth_token),
57 683cf244 Sofia Papagiannaki
                                    quote(BASEURL))
58 683cf244 Sofia Papagiannaki
    message = render_to_string(template_name, {
59 683cf244 Sofia Papagiannaki
            'user': user,
60 683cf244 Sofia Papagiannaki
            'url': url,
61 683cf244 Sofia Papagiannaki
            'baseurl': BASEURL,
62 683cf244 Sofia Papagiannaki
            'site_name': SITENAME,
63 683cf244 Sofia Papagiannaki
            'support': DEFAULT_CONTACT_EMAIL})
64 683cf244 Sofia Papagiannaki
    sender = DEFAULT_FROM_EMAIL
65 683cf244 Sofia Papagiannaki
    send_mail('%s  alpha2 testing account activation' % SITENAME, message, sender, [user.email])
66 683cf244 Sofia Papagiannaki
    logger.info('Sent activation %s', user)
67 683cf244 Sofia Papagiannaki
68 683cf244 Sofia Papagiannaki
def send_notification(user, template_name='im/admin_notification.txt'):
69 683cf244 Sofia Papagiannaki
    """
70 683cf244 Sofia Papagiannaki
    Send email to DEFAULT_ADMIN_EMAIL to notify for a new user registration.
71 683cf244 Sofia Papagiannaki
    
72 683cf244 Sofia Papagiannaki
    Raises SMTPException, socket.error
73 683cf244 Sofia Papagiannaki
    """
74 683cf244 Sofia Papagiannaki
    if not DEFAULT_ADMIN_EMAIL:
75 683cf244 Sofia Papagiannaki
        return
76 683cf244 Sofia Papagiannaki
    message = render_to_string(template_name, {
77 683cf244 Sofia Papagiannaki
            'user': user,
78 683cf244 Sofia Papagiannaki
            'baseurl': BASEURL,
79 683cf244 Sofia Papagiannaki
            'site_name': SITENAME,
80 683cf244 Sofia Papagiannaki
            'support': DEFAULT_CONTACT_EMAIL})
81 683cf244 Sofia Papagiannaki
    sender = DEFAULT_FROM_EMAIL
82 683cf244 Sofia Papagiannaki
    send_mail('%s  alpha2 testing account notification' % SITENAME, message, sender, [DEFAULT_ADMIN_EMAIL])
83 683cf244 Sofia Papagiannaki
    logger.info('Sent admin notification for user %s', user)
84 683cf244 Sofia Papagiannaki
85 683cf244 Sofia Papagiannaki
def send_invitation(invitation, template_name='im/invitation.txt'):
86 683cf244 Sofia Papagiannaki
    """
87 683cf244 Sofia Papagiannaki
    Send invitation email.
88 683cf244 Sofia Papagiannaki
    
89 683cf244 Sofia Papagiannaki
    Raises SMTPException, socket.error
90 683cf244 Sofia Papagiannaki
    """
91 683cf244 Sofia Papagiannaki
    subject = _('Invitation to %s alpha2 testing' % SITENAME)
92 683cf244 Sofia Papagiannaki
    url = '%s?code=%d' % (urljoin(BASEURL, reverse('astakos.im.views.signup')), invitation.code)
93 683cf244 Sofia Papagiannaki
    message = render_to_string('im/invitation.txt', {
94 683cf244 Sofia Papagiannaki
                'invitation': invitation,
95 683cf244 Sofia Papagiannaki
                'url': url,
96 683cf244 Sofia Papagiannaki
                'baseurl': BASEURL,
97 683cf244 Sofia Papagiannaki
                'site_name': SITENAME,
98 683cf244 Sofia Papagiannaki
                'support': DEFAULT_CONTACT_EMAIL})
99 683cf244 Sofia Papagiannaki
    sender = DEFAULT_FROM_EMAIL
100 683cf244 Sofia Papagiannaki
    send_mail(subject, message, sender, [invitation.username])
101 683cf244 Sofia Papagiannaki
    logger.info('Sent invitation %s', invitation)
102 683cf244 Sofia Papagiannaki
103 683cf244 Sofia Papagiannaki
def send_greeting(user, email_template_name='im/welcome_email.txt'):
104 683cf244 Sofia Papagiannaki
    """
105 683cf244 Sofia Papagiannaki
    Send welcome email.
106 f36af44a Antony Chazapis
    
107 f36af44a Antony Chazapis
    Raises SMTPException, socket.error
108 f36af44a Antony Chazapis
    """
109 4abc7b29 Sofia Papagiannaki
    subject = _('Welcome to %s alpha2 testing' % SITENAME)
110 f36af44a Antony Chazapis
    message = render_to_string(email_template_name, {
111 f36af44a Antony Chazapis
                'user': user,
112 fc28d013 Sofia Papagiannaki
                'url': urljoin(BASEURL, reverse('astakos.im.views.index')),
113 f36af44a Antony Chazapis
                'baseurl': BASEURL,
114 f36af44a Antony Chazapis
                'site_name': SITENAME,
115 ef0c73c4 Sofia Papagiannaki
                'support': DEFAULT_CONTACT_EMAIL})
116 d552ecb7 Antony Chazapis
    sender = DEFAULT_FROM_EMAIL
117 f36af44a Antony Chazapis
    send_mail(subject, message, sender, [user.email])
118 f36af44a Antony Chazapis
    logger.info('Sent greeting %s', user)
119 f36af44a Antony Chazapis
120 683cf244 Sofia Papagiannaki
def activate(user, email_template_name='im/welcome_email.txt'):
121 683cf244 Sofia Papagiannaki
    """
122 683cf244 Sofia Papagiannaki
    Activates the specific user and sends email.
123 683cf244 Sofia Papagiannaki
    
124 683cf244 Sofia Papagiannaki
    Raises SMTPException, socket.error
125 683cf244 Sofia Papagiannaki
    """
126 683cf244 Sofia Papagiannaki
    user.is_active = True
127 683cf244 Sofia Papagiannaki
    user.save()
128 683cf244 Sofia Papagiannaki
    send_greeting(user, email_template_name)
129 683cf244 Sofia Papagiannaki
130 f36af44a Antony Chazapis
def _generate_invitation_code():
131 f36af44a Antony Chazapis
    while True:
132 f36af44a Antony Chazapis
        code = randint(1, 2L**63 - 1)
133 f36af44a Antony Chazapis
        try:
134 f36af44a Antony Chazapis
            Invitation.objects.get(code=code)
135 f36af44a Antony Chazapis
            # An invitation with this code already exists, try again
136 f36af44a Antony Chazapis
        except Invitation.DoesNotExist:
137 f36af44a Antony Chazapis
            return code
138 f36af44a Antony Chazapis
139 683cf244 Sofia Papagiannaki
def invite(inviter, username, realname, email_template_name='im/welcome_email.txt'):
140 f36af44a Antony Chazapis
    """
141 f36af44a Antony Chazapis
    Send an invitation email and upon success reduces inviter's invitation by one.
142 f36af44a Antony Chazapis
    
143 f36af44a Antony Chazapis
    Raises SMTPException, socket.error
144 f36af44a Antony Chazapis
    """
145 f36af44a Antony Chazapis
    code = _generate_invitation_code()
146 f36af44a Antony Chazapis
    invitation = Invitation(inviter=inviter,
147 f36af44a Antony Chazapis
                            username=username,
148 f36af44a Antony Chazapis
                            code=code,
149 f36af44a Antony Chazapis
                            realname=realname)
150 f36af44a Antony Chazapis
    invitation.save()
151 683cf244 Sofia Papagiannaki
    send_invitation(invitation, email_template_name)
152 f36af44a Antony Chazapis
    inviter.invitations = max(0, inviter.invitations - 1)
153 d552ecb7 Antony Chazapis
    inviter.save()