Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / functions.py @ 7598cd73

History | View | Annotate | Download (22.2 kB)

1 f36af44a Antony Chazapis
# Copyright 2011 GRNET S.A. All rights reserved.
2 5ce3ce4f Sofia Papagiannaki
#
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 5ce3ce4f Sofia Papagiannaki
#
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 5ce3ce4f Sofia Papagiannaki
#
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 5ce3ce4f Sofia Papagiannaki
#
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 5ce3ce4f Sofia Papagiannaki
#
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 49790d9d Sofia Papagiannaki
from django.template import Context, loader
42 bf0c6de5 Sofia Papagiannaki
from django.contrib.auth import (
43 bf0c6de5 Sofia Papagiannaki
    login as auth_login,
44 73fbaec4 Sofia Papagiannaki
    logout as auth_logout)
45 1cbce16f Sofia Papagiannaki
from django.conf import settings
46 9a06d96f Olga Brani
from django.contrib.auth.models import AnonymousUser
47 73fbaec4 Sofia Papagiannaki
from django.core.exceptions import PermissionDenied
48 974ee6a6 Sofia Papagiannaki
from django.db import IntegrityError
49 27e26a41 Sofia Papagiannaki
50 683cf244 Sofia Papagiannaki
from urllib import quote
51 f36af44a Antony Chazapis
from urlparse import urljoin
52 8f5a3a06 Sofia Papagiannaki
from smtplib import SMTPException
53 751d24cf Sofia Papagiannaki
from datetime import datetime
54 111f3da6 Sofia Papagiannaki
from functools import wraps
55 f36af44a Antony Chazapis
56 bf0c6de5 Sofia Papagiannaki
from astakos.im.settings import (
57 c0b26605 Sofia Papagiannaki
    DEFAULT_CONTACT_EMAIL, SITENAME, BASEURL, LOGGING_LEVEL,
58 c0b26605 Sofia Papagiannaki
    VERIFICATION_EMAIL_SUBJECT, ACCOUNT_CREATION_SUBJECT,
59 c0b26605 Sofia Papagiannaki
    GROUP_CREATION_SUBJECT, HELPDESK_NOTIFICATION_EMAIL_SUBJECT,
60 c0b26605 Sofia Papagiannaki
    INVITATION_EMAIL_SUBJECT, GREETING_EMAIL_SUBJECT, FEEDBACK_EMAIL_SUBJECT,
61 73fbaec4 Sofia Papagiannaki
    EMAIL_CHANGE_EMAIL_SUBJECT,
62 73fbaec4 Sofia Papagiannaki
    PROJECT_CREATION_SUBJECT, PROJECT_APPROVED_SUBJECT,
63 73fbaec4 Sofia Papagiannaki
    PROJECT_TERMINATION_SUBJECT, PROJECT_SUSPENSION_SUBJECT,
64 272cf735 Sofia Papagiannaki
    PROJECT_MEMBERSHIP_CHANGE_SUBJECT,
65 272cf735 Sofia Papagiannaki
    PROJECT_MEMBER_JOIN_POLICIES, PROJECT_MEMBER_LEAVE_POLICIES)
66 73fbaec4 Sofia Papagiannaki
from astakos.im.notifications import build_notification, NotificationError
67 73fbaec4 Sofia Papagiannaki
from astakos.im.models import (
68 974ee6a6 Sofia Papagiannaki
    AstakosUser, ProjectMembership, ProjectApplication, Project,
69 fcc1e93f Sofia Papagiannaki
    trigger_sync)
70 15ca2bea Giorgos Korfiatis
from astakos.im.models import submit_application as models_submit_application
71 a3eb3a95 Giorgos Korfiatis
from astakos.im.project_notif import (
72 a3eb3a95 Giorgos Korfiatis
    membership_change_notify,
73 a3eb3a95 Giorgos Korfiatis
    application_submit_notify, application_approve_notify,
74 a3eb3a95 Giorgos Korfiatis
    project_termination_notify, project_suspension_notify)
75 73fbaec4 Sofia Papagiannaki
76 ae497612 Olga Brani
import astakos.im.messages as astakos_messages
77 f36af44a Antony Chazapis
78 f36af44a Antony Chazapis
logger = logging.getLogger(__name__)
79 f36af44a Antony Chazapis
80 5ce3ce4f Sofia Papagiannaki
81 111f3da6 Sofia Papagiannaki
def logged(func, msg):
82 111f3da6 Sofia Papagiannaki
    @wraps(func)
83 111f3da6 Sofia Papagiannaki
    def with_logging(*args, **kwargs):
84 111f3da6 Sofia Papagiannaki
        email = ''
85 111f3da6 Sofia Papagiannaki
        user = None
86 9a06d96f Olga Brani
        try:
87 111f3da6 Sofia Papagiannaki
            request = args[0]
88 9a06d96f Olga Brani
            email = request.user.email
89 9a06d96f Olga Brani
        except (KeyError, AttributeError), e:
90 9a06d96f Olga Brani
            email = ''
91 111f3da6 Sofia Papagiannaki
        r = func(*args, **kwargs)
92 c9e378c7 Sofia Papagiannaki
        if LOGGING_LEVEL:
93 aab4d540 Sofia Papagiannaki
            logger.log(LOGGING_LEVEL, msg % email)
94 111f3da6 Sofia Papagiannaki
        return r
95 111f3da6 Sofia Papagiannaki
    return with_logging
96 111f3da6 Sofia Papagiannaki
97 bf0c6de5 Sofia Papagiannaki
98 bf0c6de5 Sofia Papagiannaki
def login(request, user):
99 bf0c6de5 Sofia Papagiannaki
    auth_login(request, user)
100 c3c2212a Sofia Papagiannaki
    from astakos.im.models import SessionCatalog
101 c3c2212a Sofia Papagiannaki
    SessionCatalog(
102 c0b26605 Sofia Papagiannaki
        session_key=request.session.session_key,
103 c3c2212a Sofia Papagiannaki
        user=user
104 c3c2212a Sofia Papagiannaki
    ).save()
105 bf0c6de5 Sofia Papagiannaki
106 bf0c6de5 Sofia Papagiannaki
login = logged(login, '%s logged in.')
107 111f3da6 Sofia Papagiannaki
logout = logged(auth_logout, '%s logged out.')
108 111f3da6 Sofia Papagiannaki
109 5ce3ce4f Sofia Papagiannaki
110 683cf244 Sofia Papagiannaki
def send_verification(user, template_name='im/activation_email.txt'):
111 f36af44a Antony Chazapis
    """
112 683cf244 Sofia Papagiannaki
    Send email to user to verify his/her email and activate his/her account.
113 5ce3ce4f Sofia Papagiannaki

114 8f5a3a06 Sofia Papagiannaki
    Raises SendVerificationError
115 f36af44a Antony Chazapis
    """
116 6ff7a7ca Sofia Papagiannaki
    url = '%s?auth=%s&next=%s' % (urljoin(BASEURL, reverse('activate')),
117 5ce3ce4f Sofia Papagiannaki
                                  quote(user.auth_token),
118 5ce3ce4f Sofia Papagiannaki
                                  quote(urljoin(BASEURL, reverse('index'))))
119 683cf244 Sofia Papagiannaki
    message = render_to_string(template_name, {
120 5ce3ce4f Sofia Papagiannaki
                               'user': user,
121 5ce3ce4f Sofia Papagiannaki
                               'url': url,
122 5ce3ce4f Sofia Papagiannaki
                               'baseurl': BASEURL,
123 5ce3ce4f Sofia Papagiannaki
                               'site_name': SITENAME,
124 5ce3ce4f Sofia Papagiannaki
                               'support': DEFAULT_CONTACT_EMAIL})
125 1cbce16f Sofia Papagiannaki
    sender = settings.SERVER_EMAIL
126 8f5a3a06 Sofia Papagiannaki
    try:
127 1fcf4a99 Kostas Papadimitriou
        send_mail(_(VERIFICATION_EMAIL_SUBJECT), message, sender, [user.email])
128 8f5a3a06 Sofia Papagiannaki
    except (SMTPException, socket.error) as e:
129 8f5a3a06 Sofia Papagiannaki
        logger.exception(e)
130 8f5a3a06 Sofia Papagiannaki
        raise SendVerificationError()
131 8f5a3a06 Sofia Papagiannaki
    else:
132 111f3da6 Sofia Papagiannaki
        msg = 'Sent activation %s' % user.email
133 aab4d540 Sofia Papagiannaki
        logger.log(LOGGING_LEVEL, msg)
134 683cf244 Sofia Papagiannaki
135 5ce3ce4f Sofia Papagiannaki
136 751d24cf Sofia Papagiannaki
def send_activation(user, template_name='im/activation_email.txt'):
137 751d24cf Sofia Papagiannaki
    send_verification(user, template_name)
138 751d24cf Sofia Papagiannaki
    user.activation_sent = datetime.now()
139 751d24cf Sofia Papagiannaki
    user.save()
140 683cf244 Sofia Papagiannaki
141 5ce3ce4f Sofia Papagiannaki
142 9a06d96f Olga Brani
def _send_admin_notification(template_name,
143 9a06d96f Olga Brani
                             dictionary=None,
144 9a06d96f Olga Brani
                             subject='alpha2 testing notification',):
145 683cf244 Sofia Papagiannaki
    """
146 1cbce16f Sofia Papagiannaki
    Send notification email to settings.ADMINS.
147 5ce3ce4f Sofia Papagiannaki

148 8f5a3a06 Sofia Papagiannaki
    Raises SendNotificationError
149 683cf244 Sofia Papagiannaki
    """
150 1cbce16f Sofia Papagiannaki
    if not settings.ADMINS:
151 683cf244 Sofia Papagiannaki
        return
152 aab4d540 Sofia Papagiannaki
    dictionary = dictionary or {}
153 3abf6c78 Sofia Papagiannaki
    message = render_to_string(template_name, dictionary)
154 1cbce16f Sofia Papagiannaki
    sender = settings.SERVER_EMAIL
155 8f5a3a06 Sofia Papagiannaki
    try:
156 9a06d96f Olga Brani
        send_mail(subject,
157 8cc49f4d Sofia Papagiannaki
                  message, sender, [i[1] for i in settings.ADMINS])
158 8f5a3a06 Sofia Papagiannaki
    except (SMTPException, socket.error) as e:
159 8f5a3a06 Sofia Papagiannaki
        logger.exception(e)
160 8f5a3a06 Sofia Papagiannaki
        raise SendNotificationError()
161 8f5a3a06 Sofia Papagiannaki
    else:
162 4327c8fc Kostas Papadimitriou
        msg = 'Sent admin notification for user %s' % dictionary.get('email',
163 4327c8fc Kostas Papadimitriou
                                                                     None)
164 aab4d540 Sofia Papagiannaki
        logger.log(LOGGING_LEVEL, msg)
165 683cf244 Sofia Papagiannaki
166 5ce3ce4f Sofia Papagiannaki
167 9a06d96f Olga Brani
def send_account_creation_notification(template_name, dictionary=None):
168 9a06d96f Olga Brani
    user = dictionary.get('user', AnonymousUser())
169 29b87e7c Sofia Papagiannaki
    subject = _(ACCOUNT_CREATION_SUBJECT) % {'user':user.get('email', '')}
170 9a06d96f Olga Brani
    return _send_admin_notification(template_name, dictionary, subject=subject)
171 9a06d96f Olga Brani
172 9a06d96f Olga Brani
173 f9aea9c8 Sofia Papagiannaki
def send_helpdesk_notification(user, template_name='im/helpdesk_notification.txt'):
174 a0be6a0c Sofia Papagiannaki
    """
175 a0be6a0c Sofia Papagiannaki
    Send email to DEFAULT_CONTACT_EMAIL to notify for a new user activation.
176 5ce3ce4f Sofia Papagiannaki

177 a0be6a0c Sofia Papagiannaki
    Raises SendNotificationError
178 a0be6a0c Sofia Papagiannaki
    """
179 a0be6a0c Sofia Papagiannaki
    if not DEFAULT_CONTACT_EMAIL:
180 a0be6a0c Sofia Papagiannaki
        return
181 3abf6c78 Sofia Papagiannaki
    message = render_to_string(
182 3abf6c78 Sofia Papagiannaki
        template_name,
183 3abf6c78 Sofia Papagiannaki
        {'user': user}
184 3abf6c78 Sofia Papagiannaki
    )
185 1cbce16f Sofia Papagiannaki
    sender = settings.SERVER_EMAIL
186 a0be6a0c Sofia Papagiannaki
    try:
187 9a06d96f Olga Brani
        send_mail(
188 9a06d96f Olga Brani
            _(HELPDESK_NOTIFICATION_EMAIL_SUBJECT) % {'user': user.email},
189 9a06d96f Olga Brani
            message, sender, [DEFAULT_CONTACT_EMAIL])
190 a0be6a0c Sofia Papagiannaki
    except (SMTPException, socket.error) as e:
191 a0be6a0c Sofia Papagiannaki
        logger.exception(e)
192 a0be6a0c Sofia Papagiannaki
        raise SendNotificationError()
193 a0be6a0c Sofia Papagiannaki
    else:
194 3abf6c78 Sofia Papagiannaki
        msg = 'Sent helpdesk admin notification for %s' % user.email
195 aab4d540 Sofia Papagiannaki
        logger.log(LOGGING_LEVEL, msg)
196 a0be6a0c Sofia Papagiannaki
197 5ce3ce4f Sofia Papagiannaki
198 683cf244 Sofia Papagiannaki
def send_invitation(invitation, template_name='im/invitation.txt'):
199 683cf244 Sofia Papagiannaki
    """
200 683cf244 Sofia Papagiannaki
    Send invitation email.
201 5ce3ce4f Sofia Papagiannaki

202 8f5a3a06 Sofia Papagiannaki
    Raises SendInvitationError
203 683cf244 Sofia Papagiannaki
    """
204 1fcf4a99 Kostas Papadimitriou
    subject = _(INVITATION_EMAIL_SUBJECT)
205 6ff7a7ca Sofia Papagiannaki
    url = '%s?code=%d' % (urljoin(BASEURL, reverse('index')), invitation.code)
206 aab4d540 Sofia Papagiannaki
    message = render_to_string(template_name, {
207 5ce3ce4f Sofia Papagiannaki
                               'invitation': invitation,
208 5ce3ce4f Sofia Papagiannaki
                               'url': url,
209 5ce3ce4f Sofia Papagiannaki
                               'baseurl': BASEURL,
210 5ce3ce4f Sofia Papagiannaki
                               'site_name': SITENAME,
211 5ce3ce4f Sofia Papagiannaki
                               'support': DEFAULT_CONTACT_EMAIL})
212 1cbce16f Sofia Papagiannaki
    sender = settings.SERVER_EMAIL
213 8f5a3a06 Sofia Papagiannaki
    try:
214 8f5a3a06 Sofia Papagiannaki
        send_mail(subject, message, sender, [invitation.username])
215 8f5a3a06 Sofia Papagiannaki
    except (SMTPException, socket.error) as e:
216 8f5a3a06 Sofia Papagiannaki
        logger.exception(e)
217 8f5a3a06 Sofia Papagiannaki
        raise SendInvitationError()
218 8f5a3a06 Sofia Papagiannaki
    else:
219 111f3da6 Sofia Papagiannaki
        msg = 'Sent invitation %s' % invitation
220 aab4d540 Sofia Papagiannaki
        logger.log(LOGGING_LEVEL, msg)
221 c0b26605 Sofia Papagiannaki
        invitation.inviter.invitations = max(0, invitation.inviter.invitations - 1)
222 9a06d96f Olga Brani
        invitation.inviter.save()
223 683cf244 Sofia Papagiannaki
224 5ce3ce4f Sofia Papagiannaki
225 683cf244 Sofia Papagiannaki
def send_greeting(user, email_template_name='im/welcome_email.txt'):
226 683cf244 Sofia Papagiannaki
    """
227 683cf244 Sofia Papagiannaki
    Send welcome email.
228 5ce3ce4f Sofia Papagiannaki

229 f36af44a Antony Chazapis
    Raises SMTPException, socket.error
230 f36af44a Antony Chazapis
    """
231 4f78c22c Sofia Papagiannaki
    subject = _(GREETING_EMAIL_SUBJECT)
232 f36af44a Antony Chazapis
    message = render_to_string(email_template_name, {
233 5ce3ce4f Sofia Papagiannaki
                               'user': user,
234 5ce3ce4f Sofia Papagiannaki
                               'url': urljoin(BASEURL, reverse('index')),
235 5ce3ce4f Sofia Papagiannaki
                               'baseurl': BASEURL,
236 5ce3ce4f Sofia Papagiannaki
                               'site_name': SITENAME,
237 5ce3ce4f Sofia Papagiannaki
                               'support': DEFAULT_CONTACT_EMAIL})
238 1cbce16f Sofia Papagiannaki
    sender = settings.SERVER_EMAIL
239 8f5a3a06 Sofia Papagiannaki
    try:
240 8f5a3a06 Sofia Papagiannaki
        send_mail(subject, message, sender, [user.email])
241 8f5a3a06 Sofia Papagiannaki
    except (SMTPException, socket.error) as e:
242 8f5a3a06 Sofia Papagiannaki
        logger.exception(e)
243 8f5a3a06 Sofia Papagiannaki
        raise SendGreetingError()
244 8f5a3a06 Sofia Papagiannaki
    else:
245 111f3da6 Sofia Papagiannaki
        msg = 'Sent greeting %s' % user.email
246 aab4d540 Sofia Papagiannaki
        logger.log(LOGGING_LEVEL, msg)
247 8f5a3a06 Sofia Papagiannaki
248 5ce3ce4f Sofia Papagiannaki
249 8f5a3a06 Sofia Papagiannaki
def send_feedback(msg, data, user, email_template_name='im/feedback_mail.txt'):
250 4f78c22c Sofia Papagiannaki
    subject = _(FEEDBACK_EMAIL_SUBJECT)
251 8f5a3a06 Sofia Papagiannaki
    from_email = user.email
252 8f5a3a06 Sofia Papagiannaki
    recipient_list = [DEFAULT_CONTACT_EMAIL]
253 8f5a3a06 Sofia Papagiannaki
    content = render_to_string(email_template_name, {
254 8f5a3a06 Sofia Papagiannaki
        'message': msg,
255 8f5a3a06 Sofia Papagiannaki
        'data': data,
256 8f5a3a06 Sofia Papagiannaki
        'user': user})
257 8f5a3a06 Sofia Papagiannaki
    try:
258 8f5a3a06 Sofia Papagiannaki
        send_mail(subject, content, from_email, recipient_list)
259 8f5a3a06 Sofia Papagiannaki
    except (SMTPException, socket.error) as e:
260 8f5a3a06 Sofia Papagiannaki
        logger.exception(e)
261 8f5a3a06 Sofia Papagiannaki
        raise SendFeedbackError()
262 8f5a3a06 Sofia Papagiannaki
    else:
263 111f3da6 Sofia Papagiannaki
        msg = 'Sent feedback from %s' % user.email
264 aab4d540 Sofia Papagiannaki
        logger.log(LOGGING_LEVEL, msg)
265 f36af44a Antony Chazapis
266 5ce3ce4f Sofia Papagiannaki
267 73fbaec4 Sofia Papagiannaki
def send_change_email(
268 73fbaec4 Sofia Papagiannaki
    ec, request, email_template_name='registration/email_change_email.txt'):
269 49790d9d Sofia Papagiannaki
    try:
270 34a76cdb Kostas Papadimitriou
        url = ec.get_url()
271 49790d9d Sofia Papagiannaki
        url = request.build_absolute_uri(url)
272 49790d9d Sofia Papagiannaki
        t = loader.get_template(email_template_name)
273 49790d9d Sofia Papagiannaki
        c = {'url': url, 'site_name': SITENAME}
274 1cbce16f Sofia Papagiannaki
        from_email = settings.SERVER_EMAIL
275 1fcf4a99 Kostas Papadimitriou
        send_mail(_(EMAIL_CHANGE_EMAIL_SUBJECT),
276 9a06d96f Olga Brani
                  t.render(Context(c)), from_email, [ec.new_email_address])
277 49790d9d Sofia Papagiannaki
    except (SMTPException, socket.error) as e:
278 49790d9d Sofia Papagiannaki
        logger.exception(e)
279 49790d9d Sofia Papagiannaki
        raise ChangeEmailError()
280 49790d9d Sofia Papagiannaki
    else:
281 111f3da6 Sofia Papagiannaki
        msg = 'Sent change email for %s' % ec.user.email
282 aab4d540 Sofia Papagiannaki
        logger.log(LOGGING_LEVEL, msg)
283 f36af44a Antony Chazapis
284 5ce3ce4f Sofia Papagiannaki
285 f9aea9c8 Sofia Papagiannaki
def activate(
286 f9aea9c8 Sofia Papagiannaki
    user,
287 f9aea9c8 Sofia Papagiannaki
    email_template_name='im/welcome_email.txt',
288 f9aea9c8 Sofia Papagiannaki
    helpdesk_email_template_name='im/helpdesk_notification.txt',
289 73fbaec4 Sofia Papagiannaki
    verify_email=False):
290 683cf244 Sofia Papagiannaki
    """
291 683cf244 Sofia Papagiannaki
    Activates the specific user and sends email.
292 5ce3ce4f Sofia Papagiannaki

293 27e26a41 Sofia Papagiannaki
    Raises SendGreetingError, ValidationError
294 683cf244 Sofia Papagiannaki
    """
295 683cf244 Sofia Papagiannaki
    user.is_active = True
296 4bdd7e3d Kostas Papadimitriou
    user.email_verified = True
297 f1ab6639 Kostas Papadimitriou
    if not user.activation_sent:
298 f1ab6639 Kostas Papadimitriou
        user.activation_sent = datetime.now()
299 683cf244 Sofia Papagiannaki
    user.save()
300 23b9b72f Sofia Papagiannaki
    send_helpdesk_notification(user, helpdesk_email_template_name)
301 683cf244 Sofia Papagiannaki
    send_greeting(user, email_template_name)
302 683cf244 Sofia Papagiannaki
303 73fbaec4 Sofia Papagiannaki
def invite(inviter, email, realname):
304 73fbaec4 Sofia Papagiannaki
    inv = Invitation(inviter=inviter, username=email, realname=realname)
305 73fbaec4 Sofia Papagiannaki
    inv.save()
306 73fbaec4 Sofia Papagiannaki
    send_invitation(inv)
307 73fbaec4 Sofia Papagiannaki
    inviter.invitations = max(0, self.invitations - 1)
308 73fbaec4 Sofia Papagiannaki
    inviter.save()
309 5ce3ce4f Sofia Papagiannaki
310 9a06d96f Olga Brani
def switch_account_to_shibboleth(user, local_user,
311 9a06d96f Olga Brani
                                 greeting_template_name='im/welcome_email.txt'):
312 9a06d96f Olga Brani
    try:
313 9a06d96f Olga Brani
        provider = user.provider
314 9a06d96f Olga Brani
    except AttributeError:
315 23b9b72f Sofia Papagiannaki
        return
316 9a06d96f Olga Brani
    else:
317 9a06d96f Olga Brani
        if not provider == 'shibboleth':
318 9a06d96f Olga Brani
            return
319 9a06d96f Olga Brani
        user.delete()
320 9a06d96f Olga Brani
        local_user.provider = 'shibboleth'
321 9a06d96f Olga Brani
        local_user.third_party_identifier = user.third_party_identifier
322 9a06d96f Olga Brani
        local_user.save()
323 9a06d96f Olga Brani
        send_greeting(local_user, greeting_template_name)
324 9a06d96f Olga Brani
        return local_user
325 59f598f1 Sofia Papagiannaki
326 5ce3ce4f Sofia Papagiannaki
327 8f5a3a06 Sofia Papagiannaki
class SendMailError(Exception):
328 18ffbee1 Sofia Papagiannaki
    pass
329 8f5a3a06 Sofia Papagiannaki
330 5ce3ce4f Sofia Papagiannaki
331 8f5a3a06 Sofia Papagiannaki
class SendAdminNotificationError(SendMailError):
332 8f5a3a06 Sofia Papagiannaki
    def __init__(self):
333 ae497612 Olga Brani
        self.message = _(astakos_messages.ADMIN_NOTIFICATION_SEND_ERR)
334 18ffbee1 Sofia Papagiannaki
        super(SendAdminNotificationError, self).__init__()
335 8f5a3a06 Sofia Papagiannaki
336 5ce3ce4f Sofia Papagiannaki
337 18ffbee1 Sofia Papagiannaki
class SendVerificationError(SendMailError):
338 8f5a3a06 Sofia Papagiannaki
    def __init__(self):
339 ae497612 Olga Brani
        self.message = _(astakos_messages.VERIFICATION_SEND_ERR)
340 18ffbee1 Sofia Papagiannaki
        super(SendVerificationError, self).__init__()
341 8f5a3a06 Sofia Papagiannaki
342 5ce3ce4f Sofia Papagiannaki
343 18ffbee1 Sofia Papagiannaki
class SendInvitationError(SendMailError):
344 8f5a3a06 Sofia Papagiannaki
    def __init__(self):
345 ae497612 Olga Brani
        self.message = _(astakos_messages.INVITATION_SEND_ERR)
346 18ffbee1 Sofia Papagiannaki
        super(SendInvitationError, self).__init__()
347 8f5a3a06 Sofia Papagiannaki
348 5ce3ce4f Sofia Papagiannaki
349 18ffbee1 Sofia Papagiannaki
class SendGreetingError(SendMailError):
350 8f5a3a06 Sofia Papagiannaki
    def __init__(self):
351 ae497612 Olga Brani
        self.message = _(astakos_messages.GREETING_SEND_ERR)
352 18ffbee1 Sofia Papagiannaki
        super(SendGreetingError, self).__init__()
353 8f5a3a06 Sofia Papagiannaki
354 5ce3ce4f Sofia Papagiannaki
355 18ffbee1 Sofia Papagiannaki
class SendFeedbackError(SendMailError):
356 8f5a3a06 Sofia Papagiannaki
    def __init__(self):
357 ae497612 Olga Brani
        self.message = _(astakos_messages.FEEDBACK_SEND_ERR)
358 49790d9d Sofia Papagiannaki
        super(SendFeedbackError, self).__init__()
359 49790d9d Sofia Papagiannaki
360 5ce3ce4f Sofia Papagiannaki
361 49790d9d Sofia Papagiannaki
class ChangeEmailError(SendMailError):
362 49790d9d Sofia Papagiannaki
    def __init__(self):
363 ccab6eb5 Sofia Papagiannaki
        self.message = _(astakos_messages.CHANGE_EMAIL_SEND_ERR)
364 35f8ccf1 Sofia Papagiannaki
        super(ChangeEmailError, self).__init__()
365 a0be6a0c Sofia Papagiannaki
366 5ce3ce4f Sofia Papagiannaki
367 a0be6a0c Sofia Papagiannaki
class SendNotificationError(SendMailError):
368 a0be6a0c Sofia Papagiannaki
    def __init__(self):
369 ae497612 Olga Brani
        self.message = _(astakos_messages.NOTIFICATION_SEND_ERR)
370 a0be6a0c Sofia Papagiannaki
        super(SendNotificationError, self).__init__()
371 73fbaec4 Sofia Papagiannaki
372 73fbaec4 Sofia Papagiannaki
373 73fbaec4 Sofia Papagiannaki
### PROJECT VIEWS ###
374 fcc1e93f Sofia Papagiannaki
375 b0686c16 Giorgos Korfiatis
AUTO_ACCEPT_POLICY = 1
376 b0686c16 Giorgos Korfiatis
MODERATED_POLICY   = 2
377 b0686c16 Giorgos Korfiatis
CLOSED_POLICY      = 3
378 b0686c16 Giorgos Korfiatis
379 b0686c16 Giorgos Korfiatis
POLICIES = [ AUTO_ACCEPT_POLICY, MODERATED_POLICY, CLOSED_POLICY ]
380 73fbaec4 Sofia Papagiannaki
381 73fbaec4 Sofia Papagiannaki
def get_project_by_application_id(project_application_id):
382 73fbaec4 Sofia Papagiannaki
    try:
383 73fbaec4 Sofia Papagiannaki
        return Project.objects.get(application__id=project_application_id)
384 73fbaec4 Sofia Papagiannaki
    except Project.DoesNotExist:
385 73fbaec4 Sofia Papagiannaki
        raise IOError(
386 73fbaec4 Sofia Papagiannaki
            _(astakos_messages.UNKNOWN_PROJECT_APPLICATION_ID) % project_application_id)
387 73fbaec4 Sofia Papagiannaki
388 8dcaa6ac Giorgos Korfiatis
def get_project_id_of_application_id(project_application_id):
389 8dcaa6ac Giorgos Korfiatis
    try:
390 8dcaa6ac Giorgos Korfiatis
        return Project.objects.get(application__id=project_application_id).id
391 8dcaa6ac Giorgos Korfiatis
    except Project.DoesNotExist:
392 8dcaa6ac Giorgos Korfiatis
        raise IOError(
393 8dcaa6ac Giorgos Korfiatis
            _(astakos_messages.UNKNOWN_PROJECT_APPLICATION_ID) % project_application_id)
394 8dcaa6ac Giorgos Korfiatis
395 eb9ff37a Sofia Papagiannaki
def get_project_by_id(project_id):
396 eb9ff37a Sofia Papagiannaki
    try:
397 eb9ff37a Sofia Papagiannaki
        return Project.objects.get(id=project_id)
398 eb9ff37a Sofia Papagiannaki
    except Project.DoesNotExist:
399 eb9ff37a Sofia Papagiannaki
        raise IOError(
400 eb9ff37a Sofia Papagiannaki
            _(astakos_messages.UNKNOWN_PROJECT_ID) % project_id)
401 eb9ff37a Sofia Papagiannaki
402 8dcaa6ac Giorgos Korfiatis
def get_project_for_update(project_id):
403 8dcaa6ac Giorgos Korfiatis
    try:
404 8dcaa6ac Giorgos Korfiatis
        return Project.objects.select_for_update().get(id=project_id)
405 8dcaa6ac Giorgos Korfiatis
    except Project.DoesNotExist:
406 8dcaa6ac Giorgos Korfiatis
        raise IOError(
407 8dcaa6ac Giorgos Korfiatis
            _(astakos_messages.UNKNOWN_PROJECT_ID) % project_id)
408 8dcaa6ac Giorgos Korfiatis
409 73fbaec4 Sofia Papagiannaki
def get_user_by_id(user_id):
410 73fbaec4 Sofia Papagiannaki
    try:
411 974ee6a6 Sofia Papagiannaki
        return AstakosUser.objects.get(id=user_id)
412 73fbaec4 Sofia Papagiannaki
    except AstakosUser.DoesNotExist:
413 73fbaec4 Sofia Papagiannaki
        raise IOError(_(astakos_messages.UNKNOWN_USER_ID) % user_id)
414 73fbaec4 Sofia Papagiannaki
415 7dd3047d Sofia Papagiannaki
def create_membership(project, user):
416 7dd3047d Sofia Papagiannaki
    if isinstance(project, int):
417 8dcaa6ac Giorgos Korfiatis
        project = get_project_by_id(project)
418 7dd3047d Sofia Papagiannaki
    if isinstance(user, int):
419 7dd3047d Sofia Papagiannaki
        user = get_user_by_id(user)
420 7dd3047d Sofia Papagiannaki
    m = ProjectMembership(
421 7dd3047d Sofia Papagiannaki
        project=project,
422 7dd3047d Sofia Papagiannaki
        person=user,
423 7dd3047d Sofia Papagiannaki
        request_date=datetime.now())
424 73fbaec4 Sofia Papagiannaki
    try:
425 7dd3047d Sofia Papagiannaki
        m.save()
426 73fbaec4 Sofia Papagiannaki
    except IntegrityError, e:
427 73fbaec4 Sofia Papagiannaki
        raise IOError(_(astakos_messages.MEMBERSHIP_REQUEST_EXISTS))
428 73fbaec4 Sofia Papagiannaki
    else:
429 fc61dfb7 Sofia Papagiannaki
        return m
430 73fbaec4 Sofia Papagiannaki
431 8dcaa6ac Giorgos Korfiatis
def get_membership_for_update(project, user):
432 974ee6a6 Sofia Papagiannaki
    if isinstance(project, int):
433 8dcaa6ac Giorgos Korfiatis
        project = get_project_by_id(project)
434 974ee6a6 Sofia Papagiannaki
    if isinstance(user, int):
435 73fbaec4 Sofia Papagiannaki
        user = get_user_by_id(user)
436 73fbaec4 Sofia Papagiannaki
    try:
437 8dcaa6ac Giorgos Korfiatis
        return ProjectMembership.objects.select_for_update().get(
438 73fbaec4 Sofia Papagiannaki
            project=project,
439 73fbaec4 Sofia Papagiannaki
            person=user)
440 73fbaec4 Sofia Papagiannaki
    except ProjectMembership.DoesNotExist:
441 73fbaec4 Sofia Papagiannaki
        raise IOError(_(astakos_messages.NOT_MEMBERSHIP_REQUEST))
442 73fbaec4 Sofia Papagiannaki
443 907f15db Giorgos Korfiatis
def checkAllowed(project, request_user):
444 907f15db Giorgos Korfiatis
    if request_user and \
445 907f15db Giorgos Korfiatis
        (not project.application.owner == request_user and \
446 907f15db Giorgos Korfiatis
            not request_user.is_superuser):
447 907f15db Giorgos Korfiatis
        raise PermissionDenied(_(astakos_messages.NOT_ALLOWED))
448 907f15db Giorgos Korfiatis
449 907f15db Giorgos Korfiatis
def checkAlive(project):
450 907f15db Giorgos Korfiatis
    if not project.is_alive:
451 907f15db Giorgos Korfiatis
        raise PermissionDenied(
452 907f15db Giorgos Korfiatis
            _(astakos_messages.NOT_ALIVE_PROJECT) % project.__dict__)
453 907f15db Giorgos Korfiatis
454 8dcaa6ac Giorgos Korfiatis
def accept_membership(project_application_id, user, request_user=None):
455 73fbaec4 Sofia Papagiannaki
    """
456 73fbaec4 Sofia Papagiannaki
        Raises:
457 73fbaec4 Sofia Papagiannaki
            django.core.exceptions.PermissionDenied
458 73fbaec4 Sofia Papagiannaki
            IOError
459 73fbaec4 Sofia Papagiannaki
    """
460 8dcaa6ac Giorgos Korfiatis
    project_id = get_project_id_of_application_id(project_application_id)
461 8dcaa6ac Giorgos Korfiatis
    return do_accept_membership(project_id, user, request_user)
462 8dcaa6ac Giorgos Korfiatis
463 e47fb17a Sofia Papagiannaki
def do_accept_membership_checks(project, request_user):
464 907f15db Giorgos Korfiatis
    checkAllowed(project, request_user)
465 907f15db Giorgos Korfiatis
    checkAlive(project)
466 b0686c16 Giorgos Korfiatis
467 b0686c16 Giorgos Korfiatis
    join_policy = project.application.member_join_policy
468 b0686c16 Giorgos Korfiatis
    if join_policy == CLOSED_POLICY:
469 b0686c16 Giorgos Korfiatis
        raise PermissionDenied(_(astakos_messages.MEMBER_JOIN_POLICY_CLOSED))
470 b0686c16 Giorgos Korfiatis
471 8dcaa6ac Giorgos Korfiatis
    if project.violates_members_limit(adding=1):
472 73fbaec4 Sofia Papagiannaki
        raise PermissionDenied(_(astakos_messages.MEMBER_NUMBER_LIMIT_REACHED))
473 73fbaec4 Sofia Papagiannaki
474 907f15db Giorgos Korfiatis
def do_accept_membership(project_id, user, request_user=None):
475 e47fb17a Sofia Papagiannaki
    project = get_project_for_update(project_id)
476 907f15db Giorgos Korfiatis
    do_accept_membership_checks(project, request_user)
477 e47fb17a Sofia Papagiannaki
478 8dcaa6ac Giorgos Korfiatis
    membership = get_membership_for_update(project, user)
479 73fbaec4 Sofia Papagiannaki
    membership.accept()
480 3e47bb0b Sofia Papagiannaki
    trigger_sync()
481 73fbaec4 Sofia Papagiannaki
482 a3eb3a95 Giorgos Korfiatis
    membership_change_notify(project, membership.person, 'accepted')
483 a3eb3a95 Giorgos Korfiatis
484 73fbaec4 Sofia Papagiannaki
    return membership
485 73fbaec4 Sofia Papagiannaki
486 8dcaa6ac Giorgos Korfiatis
def reject_membership(project_application_id, user, request_user=None):
487 73fbaec4 Sofia Papagiannaki
    """
488 73fbaec4 Sofia Papagiannaki
        Raises:
489 73fbaec4 Sofia Papagiannaki
            django.core.exceptions.PermissionDenied
490 73fbaec4 Sofia Papagiannaki
            IOError
491 73fbaec4 Sofia Papagiannaki
    """
492 8dcaa6ac Giorgos Korfiatis
    project_id = get_project_id_of_application_id(project_application_id)
493 8dcaa6ac Giorgos Korfiatis
    return do_reject_membership(project_id, user, request_user)
494 8dcaa6ac Giorgos Korfiatis
495 e47fb17a Sofia Papagiannaki
def do_reject_membership_checks(project, request_user):
496 907f15db Giorgos Korfiatis
    checkAllowed(project, request_user)
497 907f15db Giorgos Korfiatis
    checkAlive(project)
498 e47fb17a Sofia Papagiannaki
499 907f15db Giorgos Korfiatis
def do_reject_membership(project_id, user, request_user=None):
500 e47fb17a Sofia Papagiannaki
    project = get_project_for_update(project_id)
501 907f15db Giorgos Korfiatis
    do_reject_membership_checks(project, request_user)
502 1352dabb Kostas Papadimitriou
503 8dcaa6ac Giorgos Korfiatis
    membership = get_membership_for_update(project, user)
504 73fbaec4 Sofia Papagiannaki
    membership.reject()
505 73fbaec4 Sofia Papagiannaki
506 a3eb3a95 Giorgos Korfiatis
    membership_change_notify(project, membership.person, 'rejected')
507 a3eb3a95 Giorgos Korfiatis
508 73fbaec4 Sofia Papagiannaki
    return membership
509 73fbaec4 Sofia Papagiannaki
510 8dcaa6ac Giorgos Korfiatis
def remove_membership(project_application_id, user, request_user=None):
511 73fbaec4 Sofia Papagiannaki
    """
512 73fbaec4 Sofia Papagiannaki
        Raises:
513 73fbaec4 Sofia Papagiannaki
            django.core.exceptions.PermissionDenied
514 73fbaec4 Sofia Papagiannaki
            IOError
515 73fbaec4 Sofia Papagiannaki
    """
516 8dcaa6ac Giorgos Korfiatis
    project_id = get_project_id_of_application_id(project_application_id)
517 8dcaa6ac Giorgos Korfiatis
    return do_remove_membership(project_id, user, request_user)
518 8dcaa6ac Giorgos Korfiatis
519 8c3e6cb5 Kostas Papadimitriou
def do_remove_membership_checks(project, membership, request_user=None):
520 907f15db Giorgos Korfiatis
    checkAllowed(project, request_user)
521 907f15db Giorgos Korfiatis
    checkAlive(project)
522 73fbaec4 Sofia Papagiannaki
523 b0686c16 Giorgos Korfiatis
    leave_policy = project.application.member_leave_policy
524 b0686c16 Giorgos Korfiatis
    if leave_policy == CLOSED_POLICY:
525 b0686c16 Giorgos Korfiatis
        raise PermissionDenied(_(astakos_messages.MEMBER_LEAVE_POLICY_CLOSED))
526 b0686c16 Giorgos Korfiatis
527 907f15db Giorgos Korfiatis
def do_remove_membership(project_id, user, request_user=None):
528 907f15db Giorgos Korfiatis
    project = get_project_for_update(project_id)
529 907f15db Giorgos Korfiatis
    do_remove_membership_checks(project, request_user)
530 907f15db Giorgos Korfiatis
531 8dcaa6ac Giorgos Korfiatis
    membership = get_membership_for_update(project, user)
532 73fbaec4 Sofia Papagiannaki
    membership.remove()
533 3e47bb0b Sofia Papagiannaki
    trigger_sync()
534 73fbaec4 Sofia Papagiannaki
535 a3eb3a95 Giorgos Korfiatis
    membership_change_notify(project, membership.person, 'removed')
536 a3eb3a95 Giorgos Korfiatis
537 73fbaec4 Sofia Papagiannaki
    return membership
538 73fbaec4 Sofia Papagiannaki
539 8dcaa6ac Giorgos Korfiatis
def enroll_member(project_application_id, user, request_user=None):
540 8dcaa6ac Giorgos Korfiatis
    project_id = get_project_id_of_application_id(project_application_id)
541 8dcaa6ac Giorgos Korfiatis
    return do_enroll_member(project_id, user, request_user)
542 8dcaa6ac Giorgos Korfiatis
543 8dcaa6ac Giorgos Korfiatis
def do_enroll_member(project_id, user, request_user=None):
544 907f15db Giorgos Korfiatis
    project = get_project_for_update(project_id)
545 907f15db Giorgos Korfiatis
    do_accept_membership_checks(project, request_user)
546 907f15db Giorgos Korfiatis
547 8dcaa6ac Giorgos Korfiatis
    membership = create_membership(project_id, user)
548 907f15db Giorgos Korfiatis
    membership.accept()
549 907f15db Giorgos Korfiatis
    trigger_sync()
550 907f15db Giorgos Korfiatis
551 907f15db Giorgos Korfiatis
    # TODO send proper notification
552 907f15db Giorgos Korfiatis
    return membership
553 8dcaa6ac Giorgos Korfiatis
554 73fbaec4 Sofia Papagiannaki
def leave_project(project_application_id, user_id):
555 73fbaec4 Sofia Papagiannaki
    """
556 73fbaec4 Sofia Papagiannaki
        Raises:
557 73fbaec4 Sofia Papagiannaki
            django.core.exceptions.PermissionDenied
558 73fbaec4 Sofia Papagiannaki
            IOError
559 73fbaec4 Sofia Papagiannaki
    """
560 8dcaa6ac Giorgos Korfiatis
    project_id = get_project_id_of_application_id(project_application_id)
561 8dcaa6ac Giorgos Korfiatis
    return do_leave_project(project_id, user_id)
562 8dcaa6ac Giorgos Korfiatis
563 e47fb17a Sofia Papagiannaki
def do_leave_project_checks(project):
564 907f15db Giorgos Korfiatis
    checkAlive(project)
565 8dcaa6ac Giorgos Korfiatis
566 03869281 Sofia Papagiannaki
    leave_policy = project.application.member_leave_policy
567 b0686c16 Giorgos Korfiatis
    if leave_policy == CLOSED_POLICY:
568 73fbaec4 Sofia Papagiannaki
        raise PermissionDenied(_(astakos_messages.MEMBER_LEAVE_POLICY_CLOSED))
569 73fbaec4 Sofia Papagiannaki
570 907f15db Giorgos Korfiatis
def do_leave_project(project_id, user_id):
571 e47fb17a Sofia Papagiannaki
    project = get_project_for_update(project_id)
572 907f15db Giorgos Korfiatis
    do_leave_project_checks(project)
573 e47fb17a Sofia Papagiannaki
574 8dcaa6ac Giorgos Korfiatis
    membership = get_membership_for_update(project, user_id)
575 4e057833 Sofia Papagiannaki
576 4e057833 Sofia Papagiannaki
    leave_policy = project.application.member_leave_policy
577 b0686c16 Giorgos Korfiatis
    if leave_policy == AUTO_ACCEPT_POLICY:
578 73fbaec4 Sofia Papagiannaki
        membership.remove()
579 3e47bb0b Sofia Papagiannaki
        trigger_sync()
580 73fbaec4 Sofia Papagiannaki
    else:
581 73fbaec4 Sofia Papagiannaki
        membership.leave_request_date = datetime.now()
582 73fbaec4 Sofia Papagiannaki
        membership.save()
583 73fbaec4 Sofia Papagiannaki
    return membership
584 73fbaec4 Sofia Papagiannaki
585 73fbaec4 Sofia Papagiannaki
def join_project(project_application_id, user_id):
586 73fbaec4 Sofia Papagiannaki
    """
587 73fbaec4 Sofia Papagiannaki
        Raises:
588 73fbaec4 Sofia Papagiannaki
            django.core.exceptions.PermissionDenied
589 73fbaec4 Sofia Papagiannaki
            IOError
590 73fbaec4 Sofia Papagiannaki
    """
591 8dcaa6ac Giorgos Korfiatis
    project_id = get_project_id_of_application_id(project_application_id)
592 8dcaa6ac Giorgos Korfiatis
    return do_join_project(project_id, user_id)
593 8dcaa6ac Giorgos Korfiatis
594 e47fb17a Sofia Papagiannaki
def do_join_project_checks(project):
595 907f15db Giorgos Korfiatis
    checkAlive(project)
596 8dcaa6ac Giorgos Korfiatis
597 974ee6a6 Sofia Papagiannaki
    join_policy = project.application.member_join_policy
598 b0686c16 Giorgos Korfiatis
    if join_policy == CLOSED_POLICY:
599 73fbaec4 Sofia Papagiannaki
        raise PermissionDenied(_(astakos_messages.MEMBER_JOIN_POLICY_CLOSED))
600 73fbaec4 Sofia Papagiannaki
601 907f15db Giorgos Korfiatis
def do_join_project(project_id, user_id):
602 e47fb17a Sofia Papagiannaki
    project = get_project_for_update(project_id)
603 907f15db Giorgos Korfiatis
    do_join_project_checks(project)
604 e47fb17a Sofia Papagiannaki
605 8dcaa6ac Giorgos Korfiatis
    membership = create_membership(project, user_id)
606 73fbaec4 Sofia Papagiannaki
607 4e057833 Sofia Papagiannaki
    join_policy = project.application.member_join_policy
608 b0686c16 Giorgos Korfiatis
    if (join_policy == AUTO_ACCEPT_POLICY and
609 a073c3b2 Giorgos Korfiatis
        not project.violates_members_limit(adding=1)):
610 73fbaec4 Sofia Papagiannaki
        membership.accept()
611 3e47bb0b Sofia Papagiannaki
        trigger_sync()
612 73fbaec4 Sofia Papagiannaki
    return membership
613 8dcaa6ac Giorgos Korfiatis
614 ee4aa6eb Giorgos Korfiatis
def submit_application(kw, request_user=None):
615 ee4aa6eb Giorgos Korfiatis
616 ee4aa6eb Giorgos Korfiatis
    kw['applicant'] = request_user
617 69c822cc Giorgos Korfiatis
618 15ca2bea Giorgos Korfiatis
    precursor_id = kw.get('precursor_application', None)
619 15ca2bea Giorgos Korfiatis
    if precursor_id is not None:
620 15ca2bea Giorgos Korfiatis
        sfu = ProjectApplication.objects.select_for_update()
621 15ca2bea Giorgos Korfiatis
        precursor = sfu.get(id=precursor_id)
622 15ca2bea Giorgos Korfiatis
        kw['precursor_application'] = precursor
623 73fbaec4 Sofia Papagiannaki
624 ee4aa6eb Giorgos Korfiatis
        if request_user and \
625 ee4aa6eb Giorgos Korfiatis
            (not precursor.owner == request_user and \
626 ee4aa6eb Giorgos Korfiatis
                not request_user.is_superuser):
627 ee4aa6eb Giorgos Korfiatis
            raise PermissionDenied(_(astakos_messages.NOT_ALLOWED))
628 ee4aa6eb Giorgos Korfiatis
629 15ca2bea Giorgos Korfiatis
    application = models_submit_application(**kw)
630 1352dabb Kostas Papadimitriou
631 a3eb3a95 Giorgos Korfiatis
    application_submit_notify(application)
632 a3eb3a95 Giorgos Korfiatis
    return application
633 73fbaec4 Sofia Papagiannaki
634 8dcaa6ac Giorgos Korfiatis
def update_application(app_id, **kw):
635 8dcaa6ac Giorgos Korfiatis
    app = ProjectApplication.objects.get(id=app_id)
636 8dcaa6ac Giorgos Korfiatis
    app.id = None
637 8dcaa6ac Giorgos Korfiatis
    app.state = app.PENDING
638 8dcaa6ac Giorgos Korfiatis
    app.precursor_application_id = app_id
639 8dcaa6ac Giorgos Korfiatis
    app.issue_date = datetime.now()
640 8dcaa6ac Giorgos Korfiatis
641 8dcaa6ac Giorgos Korfiatis
    resource_policies = kw.pop('resource_policies', None)
642 be4811c0 Giorgos Korfiatis
    for k, v in kw.iteritems():
643 8dcaa6ac Giorgos Korfiatis
        setattr(app, k, v)
644 8dcaa6ac Giorgos Korfiatis
    app.save()
645 8dcaa6ac Giorgos Korfiatis
    app.resource_policies = resource_policies
646 8dcaa6ac Giorgos Korfiatis
    return app.id
647 8dcaa6ac Giorgos Korfiatis
648 8dcaa6ac Giorgos Korfiatis
def approve_application(app):
649 8dcaa6ac Giorgos Korfiatis
650 8dcaa6ac Giorgos Korfiatis
    app_id = app if isinstance(app, int) else app.id
651 8dcaa6ac Giorgos Korfiatis
652 8dcaa6ac Giorgos Korfiatis
    try:
653 8dcaa6ac Giorgos Korfiatis
        objects = ProjectApplication.objects.select_for_update()
654 8dcaa6ac Giorgos Korfiatis
        application = objects.get(id=app_id)
655 8dcaa6ac Giorgos Korfiatis
    except ProjectApplication.DoesNotExist:
656 8dcaa6ac Giorgos Korfiatis
        raise PermissionDenied()
657 8dcaa6ac Giorgos Korfiatis
658 73fbaec4 Sofia Papagiannaki
    application.approve()
659 3e47bb0b Sofia Papagiannaki
    trigger_sync()
660 8dcaa6ac Giorgos Korfiatis
661 a3eb3a95 Giorgos Korfiatis
    application_approve_notify(application)
662 eb9ff37a Sofia Papagiannaki
663 eb9ff37a Sofia Papagiannaki
def terminate(project_id):
664 5b9e9530 Giorgos Korfiatis
    project = get_project_for_update(project_id)
665 907f15db Giorgos Korfiatis
    checkAlive(project)
666 5b9e9530 Giorgos Korfiatis
667 5b9e9530 Giorgos Korfiatis
    project.terminate()
668 eb9ff37a Sofia Papagiannaki
    trigger_sync()
669 eb9ff37a Sofia Papagiannaki
670 a3eb3a95 Giorgos Korfiatis
    project_termination_notify(project)
671 eb9ff37a Sofia Papagiannaki
672 eb9ff37a Sofia Papagiannaki
def suspend(project_id):
673 eb9ff37a Sofia Papagiannaki
    project = get_project_by_id(project_id)
674 eb9ff37a Sofia Papagiannaki
    project.last_approval_date = None
675 eb9ff37a Sofia Papagiannaki
    project.save()
676 eb9ff37a Sofia Papagiannaki
    trigger_sync()
677 1352dabb Kostas Papadimitriou
678 a3eb3a95 Giorgos Korfiatis
    project_suspension_notify(project)