Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / views.py @ fcc1e93f

History | View | Annotate | Download (48.4 kB)

1 aba1e498 Antony Chazapis
# Copyright 2011-2012 GRNET S.A. All rights reserved.
2 176023aa Kostas Papadimitriou
#
3 64cd4730 Antony Chazapis
# Redistribution and use in source and binary forms, with or
4 64cd4730 Antony Chazapis
# without modification, are permitted provided that the following
5 64cd4730 Antony Chazapis
# conditions are met:
6 176023aa Kostas Papadimitriou
#
7 64cd4730 Antony Chazapis
#   1. Redistributions of source code must retain the above
8 64cd4730 Antony Chazapis
#      copyright notice, this list of conditions and the following
9 64cd4730 Antony Chazapis
#      disclaimer.
10 176023aa Kostas Papadimitriou
#
11 64cd4730 Antony Chazapis
#   2. Redistributions in binary form must reproduce the above
12 64cd4730 Antony Chazapis
#      copyright notice, this list of conditions and the following
13 64cd4730 Antony Chazapis
#      disclaimer in the documentation and/or other materials
14 64cd4730 Antony Chazapis
#      provided with the distribution.
15 176023aa Kostas Papadimitriou
#
16 64cd4730 Antony Chazapis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 64cd4730 Antony Chazapis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 64cd4730 Antony Chazapis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 64cd4730 Antony Chazapis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 64cd4730 Antony Chazapis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 64cd4730 Antony Chazapis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 64cd4730 Antony Chazapis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 64cd4730 Antony Chazapis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 64cd4730 Antony Chazapis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 64cd4730 Antony Chazapis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 64cd4730 Antony Chazapis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 64cd4730 Antony Chazapis
# POSSIBILITY OF SUCH DAMAGE.
28 176023aa Kostas Papadimitriou
#
29 64cd4730 Antony Chazapis
# The views and conclusions contained in the software and
30 64cd4730 Antony Chazapis
# documentation are those of the authors and should not be
31 64cd4730 Antony Chazapis
# interpreted as representing official policies, either expressed
32 64cd4730 Antony Chazapis
# or implied, of GRNET S.A.
33 64cd4730 Antony Chazapis
34 64cd4730 Antony Chazapis
import logging
35 6e029beb Sofia Papagiannaki
import calendar
36 9a06d96f Olga Brani
import inflect
37 9a06d96f Olga Brani
38 9a06d96f Olga Brani
engine = inflect.engine()
39 64cd4730 Antony Chazapis
40 0905ccd2 Sofia Papagiannaki
from urllib import quote
41 63ecdd20 Sofia Papagiannaki
from functools import wraps
42 c0b26605 Sofia Papagiannaki
from datetime import datetime
43 64cd4730 Antony Chazapis
44 c630fee6 Kostas Papadimitriou
from django.shortcuts import get_object_or_404
45 890b0eaf Sofia Papagiannaki
from django.contrib import messages
46 01ac12d5 Sofia Papagiannaki
from django.contrib.auth.decorators import login_required
47 01ac12d5 Sofia Papagiannaki
from django.core.urlresolvers import reverse
48 01ac12d5 Sofia Papagiannaki
from django.db import transaction
49 01ac12d5 Sofia Papagiannaki
from django.db.utils import IntegrityError
50 73fbaec4 Sofia Papagiannaki
from django.http import (
51 73fbaec4 Sofia Papagiannaki
    HttpResponse, HttpResponseBadRequest,
52 73fbaec4 Sofia Papagiannaki
    HttpResponseForbidden, HttpResponseRedirect,
53 73fbaec4 Sofia Papagiannaki
    HttpResponseBadRequest, Http404)
54 01ac12d5 Sofia Papagiannaki
from django.shortcuts import redirect
55 661c4479 Sofia Papagiannaki
from django.template import RequestContext, loader as template_loader
56 01ac12d5 Sofia Papagiannaki
from django.utils.http import urlencode
57 01ac12d5 Sofia Papagiannaki
from django.utils.translation import ugettext as _
58 e1a80257 Sofia Papagiannaki
from django.views.generic.create_update import (
59 4e748491 Sofia Papagiannaki
    apply_extra_context, lookup_object, delete_object, get_model_and_form_class)
60 f3342849 Sofia Papagiannaki
from django.views.generic.list_detail import object_list, object_detail
61 661c4479 Sofia Papagiannaki
from django.core.xheaders import populate_xheaders
62 792c2f3b Olga Brani
from django.core.exceptions import ValidationError, PermissionDenied
63 c0b26605 Sofia Papagiannaki
from django.template.loader import render_to_string
64 9a06d96f Olga Brani
from django.views.decorators.http import require_http_methods
65 29b0ec5a Sofia Papagiannaki
from django.db.models import Q
66 bfe23b13 Sofia Papagiannaki
from django.core.exceptions import PermissionDenied
67 c0b26605 Sofia Papagiannaki
68 c630fee6 Kostas Papadimitriou
import astakos.im.messages as astakos_messages
69 c630fee6 Kostas Papadimitriou
70 29b0ec5a Sofia Papagiannaki
from astakos.im.activation_backends import get_backend, SimpleBackend
71 e1a80257 Sofia Papagiannaki
from astakos.im.models import (
72 73fbaec4 Sofia Papagiannaki
    AstakosUser, ApprovalTerms,
73 fcc1e93f Sofia Papagiannaki
    EmailChange, RESOURCE_SEPARATOR,
74 fcc1e93f Sofia Papagiannaki
    AstakosUserAuthProvider, PendingThirdPartyUser,
75 73fbaec4 Sofia Papagiannaki
    ProjectApplication, ProjectMembership, Project)
76 73fbaec4 Sofia Papagiannaki
from astakos.im.util import (
77 73fbaec4 Sofia Papagiannaki
    get_context, prepare_response, get_query, restrict_next)
78 e1a80257 Sofia Papagiannaki
from astakos.im.forms import (
79 e1a80257 Sofia Papagiannaki
    LoginForm, InvitationForm, ProfileForm,
80 e1a80257 Sofia Papagiannaki
    FeedbackForm, SignApprovalTermsForm,
81 e1a80257 Sofia Papagiannaki
    EmailChangeForm,
82 bfe23b13 Sofia Papagiannaki
    ProjectApplicationForm, ProjectSortForm,
83 73fbaec4 Sofia Papagiannaki
    AddProjectMembersForm, ProjectSearchForm,
84 73fbaec4 Sofia Papagiannaki
    ProjectMembersSortForm)
85 f3342849 Sofia Papagiannaki
from astakos.im.functions import (
86 f3342849 Sofia Papagiannaki
    send_feedback, SendMailError,
87 f3342849 Sofia Papagiannaki
    logout as auth_logout,
88 f3342849 Sofia Papagiannaki
    activate as activate_func,
89 73fbaec4 Sofia Papagiannaki
    invite,
90 f3342849 Sofia Papagiannaki
    send_activation as send_activation_func,
91 73fbaec4 Sofia Papagiannaki
    SendNotificationError,
92 73fbaec4 Sofia Papagiannaki
    accept_membership, reject_membership, remove_membership,
93 7dd3047d Sofia Papagiannaki
    leave_project, join_project, enroll_member)
94 73fbaec4 Sofia Papagiannaki
# from astakos.im.endpoints.qh import timeline_charge
95 f3342849 Sofia Papagiannaki
from astakos.im.settings import (
96 f3342849 Sofia Papagiannaki
    COOKIE_DOMAIN, LOGOUT_NEXT,
97 f3342849 Sofia Papagiannaki
    LOGGING_LEVEL, PAGINATE_BY,
98 a9c7ff8a Sofia Papagiannaki
    RESOURCES_PRESENTATION_DATA, PAGINATE_BY_ALL,
99 a9c7ff8a Sofia Papagiannaki
    MODERATION_ENABLED)
100 48421603 Kostas Papadimitriou
from astakos.im import settings as astakos_settings
101 f8f86e83 root
#from astakos.im.tasks import request_billing
102 820b18e0 Sofia Papagiannaki
from astakos.im.api.callpoint import AstakosCallpoint
103 792c2f3b Olga Brani
from astakos.im import auth_providers
104 a9c7ff8a Sofia Papagiannaki
from astakos.im.templatetags.filters import ResourcePresentation
105 ae497612 Olga Brani
106 e015e9e6 Sofia Papagiannaki
logger = logging.getLogger(__name__)
107 e015e9e6 Sofia Papagiannaki
108 820b18e0 Sofia Papagiannaki
callpoint = AstakosCallpoint()
109 9a06d96f Olga Brani
110 b2ffa772 Sofia Papagiannaki
def render_response(template, tab=None, status=200, context_instance=None, **kwargs):
111 890b0eaf Sofia Papagiannaki
    """
112 890b0eaf Sofia Papagiannaki
    Calls ``django.template.loader.render_to_string`` with an additional ``tab``
113 890b0eaf Sofia Papagiannaki
    keyword argument and returns an ``django.http.HttpResponse`` with the
114 890b0eaf Sofia Papagiannaki
    specified ``status``.
115 890b0eaf Sofia Papagiannaki
    """
116 64cd4730 Antony Chazapis
    if tab is None:
117 881c856c Sofia Papagiannaki
        tab = template.partition('_')[0].partition('.html')[0]
118 64cd4730 Antony Chazapis
    kwargs.setdefault('tab', tab)
119 661c4479 Sofia Papagiannaki
    html = template_loader.render_to_string(
120 5ce3ce4f Sofia Papagiannaki
        template, kwargs, context_instance=context_instance)
121 c301698f Sofia Papagiannaki
    response = HttpResponse(html, status=status)
122 c301698f Sofia Papagiannaki
    return response
123 64cd4730 Antony Chazapis
124 792c2f3b Olga Brani
def requires_auth_provider(provider_id, **perms):
125 792c2f3b Olga Brani
    """
126 792c2f3b Olga Brani
    """
127 792c2f3b Olga Brani
    def decorator(func, *args, **kwargs):
128 792c2f3b Olga Brani
        @wraps(func)
129 792c2f3b Olga Brani
        def wrapper(request, *args, **kwargs):
130 792c2f3b Olga Brani
            provider = auth_providers.get_provider(provider_id)
131 792c2f3b Olga Brani
132 792c2f3b Olga Brani
            if not provider or not provider.is_active():
133 792c2f3b Olga Brani
                raise PermissionDenied
134 792c2f3b Olga Brani
135 792c2f3b Olga Brani
            if provider:
136 792c2f3b Olga Brani
                for pkey, value in perms.iteritems():
137 792c2f3b Olga Brani
                    attr = 'is_available_for_%s' % pkey.lower()
138 792c2f3b Olga Brani
                    if getattr(provider, attr)() != value:
139 279d6e51 Olga Brani
                        #TODO: add session message
140 c630fee6 Kostas Papadimitriou
                        return HttpResponseRedirect(reverse('login'))
141 792c2f3b Olga Brani
            return func(request, *args)
142 792c2f3b Olga Brani
        return wrapper
143 792c2f3b Olga Brani
    return decorator
144 792c2f3b Olga Brani
145 63ecdd20 Sofia Papagiannaki
146 63ecdd20 Sofia Papagiannaki
def requires_anonymous(func):
147 63ecdd20 Sofia Papagiannaki
    """
148 270dd48d Sofia Papagiannaki
    Decorator checkes whether the request.user is not Anonymous and in that case
149 7482228b Sofia Papagiannaki
    redirects to `logout`.
150 63ecdd20 Sofia Papagiannaki
    """
151 63ecdd20 Sofia Papagiannaki
    @wraps(func)
152 63ecdd20 Sofia Papagiannaki
    def wrapper(request, *args):
153 63ecdd20 Sofia Papagiannaki
        if not request.user.is_anonymous():
154 63ecdd20 Sofia Papagiannaki
            next = urlencode({'next': request.build_absolute_uri()})
155 270dd48d Sofia Papagiannaki
            logout_uri = reverse(logout) + '?' + next
156 270dd48d Sofia Papagiannaki
            return HttpResponseRedirect(logout_uri)
157 63ecdd20 Sofia Papagiannaki
        return func(request, *args)
158 63ecdd20 Sofia Papagiannaki
    return wrapper
159 63ecdd20 Sofia Papagiannaki
160 5ce3ce4f Sofia Papagiannaki
161 270dd48d Sofia Papagiannaki
def signed_terms_required(func):
162 270dd48d Sofia Papagiannaki
    """
163 badcb2a9 Kostas Papadimitriou
    Decorator checks whether the request.user is Anonymous and in that case
164 270dd48d Sofia Papagiannaki
    redirects to `logout`.
165 270dd48d Sofia Papagiannaki
    """
166 270dd48d Sofia Papagiannaki
    @wraps(func)
167 270dd48d Sofia Papagiannaki
    def wrapper(request, *args, **kwargs):
168 fcf90160 Sofia Papagiannaki
        if request.user.is_authenticated() and not request.user.signed_terms:
169 270dd48d Sofia Papagiannaki
            params = urlencode({'next': request.build_absolute_uri(),
170 5ce3ce4f Sofia Papagiannaki
                                'show_form': ''})
171 270dd48d Sofia Papagiannaki
            terms_uri = reverse('latest_terms') + '?' + params
172 270dd48d Sofia Papagiannaki
            return HttpResponseRedirect(terms_uri)
173 270dd48d Sofia Papagiannaki
        return func(request, *args, **kwargs)
174 270dd48d Sofia Papagiannaki
    return wrapper
175 270dd48d Sofia Papagiannaki
176 5ce3ce4f Sofia Papagiannaki
177 badcb2a9 Kostas Papadimitriou
def required_auth_methods_assigned(only_warn=False):
178 badcb2a9 Kostas Papadimitriou
    """
179 badcb2a9 Kostas Papadimitriou
    Decorator that checks whether the request.user has all required auth providers
180 badcb2a9 Kostas Papadimitriou
    assigned.
181 badcb2a9 Kostas Papadimitriou
    """
182 badcb2a9 Kostas Papadimitriou
    required_providers = auth_providers.REQUIRED_PROVIDERS.keys()
183 badcb2a9 Kostas Papadimitriou
184 badcb2a9 Kostas Papadimitriou
    def decorator(func):
185 badcb2a9 Kostas Papadimitriou
        if not required_providers:
186 badcb2a9 Kostas Papadimitriou
            return func
187 badcb2a9 Kostas Papadimitriou
188 badcb2a9 Kostas Papadimitriou
        @wraps(func)
189 badcb2a9 Kostas Papadimitriou
        def wrapper(request, *args, **kwargs):
190 badcb2a9 Kostas Papadimitriou
            if request.user.is_authenticated():
191 badcb2a9 Kostas Papadimitriou
                for required in required_providers:
192 badcb2a9 Kostas Papadimitriou
                    if not request.user.has_auth_provider(required):
193 badcb2a9 Kostas Papadimitriou
                        provider = auth_providers.get_provider(required)
194 badcb2a9 Kostas Papadimitriou
                        if only_warn:
195 badcb2a9 Kostas Papadimitriou
                            messages.error(request,
196 badcb2a9 Kostas Papadimitriou
                                           _(astakos_messages.AUTH_PROVIDER_REQUIRED  % {
197 badcb2a9 Kostas Papadimitriou
                                               'provider': provider.get_title_display}))
198 badcb2a9 Kostas Papadimitriou
                        else:
199 badcb2a9 Kostas Papadimitriou
                            return HttpResponseRedirect(reverse('edit_profile'))
200 badcb2a9 Kostas Papadimitriou
            return func(request, *args, **kwargs)
201 badcb2a9 Kostas Papadimitriou
        return wrapper
202 badcb2a9 Kostas Papadimitriou
    return decorator
203 badcb2a9 Kostas Papadimitriou
204 badcb2a9 Kostas Papadimitriou
205 badcb2a9 Kostas Papadimitriou
def valid_astakos_user_required(func):
206 badcb2a9 Kostas Papadimitriou
    return signed_terms_required(required_auth_methods_assigned()(login_required(func)))
207 badcb2a9 Kostas Papadimitriou
208 badcb2a9 Kostas Papadimitriou
209 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
210 270dd48d Sofia Papagiannaki
@signed_terms_required
211 1f3b4b39 Sofia Papagiannaki
def index(request, login_template_name='im/login.html', profile_template_name='im/profile.html', extra_context=None):
212 890b0eaf Sofia Papagiannaki
    """
213 dcf55476 Sofia Papagiannaki
    If there is logged on user renders the profile page otherwise renders login page.
214 176023aa Kostas Papadimitriou

215 890b0eaf Sofia Papagiannaki
    **Arguments**
216 176023aa Kostas Papadimitriou

217 dcf55476 Sofia Papagiannaki
    ``login_template_name``
218 dcf55476 Sofia Papagiannaki
        A custom login template to use. This is optional; if not specified,
219 1e685275 Sofia Papagiannaki
        this will default to ``im/login.html``.
220 176023aa Kostas Papadimitriou

221 dcf55476 Sofia Papagiannaki
    ``profile_template_name``
222 dcf55476 Sofia Papagiannaki
        A custom profile template to use. This is optional; if not specified,
223 1e685275 Sofia Papagiannaki
        this will default to ``im/profile.html``.
224 176023aa Kostas Papadimitriou

225 890b0eaf Sofia Papagiannaki
    ``extra_context``
226 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
227 176023aa Kostas Papadimitriou

228 890b0eaf Sofia Papagiannaki
    **Template:**
229 176023aa Kostas Papadimitriou

230 1e685275 Sofia Papagiannaki
    im/profile.html or im/login.html or ``template_name`` keyword argument.
231 176023aa Kostas Papadimitriou

232 890b0eaf Sofia Papagiannaki
    """
233 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
234 dcf55476 Sofia Papagiannaki
    template_name = login_template_name
235 dcf55476 Sofia Papagiannaki
    if request.user.is_authenticated():
236 f534fb96 Sofia Papagiannaki
        return HttpResponseRedirect(reverse('astakos.im.views.edit_profile'))
237 792c2f3b Olga Brani
238 f7cf5257 Kostas Papadimitriou
    third_party_token = request.GET.get('key', False)
239 f7cf5257 Kostas Papadimitriou
    if third_party_token:
240 f7cf5257 Kostas Papadimitriou
        messages.info(request, astakos_messages.AUTH_PROVIDER_LOGIN_TO_ADD)
241 f7cf5257 Kostas Papadimitriou
242 ef20ea07 Sofia Papagiannaki
    return render_response(
243 ef20ea07 Sofia Papagiannaki
        template_name,
244 ef20ea07 Sofia Papagiannaki
        login_form = LoginForm(request=request),
245 ef20ea07 Sofia Papagiannaki
        context_instance = get_context(request, extra_context)
246 ef20ea07 Sofia Papagiannaki
    )
247 5ce3ce4f Sofia Papagiannaki
248 64cd4730 Antony Chazapis
249 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
250 badcb2a9 Kostas Papadimitriou
@valid_astakos_user_required
251 890b0eaf Sofia Papagiannaki
@transaction.commit_manually
252 aab4d540 Sofia Papagiannaki
def invite(request, template_name='im/invitations.html', extra_context=None):
253 890b0eaf Sofia Papagiannaki
    """
254 890b0eaf Sofia Papagiannaki
    Allows a user to invite somebody else.
255 176023aa Kostas Papadimitriou

256 890b0eaf Sofia Papagiannaki
    In case of GET request renders a form for providing the invitee information.
257 890b0eaf Sofia Papagiannaki
    In case of POST checks whether the user has not run out of invitations and then
258 890b0eaf Sofia Papagiannaki
    sends an invitation email to singup to the service.
259 176023aa Kostas Papadimitriou

260 890b0eaf Sofia Papagiannaki
    The view uses commit_manually decorator in order to ensure the number of the
261 890b0eaf Sofia Papagiannaki
    user invitations is going to be updated only if the email has been successfully sent.
262 176023aa Kostas Papadimitriou

263 2cbaacd5 Sofia Papagiannaki
    If the user isn't logged in, redirects to settings.LOGIN_URL.
264 176023aa Kostas Papadimitriou

265 890b0eaf Sofia Papagiannaki
    **Arguments**
266 176023aa Kostas Papadimitriou

267 890b0eaf Sofia Papagiannaki
    ``template_name``
268 890b0eaf Sofia Papagiannaki
        A custom template to use. This is optional; if not specified,
269 1e685275 Sofia Papagiannaki
        this will default to ``im/invitations.html``.
270 176023aa Kostas Papadimitriou

271 890b0eaf Sofia Papagiannaki
    ``extra_context``
272 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
273 176023aa Kostas Papadimitriou

274 890b0eaf Sofia Papagiannaki
    **Template:**
275 176023aa Kostas Papadimitriou

276 1e685275 Sofia Papagiannaki
    im/invitations.html or ``template_name`` keyword argument.
277 176023aa Kostas Papadimitriou

278 890b0eaf Sofia Papagiannaki
    **Settings:**
279 176023aa Kostas Papadimitriou

280 890b0eaf Sofia Papagiannaki
    The view expectes the following settings are defined:
281 176023aa Kostas Papadimitriou

282 890b0eaf Sofia Papagiannaki
    * LOGIN_URL: login uri
283 890b0eaf Sofia Papagiannaki
    """
284 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
285 64cd4730 Antony Chazapis
    status = None
286 64cd4730 Antony Chazapis
    message = None
287 8f5a3a06 Sofia Papagiannaki
    form = InvitationForm()
288 5ce3ce4f Sofia Papagiannaki
289 18ffbee1 Sofia Papagiannaki
    inviter = request.user
290 64cd4730 Antony Chazapis
    if request.method == 'POST':
291 8f5a3a06 Sofia Papagiannaki
        form = InvitationForm(request.POST)
292 64cd4730 Antony Chazapis
        if inviter.invitations > 0:
293 8f5a3a06 Sofia Papagiannaki
            if form.is_valid():
294 8f5a3a06 Sofia Papagiannaki
                try:
295 9a06d96f Olga Brani
                    email = form.cleaned_data.get('username')
296 9a06d96f Olga Brani
                    realname = form.cleaned_data.get('realname')
297 73fbaec4 Sofia Papagiannaki
                    invite(inviter, email, realname)
298 ae497612 Olga Brani
                    message = _(astakos_messages.INVITATION_SENT) % locals()
299 24406ae3 Sofia Papagiannaki
                    messages.success(request, message)
300 8f5a3a06 Sofia Papagiannaki
                except SendMailError, e:
301 8f5a3a06 Sofia Papagiannaki
                    message = e.message
302 24406ae3 Sofia Papagiannaki
                    messages.error(request, message)
303 8f5a3a06 Sofia Papagiannaki
                    transaction.rollback()
304 18ffbee1 Sofia Papagiannaki
                except BaseException, e:
305 ae497612 Olga Brani
                    message = _(astakos_messages.GENERIC_ERROR)
306 24406ae3 Sofia Papagiannaki
                    messages.error(request, message)
307 18ffbee1 Sofia Papagiannaki
                    logger.exception(e)
308 18ffbee1 Sofia Papagiannaki
                    transaction.rollback()
309 18ffbee1 Sofia Papagiannaki
                else:
310 18ffbee1 Sofia Papagiannaki
                    transaction.commit()
311 64cd4730 Antony Chazapis
        else:
312 ae497612 Olga Brani
            message = _(astakos_messages.MAX_INVITATION_NUMBER_REACHED)
313 24406ae3 Sofia Papagiannaki
            messages.error(request, message)
314 176023aa Kostas Papadimitriou
315 a196eb7e Sofia Papagiannaki
    sent = [{'email': inv.username,
316 d6ae71a2 root
             'realname': inv.realname,
317 d6ae71a2 root
             'is_consumed': inv.is_consumed}
318 5ce3ce4f Sofia Papagiannaki
            for inv in request.user.invitations_sent.all()]
319 77e2ad52 root
    kwargs = {'inviter': inviter,
320 5ce3ce4f Sofia Papagiannaki
              'sent': sent}
321 0905ccd2 Sofia Papagiannaki
    context = get_context(request, extra_context, **kwargs)
322 0905ccd2 Sofia Papagiannaki
    return render_response(template_name,
323 5ce3ce4f Sofia Papagiannaki
                           invitation_form=form,
324 5ce3ce4f Sofia Papagiannaki
                           context_instance=context)
325 5ce3ce4f Sofia Papagiannaki
326 64cd4730 Antony Chazapis
327 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
328 badcb2a9 Kostas Papadimitriou
@required_auth_methods_assigned(only_warn=True)
329 890b0eaf Sofia Papagiannaki
@login_required
330 270dd48d Sofia Papagiannaki
@signed_terms_required
331 aab4d540 Sofia Papagiannaki
def edit_profile(request, template_name='im/profile.html', extra_context=None):
332 890b0eaf Sofia Papagiannaki
    """
333 890b0eaf Sofia Papagiannaki
    Allows a user to edit his/her profile.
334 176023aa Kostas Papadimitriou

335 890b0eaf Sofia Papagiannaki
    In case of GET request renders a form for displaying the user information.
336 ce86cd44 Sofia Papagiannaki
    In case of POST updates the user informantion and redirects to ``next``
337 ce86cd44 Sofia Papagiannaki
    url parameter if exists.
338 176023aa Kostas Papadimitriou

339 2cbaacd5 Sofia Papagiannaki
    If the user isn't logged in, redirects to settings.LOGIN_URL.
340 176023aa Kostas Papadimitriou

341 890b0eaf Sofia Papagiannaki
    **Arguments**
342 176023aa Kostas Papadimitriou

343 890b0eaf Sofia Papagiannaki
    ``template_name``
344 890b0eaf Sofia Papagiannaki
        A custom template to use. This is optional; if not specified,
345 1e685275 Sofia Papagiannaki
        this will default to ``im/profile.html``.
346 176023aa Kostas Papadimitriou

347 890b0eaf Sofia Papagiannaki
    ``extra_context``
348 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
349 176023aa Kostas Papadimitriou

350 890b0eaf Sofia Papagiannaki
    **Template:**
351 176023aa Kostas Papadimitriou

352 1e685275 Sofia Papagiannaki
    im/profile.html or ``template_name`` keyword argument.
353 176023aa Kostas Papadimitriou

354 92defad4 Sofia Papagiannaki
    **Settings:**
355 176023aa Kostas Papadimitriou

356 92defad4 Sofia Papagiannaki
    The view expectes the following settings are defined:
357 176023aa Kostas Papadimitriou

358 92defad4 Sofia Papagiannaki
    * LOGIN_URL: login uri
359 890b0eaf Sofia Papagiannaki
    """
360 aab4d540 Sofia Papagiannaki
    extra_context = extra_context or {}
361 bf0c6de5 Sofia Papagiannaki
    form = ProfileForm(
362 bf0c6de5 Sofia Papagiannaki
        instance=request.user,
363 bf0c6de5 Sofia Papagiannaki
        session_key=request.session.session_key
364 bf0c6de5 Sofia Papagiannaki
    )
365 15efc749 Sofia Papagiannaki
    extra_context['next'] = request.GET.get('next')
366 64cd4730 Antony Chazapis
    if request.method == 'POST':
367 bf0c6de5 Sofia Papagiannaki
        form = ProfileForm(
368 bf0c6de5 Sofia Papagiannaki
            request.POST,
369 bf0c6de5 Sofia Papagiannaki
            instance=request.user,
370 bf0c6de5 Sofia Papagiannaki
            session_key=request.session.session_key
371 bf0c6de5 Sofia Papagiannaki
        )
372 890b0eaf Sofia Papagiannaki
        if form.is_valid():
373 64cd4730 Antony Chazapis
            try:
374 c301698f Sofia Papagiannaki
                prev_token = request.user.auth_token
375 c301698f Sofia Papagiannaki
                user = form.save()
376 bf0c6de5 Sofia Papagiannaki
                form = ProfileForm(
377 bf0c6de5 Sofia Papagiannaki
                    instance=user,
378 bf0c6de5 Sofia Papagiannaki
                    session_key=request.session.session_key
379 bf0c6de5 Sofia Papagiannaki
                )
380 217994f8 Sofia Papagiannaki
                next = restrict_next(
381 217994f8 Sofia Papagiannaki
                    request.POST.get('next'),
382 217994f8 Sofia Papagiannaki
                    domain=COOKIE_DOMAIN
383 217994f8 Sofia Papagiannaki
                )
384 1a3675a0 Sofia Papagiannaki
                if next:
385 1a3675a0 Sofia Papagiannaki
                    return redirect(next)
386 ae497612 Olga Brani
                msg = _(astakos_messages.PROFILE_UPDATED)
387 24406ae3 Sofia Papagiannaki
                messages.success(request, msg)
388 890b0eaf Sofia Papagiannaki
            except ValueError, ve:
389 24406ae3 Sofia Papagiannaki
                messages.success(request, ve)
390 23447441 Sofia Papagiannaki
    elif request.method == "GET":
391 792c2f3b Olga Brani
        request.user.is_verified = True
392 792c2f3b Olga Brani
        request.user.save()
393 792c2f3b Olga Brani
394 792c2f3b Olga Brani
    # existing providers
395 792c2f3b Olga Brani
    user_providers = request.user.get_active_auth_providers()
396 792c2f3b Olga Brani
397 792c2f3b Olga Brani
    # providers that user can add
398 792c2f3b Olga Brani
    user_available_providers = request.user.get_available_auth_providers()
399 792c2f3b Olga Brani
400 0905ccd2 Sofia Papagiannaki
    return render_response(template_name,
401 8f5a3a06 Sofia Papagiannaki
                           profile_form = form,
402 792c2f3b Olga Brani
                           user_providers = user_providers,
403 792c2f3b Olga Brani
                           user_available_providers = user_available_providers,
404 0905ccd2 Sofia Papagiannaki
                           context_instance = get_context(request,
405 c301698f Sofia Papagiannaki
                                                          extra_context))
406 5ce3ce4f Sofia Papagiannaki
407 64cd4730 Antony Chazapis
408 10ed0073 Sofia Papagiannaki
@transaction.commit_manually
409 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
410 279d6e51 Olga Brani
def signup(request, template_name='im/signup.html', on_success='im/signup_complete.html', extra_context=None, backend=None):
411 890b0eaf Sofia Papagiannaki
    """
412 890b0eaf Sofia Papagiannaki
    Allows a user to create a local account.
413 176023aa Kostas Papadimitriou

414 b669d9c0 Sofia Papagiannaki
    In case of GET request renders a form for entering the user information.
415 890b0eaf Sofia Papagiannaki
    In case of POST handles the signup.
416 176023aa Kostas Papadimitriou

417 890b0eaf Sofia Papagiannaki
    The user activation will be delegated to the backend specified by the ``backend`` keyword argument
418 8f5a3a06 Sofia Papagiannaki
    if present, otherwise to the ``astakos.im.activation_backends.InvitationBackend``
419 8f5a3a06 Sofia Papagiannaki
    if settings.ASTAKOS_INVITATIONS_ENABLED is True or ``astakos.im.activation_backends.SimpleBackend`` if not
420 8f5a3a06 Sofia Papagiannaki
    (see activation_backends);
421 5ce3ce4f Sofia Papagiannaki

422 b669d9c0 Sofia Papagiannaki
    Upon successful user creation, if ``next`` url parameter is present the user is redirected there
423 890b0eaf Sofia Papagiannaki
    otherwise renders the same page with a success message.
424 5ce3ce4f Sofia Papagiannaki

425 8f5a3a06 Sofia Papagiannaki
    On unsuccessful creation, renders ``template_name`` with an error message.
426 5ce3ce4f Sofia Papagiannaki

427 890b0eaf Sofia Papagiannaki
    **Arguments**
428 5ce3ce4f Sofia Papagiannaki

429 8f5a3a06 Sofia Papagiannaki
    ``template_name``
430 8f5a3a06 Sofia Papagiannaki
        A custom template to render. This is optional;
431 1e685275 Sofia Papagiannaki
        if not specified, this will default to ``im/signup.html``.
432 176023aa Kostas Papadimitriou

433 f7e8a159 Sofia Papagiannaki
    ``on_success``
434 f7e8a159 Sofia Papagiannaki
        A custom template to render in case of success. This is optional;
435 1e685275 Sofia Papagiannaki
        if not specified, this will default to ``im/signup_complete.html``.
436 176023aa Kostas Papadimitriou

437 890b0eaf Sofia Papagiannaki
    ``extra_context``
438 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
439 176023aa Kostas Papadimitriou

440 890b0eaf Sofia Papagiannaki
    **Template:**
441 5ce3ce4f Sofia Papagiannaki

442 8f5a3a06 Sofia Papagiannaki
    im/signup.html or ``template_name`` keyword argument.
443 5ce3ce4f Sofia Papagiannaki
    im/signup_complete.html or ``on_success`` keyword argument.
444 890b0eaf Sofia Papagiannaki
    """
445 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
446 0d02a287 Sofia Papagiannaki
    if request.user.is_authenticated():
447 6ff7a7ca Sofia Papagiannaki
        return HttpResponseRedirect(reverse('edit_profile'))
448 5ce3ce4f Sofia Papagiannaki
449 0a569195 Sofia Papagiannaki
    provider = get_query(request).get('provider', 'local')
450 279d6e51 Olga Brani
    if not auth_providers.get_provider(provider).is_available_for_create():
451 279d6e51 Olga Brani
        raise PermissionDenied
452 279d6e51 Olga Brani
453 6c8a3f7c Sofia Papagiannaki
    id = get_query(request).get('id')
454 6c8a3f7c Sofia Papagiannaki
    try:
455 6c8a3f7c Sofia Papagiannaki
        instance = AstakosUser.objects.get(id=id) if id else None
456 6c8a3f7c Sofia Papagiannaki
    except AstakosUser.DoesNotExist:
457 6c8a3f7c Sofia Papagiannaki
        instance = None
458 6c8a3f7c Sofia Papagiannaki
459 8ab484ea Kostas Papadimitriou
    third_party_token = request.REQUEST.get('third_party_token', None)
460 c630fee6 Kostas Papadimitriou
    if third_party_token:
461 c630fee6 Kostas Papadimitriou
        pending = get_object_or_404(PendingThirdPartyUser,
462 c630fee6 Kostas Papadimitriou
                                    token=third_party_token)
463 c630fee6 Kostas Papadimitriou
        provider = pending.provider
464 c630fee6 Kostas Papadimitriou
        instance = pending.get_user_instance()
465 8ab484ea Kostas Papadimitriou
466 890b0eaf Sofia Papagiannaki
    try:
467 18ffbee1 Sofia Papagiannaki
        if not backend:
468 18ffbee1 Sofia Papagiannaki
            backend = get_backend(request)
469 6c8a3f7c Sofia Papagiannaki
        form = backend.get_signup_form(provider, instance)
470 0a569195 Sofia Papagiannaki
    except Exception, e:
471 4e30244e Sofia Papagiannaki
        form = SimpleBackend(request).get_signup_form(provider)
472 24406ae3 Sofia Papagiannaki
        messages.error(request, e)
473 8f5a3a06 Sofia Papagiannaki
    if request.method == 'POST':
474 8f5a3a06 Sofia Papagiannaki
        if form.is_valid():
475 18ffbee1 Sofia Papagiannaki
            user = form.save(commit=False)
476 8f5a3a06 Sofia Papagiannaki
            try:
477 8f5a3a06 Sofia Papagiannaki
                result = backend.handle_activation(user)
478 8f5a3a06 Sofia Papagiannaki
                status = messages.SUCCESS
479 18ffbee1 Sofia Papagiannaki
                message = result.message
480 792c2f3b Olga Brani
481 792c2f3b Olga Brani
                form.store_user(user, request)
482 792c2f3b Olga Brani
483 ca828a10 Sofia Papagiannaki
                if 'additional_email' in form.cleaned_data:
484 ca828a10 Sofia Papagiannaki
                    additional_email = form.cleaned_data['additional_email']
485 ca828a10 Sofia Papagiannaki
                    if additional_email != user.email:
486 ca828a10 Sofia Papagiannaki
                        user.additionalmail_set.create(email=additional_email)
487 5ce3ce4f Sofia Papagiannaki
                        msg = 'Additional email: %s saved for user %s.' % (
488 6c8a3f7c Sofia Papagiannaki
                            additional_email,
489 6c8a3f7c Sofia Papagiannaki
                            user.email
490 6c8a3f7c Sofia Papagiannaki
                        )
491 b669d9c0 Sofia Papagiannaki
                        logger._log(LOGGING_LEVEL, msg, [])
492 8f5a3a06 Sofia Papagiannaki
                if user and user.is_active:
493 8f5a3a06 Sofia Papagiannaki
                    next = request.POST.get('next', '')
494 40a0cd8b Sofia Papagiannaki
                    response = prepare_response(request, user, next=next)
495 c3f6cdf1 root
                    transaction.commit()
496 40a0cd8b Sofia Papagiannaki
                    return response
497 8f5a3a06 Sofia Papagiannaki
                messages.add_message(request, status, message)
498 792c2f3b Olga Brani
                transaction.commit()
499 279d6e51 Olga Brani
                return render_response(
500 279d6e51 Olga Brani
                    on_success,
501 279d6e51 Olga Brani
                    context_instance=get_context(
502 279d6e51 Olga Brani
                        request,
503 279d6e51 Olga Brani
                        extra_context
504 279d6e51 Olga Brani
                    )
505 279d6e51 Olga Brani
                )
506 18ffbee1 Sofia Papagiannaki
            except SendMailError, e:
507 c44955a6 Sofia Papagiannaki
                logger.exception(e)
508 18ffbee1 Sofia Papagiannaki
                status = messages.ERROR
509 18ffbee1 Sofia Papagiannaki
                message = e.message
510 24406ae3 Sofia Papagiannaki
                messages.error(request, message)
511 10ed0073 Sofia Papagiannaki
                transaction.rollback()
512 18ffbee1 Sofia Papagiannaki
            except BaseException, e:
513 678b2236 Sofia Papagiannaki
                logger.exception(e)
514 ae497612 Olga Brani
                message = _(astakos_messages.GENERIC_ERROR)
515 24406ae3 Sofia Papagiannaki
                messages.error(request, message)
516 0a569195 Sofia Papagiannaki
                logger.exception(e)
517 10ed0073 Sofia Papagiannaki
                transaction.rollback()
518 8f5a3a06 Sofia Papagiannaki
    return render_response(template_name,
519 5ce3ce4f Sofia Papagiannaki
                           signup_form=form,
520 8ab484ea Kostas Papadimitriou
                           third_party_token=third_party_token,
521 5ce3ce4f Sofia Papagiannaki
                           provider=provider,
522 890b0eaf Sofia Papagiannaki
                           context_instance=get_context(request, extra_context))
523 64cd4730 Antony Chazapis
524 5ce3ce4f Sofia Papagiannaki
525 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
526 badcb2a9 Kostas Papadimitriou
@required_auth_methods_assigned(only_warn=True)
527 890b0eaf Sofia Papagiannaki
@login_required
528 270dd48d Sofia Papagiannaki
@signed_terms_required
529 aab4d540 Sofia Papagiannaki
def feedback(request, template_name='im/feedback.html', email_template_name='im/feedback_mail.txt', extra_context=None):
530 890b0eaf Sofia Papagiannaki
    """
531 890b0eaf Sofia Papagiannaki
    Allows a user to send feedback.
532 176023aa Kostas Papadimitriou

533 890b0eaf Sofia Papagiannaki
    In case of GET request renders a form for providing the feedback information.
534 890b0eaf Sofia Papagiannaki
    In case of POST sends an email to support team.
535 176023aa Kostas Papadimitriou

536 2cbaacd5 Sofia Papagiannaki
    If the user isn't logged in, redirects to settings.LOGIN_URL.
537 176023aa Kostas Papadimitriou

538 890b0eaf Sofia Papagiannaki
    **Arguments**
539 176023aa Kostas Papadimitriou

540 890b0eaf Sofia Papagiannaki
    ``template_name``
541 890b0eaf Sofia Papagiannaki
        A custom template to use. This is optional; if not specified,
542 1e685275 Sofia Papagiannaki
        this will default to ``im/feedback.html``.
543 176023aa Kostas Papadimitriou

544 890b0eaf Sofia Papagiannaki
    ``extra_context``
545 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
546 176023aa Kostas Papadimitriou

547 890b0eaf Sofia Papagiannaki
    **Template:**
548 176023aa Kostas Papadimitriou

549 1e685275 Sofia Papagiannaki
    im/signup.html or ``template_name`` keyword argument.
550 176023aa Kostas Papadimitriou

551 890b0eaf Sofia Papagiannaki
    **Settings:**
552 176023aa Kostas Papadimitriou

553 92defad4 Sofia Papagiannaki
    * LOGIN_URL: login uri
554 890b0eaf Sofia Papagiannaki
    """
555 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
556 64cd4730 Antony Chazapis
    if request.method == 'GET':
557 890b0eaf Sofia Papagiannaki
        form = FeedbackForm()
558 890b0eaf Sofia Papagiannaki
    if request.method == 'POST':
559 890b0eaf Sofia Papagiannaki
        if not request.user:
560 890b0eaf Sofia Papagiannaki
            return HttpResponse('Unauthorized', status=401)
561 176023aa Kostas Papadimitriou
562 890b0eaf Sofia Papagiannaki
        form = FeedbackForm(request.POST)
563 890b0eaf Sofia Papagiannaki
        if form.is_valid():
564 e9083112 Sofia Papagiannaki
            msg = form.cleaned_data['feedback_msg']
565 8f5a3a06 Sofia Papagiannaki
            data = form.cleaned_data['feedback_data']
566 538ccdd5 Sofia Papagiannaki
            try:
567 8f5a3a06 Sofia Papagiannaki
                send_feedback(msg, data, request.user, email_template_name)
568 8f5a3a06 Sofia Papagiannaki
            except SendMailError, e:
569 24406ae3 Sofia Papagiannaki
                messages.error(request, message)
570 8f5a3a06 Sofia Papagiannaki
            else:
571 ae497612 Olga Brani
                message = _(astakos_messages.FEEDBACK_SENT)
572 aab4d540 Sofia Papagiannaki
                messages.success(request, message)
573 890b0eaf Sofia Papagiannaki
    return render_response(template_name,
574 5ce3ce4f Sofia Papagiannaki
                           feedback_form=form,
575 5ce3ce4f Sofia Papagiannaki
                           context_instance=get_context(request, extra_context))
576 5ce3ce4f Sofia Papagiannaki
577 15efc749 Sofia Papagiannaki
578 217994f8 Sofia Papagiannaki
@require_http_methods(["GET"])
579 8e45d6fd Sofia Papagiannaki
@signed_terms_required
580 aab4d540 Sofia Papagiannaki
def logout(request, template='registration/logged_out.html', extra_context=None):
581 63ecdd20 Sofia Papagiannaki
    """
582 b2ffa772 Sofia Papagiannaki
    Wraps `django.contrib.auth.logout`.
583 63ecdd20 Sofia Papagiannaki
    """
584 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
585 7482228b Sofia Papagiannaki
    response = HttpResponse()
586 8e45d6fd Sofia Papagiannaki
    if request.user.is_authenticated():
587 8e45d6fd Sofia Papagiannaki
        email = request.user.email
588 8e45d6fd Sofia Papagiannaki
        auth_logout(request)
589 c630fee6 Kostas Papadimitriou
    else:
590 c630fee6 Kostas Papadimitriou
        response['Location'] = reverse('index')
591 c630fee6 Kostas Papadimitriou
        response.status_code = 301
592 c630fee6 Kostas Papadimitriou
        return response
593 c630fee6 Kostas Papadimitriou
594 217994f8 Sofia Papagiannaki
    next = restrict_next(
595 217994f8 Sofia Papagiannaki
        request.GET.get('next'),
596 217994f8 Sofia Papagiannaki
        domain=COOKIE_DOMAIN
597 217994f8 Sofia Papagiannaki
    )
598 c630fee6 Kostas Papadimitriou
599 63ecdd20 Sofia Papagiannaki
    if next:
600 63ecdd20 Sofia Papagiannaki
        response['Location'] = next
601 63ecdd20 Sofia Papagiannaki
        response.status_code = 302
602 0d02a287 Sofia Papagiannaki
    elif LOGOUT_NEXT:
603 0d02a287 Sofia Papagiannaki
        response['Location'] = LOGOUT_NEXT
604 0d02a287 Sofia Papagiannaki
        response.status_code = 301
605 b2ffa772 Sofia Papagiannaki
    else:
606 c0b26605 Sofia Papagiannaki
        messages.add_message(request, messages.SUCCESS, _(astakos_messages.LOGOUT_SUCCESS))
607 c630fee6 Kostas Papadimitriou
        response['Location'] = reverse('index')
608 c630fee6 Kostas Papadimitriou
        response.status_code = 301
609 49df775e Sofia Papagiannaki
    return response
610 2126d85d Sofia Papagiannaki
611 5ce3ce4f Sofia Papagiannaki
612 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
613 683cf244 Sofia Papagiannaki
@transaction.commit_manually
614 3bb604eb Sofia Papagiannaki
def activate(request, greeting_email_template_name='im/welcome_email.txt',
615 3bb604eb Sofia Papagiannaki
             helpdesk_email_template_name='im/helpdesk_notification.txt'):
616 2126d85d Sofia Papagiannaki
    """
617 683cf244 Sofia Papagiannaki
    Activates the user identified by the ``auth`` request parameter, sends a welcome email
618 683cf244 Sofia Papagiannaki
    and renews the user token.
619 176023aa Kostas Papadimitriou

620 683cf244 Sofia Papagiannaki
    The view uses commit_manually decorator in order to ensure the user state will be updated
621 683cf244 Sofia Papagiannaki
    only if the email will be send successfully.
622 2126d85d Sofia Papagiannaki
    """
623 2126d85d Sofia Papagiannaki
    token = request.GET.get('auth')
624 2126d85d Sofia Papagiannaki
    next = request.GET.get('next')
625 2126d85d Sofia Papagiannaki
    try:
626 2126d85d Sofia Papagiannaki
        user = AstakosUser.objects.get(auth_token=token)
627 2126d85d Sofia Papagiannaki
    except AstakosUser.DoesNotExist:
628 279d6e51 Olga Brani
        return HttpResponseBadRequest(_(astakos_messages.ACCOUNT_UNKNOWN))
629 5ce3ce4f Sofia Papagiannaki
630 d1757ca7 Sofia Papagiannaki
    if user.is_active:
631 ae497612 Olga Brani
        message = _(astakos_messages.ACCOUNT_ALREADY_ACTIVE)
632 24406ae3 Sofia Papagiannaki
        messages.error(request, message)
633 279d6e51 Olga Brani
        return index(request)
634 5ce3ce4f Sofia Papagiannaki
635 0a569195 Sofia Papagiannaki
    try:
636 279d6e51 Olga Brani
        activate_func(user, greeting_email_template_name, helpdesk_email_template_name, verify_email=True)
637 ef20ea07 Sofia Papagiannaki
        response = prepare_response(request, user, next, renew=True)
638 ef20ea07 Sofia Papagiannaki
        transaction.commit()
639 279d6e51 Olga Brani
        return response
640 ef20ea07 Sofia Papagiannaki
    except SendMailError, e:
641 ef20ea07 Sofia Papagiannaki
        message = e.message
642 ef20ea07 Sofia Papagiannaki
        messages.add_message(request, messages.ERROR, message)
643 ef20ea07 Sofia Papagiannaki
        transaction.rollback()
644 279d6e51 Olga Brani
        return index(request)
645 ef20ea07 Sofia Papagiannaki
    except BaseException, e:
646 ef20ea07 Sofia Papagiannaki
        status = messages.ERROR
647 c0b26605 Sofia Papagiannaki
        message = _(astakos_messages.GENERIC_ERROR)
648 ef20ea07 Sofia Papagiannaki
        messages.add_message(request, messages.ERROR, message)
649 ef20ea07 Sofia Papagiannaki
        logger.exception(e)
650 ef20ea07 Sofia Papagiannaki
        transaction.rollback()
651 279d6e51 Olga Brani
        return index(request)
652 270dd48d Sofia Papagiannaki
653 5ce3ce4f Sofia Papagiannaki
654 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
655 aab4d540 Sofia Papagiannaki
def approval_terms(request, term_id=None, template_name='im/approval_terms.html', extra_context=None):
656 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
657 270dd48d Sofia Papagiannaki
    term = None
658 270dd48d Sofia Papagiannaki
    terms = None
659 270dd48d Sofia Papagiannaki
    if not term_id:
660 270dd48d Sofia Papagiannaki
        try:
661 270dd48d Sofia Papagiannaki
            term = ApprovalTerms.objects.order_by('-id')[0]
662 270dd48d Sofia Papagiannaki
        except IndexError:
663 270dd48d Sofia Papagiannaki
            pass
664 270dd48d Sofia Papagiannaki
    else:
665 270dd48d Sofia Papagiannaki
        try:
666 aab4d540 Sofia Papagiannaki
            term = ApprovalTerms.objects.get(id=term_id)
667 aab4d540 Sofia Papagiannaki
        except ApprovalTerms.DoesNotExist, e:
668 270dd48d Sofia Papagiannaki
            pass
669 176023aa Kostas Papadimitriou
670 270dd48d Sofia Papagiannaki
    if not term:
671 ae497612 Olga Brani
        messages.error(request, _(astakos_messages.NO_APPROVAL_TERMS))
672 6ff7a7ca Sofia Papagiannaki
        return HttpResponseRedirect(reverse('index'))
673 270dd48d Sofia Papagiannaki
    f = open(term.location, 'r')
674 270dd48d Sofia Papagiannaki
    terms = f.read()
675 176023aa Kostas Papadimitriou
676 270dd48d Sofia Papagiannaki
    if request.method == 'POST':
677 217994f8 Sofia Papagiannaki
        next = restrict_next(
678 217994f8 Sofia Papagiannaki
            request.POST.get('next'),
679 217994f8 Sofia Papagiannaki
            domain=COOKIE_DOMAIN
680 217994f8 Sofia Papagiannaki
        )
681 270dd48d Sofia Papagiannaki
        if not next:
682 6ff7a7ca Sofia Papagiannaki
            next = reverse('index')
683 270dd48d Sofia Papagiannaki
        form = SignApprovalTermsForm(request.POST, instance=request.user)
684 270dd48d Sofia Papagiannaki
        if not form.is_valid():
685 270dd48d Sofia Papagiannaki
            return render_response(template_name,
686 5ce3ce4f Sofia Papagiannaki
                                   terms=terms,
687 5ce3ce4f Sofia Papagiannaki
                                   approval_terms_form=form,
688 5ce3ce4f Sofia Papagiannaki
                                   context_instance=get_context(request, extra_context))
689 270dd48d Sofia Papagiannaki
        user = form.save()
690 270dd48d Sofia Papagiannaki
        return HttpResponseRedirect(next)
691 270dd48d Sofia Papagiannaki
    else:
692 586967c0 Sofia Papagiannaki
        form = None
693 fcf90160 Sofia Papagiannaki
        if request.user.is_authenticated() and not request.user.signed_terms:
694 586967c0 Sofia Papagiannaki
            form = SignApprovalTermsForm(instance=request.user)
695 270dd48d Sofia Papagiannaki
        return render_response(template_name,
696 5ce3ce4f Sofia Papagiannaki
                               terms=terms,
697 5ce3ce4f Sofia Papagiannaki
                               approval_terms_form=form,
698 5ce3ce4f Sofia Papagiannaki
                               context_instance=get_context(request, extra_context))
699 5ce3ce4f Sofia Papagiannaki
700 270dd48d Sofia Papagiannaki
701 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
702 badcb2a9 Kostas Papadimitriou
@valid_astakos_user_required
703 49790d9d Sofia Papagiannaki
@transaction.commit_manually
704 49790d9d Sofia Papagiannaki
def change_email(request, activation_key=None,
705 49790d9d Sofia Papagiannaki
                 email_template_name='registration/email_change_email.txt',
706 49790d9d Sofia Papagiannaki
                 form_template_name='registration/email_change_form.html',
707 49790d9d Sofia Papagiannaki
                 confirm_template_name='registration/email_change_done.html',
708 aab4d540 Sofia Papagiannaki
                 extra_context=None):
709 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
710 53e0b8fe Kostas Papadimitriou
711 53e0b8fe Kostas Papadimitriou
712 49790d9d Sofia Papagiannaki
    if activation_key:
713 49790d9d Sofia Papagiannaki
        try:
714 49790d9d Sofia Papagiannaki
            user = EmailChange.objects.change_email(activation_key)
715 49790d9d Sofia Papagiannaki
            if request.user.is_authenticated() and request.user == user:
716 ae497612 Olga Brani
                msg = _(astakos_messages.EMAIL_CHANGED)
717 24406ae3 Sofia Papagiannaki
                messages.success(request, msg)
718 49790d9d Sofia Papagiannaki
                auth_logout(request)
719 49790d9d Sofia Papagiannaki
                response = prepare_response(request, user)
720 49790d9d Sofia Papagiannaki
                transaction.commit()
721 53e0b8fe Kostas Papadimitriou
                return HttpResponseRedirect(reverse('edit_profile'))
722 49790d9d Sofia Papagiannaki
        except ValueError, e:
723 24406ae3 Sofia Papagiannaki
            messages.error(request, e)
724 53e0b8fe Kostas Papadimitriou
            transaction.rollback()
725 53e0b8fe Kostas Papadimitriou
            return HttpResponseRedirect(reverse('index'))
726 53e0b8fe Kostas Papadimitriou
727 49790d9d Sofia Papagiannaki
        return render_response(confirm_template_name,
728 53e0b8fe Kostas Papadimitriou
                               modified_user=user if 'user' in locals() \
729 53e0b8fe Kostas Papadimitriou
                               else None, context_instance=get_context(request,
730 5ce3ce4f Sofia Papagiannaki
                                                            extra_context))
731 5ce3ce4f Sofia Papagiannaki
732 49790d9d Sofia Papagiannaki
    if not request.user.is_authenticated():
733 49790d9d Sofia Papagiannaki
        path = quote(request.get_full_path())
734 6ff7a7ca Sofia Papagiannaki
        url = request.build_absolute_uri(reverse('index'))
735 49790d9d Sofia Papagiannaki
        return HttpResponseRedirect(url + '?next=' + path)
736 53e0b8fe Kostas Papadimitriou
737 53e0b8fe Kostas Papadimitriou
    # clean up expired email changes
738 53e0b8fe Kostas Papadimitriou
    if request.user.email_change_is_pending():
739 53e0b8fe Kostas Papadimitriou
        change = request.user.emailchanges.get()
740 53e0b8fe Kostas Papadimitriou
        if change.activation_key_expired():
741 53e0b8fe Kostas Papadimitriou
            change.delete()
742 53e0b8fe Kostas Papadimitriou
            transaction.commit()
743 53e0b8fe Kostas Papadimitriou
            return HttpResponseRedirect(reverse('email_change'))
744 53e0b8fe Kostas Papadimitriou
745 49790d9d Sofia Papagiannaki
    form = EmailChangeForm(request.POST or None)
746 49790d9d Sofia Papagiannaki
    if request.method == 'POST' and form.is_valid():
747 49790d9d Sofia Papagiannaki
        try:
748 53e0b8fe Kostas Papadimitriou
            # delete pending email changes
749 53e0b8fe Kostas Papadimitriou
            request.user.emailchanges.all().delete()
750 49790d9d Sofia Papagiannaki
            ec = form.save(email_template_name, request)
751 49790d9d Sofia Papagiannaki
        except SendMailError, e:
752 49790d9d Sofia Papagiannaki
            msg = e
753 24406ae3 Sofia Papagiannaki
            messages.error(request, msg)
754 49790d9d Sofia Papagiannaki
            transaction.rollback()
755 53e0b8fe Kostas Papadimitriou
            return HttpResponseRedirect(reverse('edit_profile'))
756 49790d9d Sofia Papagiannaki
        else:
757 ae497612 Olga Brani
            msg = _(astakos_messages.EMAIL_CHANGE_REGISTERED)
758 24406ae3 Sofia Papagiannaki
            messages.success(request, msg)
759 49790d9d Sofia Papagiannaki
            transaction.commit()
760 53e0b8fe Kostas Papadimitriou
            return HttpResponseRedirect(reverse('edit_profile'))
761 53e0b8fe Kostas Papadimitriou
762 53e0b8fe Kostas Papadimitriou
    if request.user.email_change_is_pending():
763 53e0b8fe Kostas Papadimitriou
        messages.warning(request, astakos_messages.PENDING_EMAIL_CHANGE_REQUEST)
764 53e0b8fe Kostas Papadimitriou
765 c0b26605 Sofia Papagiannaki
    return render_response(
766 c0b26605 Sofia Papagiannaki
        form_template_name,
767 c0b26605 Sofia Papagiannaki
        form=form,
768 c0b26605 Sofia Papagiannaki
        context_instance=get_context(request, extra_context)
769 c0b26605 Sofia Papagiannaki
    )
770 1f3b4b39 Sofia Papagiannaki
771 1f3b4b39 Sofia Papagiannaki
772 1f3b4b39 Sofia Papagiannaki
def send_activation(request, user_id, template_name='im/login.html', extra_context=None):
773 792c2f3b Olga Brani
774 badcb2a9 Kostas Papadimitriou
    if request.user.is_authenticated():
775 badcb2a9 Kostas Papadimitriou
        messages.error(request, _(astakos_messages.ALREADY_LOGGED_IN))
776 badcb2a9 Kostas Papadimitriou
        return HttpResponseRedirect(reverse('edit_profile'))
777 badcb2a9 Kostas Papadimitriou
778 48421603 Kostas Papadimitriou
    if astakos_settings.MODERATION_ENABLED:
779 792c2f3b Olga Brani
        raise PermissionDenied
780 792c2f3b Olga Brani
781 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
782 1f3b4b39 Sofia Papagiannaki
    try:
783 1f3b4b39 Sofia Papagiannaki
        u = AstakosUser.objects.get(id=user_id)
784 1f3b4b39 Sofia Papagiannaki
    except AstakosUser.DoesNotExist:
785 c0b26605 Sofia Papagiannaki
        messages.error(request, _(astakos_messages.ACCOUNT_UNKNOWN))
786 1f3b4b39 Sofia Papagiannaki
    else:
787 1f3b4b39 Sofia Papagiannaki
        try:
788 1f3b4b39 Sofia Papagiannaki
            send_activation_func(u)
789 c0b26605 Sofia Papagiannaki
            msg = _(astakos_messages.ACTIVATION_SENT)
790 1f3b4b39 Sofia Papagiannaki
            messages.success(request, msg)
791 1f3b4b39 Sofia Papagiannaki
        except SendMailError, e:
792 1f3b4b39 Sofia Papagiannaki
            messages.error(request, e)
793 1f3b4b39 Sofia Papagiannaki
    return render_response(
794 1f3b4b39 Sofia Papagiannaki
        template_name,
795 c0b26605 Sofia Papagiannaki
        login_form = LoginForm(request=request),
796 1f3b4b39 Sofia Papagiannaki
        context_instance = get_context(
797 1f3b4b39 Sofia Papagiannaki
            request,
798 1f3b4b39 Sofia Papagiannaki
            extra_context
799 1f3b4b39 Sofia Papagiannaki
        )
800 1f3b4b39 Sofia Papagiannaki
    )
801 5ce3ce4f Sofia Papagiannaki
802 73fbaec4 Sofia Papagiannaki
803 73fbaec4 Sofia Papagiannaki
@require_http_methods(["GET"])
804 badcb2a9 Kostas Papadimitriou
@valid_astakos_user_required
805 666c7490 Sofia Papagiannaki
def resource_usage(request):
806 e9ef5009 Kostas Papadimitriou
807 e9ef5009 Kostas Papadimitriou
    def with_class(entry):
808 e9ef5009 Kostas Papadimitriou
         entry['load_class'] = 'red'
809 e9ef5009 Kostas Papadimitriou
         max_value = float(entry['maxValue'])
810 e9ef5009 Kostas Papadimitriou
         curr_value = float(entry['currValue'])
811 e9ef5009 Kostas Papadimitriou
         entry['ratio_limited']= 0
812 e9ef5009 Kostas Papadimitriou
         if max_value > 0 :
813 e9ef5009 Kostas Papadimitriou
             entry['ratio'] = (curr_value / max_value) * 100
814 e9ef5009 Kostas Papadimitriou
         else:
815 e9ef5009 Kostas Papadimitriou
             entry['ratio'] = 0
816 e9ef5009 Kostas Papadimitriou
         if entry['ratio'] < 66:
817 e9ef5009 Kostas Papadimitriou
             entry['load_class'] = 'yellow'
818 e9ef5009 Kostas Papadimitriou
         if entry['ratio'] < 33:
819 e9ef5009 Kostas Papadimitriou
             entry['load_class'] = 'green'
820 e9ef5009 Kostas Papadimitriou
         if entry['ratio']<0:
821 e9ef5009 Kostas Papadimitriou
             entry['ratio'] = 0
822 e9ef5009 Kostas Papadimitriou
         if entry['ratio']>100:
823 e9ef5009 Kostas Papadimitriou
             entry['ratio_limited'] = 100
824 e9ef5009 Kostas Papadimitriou
         else:
825 e9ef5009 Kostas Papadimitriou
             entry['ratio_limited'] = entry['ratio']
826 e9ef5009 Kostas Papadimitriou
         return entry
827 e9ef5009 Kostas Papadimitriou
828 e9ef5009 Kostas Papadimitriou
    def pluralize(entry):
829 e9ef5009 Kostas Papadimitriou
        entry['plural'] = engine.plural(entry.get('name'))
830 e9ef5009 Kostas Papadimitriou
        return entry
831 e9ef5009 Kostas Papadimitriou
832 a9c7ff8a Sofia Papagiannaki
    resource_usage = None
833 666c7490 Sofia Papagiannaki
    result = callpoint.get_user_usage(request.user.id)
834 820b18e0 Sofia Papagiannaki
    if result.is_success:
835 a9c7ff8a Sofia Papagiannaki
        resource_usage = result.data
836 e9ef5009 Kostas Papadimitriou
        backenddata = map(with_class, result.data)
837 e9ef5009 Kostas Papadimitriou
        backenddata = map(with_class, backenddata)
838 e9ef5009 Kostas Papadimitriou
839 9a06d96f Olga Brani
    else:
840 820b18e0 Sofia Papagiannaki
        messages.error(request, result.reason)
841 666c7490 Sofia Papagiannaki
    return render_response('im/resource_usage.html',
842 3cbd5e47 Olga Brani
                           context_instance=get_context(request),
843 e9ef5009 Kostas Papadimitriou
                           resource_usage=backenddata,
844 3cbd5e47 Olga Brani
                           result=result)
845 9a06d96f Olga Brani
846 1b866d9e Olga Brani
847 f8f86e83 root
##@require_http_methods(["GET"])
848 f8f86e83 root
#@require_http_methods(["POST", "GET"])
849 f8f86e83 root
#@signed_terms_required
850 f8f86e83 root
#@login_required
851 f8f86e83 root
#def billing(request):
852 f8f86e83 root
#
853 f8f86e83 root
#    today = datetime.today()
854 f8f86e83 root
#    month_last_day = calendar.monthrange(today.year, today.month)[1]
855 f8f86e83 root
#    start = request.POST.get('datefrom', None)
856 f8f86e83 root
#    if start:
857 f8f86e83 root
#        today = datetime.fromtimestamp(int(start))
858 f8f86e83 root
#        month_last_day = calendar.monthrange(today.year, today.month)[1]
859 f8f86e83 root
#
860 f8f86e83 root
#    start = datetime(today.year, today.month, 1).strftime("%s")
861 f8f86e83 root
#    end = datetime(today.year, today.month, month_last_day).strftime("%s")
862 f8f86e83 root
#    r = request_billing.apply(args=('pgerakios@grnet.gr',
863 f8f86e83 root
#                                    int(start) * 1000,
864 f8f86e83 root
#                                    int(end) * 1000))
865 f8f86e83 root
#    data = {}
866 f8f86e83 root
#
867 f8f86e83 root
#    try:
868 f8f86e83 root
#        status, data = r.result
869 f8f86e83 root
#        data = _clear_billing_data(data)
870 f8f86e83 root
#        if status != 200:
871 f8f86e83 root
#            messages.error(request, _(astakos_messages.BILLING_ERROR) % status)
872 f8f86e83 root
#    except:
873 f8f86e83 root
#        messages.error(request, r.result)
874 f8f86e83 root
#
875 f8f86e83 root
#    return render_response(
876 f8f86e83 root
#        template='im/billing.html',
877 f8f86e83 root
#        context_instance=get_context(request),
878 f8f86e83 root
#        data=data,
879 f8f86e83 root
#        zerodate=datetime(month=1, year=1970, day=1),
880 f8f86e83 root
#        today=today,
881 f8f86e83 root
#        start=int(start),
882 f8f86e83 root
#        month_last_day=month_last_day)
883 9a06d96f Olga Brani
884 54213d7a Sofia Papagiannaki
885 f8f86e83 root
#def _clear_billing_data(data):
886 f8f86e83 root
#
887 f8f86e83 root
#    # remove addcredits entries
888 f8f86e83 root
#    def isnotcredit(e):
889 f8f86e83 root
#        return e['serviceName'] != "addcredits"
890 f8f86e83 root
#
891 f8f86e83 root
#    # separate services
892 f8f86e83 root
#    def servicefilter(service_name):
893 f8f86e83 root
#        service = service_name
894 f8f86e83 root
#
895 f8f86e83 root
#        def fltr(e):
896 f8f86e83 root
#            return e['serviceName'] == service
897 f8f86e83 root
#        return fltr
898 f8f86e83 root
#
899 f8f86e83 root
#    data['bill_nocredits'] = filter(isnotcredit, data['bill'])
900 f8f86e83 root
#    data['bill_vmtime'] = filter(servicefilter('vmtime'), data['bill'])
901 f8f86e83 root
#    data['bill_diskspace'] = filter(servicefilter('diskspace'), data['bill'])
902 f8f86e83 root
#    data['bill_addcredits'] = filter(servicefilter('addcredits'), data['bill'])
903 f8f86e83 root
#
904 f8f86e83 root
#    return data
905 792c2f3b Olga Brani
906 792c2f3b Olga Brani
907 e1a80257 Sofia Papagiannaki
# #@require_http_methods(["GET"])
908 e1a80257 Sofia Papagiannaki
# @require_http_methods(["POST", "GET"])
909 e1a80257 Sofia Papagiannaki
# @signed_terms_required
910 e1a80257 Sofia Papagiannaki
# @login_required
911 e1a80257 Sofia Papagiannaki
# def timeline(request):
912 e1a80257 Sofia Papagiannaki
# #    data = {'entity':request.user.email}
913 e1a80257 Sofia Papagiannaki
#     timeline_body = ()
914 e1a80257 Sofia Papagiannaki
#     timeline_header = ()
915 e1a80257 Sofia Papagiannaki
# #    form = TimelineForm(data)
916 e1a80257 Sofia Papagiannaki
#     form = TimelineForm()
917 e1a80257 Sofia Papagiannaki
#     if request.method == 'POST':
918 e1a80257 Sofia Papagiannaki
#         data = request.POST
919 e1a80257 Sofia Papagiannaki
#         form = TimelineForm(data)
920 e1a80257 Sofia Papagiannaki
#         if form.is_valid():
921 e1a80257 Sofia Papagiannaki
#             data = form.cleaned_data
922 e1a80257 Sofia Papagiannaki
#             timeline_header = ('entity', 'resource',
923 e1a80257 Sofia Papagiannaki
#                                'event name', 'event date',
924 e1a80257 Sofia Papagiannaki
#                                'incremental cost', 'total cost')
925 e1a80257 Sofia Papagiannaki
#             timeline_body = timeline_charge(
926 e1a80257 Sofia Papagiannaki
#                 data['entity'], data['resource'],
927 e1a80257 Sofia Papagiannaki
#                 data['start_date'], data['end_date'],
928 e1a80257 Sofia Papagiannaki
#                 data['details'], data['operation'])
929 f7cf5257 Kostas Papadimitriou
#
930 e1a80257 Sofia Papagiannaki
#     return render_response(template='im/timeline.html',
931 e1a80257 Sofia Papagiannaki
#                            context_instance=get_context(request),
932 e1a80257 Sofia Papagiannaki
#                            form=form,
933 e1a80257 Sofia Papagiannaki
#                            timeline_header=timeline_header,
934 e1a80257 Sofia Papagiannaki
#                            timeline_body=timeline_body)
935 e1a80257 Sofia Papagiannaki
#     return data
936 5ebebb20 Olga Brani
937 792c2f3b Olga Brani
938 f432088a Kostas Papadimitriou
# TODO: action only on POST and user should confirm the removal
939 d2633501 Kostas Papadimitriou
@require_http_methods(["GET", "POST"])
940 d2633501 Kostas Papadimitriou
@login_required
941 d2633501 Kostas Papadimitriou
@signed_terms_required
942 d2633501 Kostas Papadimitriou
def remove_auth_provider(request, pk):
943 f432088a Kostas Papadimitriou
    try:
944 f432088a Kostas Papadimitriou
        provider = request.user.auth_providers.get(pk=pk)
945 f432088a Kostas Papadimitriou
    except AstakosUserAuthProvider.DoesNotExist:
946 f432088a Kostas Papadimitriou
        raise Http404
947 f432088a Kostas Papadimitriou
948 d2633501 Kostas Papadimitriou
    if provider.can_remove():
949 d2633501 Kostas Papadimitriou
        provider.delete()
950 d2633501 Kostas Papadimitriou
        return HttpResponseRedirect(reverse('edit_profile'))
951 d2633501 Kostas Papadimitriou
    else:
952 f432088a Kostas Papadimitriou
        raise PermissionDenied
953 5ebebb20 Olga Brani
954 792c2f3b Olga Brani
955 5ebebb20 Olga Brani
def how_it_works(request):
956 5ebebb20 Olga Brani
    return render_response(
957 ccab6eb5 Sofia Papagiannaki
        'im/how_it_works.html',
958 ccab6eb5 Sofia Papagiannaki
        context_instance=get_context(request))
959 e1a80257 Sofia Papagiannaki
960 bfe23b13 Sofia Papagiannaki
@transaction.commit_manually
961 172ce682 Sofia Papagiannaki
def _create_object(request, model=None, template_name=None,
962 172ce682 Sofia Papagiannaki
        template_loader=template_loader, extra_context=None, post_save_redirect=None,
963 172ce682 Sofia Papagiannaki
        login_required=False, context_processors=None, form_class=None):
964 172ce682 Sofia Papagiannaki
    """
965 4e748491 Sofia Papagiannaki
    Based of django.views.generic.create_update.create_object which displays a
966 172ce682 Sofia Papagiannaki
    summary page before creating the object.
967 172ce682 Sofia Papagiannaki
    """
968 bfe23b13 Sofia Papagiannaki
    rollback = False
969 172ce682 Sofia Papagiannaki
    response = None
970 4e748491 Sofia Papagiannaki
971 4e748491 Sofia Papagiannaki
    if extra_context is None: extra_context = {}
972 4e748491 Sofia Papagiannaki
    if login_required and not request.user.is_authenticated():
973 4e748491 Sofia Papagiannaki
        return redirect_to_login(request.path)
974 ccab6eb5 Sofia Papagiannaki
    try:
975 f7cf5257 Kostas Papadimitriou
976 172ce682 Sofia Papagiannaki
        model, form_class = get_model_and_form_class(model, form_class)
977 172ce682 Sofia Papagiannaki
        extra_context['edit'] = 0
978 172ce682 Sofia Papagiannaki
        if request.method == 'POST':
979 172ce682 Sofia Papagiannaki
            form = form_class(request.POST, request.FILES)
980 172ce682 Sofia Papagiannaki
            if form.is_valid():
981 172ce682 Sofia Papagiannaki
                verify = request.GET.get('verify')
982 172ce682 Sofia Papagiannaki
                edit = request.GET.get('edit')
983 172ce682 Sofia Papagiannaki
                if verify == '1':
984 172ce682 Sofia Papagiannaki
                    extra_context['show_form'] = False
985 172ce682 Sofia Papagiannaki
                    extra_context['form_data'] = form.cleaned_data
986 172ce682 Sofia Papagiannaki
                elif edit == '1':
987 172ce682 Sofia Papagiannaki
                    extra_context['show_form'] = True
988 172ce682 Sofia Papagiannaki
                else:
989 172ce682 Sofia Papagiannaki
                    new_object = form.save()
990 f7cf5257 Kostas Papadimitriou
991 172ce682 Sofia Papagiannaki
                    msg = _("The %(verbose_name)s was created successfully.") %\
992 172ce682 Sofia Papagiannaki
                                {"verbose_name": model._meta.verbose_name}
993 172ce682 Sofia Papagiannaki
                    messages.success(request, msg, fail_silently=True)
994 172ce682 Sofia Papagiannaki
                    response = redirect(post_save_redirect, new_object)
995 172ce682 Sofia Papagiannaki
        else:
996 172ce682 Sofia Papagiannaki
            form = form_class()
997 b8f05f8d Sofia Papagiannaki
    except BaseException, e:
998 b8f05f8d Sofia Papagiannaki
        logger.exception(e)
999 b8f05f8d Sofia Papagiannaki
        messages.error(request, _(astakos_messages.GENERIC_ERROR))
1000 bfe23b13 Sofia Papagiannaki
        rollback = True
1001 bfe23b13 Sofia Papagiannaki
    finally:
1002 bfe23b13 Sofia Papagiannaki
        if rollback:
1003 bfe23b13 Sofia Papagiannaki
            transaction.rollback()
1004 bfe23b13 Sofia Papagiannaki
        else:
1005 bfe23b13 Sofia Papagiannaki
            transaction.commit()
1006 4e748491 Sofia Papagiannaki
1007 172ce682 Sofia Papagiannaki
        if response == None:
1008 172ce682 Sofia Papagiannaki
            # Create the template, context, response
1009 172ce682 Sofia Papagiannaki
            if not template_name:
1010 172ce682 Sofia Papagiannaki
                template_name = "%s/%s_form.html" %\
1011 172ce682 Sofia Papagiannaki
                     (model._meta.app_label, model._meta.object_name.lower())
1012 172ce682 Sofia Papagiannaki
            t = template_loader.get_template(template_name)
1013 172ce682 Sofia Papagiannaki
            c = RequestContext(request, {
1014 172ce682 Sofia Papagiannaki
                'form': form
1015 172ce682 Sofia Papagiannaki
            }, context_processors)
1016 172ce682 Sofia Papagiannaki
            apply_extra_context(extra_context, c)
1017 172ce682 Sofia Papagiannaki
            response = HttpResponse(t.render(c))
1018 172ce682 Sofia Papagiannaki
        return response
1019 172ce682 Sofia Papagiannaki
1020 4e748491 Sofia Papagiannaki
@transaction.commit_manually
1021 4e748491 Sofia Papagiannaki
def _update_object(request, model=None, object_id=None, slug=None,
1022 4e748491 Sofia Papagiannaki
        slug_field='slug', template_name=None, template_loader=template_loader,
1023 4e748491 Sofia Papagiannaki
        extra_context=None, post_save_redirect=None, login_required=False,
1024 4e748491 Sofia Papagiannaki
        context_processors=None, template_object_name='object',
1025 4e748491 Sofia Papagiannaki
        form_class=None):
1026 4e748491 Sofia Papagiannaki
    """
1027 4e748491 Sofia Papagiannaki
    Based of django.views.generic.create_update.update_object which displays a
1028 4e748491 Sofia Papagiannaki
    summary page before updating the object.
1029 4e748491 Sofia Papagiannaki
    """
1030 4e748491 Sofia Papagiannaki
    rollback = False
1031 4e748491 Sofia Papagiannaki
    response = None
1032 4e748491 Sofia Papagiannaki
1033 4e748491 Sofia Papagiannaki
    if extra_context is None: extra_context = {}
1034 4e748491 Sofia Papagiannaki
    if login_required and not request.user.is_authenticated():
1035 4e748491 Sofia Papagiannaki
        return redirect_to_login(request.path)
1036 f7cf5257 Kostas Papadimitriou
1037 4e748491 Sofia Papagiannaki
    try:
1038 4e748491 Sofia Papagiannaki
        model, form_class = get_model_and_form_class(model, form_class)
1039 4e748491 Sofia Papagiannaki
        obj = lookup_object(model, object_id, slug, slug_field)
1040 f7cf5257 Kostas Papadimitriou
1041 4e748491 Sofia Papagiannaki
        if request.method == 'POST':
1042 4e748491 Sofia Papagiannaki
            form = form_class(request.POST, request.FILES, instance=obj)
1043 4e748491 Sofia Papagiannaki
            if form.is_valid():
1044 4e748491 Sofia Papagiannaki
                verify = request.GET.get('verify')
1045 4e748491 Sofia Papagiannaki
                edit = request.GET.get('edit')
1046 4e748491 Sofia Papagiannaki
                if verify == '1':
1047 4e748491 Sofia Papagiannaki
                    extra_context['show_form'] = False
1048 4e748491 Sofia Papagiannaki
                    extra_context['form_data'] = form.cleaned_data
1049 4e748491 Sofia Papagiannaki
                elif edit == '1':
1050 4e748491 Sofia Papagiannaki
                    extra_context['show_form'] = True
1051 f7cf5257 Kostas Papadimitriou
                else:
1052 4e748491 Sofia Papagiannaki
                    obj = form.save()
1053 4e748491 Sofia Papagiannaki
                    msg = _("The %(verbose_name)s was updated successfully.") %\
1054 4e748491 Sofia Papagiannaki
                                {"verbose_name": model._meta.verbose_name}
1055 4e748491 Sofia Papagiannaki
                    messages.success(request, msg, fail_silently=True)
1056 4e748491 Sofia Papagiannaki
                    response = redirect(post_save_redirect, obj)
1057 4e748491 Sofia Papagiannaki
        else:
1058 4e748491 Sofia Papagiannaki
            form = form_class(instance=obj)
1059 4e748491 Sofia Papagiannaki
    except BaseException, e:
1060 4e748491 Sofia Papagiannaki
        logger.exception(e)
1061 4e748491 Sofia Papagiannaki
        messages.error(request, _(astakos_messages.GENERIC_ERROR))
1062 4e748491 Sofia Papagiannaki
        rollback = True
1063 4e748491 Sofia Papagiannaki
    finally:
1064 4e748491 Sofia Papagiannaki
        if rollback:
1065 4e748491 Sofia Papagiannaki
            transaction.rollback()
1066 4e748491 Sofia Papagiannaki
        else:
1067 4e748491 Sofia Papagiannaki
            transaction.commit()
1068 4e748491 Sofia Papagiannaki
        if response == None:
1069 4e748491 Sofia Papagiannaki
            if not template_name:
1070 4e748491 Sofia Papagiannaki
                template_name = "%s/%s_form.html" %\
1071 4e748491 Sofia Papagiannaki
                    (model._meta.app_label, model._meta.object_name.lower())
1072 4e748491 Sofia Papagiannaki
            t = template_loader.get_template(template_name)
1073 4e748491 Sofia Papagiannaki
            c = RequestContext(request, {
1074 4e748491 Sofia Papagiannaki
                'form': form,
1075 4e748491 Sofia Papagiannaki
                template_object_name: obj,
1076 4e748491 Sofia Papagiannaki
            }, context_processors)
1077 4e748491 Sofia Papagiannaki
            apply_extra_context(extra_context, c)
1078 4e748491 Sofia Papagiannaki
            response = HttpResponse(t.render(c))
1079 4e748491 Sofia Papagiannaki
            populate_xheaders(request, response, model, getattr(obj, obj._meta.pk.attname))
1080 4e748491 Sofia Papagiannaki
        return response
1081 4e748491 Sofia Papagiannaki
1082 172ce682 Sofia Papagiannaki
@require_http_methods(["GET", "POST"])
1083 172ce682 Sofia Papagiannaki
@signed_terms_required
1084 172ce682 Sofia Papagiannaki
@login_required
1085 172ce682 Sofia Papagiannaki
def project_add(request):
1086 172ce682 Sofia Papagiannaki
    result = callpoint.list_resources()
1087 172ce682 Sofia Papagiannaki
    if not result.is_success:
1088 172ce682 Sofia Papagiannaki
        messages.error(
1089 172ce682 Sofia Papagiannaki
            request,
1090 172ce682 Sofia Papagiannaki
            'Unable to retrieve system resources: %s' % result.reason
1091 172ce682 Sofia Papagiannaki
    )
1092 172ce682 Sofia Papagiannaki
    else:
1093 172ce682 Sofia Papagiannaki
        resource_catalog = result.data
1094 172ce682 Sofia Papagiannaki
    extra_context = {'resource_catalog':resource_catalog, 'show_form':True}
1095 172ce682 Sofia Papagiannaki
    return _create_object(request, template_name='im/projects/projectapplication_form.html',
1096 fcc1e93f Sofia Papagiannaki
        extra_context=extra_context, post_save_redirect=reverse('project_list'),
1097 172ce682 Sofia Papagiannaki
        form_class=ProjectApplicationForm)
1098 ccab6eb5 Sofia Papagiannaki
1099 e1a80257 Sofia Papagiannaki
1100 e1a80257 Sofia Papagiannaki
@require_http_methods(["GET"])
1101 e1a80257 Sofia Papagiannaki
@signed_terms_required
1102 e1a80257 Sofia Papagiannaki
@login_required
1103 f3342849 Sofia Papagiannaki
def project_list(request):
1104 2a965273 Sofia Papagiannaki
    q = ProjectApplication.objects.filter(owner=request.user)
1105 045386db Olga Brani
    q |= ProjectApplication.objects.filter(applicant=request.user)
1106 2a965273 Sofia Papagiannaki
    q |= ProjectApplication.objects.filter(
1107 2a965273 Sofia Papagiannaki
        project__in=request.user.projectmembership_set.values_list('project', flat=True)
1108 2a965273 Sofia Papagiannaki
    )
1109 ccab6eb5 Sofia Papagiannaki
    q = q.select_related()
1110 73fbaec4 Sofia Papagiannaki
    sorting = 'name'
1111 8327782d Sofia Papagiannaki
    sort_form = ProjectSortForm(request.GET)
1112 8327782d Sofia Papagiannaki
    if sort_form.is_valid():
1113 8327782d Sofia Papagiannaki
        sorting = sort_form.cleaned_data.get('sorting')
1114 8327782d Sofia Papagiannaki
    q = q.order_by(sorting)
1115 f7cf5257 Kostas Papadimitriou
1116 e1a80257 Sofia Papagiannaki
    return object_list(
1117 e1a80257 Sofia Papagiannaki
        request,
1118 2a965273 Sofia Papagiannaki
        q,
1119 30dd9e0e Olga Brani
        paginate_by=PAGINATE_BY,
1120 e1a80257 Sofia Papagiannaki
        page=request.GET.get('page') or 1,
1121 71a38edf Sofia Papagiannaki
        template_name='im/projects/project_list.html',
1122 71a38edf Sofia Papagiannaki
        extra_context={
1123 71a38edf Sofia Papagiannaki
            'is_search':False,
1124 bfe23b13 Sofia Papagiannaki
            'sorting':sorting
1125 71a38edf Sofia Papagiannaki
        }
1126 71a38edf Sofia Papagiannaki
    )
1127 e1a80257 Sofia Papagiannaki
1128 f3342849 Sofia Papagiannaki
@require_http_methods(["GET", "POST"])
1129 e1a80257 Sofia Papagiannaki
@signed_terms_required
1130 e1a80257 Sofia Papagiannaki
@login_required
1131 73fbaec4 Sofia Papagiannaki
def project_update(request, application_id):
1132 8327782d Sofia Papagiannaki
    result = callpoint.list_resources()
1133 8327782d Sofia Papagiannaki
    if not result.is_success:
1134 8327782d Sofia Papagiannaki
        messages.error(
1135 8327782d Sofia Papagiannaki
            request,
1136 8327782d Sofia Papagiannaki
            'Unable to retrieve system resources: %s' % result.reason
1137 8327782d Sofia Papagiannaki
    )
1138 172ce682 Sofia Papagiannaki
    else:
1139 172ce682 Sofia Papagiannaki
        resource_catalog = result.data
1140 5200e864 Sofia Papagiannaki
    extra_context = {'resource_catalog':resource_catalog, 'show_form':True}
1141 4e748491 Sofia Papagiannaki
    return _update_object(
1142 f3342849 Sofia Papagiannaki
        request,
1143 73fbaec4 Sofia Papagiannaki
        object_id=application_id,
1144 8327782d Sofia Papagiannaki
        template_name='im/projects/projectapplication_form.html',
1145 8327782d Sofia Papagiannaki
        extra_context=extra_context, post_save_redirect='/im/project/list/',
1146 8327782d Sofia Papagiannaki
        form_class=ProjectApplicationForm)
1147 17a2f450 Sofia Papagiannaki
1148 e1a80257 Sofia Papagiannaki
1149 e1a80257 Sofia Papagiannaki
@require_http_methods(["GET", "POST"])
1150 e1a80257 Sofia Papagiannaki
@signed_terms_required
1151 e1a80257 Sofia Papagiannaki
@login_required
1152 73fbaec4 Sofia Papagiannaki
@transaction.commit_manually
1153 73fbaec4 Sofia Papagiannaki
def project_detail(request, application_id):
1154 7dd3047d Sofia Papagiannaki
    resource_catalog = None
1155 8327782d Sofia Papagiannaki
    result = callpoint.list_resources()
1156 172ce682 Sofia Papagiannaki
    if not result.is_success:
1157 172ce682 Sofia Papagiannaki
        messages.error(
1158 172ce682 Sofia Papagiannaki
            request,
1159 172ce682 Sofia Papagiannaki
            'Unable to retrieve system resources: %s' % result.reason
1160 172ce682 Sofia Papagiannaki
    )
1161 172ce682 Sofia Papagiannaki
    else:
1162 172ce682 Sofia Papagiannaki
        resource_catalog = result.data
1163 ccab6eb5 Sofia Papagiannaki
1164 bfe23b13 Sofia Papagiannaki
    addmembers_form = AddProjectMembersForm()
1165 ccab6eb5 Sofia Papagiannaki
    if request.method == 'POST':
1166 bfe23b13 Sofia Papagiannaki
        addmembers_form = AddProjectMembersForm(request.POST)
1167 ccab6eb5 Sofia Papagiannaki
        if addmembers_form.is_valid():
1168 ccab6eb5 Sofia Papagiannaki
            try:
1169 73fbaec4 Sofia Papagiannaki
                rollback = False
1170 7dd3047d Sofia Papagiannaki
                application_id = int(application_id)
1171 7dd3047d Sofia Papagiannaki
                map(lambda u: enroll_member(
1172 73fbaec4 Sofia Papagiannaki
                        application_id,
1173 73fbaec4 Sofia Papagiannaki
                        u,
1174 73fbaec4 Sofia Papagiannaki
                        request_user=request.user),
1175 73fbaec4 Sofia Papagiannaki
                    addmembers_form.valid_users)
1176 73fbaec4 Sofia Papagiannaki
            except (IOError, PermissionDenied), e:
1177 73fbaec4 Sofia Papagiannaki
                messages.error(request, e)
1178 bfe23b13 Sofia Papagiannaki
            except BaseException, e:
1179 73fbaec4 Sofia Papagiannaki
                rollback = True
1180 bfe23b13 Sofia Papagiannaki
                messages.error(request, e)
1181 73fbaec4 Sofia Papagiannaki
            finally:
1182 73fbaec4 Sofia Papagiannaki
                if rollback == True:
1183 73fbaec4 Sofia Papagiannaki
                    transaction.rollback()
1184 73fbaec4 Sofia Papagiannaki
                else:
1185 73fbaec4 Sofia Papagiannaki
                    transaction.commit()
1186 bfe23b13 Sofia Papagiannaki
            addmembers_form = AddProjectMembersForm()
1187 f7cf5257 Kostas Papadimitriou
1188 bfe23b13 Sofia Papagiannaki
    # validate sorting
1189 bfe23b13 Sofia Papagiannaki
    sorting = 'person__email'
1190 73fbaec4 Sofia Papagiannaki
    form = ProjectMembersSortForm(request.GET or request.POST)
1191 bfe23b13 Sofia Papagiannaki
    if form.is_valid():
1192 bfe23b13 Sofia Papagiannaki
        sorting = form.cleaned_data.get('sorting')
1193 ccab6eb5 Sofia Papagiannaki
1194 2ddfc92b Giorgos Korfiatis
    rollback = False
1195 2ddfc92b Giorgos Korfiatis
    try:
1196 2ddfc92b Giorgos Korfiatis
        return object_detail(
1197 2ddfc92b Giorgos Korfiatis
            request,
1198 2ddfc92b Giorgos Korfiatis
            queryset=ProjectApplication.objects.select_related(),
1199 2ddfc92b Giorgos Korfiatis
            object_id=application_id,
1200 2ddfc92b Giorgos Korfiatis
            template_name='im/projects/project_detail.html',
1201 2ddfc92b Giorgos Korfiatis
            extra_context={
1202 2ddfc92b Giorgos Korfiatis
                'resource_catalog':resource_catalog,
1203 2ddfc92b Giorgos Korfiatis
                'sorting':sorting,
1204 2ddfc92b Giorgos Korfiatis
                'addmembers_form':addmembers_form
1205 2ddfc92b Giorgos Korfiatis
                }
1206 2ddfc92b Giorgos Korfiatis
            )
1207 2ddfc92b Giorgos Korfiatis
    except:
1208 2ddfc92b Giorgos Korfiatis
        rollback = True
1209 2ddfc92b Giorgos Korfiatis
    finally:
1210 2ddfc92b Giorgos Korfiatis
        if rollback == True:
1211 2ddfc92b Giorgos Korfiatis
            transaction.rollback()
1212 2ddfc92b Giorgos Korfiatis
        else:
1213 2ddfc92b Giorgos Korfiatis
            transaction.commit()
1214 e1a80257 Sofia Papagiannaki
1215 e1a80257 Sofia Papagiannaki
@require_http_methods(["GET", "POST"])
1216 e1a80257 Sofia Papagiannaki
@signed_terms_required
1217 e1a80257 Sofia Papagiannaki
@login_required
1218 e1a80257 Sofia Papagiannaki
def project_search(request):
1219 48421603 Kostas Papadimitriou
    q = request.GET.get('q')
1220 48421603 Kostas Papadimitriou
    queryset = ProjectApplication.objects
1221 48421603 Kostas Papadimitriou
1222 48421603 Kostas Papadimitriou
    if request.method == 'GET':
1223 48421603 Kostas Papadimitriou
        form = ProjectSearchForm()
1224 48421603 Kostas Papadimitriou
        q = q.strip()
1225 48421603 Kostas Papadimitriou
        queryset = queryset.filter(~Q(project__last_approval_date__isnull=True))
1226 045386db Olga Brani
        queryset = queryset.filter(name__contains=q)
1227 48421603 Kostas Papadimitriou
    else:
1228 48421603 Kostas Papadimitriou
        form = ProjectSearchForm(request.POST)
1229 48421603 Kostas Papadimitriou
1230 48421603 Kostas Papadimitriou
        if form.is_valid():
1231 48421603 Kostas Papadimitriou
            q = form.cleaned_data['q'].strip()
1232 48421603 Kostas Papadimitriou
1233 48421603 Kostas Papadimitriou
            queryset = queryset.filter(~Q(project__last_approval_date__isnull=True))
1234 48421603 Kostas Papadimitriou
1235 48421603 Kostas Papadimitriou
            queryset = queryset.filter(name__contains=q)
1236 48421603 Kostas Papadimitriou
        else:
1237 48421603 Kostas Papadimitriou
            queryset = queryset.none()
1238 48421603 Kostas Papadimitriou
1239 f7cf5257 Kostas Papadimitriou
    sorting = 'name'
1240 bfe23b13 Sofia Papagiannaki
    # validate sorting
1241 73fbaec4 Sofia Papagiannaki
    sort_form = ProjectSortForm(request.GET)
1242 bfe23b13 Sofia Papagiannaki
    if sort_form.is_valid():
1243 bfe23b13 Sofia Papagiannaki
        sorting = sort_form.cleaned_data.get('sorting')
1244 bfe23b13 Sofia Papagiannaki
    queryset = queryset.order_by(sorting)
1245 48421603 Kostas Papadimitriou
1246 bfe23b13 Sofia Papagiannaki
    return object_list(
1247 bfe23b13 Sofia Papagiannaki
        request,
1248 bfe23b13 Sofia Papagiannaki
        queryset,
1249 bfe23b13 Sofia Papagiannaki
        paginate_by=PAGINATE_BY_ALL,
1250 bfe23b13 Sofia Papagiannaki
        page=request.GET.get('page') or 1,
1251 6dadd24a Sofia Papagiannaki
        template_name='im/projects/project_list.html',
1252 bfe23b13 Sofia Papagiannaki
        extra_context=dict(
1253 bfe23b13 Sofia Papagiannaki
            form=form,
1254 bfe23b13 Sofia Papagiannaki
            is_search=True,
1255 045386db Olga Brani
            sorting=sorting,
1256 045386db Olga Brani
            q=q,
1257 bfe23b13 Sofia Papagiannaki
        )
1258 bfe23b13 Sofia Papagiannaki
    )
1259 bfe23b13 Sofia Papagiannaki
1260 73fbaec4 Sofia Papagiannaki
@require_http_methods(["POST"])
1261 e1a80257 Sofia Papagiannaki
@signed_terms_required
1262 e1a80257 Sofia Papagiannaki
@login_required
1263 bfe23b13 Sofia Papagiannaki
@transaction.commit_manually
1264 73fbaec4 Sofia Papagiannaki
def project_join(request, application_id):
1265 974ee6a6 Sofia Papagiannaki
    next = request.GET.get('next')
1266 73fbaec4 Sofia Papagiannaki
    if not next:
1267 73fbaec4 Sofia Papagiannaki
        return HttpResponseBadRequest(
1268 73fbaec4 Sofia Papagiannaki
            _(astakos_messages.MISSING_NEXT_PARAMETER))
1269 73fbaec4 Sofia Papagiannaki
1270 bfe23b13 Sofia Papagiannaki
    rollback = False
1271 bfe23b13 Sofia Papagiannaki
    try:
1272 974ee6a6 Sofia Papagiannaki
        application_id = int(application_id)
1273 73fbaec4 Sofia Papagiannaki
        join_project(application_id, request.user)
1274 73fbaec4 Sofia Papagiannaki
    except (IOError, PermissionDenied), e:
1275 bfe23b13 Sofia Papagiannaki
        messages.error(request, e)
1276 b8f05f8d Sofia Papagiannaki
    except BaseException, e:
1277 b8f05f8d Sofia Papagiannaki
        logger.exception(e)
1278 b8f05f8d Sofia Papagiannaki
        messages.error(request, _(astakos_messages.GENERIC_ERROR))
1279 bfe23b13 Sofia Papagiannaki
        rollback = True
1280 bfe23b13 Sofia Papagiannaki
    finally:
1281 bfe23b13 Sofia Papagiannaki
        if rollback:
1282 bfe23b13 Sofia Papagiannaki
            transaction.rollback()
1283 bfe23b13 Sofia Papagiannaki
        else:
1284 bfe23b13 Sofia Papagiannaki
            transaction.commit()
1285 974ee6a6 Sofia Papagiannaki
    next = restrict_next(next, domain=COOKIE_DOMAIN)
1286 73fbaec4 Sofia Papagiannaki
    return redirect(next)
1287 bfe23b13 Sofia Papagiannaki
1288 73fbaec4 Sofia Papagiannaki
@require_http_methods(["POST"])
1289 e1a80257 Sofia Papagiannaki
@signed_terms_required
1290 e1a80257 Sofia Papagiannaki
@login_required
1291 73fbaec4 Sofia Papagiannaki
@transaction.commit_manually
1292 73fbaec4 Sofia Papagiannaki
def project_leave(request, application_id):
1293 974ee6a6 Sofia Papagiannaki
    next = request.GET.get('next')
1294 73fbaec4 Sofia Papagiannaki
    if not next:
1295 73fbaec4 Sofia Papagiannaki
        return HttpResponseBadRequest(
1296 73fbaec4 Sofia Papagiannaki
            _(astakos_messages.MISSING_NEXT_PARAMETER))
1297 e1a80257 Sofia Papagiannaki
1298 73fbaec4 Sofia Papagiannaki
    rollback = False
1299 73fbaec4 Sofia Papagiannaki
    try:
1300 974ee6a6 Sofia Papagiannaki
        application_id = int(application_id)
1301 73fbaec4 Sofia Papagiannaki
        leave_project(application_id, request.user)
1302 73fbaec4 Sofia Papagiannaki
    except (IOError, PermissionDenied), e:
1303 73fbaec4 Sofia Papagiannaki
        messages.error(request, e)
1304 73fbaec4 Sofia Papagiannaki
    except BaseException, e:
1305 73fbaec4 Sofia Papagiannaki
        logger.exception(e)
1306 974ee6a6 Sofia Papagiannaki
        messages.error(request, _(astakos_messages.GENERIC_ERROR))
1307 73fbaec4 Sofia Papagiannaki
        rollback = True
1308 73fbaec4 Sofia Papagiannaki
    finally:
1309 73fbaec4 Sofia Papagiannaki
        if rollback:
1310 73fbaec4 Sofia Papagiannaki
            transaction.rollback()
1311 73fbaec4 Sofia Papagiannaki
        else:
1312 73fbaec4 Sofia Papagiannaki
            transaction.commit()
1313 f7cf5257 Kostas Papadimitriou
1314 974ee6a6 Sofia Papagiannaki
    next = restrict_next(next, domain=COOKIE_DOMAIN)
1315 73fbaec4 Sofia Papagiannaki
    return redirect(next)
1316 bfe23b13 Sofia Papagiannaki
1317 bfe23b13 Sofia Papagiannaki
@require_http_methods(["GET"])
1318 e1a80257 Sofia Papagiannaki
@signed_terms_required
1319 e1a80257 Sofia Papagiannaki
@login_required
1320 73fbaec4 Sofia Papagiannaki
@transaction.commit_manually
1321 7dd3047d Sofia Papagiannaki
def project_accept_member(request, application_id, user_id):
1322 73fbaec4 Sofia Papagiannaki
    rollback = False
1323 73fbaec4 Sofia Papagiannaki
    try:
1324 974ee6a6 Sofia Papagiannaki
        application_id = int(application_id)
1325 974ee6a6 Sofia Papagiannaki
        user_id = int(user_id)
1326 73fbaec4 Sofia Papagiannaki
        m = accept_membership(application_id, user_id, request.user)
1327 73fbaec4 Sofia Papagiannaki
    except (IOError, PermissionDenied), e:
1328 73fbaec4 Sofia Papagiannaki
        messages.error(request, e)
1329 73fbaec4 Sofia Papagiannaki
    except BaseException, e:
1330 73fbaec4 Sofia Papagiannaki
        logger.exception(e)
1331 974ee6a6 Sofia Papagiannaki
        messages.error(request, _(astakos_messages.GENERIC_ERROR))
1332 73fbaec4 Sofia Papagiannaki
        rollback = True
1333 73fbaec4 Sofia Papagiannaki
    else:
1334 73fbaec4 Sofia Papagiannaki
        realname = m.person.realname
1335 73fbaec4 Sofia Papagiannaki
        msg = _(astakos_messages.USER_JOINED_PROJECT) % locals()
1336 73fbaec4 Sofia Papagiannaki
        messages.success(request, msg)
1337 73fbaec4 Sofia Papagiannaki
    finally:
1338 73fbaec4 Sofia Papagiannaki
        if rollback:
1339 73fbaec4 Sofia Papagiannaki
            transaction.rollback()
1340 73fbaec4 Sofia Papagiannaki
        else:
1341 73fbaec4 Sofia Papagiannaki
            transaction.commit()
1342 7dd3047d Sofia Papagiannaki
    return redirect(reverse('project_detail', args=(application_id,)))
1343 bfe23b13 Sofia Papagiannaki
1344 bfe23b13 Sofia Papagiannaki
@require_http_methods(["GET"])
1345 bfe23b13 Sofia Papagiannaki
@signed_terms_required
1346 bfe23b13 Sofia Papagiannaki
@login_required
1347 73fbaec4 Sofia Papagiannaki
@transaction.commit_manually
1348 73fbaec4 Sofia Papagiannaki
def project_remove_member(request, application_id, user_id):
1349 73fbaec4 Sofia Papagiannaki
    rollback = False
1350 73fbaec4 Sofia Papagiannaki
    try:
1351 974ee6a6 Sofia Papagiannaki
        application_id = int(application_id)
1352 974ee6a6 Sofia Papagiannaki
        user_id = int(user_id)
1353 73fbaec4 Sofia Papagiannaki
        m = remove_membership(application_id, user_id, request.user)
1354 73fbaec4 Sofia Papagiannaki
    except (IOError, PermissionDenied), e:
1355 73fbaec4 Sofia Papagiannaki
        messages.error(request, e)
1356 73fbaec4 Sofia Papagiannaki
    except BaseException, e:
1357 73fbaec4 Sofia Papagiannaki
        logger.exception(e)
1358 974ee6a6 Sofia Papagiannaki
        messages.error(request, _(astakos_messages.GENERIC_ERROR))
1359 73fbaec4 Sofia Papagiannaki
        rollback = True
1360 73fbaec4 Sofia Papagiannaki
    else:
1361 73fbaec4 Sofia Papagiannaki
        realname = m.person.realname
1362 73fbaec4 Sofia Papagiannaki
        msg = _(astakos_messages.USER_LEFT_PROJECT) % locals()
1363 73fbaec4 Sofia Papagiannaki
        messages.success(request, msg)
1364 73fbaec4 Sofia Papagiannaki
    finally:
1365 73fbaec4 Sofia Papagiannaki
        if rollback:
1366 73fbaec4 Sofia Papagiannaki
            transaction.rollback()
1367 73fbaec4 Sofia Papagiannaki
        else:
1368 73fbaec4 Sofia Papagiannaki
            transaction.commit()
1369 7dd3047d Sofia Papagiannaki
    return redirect(reverse('project_detail', args=(application_id,)))
1370 bfe23b13 Sofia Papagiannaki
1371 bfe23b13 Sofia Papagiannaki
@require_http_methods(["GET"])
1372 e1a80257 Sofia Papagiannaki
@signed_terms_required
1373 e1a80257 Sofia Papagiannaki
@login_required
1374 73fbaec4 Sofia Papagiannaki
@transaction.commit_manually
1375 73fbaec4 Sofia Papagiannaki
def project_reject_member(request, application_id, user_id):
1376 73fbaec4 Sofia Papagiannaki
    rollback = False
1377 73fbaec4 Sofia Papagiannaki
    try:
1378 974ee6a6 Sofia Papagiannaki
        application_id = int(application_id)
1379 974ee6a6 Sofia Papagiannaki
        user_id = int(user_id)
1380 73fbaec4 Sofia Papagiannaki
        m = reject_membership(application_id, user_id, request.user)
1381 73fbaec4 Sofia Papagiannaki
    except (IOError, PermissionDenied), e:
1382 73fbaec4 Sofia Papagiannaki
        messages.error(request, e)
1383 73fbaec4 Sofia Papagiannaki
    except BaseException, e:
1384 73fbaec4 Sofia Papagiannaki
        logger.exception(e)
1385 974ee6a6 Sofia Papagiannaki
        messages.error(request, _(astakos_messages.GENERIC_ERROR))
1386 73fbaec4 Sofia Papagiannaki
        rollback = True
1387 73fbaec4 Sofia Papagiannaki
    else:
1388 73fbaec4 Sofia Papagiannaki
        realname = m.person.realname
1389 73fbaec4 Sofia Papagiannaki
        msg = _(astakos_messages.USER_LEFT_PROJECT) % locals()
1390 73fbaec4 Sofia Papagiannaki
        messages.success(request, msg)
1391 73fbaec4 Sofia Papagiannaki
    finally:
1392 73fbaec4 Sofia Papagiannaki
        if rollback:
1393 73fbaec4 Sofia Papagiannaki
            transaction.rollback()
1394 73fbaec4 Sofia Papagiannaki
        else:
1395 73fbaec4 Sofia Papagiannaki
            transaction.commit()
1396 7dd3047d Sofia Papagiannaki
    return redirect(reverse('project_detail', args=(application_id,)))
1397 c630fee6 Kostas Papadimitriou