Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / functions.py @ 21e0fdad

History | View | Annotate | Download (22.4 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 b6fe8bb8 Giorgos Korfiatis
    trigger_sync, PendingMembershipError)
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 21e0fdad Giorgos Korfiatis
from astakos.im.endpoints.qh import qh_register_user
76 73fbaec4 Sofia Papagiannaki
77 ae497612 Olga Brani
import astakos.im.messages as astakos_messages
78 f36af44a Antony Chazapis
79 f36af44a Antony Chazapis
logger = logging.getLogger(__name__)
80 f36af44a Antony Chazapis
81 5ce3ce4f Sofia Papagiannaki
82 111f3da6 Sofia Papagiannaki
def logged(func, msg):
83 111f3da6 Sofia Papagiannaki
    @wraps(func)
84 111f3da6 Sofia Papagiannaki
    def with_logging(*args, **kwargs):
85 111f3da6 Sofia Papagiannaki
        email = ''
86 111f3da6 Sofia Papagiannaki
        user = None
87 9a06d96f Olga Brani
        try:
88 111f3da6 Sofia Papagiannaki
            request = args[0]
89 9a06d96f Olga Brani
            email = request.user.email
90 9a06d96f Olga Brani
        except (KeyError, AttributeError), e:
91 9a06d96f Olga Brani
            email = ''
92 111f3da6 Sofia Papagiannaki
        r = func(*args, **kwargs)
93 c9e378c7 Sofia Papagiannaki
        if LOGGING_LEVEL:
94 aab4d540 Sofia Papagiannaki
            logger.log(LOGGING_LEVEL, msg % email)
95 111f3da6 Sofia Papagiannaki
        return r
96 111f3da6 Sofia Papagiannaki
    return with_logging
97 111f3da6 Sofia Papagiannaki
98 bf0c6de5 Sofia Papagiannaki
99 bf0c6de5 Sofia Papagiannaki
def login(request, user):
100 bf0c6de5 Sofia Papagiannaki
    auth_login(request, user)
101 c3c2212a Sofia Papagiannaki
    from astakos.im.models import SessionCatalog
102 c3c2212a Sofia Papagiannaki
    SessionCatalog(
103 c0b26605 Sofia Papagiannaki
        session_key=request.session.session_key,
104 c3c2212a Sofia Papagiannaki
        user=user
105 c3c2212a Sofia Papagiannaki
    ).save()
106 bf0c6de5 Sofia Papagiannaki
107 bf0c6de5 Sofia Papagiannaki
login = logged(login, '%s logged in.')
108 111f3da6 Sofia Papagiannaki
logout = logged(auth_logout, '%s logged out.')
109 111f3da6 Sofia Papagiannaki
110 5ce3ce4f Sofia Papagiannaki
111 683cf244 Sofia Papagiannaki
def send_verification(user, template_name='im/activation_email.txt'):
112 f36af44a Antony Chazapis
    """
113 683cf244 Sofia Papagiannaki
    Send email to user to verify his/her email and activate his/her account.
114 5ce3ce4f Sofia Papagiannaki

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

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

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

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

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

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