Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / views.py @ 53e0b8fe

History | View | Annotate | Download (70.1 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 73fbaec4 Sofia Papagiannaki
#     AstakosGroup, Membership
74 73fbaec4 Sofia Papagiannaki
    EmailChange, GroupKind,
75 e1a80257 Sofia Papagiannaki
    RESOURCE_SEPARATOR, AstakosUserAuthProvider,
76 5a4e7b00 Kostas Papadimitriou
    PendingThirdPartyUser,
77 73fbaec4 Sofia Papagiannaki
    ProjectApplication, ProjectMembership, Project)
78 73fbaec4 Sofia Papagiannaki
from astakos.im.util import (
79 73fbaec4 Sofia Papagiannaki
    get_context, prepare_response, get_query, restrict_next)
80 e1a80257 Sofia Papagiannaki
from astakos.im.forms import (
81 e1a80257 Sofia Papagiannaki
    LoginForm, InvitationForm, ProfileForm,
82 e1a80257 Sofia Papagiannaki
    FeedbackForm, SignApprovalTermsForm,
83 e1a80257 Sofia Papagiannaki
    EmailChangeForm,
84 73fbaec4 Sofia Papagiannaki
#     AstakosGroupCreationForm, AstakosGroupSearchForm,
85 73fbaec4 Sofia Papagiannaki
#     AstakosGroupUpdateForm, AddGroupMembersForm,
86 73fbaec4 Sofia Papagiannaki
#     MembersSortForm, AstakosGroupSortForm,
87 73fbaec4 Sofia Papagiannaki
#     TimelineForm, PickResourceForm,
88 73fbaec4 Sofia Papagiannaki
#     AstakosGroupCreationSummaryForm,
89 bfe23b13 Sofia Papagiannaki
    ProjectApplicationForm, ProjectSortForm,
90 73fbaec4 Sofia Papagiannaki
    AddProjectMembersForm, ProjectSearchForm,
91 73fbaec4 Sofia Papagiannaki
    ProjectMembersSortForm)
92 f3342849 Sofia Papagiannaki
from astakos.im.functions import (
93 f3342849 Sofia Papagiannaki
    send_feedback, SendMailError,
94 f3342849 Sofia Papagiannaki
    logout as auth_logout,
95 f3342849 Sofia Papagiannaki
    activate as activate_func,
96 73fbaec4 Sofia Papagiannaki
    invite,
97 f3342849 Sofia Papagiannaki
    send_activation as send_activation_func,
98 73fbaec4 Sofia Papagiannaki
#     send_group_creation_notification,
99 73fbaec4 Sofia Papagiannaki
    SendNotificationError,
100 73fbaec4 Sofia Papagiannaki
    accept_membership, reject_membership, remove_membership,
101 73fbaec4 Sofia Papagiannaki
    leave_project, join_project)
102 73fbaec4 Sofia Papagiannaki
# from astakos.im.endpoints.qh import timeline_charge
103 f3342849 Sofia Papagiannaki
from astakos.im.settings import (
104 f3342849 Sofia Papagiannaki
    COOKIE_DOMAIN, LOGOUT_NEXT,
105 f3342849 Sofia Papagiannaki
    LOGGING_LEVEL, PAGINATE_BY,
106 73fbaec4 Sofia Papagiannaki
    RESOURCES_PRESENTATION_DATA, PAGINATE_BY_ALL)
107 f8f86e83 root
#from astakos.im.tasks import request_billing
108 820b18e0 Sofia Papagiannaki
from astakos.im.api.callpoint import AstakosCallpoint
109 64cd4730 Antony Chazapis
110 792c2f3b Olga Brani
from astakos.im import settings
111 792c2f3b Olga Brani
from astakos.im import auth_providers
112 ae497612 Olga Brani
113 e015e9e6 Sofia Papagiannaki
logger = logging.getLogger(__name__)
114 e015e9e6 Sofia Papagiannaki
115 820b18e0 Sofia Papagiannaki
callpoint = AstakosCallpoint()
116 9a06d96f Olga Brani
117 b2ffa772 Sofia Papagiannaki
def render_response(template, tab=None, status=200, context_instance=None, **kwargs):
118 890b0eaf Sofia Papagiannaki
    """
119 890b0eaf Sofia Papagiannaki
    Calls ``django.template.loader.render_to_string`` with an additional ``tab``
120 890b0eaf Sofia Papagiannaki
    keyword argument and returns an ``django.http.HttpResponse`` with the
121 890b0eaf Sofia Papagiannaki
    specified ``status``.
122 890b0eaf Sofia Papagiannaki
    """
123 64cd4730 Antony Chazapis
    if tab is None:
124 881c856c Sofia Papagiannaki
        tab = template.partition('_')[0].partition('.html')[0]
125 64cd4730 Antony Chazapis
    kwargs.setdefault('tab', tab)
126 661c4479 Sofia Papagiannaki
    html = template_loader.render_to_string(
127 5ce3ce4f Sofia Papagiannaki
        template, kwargs, context_instance=context_instance)
128 c301698f Sofia Papagiannaki
    response = HttpResponse(html, status=status)
129 c301698f Sofia Papagiannaki
    return response
130 64cd4730 Antony Chazapis
131 792c2f3b Olga Brani
def requires_auth_provider(provider_id, **perms):
132 792c2f3b Olga Brani
    """
133 792c2f3b Olga Brani
    """
134 792c2f3b Olga Brani
    def decorator(func, *args, **kwargs):
135 792c2f3b Olga Brani
        @wraps(func)
136 792c2f3b Olga Brani
        def wrapper(request, *args, **kwargs):
137 792c2f3b Olga Brani
            provider = auth_providers.get_provider(provider_id)
138 792c2f3b Olga Brani
139 792c2f3b Olga Brani
            if not provider or not provider.is_active():
140 792c2f3b Olga Brani
                raise PermissionDenied
141 792c2f3b Olga Brani
142 792c2f3b Olga Brani
            if provider:
143 792c2f3b Olga Brani
                for pkey, value in perms.iteritems():
144 792c2f3b Olga Brani
                    attr = 'is_available_for_%s' % pkey.lower()
145 792c2f3b Olga Brani
                    if getattr(provider, attr)() != value:
146 279d6e51 Olga Brani
                        #TODO: add session message
147 c630fee6 Kostas Papadimitriou
                        return HttpResponseRedirect(reverse('login'))
148 792c2f3b Olga Brani
            return func(request, *args)
149 792c2f3b Olga Brani
        return wrapper
150 792c2f3b Olga Brani
    return decorator
151 792c2f3b Olga Brani
152 63ecdd20 Sofia Papagiannaki
153 63ecdd20 Sofia Papagiannaki
def requires_anonymous(func):
154 63ecdd20 Sofia Papagiannaki
    """
155 270dd48d Sofia Papagiannaki
    Decorator checkes whether the request.user is not Anonymous and in that case
156 7482228b Sofia Papagiannaki
    redirects to `logout`.
157 63ecdd20 Sofia Papagiannaki
    """
158 63ecdd20 Sofia Papagiannaki
    @wraps(func)
159 63ecdd20 Sofia Papagiannaki
    def wrapper(request, *args):
160 63ecdd20 Sofia Papagiannaki
        if not request.user.is_anonymous():
161 63ecdd20 Sofia Papagiannaki
            next = urlencode({'next': request.build_absolute_uri()})
162 270dd48d Sofia Papagiannaki
            logout_uri = reverse(logout) + '?' + next
163 270dd48d Sofia Papagiannaki
            return HttpResponseRedirect(logout_uri)
164 63ecdd20 Sofia Papagiannaki
        return func(request, *args)
165 63ecdd20 Sofia Papagiannaki
    return wrapper
166 63ecdd20 Sofia Papagiannaki
167 5ce3ce4f Sofia Papagiannaki
168 270dd48d Sofia Papagiannaki
def signed_terms_required(func):
169 270dd48d Sofia Papagiannaki
    """
170 badcb2a9 Kostas Papadimitriou
    Decorator checks whether the request.user is Anonymous and in that case
171 270dd48d Sofia Papagiannaki
    redirects to `logout`.
172 270dd48d Sofia Papagiannaki
    """
173 270dd48d Sofia Papagiannaki
    @wraps(func)
174 270dd48d Sofia Papagiannaki
    def wrapper(request, *args, **kwargs):
175 fcf90160 Sofia Papagiannaki
        if request.user.is_authenticated() and not request.user.signed_terms:
176 270dd48d Sofia Papagiannaki
            params = urlencode({'next': request.build_absolute_uri(),
177 5ce3ce4f Sofia Papagiannaki
                                'show_form': ''})
178 270dd48d Sofia Papagiannaki
            terms_uri = reverse('latest_terms') + '?' + params
179 270dd48d Sofia Papagiannaki
            return HttpResponseRedirect(terms_uri)
180 270dd48d Sofia Papagiannaki
        return func(request, *args, **kwargs)
181 270dd48d Sofia Papagiannaki
    return wrapper
182 270dd48d Sofia Papagiannaki
183 5ce3ce4f Sofia Papagiannaki
184 badcb2a9 Kostas Papadimitriou
def required_auth_methods_assigned(only_warn=False):
185 badcb2a9 Kostas Papadimitriou
    """
186 badcb2a9 Kostas Papadimitriou
    Decorator that checks whether the request.user has all required auth providers
187 badcb2a9 Kostas Papadimitriou
    assigned.
188 badcb2a9 Kostas Papadimitriou
    """
189 badcb2a9 Kostas Papadimitriou
    required_providers = auth_providers.REQUIRED_PROVIDERS.keys()
190 badcb2a9 Kostas Papadimitriou
191 badcb2a9 Kostas Papadimitriou
    def decorator(func):
192 badcb2a9 Kostas Papadimitriou
        if not required_providers:
193 badcb2a9 Kostas Papadimitriou
            return func
194 badcb2a9 Kostas Papadimitriou
195 badcb2a9 Kostas Papadimitriou
        @wraps(func)
196 badcb2a9 Kostas Papadimitriou
        def wrapper(request, *args, **kwargs):
197 badcb2a9 Kostas Papadimitriou
            if request.user.is_authenticated():
198 badcb2a9 Kostas Papadimitriou
                for required in required_providers:
199 badcb2a9 Kostas Papadimitriou
                    if not request.user.has_auth_provider(required):
200 badcb2a9 Kostas Papadimitriou
                        provider = auth_providers.get_provider(required)
201 badcb2a9 Kostas Papadimitriou
                        if only_warn:
202 badcb2a9 Kostas Papadimitriou
                            messages.error(request,
203 badcb2a9 Kostas Papadimitriou
                                           _(astakos_messages.AUTH_PROVIDER_REQUIRED  % {
204 badcb2a9 Kostas Papadimitriou
                                               'provider': provider.get_title_display}))
205 badcb2a9 Kostas Papadimitriou
                        else:
206 badcb2a9 Kostas Papadimitriou
                            return HttpResponseRedirect(reverse('edit_profile'))
207 badcb2a9 Kostas Papadimitriou
            return func(request, *args, **kwargs)
208 badcb2a9 Kostas Papadimitriou
        return wrapper
209 badcb2a9 Kostas Papadimitriou
    return decorator
210 badcb2a9 Kostas Papadimitriou
211 badcb2a9 Kostas Papadimitriou
212 badcb2a9 Kostas Papadimitriou
def valid_astakos_user_required(func):
213 badcb2a9 Kostas Papadimitriou
    return signed_terms_required(required_auth_methods_assigned()(login_required(func)))
214 badcb2a9 Kostas Papadimitriou
215 badcb2a9 Kostas Papadimitriou
216 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
217 270dd48d Sofia Papagiannaki
@signed_terms_required
218 1f3b4b39 Sofia Papagiannaki
def index(request, login_template_name='im/login.html', profile_template_name='im/profile.html', extra_context=None):
219 890b0eaf Sofia Papagiannaki
    """
220 dcf55476 Sofia Papagiannaki
    If there is logged on user renders the profile page otherwise renders login page.
221 176023aa Kostas Papadimitriou

222 890b0eaf Sofia Papagiannaki
    **Arguments**
223 176023aa Kostas Papadimitriou

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

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

232 890b0eaf Sofia Papagiannaki
    ``extra_context``
233 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
234 176023aa Kostas Papadimitriou

235 890b0eaf Sofia Papagiannaki
    **Template:**
236 176023aa Kostas Papadimitriou

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

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

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

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

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

272 890b0eaf Sofia Papagiannaki
    **Arguments**
273 176023aa Kostas Papadimitriou

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

278 890b0eaf Sofia Papagiannaki
    ``extra_context``
279 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
280 176023aa Kostas Papadimitriou

281 890b0eaf Sofia Papagiannaki
    **Template:**
282 176023aa Kostas Papadimitriou

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

285 890b0eaf Sofia Papagiannaki
    **Settings:**
286 176023aa Kostas Papadimitriou

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

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

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

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

348 890b0eaf Sofia Papagiannaki
    **Arguments**
349 176023aa Kostas Papadimitriou

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

354 890b0eaf Sofia Papagiannaki
    ``extra_context``
355 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
356 176023aa Kostas Papadimitriou

357 890b0eaf Sofia Papagiannaki
    **Template:**
358 176023aa Kostas Papadimitriou

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

361 92defad4 Sofia Papagiannaki
    **Settings:**
362 176023aa Kostas Papadimitriou

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

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

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

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

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

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

434 890b0eaf Sofia Papagiannaki
    **Arguments**
435 5ce3ce4f Sofia Papagiannaki

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

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

444 890b0eaf Sofia Papagiannaki
    ``extra_context``
445 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
446 176023aa Kostas Papadimitriou

447 890b0eaf Sofia Papagiannaki
    **Template:**
448 5ce3ce4f Sofia Papagiannaki

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

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

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

545 890b0eaf Sofia Papagiannaki
    **Arguments**
546 176023aa Kostas Papadimitriou

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

551 890b0eaf Sofia Papagiannaki
    ``extra_context``
552 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
553 176023aa Kostas Papadimitriou

554 890b0eaf Sofia Papagiannaki
    **Template:**
555 176023aa Kostas Papadimitriou

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

558 890b0eaf Sofia Papagiannaki
    **Settings:**
559 176023aa Kostas Papadimitriou

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

627 683cf244 Sofia Papagiannaki
    The view uses commit_manually decorator in order to ensure the user state will be updated
628 683cf244 Sofia Papagiannaki
    only if the email will be send successfully.
629 2126d85d Sofia Papagiannaki
    """
630 2126d85d Sofia Papagiannaki
    token = request.GET.get('auth')
631 2126d85d Sofia Papagiannaki
    next = request.GET.get('next')
632 2126d85d Sofia Papagiannaki
    try:
633 2126d85d Sofia Papagiannaki
        user = AstakosUser.objects.get(auth_token=token)
634 2126d85d Sofia Papagiannaki
    except AstakosUser.DoesNotExist:
635 279d6e51 Olga Brani
        return HttpResponseBadRequest(_(astakos_messages.ACCOUNT_UNKNOWN))
636 5ce3ce4f Sofia Papagiannaki
637 d1757ca7 Sofia Papagiannaki
    if user.is_active:
638 ae497612 Olga Brani
        message = _(astakos_messages.ACCOUNT_ALREADY_ACTIVE)
639 24406ae3 Sofia Papagiannaki
        messages.error(request, message)
640 279d6e51 Olga Brani
        return index(request)
641 5ce3ce4f Sofia Papagiannaki
642 0a569195 Sofia Papagiannaki
    try:
643 279d6e51 Olga Brani
        activate_func(user, greeting_email_template_name, helpdesk_email_template_name, verify_email=True)
644 ef20ea07 Sofia Papagiannaki
        response = prepare_response(request, user, next, renew=True)
645 ef20ea07 Sofia Papagiannaki
        transaction.commit()
646 279d6e51 Olga Brani
        return response
647 ef20ea07 Sofia Papagiannaki
    except SendMailError, e:
648 ef20ea07 Sofia Papagiannaki
        message = e.message
649 ef20ea07 Sofia Papagiannaki
        messages.add_message(request, messages.ERROR, message)
650 ef20ea07 Sofia Papagiannaki
        transaction.rollback()
651 279d6e51 Olga Brani
        return index(request)
652 ef20ea07 Sofia Papagiannaki
    except BaseException, e:
653 ef20ea07 Sofia Papagiannaki
        status = messages.ERROR
654 c0b26605 Sofia Papagiannaki
        message = _(astakos_messages.GENERIC_ERROR)
655 ef20ea07 Sofia Papagiannaki
        messages.add_message(request, messages.ERROR, message)
656 ef20ea07 Sofia Papagiannaki
        logger.exception(e)
657 ef20ea07 Sofia Papagiannaki
        transaction.rollback()
658 279d6e51 Olga Brani
        return index(request)
659 270dd48d Sofia Papagiannaki
660 5ce3ce4f Sofia Papagiannaki
661 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
662 aab4d540 Sofia Papagiannaki
def approval_terms(request, term_id=None, template_name='im/approval_terms.html', extra_context=None):
663 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
664 270dd48d Sofia Papagiannaki
    term = None
665 270dd48d Sofia Papagiannaki
    terms = None
666 270dd48d Sofia Papagiannaki
    if not term_id:
667 270dd48d Sofia Papagiannaki
        try:
668 270dd48d Sofia Papagiannaki
            term = ApprovalTerms.objects.order_by('-id')[0]
669 270dd48d Sofia Papagiannaki
        except IndexError:
670 270dd48d Sofia Papagiannaki
            pass
671 270dd48d Sofia Papagiannaki
    else:
672 270dd48d Sofia Papagiannaki
        try:
673 aab4d540 Sofia Papagiannaki
            term = ApprovalTerms.objects.get(id=term_id)
674 aab4d540 Sofia Papagiannaki
        except ApprovalTerms.DoesNotExist, e:
675 270dd48d Sofia Papagiannaki
            pass
676 176023aa Kostas Papadimitriou
677 270dd48d Sofia Papagiannaki
    if not term:
678 ae497612 Olga Brani
        messages.error(request, _(astakos_messages.NO_APPROVAL_TERMS))
679 6ff7a7ca Sofia Papagiannaki
        return HttpResponseRedirect(reverse('index'))
680 270dd48d Sofia Papagiannaki
    f = open(term.location, 'r')
681 270dd48d Sofia Papagiannaki
    terms = f.read()
682 176023aa Kostas Papadimitriou
683 270dd48d Sofia Papagiannaki
    if request.method == 'POST':
684 217994f8 Sofia Papagiannaki
        next = restrict_next(
685 217994f8 Sofia Papagiannaki
            request.POST.get('next'),
686 217994f8 Sofia Papagiannaki
            domain=COOKIE_DOMAIN
687 217994f8 Sofia Papagiannaki
        )
688 270dd48d Sofia Papagiannaki
        if not next:
689 6ff7a7ca Sofia Papagiannaki
            next = reverse('index')
690 270dd48d Sofia Papagiannaki
        form = SignApprovalTermsForm(request.POST, instance=request.user)
691 270dd48d Sofia Papagiannaki
        if not form.is_valid():
692 270dd48d Sofia Papagiannaki
            return render_response(template_name,
693 5ce3ce4f Sofia Papagiannaki
                                   terms=terms,
694 5ce3ce4f Sofia Papagiannaki
                                   approval_terms_form=form,
695 5ce3ce4f Sofia Papagiannaki
                                   context_instance=get_context(request, extra_context))
696 270dd48d Sofia Papagiannaki
        user = form.save()
697 270dd48d Sofia Papagiannaki
        return HttpResponseRedirect(next)
698 270dd48d Sofia Papagiannaki
    else:
699 586967c0 Sofia Papagiannaki
        form = None
700 fcf90160 Sofia Papagiannaki
        if request.user.is_authenticated() and not request.user.signed_terms:
701 586967c0 Sofia Papagiannaki
            form = SignApprovalTermsForm(instance=request.user)
702 270dd48d Sofia Papagiannaki
        return render_response(template_name,
703 5ce3ce4f Sofia Papagiannaki
                               terms=terms,
704 5ce3ce4f Sofia Papagiannaki
                               approval_terms_form=form,
705 5ce3ce4f Sofia Papagiannaki
                               context_instance=get_context(request, extra_context))
706 5ce3ce4f Sofia Papagiannaki
707 270dd48d Sofia Papagiannaki
708 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
709 badcb2a9 Kostas Papadimitriou
@valid_astakos_user_required
710 49790d9d Sofia Papagiannaki
@transaction.commit_manually
711 49790d9d Sofia Papagiannaki
def change_email(request, activation_key=None,
712 49790d9d Sofia Papagiannaki
                 email_template_name='registration/email_change_email.txt',
713 49790d9d Sofia Papagiannaki
                 form_template_name='registration/email_change_form.html',
714 49790d9d Sofia Papagiannaki
                 confirm_template_name='registration/email_change_done.html',
715 aab4d540 Sofia Papagiannaki
                 extra_context=None):
716 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
717 53e0b8fe Kostas Papadimitriou
718 53e0b8fe Kostas Papadimitriou
719 49790d9d Sofia Papagiannaki
    if activation_key:
720 49790d9d Sofia Papagiannaki
        try:
721 49790d9d Sofia Papagiannaki
            user = EmailChange.objects.change_email(activation_key)
722 49790d9d Sofia Papagiannaki
            if request.user.is_authenticated() and request.user == user:
723 ae497612 Olga Brani
                msg = _(astakos_messages.EMAIL_CHANGED)
724 24406ae3 Sofia Papagiannaki
                messages.success(request, msg)
725 49790d9d Sofia Papagiannaki
                auth_logout(request)
726 49790d9d Sofia Papagiannaki
                response = prepare_response(request, user)
727 49790d9d Sofia Papagiannaki
                transaction.commit()
728 53e0b8fe Kostas Papadimitriou
                return HttpResponseRedirect(reverse('edit_profile'))
729 49790d9d Sofia Papagiannaki
        except ValueError, e:
730 24406ae3 Sofia Papagiannaki
            messages.error(request, e)
731 53e0b8fe Kostas Papadimitriou
            transaction.rollback()
732 53e0b8fe Kostas Papadimitriou
            return HttpResponseRedirect(reverse('index'))
733 53e0b8fe Kostas Papadimitriou
734 49790d9d Sofia Papagiannaki
        return render_response(confirm_template_name,
735 53e0b8fe Kostas Papadimitriou
                               modified_user=user if 'user' in locals() \
736 53e0b8fe Kostas Papadimitriou
                               else None, context_instance=get_context(request,
737 5ce3ce4f Sofia Papagiannaki
                                                            extra_context))
738 5ce3ce4f Sofia Papagiannaki
739 49790d9d Sofia Papagiannaki
    if not request.user.is_authenticated():
740 49790d9d Sofia Papagiannaki
        path = quote(request.get_full_path())
741 6ff7a7ca Sofia Papagiannaki
        url = request.build_absolute_uri(reverse('index'))
742 49790d9d Sofia Papagiannaki
        return HttpResponseRedirect(url + '?next=' + path)
743 53e0b8fe Kostas Papadimitriou
744 53e0b8fe Kostas Papadimitriou
    # clean up expired email changes
745 53e0b8fe Kostas Papadimitriou
    if request.user.email_change_is_pending():
746 53e0b8fe Kostas Papadimitriou
        change = request.user.emailchanges.get()
747 53e0b8fe Kostas Papadimitriou
        if change.activation_key_expired():
748 53e0b8fe Kostas Papadimitriou
            change.delete()
749 53e0b8fe Kostas Papadimitriou
            transaction.commit()
750 53e0b8fe Kostas Papadimitriou
            return HttpResponseRedirect(reverse('email_change'))
751 53e0b8fe Kostas Papadimitriou
752 49790d9d Sofia Papagiannaki
    form = EmailChangeForm(request.POST or None)
753 49790d9d Sofia Papagiannaki
    if request.method == 'POST' and form.is_valid():
754 49790d9d Sofia Papagiannaki
        try:
755 53e0b8fe Kostas Papadimitriou
            # delete pending email changes
756 53e0b8fe Kostas Papadimitriou
            request.user.emailchanges.all().delete()
757 49790d9d Sofia Papagiannaki
            ec = form.save(email_template_name, request)
758 49790d9d Sofia Papagiannaki
        except SendMailError, e:
759 49790d9d Sofia Papagiannaki
            msg = e
760 24406ae3 Sofia Papagiannaki
            messages.error(request, msg)
761 49790d9d Sofia Papagiannaki
            transaction.rollback()
762 53e0b8fe Kostas Papadimitriou
            return HttpResponseRedirect(reverse('edit_profile'))
763 49790d9d Sofia Papagiannaki
        else:
764 ae497612 Olga Brani
            msg = _(astakos_messages.EMAIL_CHANGE_REGISTERED)
765 24406ae3 Sofia Papagiannaki
            messages.success(request, msg)
766 49790d9d Sofia Papagiannaki
            transaction.commit()
767 53e0b8fe Kostas Papadimitriou
            return HttpResponseRedirect(reverse('edit_profile'))
768 53e0b8fe Kostas Papadimitriou
769 53e0b8fe Kostas Papadimitriou
    if request.user.email_change_is_pending():
770 53e0b8fe Kostas Papadimitriou
        messages.warning(request, astakos_messages.PENDING_EMAIL_CHANGE_REQUEST)
771 53e0b8fe Kostas Papadimitriou
772 c0b26605 Sofia Papagiannaki
    return render_response(
773 c0b26605 Sofia Papagiannaki
        form_template_name,
774 c0b26605 Sofia Papagiannaki
        form=form,
775 c0b26605 Sofia Papagiannaki
        context_instance=get_context(request, extra_context)
776 c0b26605 Sofia Papagiannaki
    )
777 1f3b4b39 Sofia Papagiannaki
778 1f3b4b39 Sofia Papagiannaki
779 1f3b4b39 Sofia Papagiannaki
def send_activation(request, user_id, template_name='im/login.html', extra_context=None):
780 792c2f3b Olga Brani
781 badcb2a9 Kostas Papadimitriou
    if request.user.is_authenticated():
782 badcb2a9 Kostas Papadimitriou
        messages.error(request, _(astakos_messages.ALREADY_LOGGED_IN))
783 badcb2a9 Kostas Papadimitriou
        return HttpResponseRedirect(reverse('edit_profile'))
784 badcb2a9 Kostas Papadimitriou
785 792c2f3b Olga Brani
    if settings.MODERATION_ENABLED:
786 792c2f3b Olga Brani
        raise PermissionDenied
787 792c2f3b Olga Brani
788 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
789 1f3b4b39 Sofia Papagiannaki
    try:
790 1f3b4b39 Sofia Papagiannaki
        u = AstakosUser.objects.get(id=user_id)
791 1f3b4b39 Sofia Papagiannaki
    except AstakosUser.DoesNotExist:
792 c0b26605 Sofia Papagiannaki
        messages.error(request, _(astakos_messages.ACCOUNT_UNKNOWN))
793 1f3b4b39 Sofia Papagiannaki
    else:
794 1f3b4b39 Sofia Papagiannaki
        try:
795 1f3b4b39 Sofia Papagiannaki
            send_activation_func(u)
796 c0b26605 Sofia Papagiannaki
            msg = _(astakos_messages.ACTIVATION_SENT)
797 1f3b4b39 Sofia Papagiannaki
            messages.success(request, msg)
798 1f3b4b39 Sofia Papagiannaki
        except SendMailError, e:
799 1f3b4b39 Sofia Papagiannaki
            messages.error(request, e)
800 1f3b4b39 Sofia Papagiannaki
    return render_response(
801 1f3b4b39 Sofia Papagiannaki
        template_name,
802 c0b26605 Sofia Papagiannaki
        login_form = LoginForm(request=request),
803 1f3b4b39 Sofia Papagiannaki
        context_instance = get_context(
804 1f3b4b39 Sofia Papagiannaki
            request,
805 1f3b4b39 Sofia Papagiannaki
            extra_context
806 1f3b4b39 Sofia Papagiannaki
        )
807 1f3b4b39 Sofia Papagiannaki
    )
808 5ce3ce4f Sofia Papagiannaki
809 172ce682 Sofia Papagiannaki
# class ResourcePresentation():
810 172ce682 Sofia Papagiannaki
# 
811 172ce682 Sofia Papagiannaki
#     def __init__(self, data):
812 172ce682 Sofia Papagiannaki
#         self.data = data
813 172ce682 Sofia Papagiannaki
# 
814 172ce682 Sofia Papagiannaki
#     def update_from_result(self, result):
815 172ce682 Sofia Papagiannaki
#         if result.is_success:
816 172ce682 Sofia Papagiannaki
#             for r in result.data:
817 172ce682 Sofia Papagiannaki
#                 rname = '%s%s%s' % (r.get('service'), RESOURCE_SEPARATOR, r.get('name'))
818 172ce682 Sofia Papagiannaki
#                 if not rname in self.data['resources']:
819 172ce682 Sofia Papagiannaki
#                     self.data['resources'][rname] = {}
820 172ce682 Sofia Papagiannaki
# 
821 172ce682 Sofia Papagiannaki
#                 self.data['resources'][rname].update(r)
822 172ce682 Sofia Papagiannaki
#                 self.data['resources'][rname]['id'] = rname
823 172ce682 Sofia Papagiannaki
#                 group = r.get('group')
824 172ce682 Sofia Papagiannaki
#                 if not group in self.data['groups']:
825 172ce682 Sofia Papagiannaki
#                     self.data['groups'][group] = {}
826 172ce682 Sofia Papagiannaki
# 
827 172ce682 Sofia Papagiannaki
#                 self.data['groups'][r.get('group')].update({'name': r.get('group')})
828 172ce682 Sofia Papagiannaki
# 
829 172ce682 Sofia Papagiannaki
#     def test(self, quota_dict):
830 172ce682 Sofia Papagiannaki
#         for k, v in quota_dict.iteritems():
831 172ce682 Sofia Papagiannaki
#             rname = k
832 172ce682 Sofia Papagiannaki
#             value = v
833 172ce682 Sofia Papagiannaki
#             if not rname in self.data['resources']:
834 172ce682 Sofia Papagiannaki
#                 self.data['resources'][rname] = {}
835 172ce682 Sofia Papagiannaki
# 
836 172ce682 Sofia Papagiannaki
# 
837 172ce682 Sofia Papagiannaki
#             self.data['resources'][rname]['value'] = value
838 172ce682 Sofia Papagiannaki
# 
839 172ce682 Sofia Papagiannaki
# 
840 172ce682 Sofia Papagiannaki
#     def update_from_result_report(self, result):
841 172ce682 Sofia Papagiannaki
#         if result.is_success:
842 172ce682 Sofia Papagiannaki
#             for r in result.data:
843 172ce682 Sofia Papagiannaki
#                 rname = r.get('name')
844 172ce682 Sofia Papagiannaki
#                 if not rname in self.data['resources']:
845 172ce682 Sofia Papagiannaki
#                     self.data['resources'][rname] = {}
846 172ce682 Sofia Papagiannaki
# 
847 172ce682 Sofia Papagiannaki
#                 self.data['resources'][rname].update(r)
848 172ce682 Sofia Papagiannaki
#                 self.data['resources'][rname]['id'] = rname
849 172ce682 Sofia Papagiannaki
#                 group = r.get('group')
850 172ce682 Sofia Papagiannaki
#                 if not group in self.data['groups']:
851 172ce682 Sofia Papagiannaki
#                     self.data['groups'][group] = {}
852 172ce682 Sofia Papagiannaki
# 
853 172ce682 Sofia Papagiannaki
#                 self.data['groups'][r.get('group')].update({'name': r.get('group')})
854 172ce682 Sofia Papagiannaki
# 
855 172ce682 Sofia Papagiannaki
#     def get_group_resources(self, group):
856 172ce682 Sofia Papagiannaki
#         return dict(filter(lambda t: t[1].get('group') == group, self.data['resources'].iteritems()))
857 172ce682 Sofia Papagiannaki
# 
858 172ce682 Sofia Papagiannaki
#     def get_groups_resources(self):
859 172ce682 Sofia Papagiannaki
#         for g in self.data['groups']:
860 172ce682 Sofia Papagiannaki
#             yield g, self.get_group_resources(g)
861 172ce682 Sofia Papagiannaki
# 
862 172ce682 Sofia Papagiannaki
#     def get_quota(self, group_quotas):
863 172ce682 Sofia Papagiannaki
#         for r, v in group_quotas:
864 172ce682 Sofia Papagiannaki
#             rname = str(r)
865 172ce682 Sofia Papagiannaki
#             quota = self.data['resources'].get(rname)
866 172ce682 Sofia Papagiannaki
#             quota['value'] = v
867 172ce682 Sofia Papagiannaki
#             yield quota
868 172ce682 Sofia Papagiannaki
# 
869 172ce682 Sofia Papagiannaki
# 
870 172ce682 Sofia Papagiannaki
#     def get_policies(self, policies_data):
871 172ce682 Sofia Papagiannaki
#         for policy in policies_data:
872 172ce682 Sofia Papagiannaki
#             rname = '%s%s%s' % (policy.get('service'), RESOURCE_SEPARATOR, policy.get('resource'))
873 172ce682 Sofia Papagiannaki
#             policy.update(self.data['resources'].get(rname))
874 172ce682 Sofia Papagiannaki
#             yield policy
875 172ce682 Sofia Papagiannaki
# 
876 172ce682 Sofia Papagiannaki
#     def __repr__(self):
877 172ce682 Sofia Papagiannaki
#         return self.data.__repr__()
878 172ce682 Sofia Papagiannaki
# 
879 172ce682 Sofia Papagiannaki
#     def __iter__(self, *args, **kwargs):
880 172ce682 Sofia Papagiannaki
#         return self.data.__iter__(*args, **kwargs)
881 172ce682 Sofia Papagiannaki
# 
882 172ce682 Sofia Papagiannaki
#     def __getitem__(self, *args, **kwargs):
883 172ce682 Sofia Papagiannaki
#         return self.data.__getitem__(*args, **kwargs)
884 172ce682 Sofia Papagiannaki
# 
885 172ce682 Sofia Papagiannaki
#     def get(self, *args, **kwargs):
886 172ce682 Sofia Papagiannaki
#         return self.data.get(*args, **kwargs)
887 792c2f3b Olga Brani
888 792c2f3b Olga Brani
889 12269b45 Olga Brani
890 73fbaec4 Sofia Papagiannaki
# @require_http_methods(["GET", "POST"])
891 73fbaec4 Sofia Papagiannaki
# @signed_terms_required
892 73fbaec4 Sofia Papagiannaki
# @login_required
893 73fbaec4 Sofia Papagiannaki
# def group_add(request, kind_name='default'):
894 73fbaec4 Sofia Papagiannaki
#     result = callpoint.list_resources()
895 73fbaec4 Sofia Papagiannaki
#     resource_catalog = ResourcePresentation(RESOURCES_PRESENTATION_DATA)
896 73fbaec4 Sofia Papagiannaki
#     resource_catalog.update_from_result(result)
897 73fbaec4 Sofia Papagiannaki
# 
898 73fbaec4 Sofia Papagiannaki
#     if not result.is_success:
899 73fbaec4 Sofia Papagiannaki
#         messages.error(
900 73fbaec4 Sofia Papagiannaki
#             request,
901 73fbaec4 Sofia Papagiannaki
#             'Unable to retrieve system resources: %s' % result.reason
902 73fbaec4 Sofia Papagiannaki
#     )
903 73fbaec4 Sofia Papagiannaki
# 
904 73fbaec4 Sofia Papagiannaki
#     try:
905 73fbaec4 Sofia Papagiannaki
#         kind = GroupKind.objects.get(name=kind_name)
906 73fbaec4 Sofia Papagiannaki
#     except:
907 73fbaec4 Sofia Papagiannaki
#         return HttpResponseBadRequest(_(astakos_messages.GROUPKIND_UNKNOWN))
908 73fbaec4 Sofia Papagiannaki
# 
909 73fbaec4 Sofia Papagiannaki
# 
910 73fbaec4 Sofia Papagiannaki
# 
911 73fbaec4 Sofia Papagiannaki
#     post_save_redirect = '/im/group/%(id)s/'
912 73fbaec4 Sofia Papagiannaki
#     context_processors = None
913 73fbaec4 Sofia Papagiannaki
#     model, form_class = get_model_and_form_class(
914 73fbaec4 Sofia Papagiannaki
#         model=None,
915 73fbaec4 Sofia Papagiannaki
#         form_class=AstakosGroupCreationForm
916 73fbaec4 Sofia Papagiannaki
#     )
917 73fbaec4 Sofia Papagiannaki
# 
918 73fbaec4 Sofia Papagiannaki
#     if request.method == 'POST':
919 73fbaec4 Sofia Papagiannaki
#         form = form_class(request.POST, request.FILES)
920 73fbaec4 Sofia Papagiannaki
#         if form.is_valid():
921 73fbaec4 Sofia Papagiannaki
#             policies = form.policies()
922 73fbaec4 Sofia Papagiannaki
#             return render_response(
923 73fbaec4 Sofia Papagiannaki
#                 template='im/astakosgroup_form_summary.html',
924 73fbaec4 Sofia Papagiannaki
#                 context_instance=get_context(request),
925 73fbaec4 Sofia Papagiannaki
#                 form=AstakosGroupCreationSummaryForm(form.cleaned_data),
926 73fbaec4 Sofia Papagiannaki
#                 policies=resource_catalog.get_policies(policies)
927 73fbaec4 Sofia Papagiannaki
#             )
928 73fbaec4 Sofia Papagiannaki
#     else:
929 73fbaec4 Sofia Papagiannaki
#         now = datetime.now()
930 73fbaec4 Sofia Papagiannaki
#         data = {
931 73fbaec4 Sofia Papagiannaki
#             'kind': kind,
932 73fbaec4 Sofia Papagiannaki
#         }
933 73fbaec4 Sofia Papagiannaki
#         for group, resources in resource_catalog.get_groups_resources():
934 73fbaec4 Sofia Papagiannaki
#             data['is_selected_%s' % group] = False
935 73fbaec4 Sofia Papagiannaki
#             for resource in resources:
936 73fbaec4 Sofia Papagiannaki
#                 data['%s_uplimit' % resource] = ''
937 73fbaec4 Sofia Papagiannaki
# 
938 73fbaec4 Sofia Papagiannaki
#         form = form_class(data)
939 73fbaec4 Sofia Papagiannaki
# 
940 73fbaec4 Sofia Papagiannaki
#     # Create the template, context, response
941 73fbaec4 Sofia Papagiannaki
#     template_name = "%s/%s_form.html" % (
942 73fbaec4 Sofia Papagiannaki
#         model._meta.app_label,
943 73fbaec4 Sofia Papagiannaki
#         model._meta.object_name.lower()
944 73fbaec4 Sofia Papagiannaki
#     )
945 73fbaec4 Sofia Papagiannaki
#     t = template_loader.get_template(template_name)
946 73fbaec4 Sofia Papagiannaki
#     c = RequestContext(request, {
947 73fbaec4 Sofia Papagiannaki
#         'form': form,
948 73fbaec4 Sofia Papagiannaki
#         'kind': kind,
949 73fbaec4 Sofia Papagiannaki
#         'resource_catalog':resource_catalog,
950 73fbaec4 Sofia Papagiannaki
#     }, context_processors)
951 73fbaec4 Sofia Papagiannaki
#     return HttpResponse(t.render(c))
952 73fbaec4 Sofia Papagiannaki
953 73fbaec4 Sofia Papagiannaki
954 73fbaec4 Sofia Papagiannaki
##@require_hsttp_methods(["POST"])
955 73fbaec4 Sofia Papagiannaki
# @require_http_methods(["GET", "POST"])
956 73fbaec4 Sofia Papagiannaki
# @signed_terms_required
957 73fbaec4 Sofia Papagiannaki
# @login_required
958 73fbaec4 Sofia Papagiannaki
# @transaction.commit_manually
959 73fbaec4 Sofia Papagiannaki
# def group_add_complete(request):
960 73fbaec4 Sofia Papagiannaki
#     model = AstakosGroup
961 73fbaec4 Sofia Papagiannaki
#     form = AstakosGroupCreationSummaryForm(request.POST)
962 73fbaec4 Sofia Papagiannaki
#     if form.is_valid():
963 73fbaec4 Sofia Papagiannaki
#         d = form.cleaned_data
964 73fbaec4 Sofia Papagiannaki
#         d['owners'] = [request.user]
965 73fbaec4 Sofia Papagiannaki
#         result = callpoint.create_groups((d,)).next()
966 73fbaec4 Sofia Papagiannaki
#         if result.is_success:
967 73fbaec4 Sofia Papagiannaki
#             new_object = result.data[0]
968 73fbaec4 Sofia Papagiannaki
#             # send notification
969 73fbaec4 Sofia Papagiannaki
#             try:
970 73fbaec4 Sofia Papagiannaki
#                 send_group_creation_notification(
971 73fbaec4 Sofia Papagiannaki
#                     template_name='im/group_creation_notification.txt',
972 73fbaec4 Sofia Papagiannaki
#                     dictionary={
973 73fbaec4 Sofia Papagiannaki
#                         'group': new_object,
974 73fbaec4 Sofia Papagiannaki
#                         'owner': request.user,
975 73fbaec4 Sofia Papagiannaki
#                         'policies': d.get('policies', [])
976 73fbaec4 Sofia Papagiannaki
#                     }
977 73fbaec4 Sofia Papagiannaki
#                 )
978 73fbaec4 Sofia Papagiannaki
#             except SendNotificationError, e:
979 73fbaec4 Sofia Papagiannaki
#                 messages.error(request, e, fail_silently=True)
980 73fbaec4 Sofia Papagiannaki
#                 transaction.rollback()
981 73fbaec4 Sofia Papagiannaki
#             else:
982 73fbaec4 Sofia Papagiannaki
#                 msg = _(astakos_messages.OBJECT_CREATED) %\
983 73fbaec4 Sofia Papagiannaki
#                     {"verbose_name": model._meta.verbose_name}
984 73fbaec4 Sofia Papagiannaki
#                 message = _(astakos_messages.NOTIFICATION_SENT) % 'a project'
985 73fbaec4 Sofia Papagiannaki
#                 messages.success(request, msg, fail_silently=True)
986 73fbaec4 Sofia Papagiannaki
#                 transaction.commit()
987 73fbaec4 Sofia Papagiannaki
#         else:
988 73fbaec4 Sofia Papagiannaki
#             d = {"verbose_name": model._meta.verbose_name,
989 73fbaec4 Sofia Papagiannaki
#                  "reason":result.reason}
990 73fbaec4 Sofia Papagiannaki
#             msg = _(astakos_messages.OBJECT_CREATED_FAILED) % d
991 73fbaec4 Sofia Papagiannaki
#             messages.error(request, msg, fail_silently=True)
992 73fbaec4 Sofia Papagiannaki
#     return render_response(
993 73fbaec4 Sofia Papagiannaki
#         template='im/astakosgroup_form_summary.html',
994 73fbaec4 Sofia Papagiannaki
#         context_instance=get_context(request),
995 73fbaec4 Sofia Papagiannaki
#         form=form,
996 73fbaec4 Sofia Papagiannaki
#         policies=form.cleaned_data.get('policies')
997 73fbaec4 Sofia Papagiannaki
#     )
998 01ac12d5 Sofia Papagiannaki
999 73fbaec4 Sofia Papagiannaki
##@require_http_methods(["GET"])
1000 73fbaec4 Sofia Papagiannaki
# @require_http_methods(["GET", "POST"])
1001 73fbaec4 Sofia Papagiannaki
# @signed_terms_required
1002 73fbaec4 Sofia Papagiannaki
# @login_required
1003 73fbaec4 Sofia Papagiannaki
# def group_list(request):
1004 73fbaec4 Sofia Papagiannaki
#     none = request.user.astakos_groups.none()
1005 73fbaec4 Sofia Papagiannaki
#     query = """
1006 73fbaec4 Sofia Papagiannaki
#         SELECT auth_group.id,
1007 73fbaec4 Sofia Papagiannaki
#         auth_group.name AS groupname,
1008 73fbaec4 Sofia Papagiannaki
#         im_groupkind.name AS kindname,
1009 73fbaec4 Sofia Papagiannaki
#         im_astakosgroup.*,
1010 73fbaec4 Sofia Papagiannaki
#         owner.email AS groupowner,
1011 73fbaec4 Sofia Papagiannaki
#         (SELECT COUNT(*) FROM im_membership
1012 73fbaec4 Sofia Papagiannaki
#             WHERE group_id = im_astakosgroup.group_ptr_id
1013 73fbaec4 Sofia Papagiannaki
#             AND date_joined IS NOT NULL) AS approved_members_num,
1014 73fbaec4 Sofia Papagiannaki
#         (SELECT CASE WHEN(
1015 73fbaec4 Sofia Papagiannaki
#                     SELECT date_joined FROM im_membership
1016 73fbaec4 Sofia Papagiannaki
#                     WHERE group_id = im_astakosgroup.group_ptr_id
1017 73fbaec4 Sofia Papagiannaki
#                     AND person_id = %(id)s) IS NULL
1018 73fbaec4 Sofia Papagiannaki
#                     THEN 0 ELSE 1 END) AS membership_status
1019 73fbaec4 Sofia Papagiannaki
#         FROM im_astakosgroup
1020 73fbaec4 Sofia Papagiannaki
#         INNER JOIN im_membership ON (
1021 73fbaec4 Sofia Papagiannaki
#             im_astakosgroup.group_ptr_id = im_membership.group_id)
1022 73fbaec4 Sofia Papagiannaki
#         INNER JOIN auth_group ON(im_astakosgroup.group_ptr_id = auth_group.id)
1023 73fbaec4 Sofia Papagiannaki
#         INNER JOIN im_groupkind ON (im_astakosgroup.kind_id = im_groupkind.id)
1024 73fbaec4 Sofia Papagiannaki
#         LEFT JOIN im_astakosuser_owner ON (
1025 73fbaec4 Sofia Papagiannaki
#             im_astakosuser_owner.astakosgroup_id = im_astakosgroup.group_ptr_id)
1026 73fbaec4 Sofia Papagiannaki
#         LEFT JOIN auth_user as owner ON (
1027 73fbaec4 Sofia Papagiannaki
#             im_astakosuser_owner.astakosuser_id = owner.id)
1028 73fbaec4 Sofia Papagiannaki
#         WHERE im_membership.person_id = %(id)s
1029 73fbaec4 Sofia Papagiannaki
#         AND im_groupkind.name != 'default'
1030 73fbaec4 Sofia Papagiannaki
#         """ % request.user.__dict__
1031 73fbaec4 Sofia Papagiannaki
# 
1032 73fbaec4 Sofia Papagiannaki
#     # validate sorting
1033 73fbaec4 Sofia Papagiannaki
#     sorting = 'groupname'
1034 73fbaec4 Sofia Papagiannaki
#     sort_form = AstakosGroupSortForm(request.GET)
1035 73fbaec4 Sofia Papagiannaki
#     if sort_form.is_valid():
1036 73fbaec4 Sofia Papagiannaki
#         sorting = sort_form.cleaned_data.get('sorting')
1037 73fbaec4 Sofia Papagiannaki
#     query = query+" ORDER BY %s ASC" %sorting
1038 73fbaec4 Sofia Papagiannaki
#     
1039 73fbaec4 Sofia Papagiannaki
#     q = AstakosGroup.objects.raw(query)
1040 73fbaec4 Sofia Papagiannaki
#     
1041 73fbaec4 Sofia Papagiannaki
#     # Create the template, context, response
1042 73fbaec4 Sofia Papagiannaki
#     template_name = "%s/%s_list.html" % (
1043 73fbaec4 Sofia Papagiannaki
#         q.model._meta.app_label,
1044 73fbaec4 Sofia Papagiannaki
#         q.model._meta.object_name.lower()
1045 73fbaec4 Sofia Papagiannaki
#     )
1046 73fbaec4 Sofia Papagiannaki
#     extra_context = dict(
1047 73fbaec4 Sofia Papagiannaki
#         is_search=False,
1048 73fbaec4 Sofia Papagiannaki
#         q=q,
1049 73fbaec4 Sofia Papagiannaki
#         sorting=sorting,
1050 73fbaec4 Sofia Papagiannaki
#         page=request.GET.get('page', 1)
1051 73fbaec4 Sofia Papagiannaki
#     )
1052 73fbaec4 Sofia Papagiannaki
#     return render_response(template_name,
1053 73fbaec4 Sofia Papagiannaki
#                            context_instance=get_context(request, extra_context)
1054 73fbaec4 Sofia Papagiannaki
#     )
1055 73fbaec4 Sofia Papagiannaki
1056 73fbaec4 Sofia Papagiannaki
1057 73fbaec4 Sofia Papagiannaki
# @require_http_methods(["GET", "POST"])
1058 73fbaec4 Sofia Papagiannaki
# @signed_terms_required
1059 73fbaec4 Sofia Papagiannaki
# @login_required
1060 73fbaec4 Sofia Papagiannaki
# def group_detail(request, group_id):
1061 73fbaec4 Sofia Papagiannaki
#     q = AstakosGroup.objects.select_related().filter(pk=group_id)
1062 73fbaec4 Sofia Papagiannaki
#     q = q.extra(select={
1063 73fbaec4 Sofia Papagiannaki
#         'is_member': """SELECT CASE WHEN EXISTS(
1064 73fbaec4 Sofia Papagiannaki
#                             SELECT id FROM im_membership
1065 73fbaec4 Sofia Papagiannaki
#                             WHERE group_id = im_astakosgroup.group_ptr_id
1066 73fbaec4 Sofia Papagiannaki
#                             AND person_id = %s)
1067 73fbaec4 Sofia Papagiannaki
#                         THEN 1 ELSE 0 END""" % request.user.id,
1068 73fbaec4 Sofia Papagiannaki
#         'is_owner': """SELECT CASE WHEN EXISTS(
1069 73fbaec4 Sofia Papagiannaki
#                         SELECT id FROM im_astakosuser_owner
1070 73fbaec4 Sofia Papagiannaki
#                         WHERE astakosgroup_id = im_astakosgroup.group_ptr_id
1071 73fbaec4 Sofia Papagiannaki
#                         AND astakosuser_id = %s)
1072 73fbaec4 Sofia Papagiannaki
#                         THEN 1 ELSE 0 END""" % request.user.id,
1073 73fbaec4 Sofia Papagiannaki
#         'is_active_member': """SELECT CASE WHEN(
1074 73fbaec4 Sofia Papagiannaki
#                         SELECT date_joined FROM im_membership
1075 73fbaec4 Sofia Papagiannaki
#                         WHERE group_id = im_astakosgroup.group_ptr_id
1076 73fbaec4 Sofia Papagiannaki
#                         AND person_id = %s) IS NULL
1077 73fbaec4 Sofia Papagiannaki
#                         THEN 0 ELSE 1 END""" % request.user.id,
1078 73fbaec4 Sofia Papagiannaki
#         'kindname': """SELECT name FROM im_groupkind
1079 73fbaec4 Sofia Papagiannaki
#                        WHERE id = im_astakosgroup.kind_id"""})
1080 73fbaec4 Sofia Papagiannaki
# 
1081 73fbaec4 Sofia Papagiannaki
#     model = q.model
1082 73fbaec4 Sofia Papagiannaki
#     context_processors = None
1083 73fbaec4 Sofia Papagiannaki
#     mimetype = None
1084 73fbaec4 Sofia Papagiannaki
#     try:
1085 73fbaec4 Sofia Papagiannaki
#         obj = q.get()
1086 73fbaec4 Sofia Papagiannaki
#     except AstakosGroup.DoesNotExist:
1087 73fbaec4 Sofia Papagiannaki
#         raise Http404("No %s found matching the query" % (
1088 73fbaec4 Sofia Papagiannaki
#             model._meta.verbose_name))
1089 73fbaec4 Sofia Papagiannaki
# 
1090 73fbaec4 Sofia Papagiannaki
#     update_form = AstakosGroupUpdateForm(instance=obj)
1091 73fbaec4 Sofia Papagiannaki
#     addmembers_form = AddGroupMembersForm()
1092 73fbaec4 Sofia Papagiannaki
#     if request.method == 'POST':
1093 73fbaec4 Sofia Papagiannaki
#         update_data = {}
1094 73fbaec4 Sofia Papagiannaki
#         addmembers_data = {}
1095 73fbaec4 Sofia Papagiannaki
#         for k, v in request.POST.iteritems():
1096 73fbaec4 Sofia Papagiannaki
#             if k in update_form.fields:
1097 73fbaec4 Sofia Papagiannaki
#                 update_data[k] = v
1098 73fbaec4 Sofia Papagiannaki
#             if k in addmembers_form.fields:
1099 73fbaec4 Sofia Papagiannaki
#                 addmembers_data[k] = v
1100 73fbaec4 Sofia Papagiannaki
#         update_data = update_data or None
1101 73fbaec4 Sofia Papagiannaki
#         addmembers_data = addmembers_data or None
1102 73fbaec4 Sofia Papagiannaki
#         update_form = AstakosGroupUpdateForm(update_data, instance=obj)
1103 73fbaec4 Sofia Papagiannaki
#         addmembers_form = AddGroupMembersForm(addmembers_data)
1104 73fbaec4 Sofia Papagiannaki
#         if update_form.is_valid():
1105 73fbaec4 Sofia Papagiannaki
#             update_form.save()
1106 73fbaec4 Sofia Papagiannaki
#         if addmembers_form.is_valid():
1107 73fbaec4 Sofia Papagiannaki
#             try:
1108 73fbaec4 Sofia Papagiannaki
#                 map(obj.approve_member, addmembers_form.valid_users)
1109 73fbaec4 Sofia Papagiannaki
#             except AssertionError:
1110 73fbaec4 Sofia Papagiannaki
#                 msg = _(astakos_messages.GROUP_MAX_PARTICIPANT_NUMBER_REACHED)
1111 73fbaec4 Sofia Papagiannaki
#                 messages.error(request, msg)
1112 73fbaec4 Sofia Papagiannaki
#             addmembers_form = AddGroupMembersForm()
1113 73fbaec4 Sofia Papagiannaki
# 
1114 73fbaec4 Sofia Papagiannaki
#     template_name = "%s/%s_detail.html" % (
1115 73fbaec4 Sofia Papagiannaki
#         model._meta.app_label, model._meta.object_name.lower())
1116 73fbaec4 Sofia Papagiannaki
#     t = template_loader.get_template(template_name)
1117 73fbaec4 Sofia Papagiannaki
#     c = RequestContext(request, {
1118 73fbaec4 Sofia Papagiannaki
#         'object': obj,
1119 73fbaec4 Sofia Papagiannaki
#     }, context_processors)
1120 73fbaec4 Sofia Papagiannaki
# 
1121 73fbaec4 Sofia Papagiannaki
#     # validate sorting
1122 73fbaec4 Sofia Papagiannaki
#     sorting = 'person__email'
1123 73fbaec4 Sofia Papagiannaki
#     form = MembersSortForm(request.GET)
1124 73fbaec4 Sofia Papagiannaki
#     if form.is_valid():
1125 73fbaec4 Sofia Papagiannaki
#         sorting = form.cleaned_data.get('sorting')
1126 73fbaec4 Sofia Papagiannaki
#     
1127 73fbaec4 Sofia Papagiannaki
#     result = callpoint.list_resources()
1128 73fbaec4 Sofia Papagiannaki
#     resource_catalog = ResourcePresentation(RESOURCES_PRESENTATION_DATA)
1129 73fbaec4 Sofia Papagiannaki
#     resource_catalog.update_from_result(result)
1130 73fbaec4 Sofia Papagiannaki
# 
1131 73fbaec4 Sofia Papagiannaki
# 
1132 73fbaec4 Sofia Papagiannaki
#     if not result.is_success:
1133 73fbaec4 Sofia Papagiannaki
#         messages.error(
1134 73fbaec4 Sofia Papagiannaki
#             request,
1135 73fbaec4 Sofia Papagiannaki
#             'Unable to retrieve system resources: %s' % result.reason
1136 73fbaec4 Sofia Papagiannaki
#     )
1137 73fbaec4 Sofia Papagiannaki
# 
1138 73fbaec4 Sofia Papagiannaki
#     extra_context = {'update_form': update_form,
1139 73fbaec4 Sofia Papagiannaki
#                      'addmembers_form': addmembers_form,
1140 73fbaec4 Sofia Papagiannaki
#                      'page': request.GET.get('page', 1),
1141 73fbaec4 Sofia Papagiannaki
#                      'sorting': sorting,
1142 73fbaec4 Sofia Papagiannaki
#                      'resource_catalog':resource_catalog,
1143 73fbaec4 Sofia Papagiannaki
#                      'quota':resource_catalog.get_quota(obj.quota)}
1144 73fbaec4 Sofia Papagiannaki
#     for key, value in extra_context.items():
1145 73fbaec4 Sofia Papagiannaki
#         if callable(value):
1146 73fbaec4 Sofia Papagiannaki
#             c[key] = value()
1147 73fbaec4 Sofia Papagiannaki
#         else:
1148 73fbaec4 Sofia Papagiannaki
#             c[key] = value
1149 73fbaec4 Sofia Papagiannaki
#     response = HttpResponse(t.render(c), mimetype=mimetype)
1150 73fbaec4 Sofia Papagiannaki
#     populate_xheaders(
1151 73fbaec4 Sofia Papagiannaki
#         request, response, model, getattr(obj, obj._meta.pk.name))
1152 73fbaec4 Sofia Papagiannaki
#     return response
1153 73fbaec4 Sofia Papagiannaki
1154 73fbaec4 Sofia Papagiannaki
1155 73fbaec4 Sofia Papagiannaki
# @require_http_methods(["GET", "POST"])
1156 73fbaec4 Sofia Papagiannaki
# @signed_terms_required
1157 73fbaec4 Sofia Papagiannaki
# @login_required
1158 73fbaec4 Sofia Papagiannaki
# def group_search(request, extra_context=None, **kwargs):
1159 73fbaec4 Sofia Papagiannaki
#     q = request.GET.get('q')
1160 73fbaec4 Sofia Papagiannaki
#     if request.method == 'GET':
1161 73fbaec4 Sofia Papagiannaki
#         form = AstakosGroupSearchForm({'q': q} if q else None)
1162 73fbaec4 Sofia Papagiannaki
#     else:
1163 73fbaec4 Sofia Papagiannaki
#         form = AstakosGroupSearchForm(get_query(request))
1164 73fbaec4 Sofia Papagiannaki
#         if form.is_valid():
1165 73fbaec4 Sofia Papagiannaki
#             q = form.cleaned_data['q'].strip()
1166 73fbaec4 Sofia Papagiannaki
#     
1167 73fbaec4 Sofia Papagiannaki
#     sorting = 'groupname'
1168 73fbaec4 Sofia Papagiannaki
#     if q:
1169 73fbaec4 Sofia Papagiannaki
#         queryset = AstakosGroup.objects.select_related()
1170 73fbaec4 Sofia Papagiannaki
#         queryset = queryset.filter(~Q(kind__name='default'))
1171 73fbaec4 Sofia Papagiannaki
#         queryset = queryset.filter(name__contains=q)
1172 73fbaec4 Sofia Papagiannaki
#         queryset = queryset.filter(approval_date__isnull=False)
1173 73fbaec4 Sofia Papagiannaki
#         queryset = queryset.extra(select={
1174 73fbaec4 Sofia Papagiannaki
#                                   'groupname': "auth_group.name",
1175 73fbaec4 Sofia Papagiannaki
#                                   'kindname': "im_groupkind.name",
1176 73fbaec4 Sofia Papagiannaki
#                                   'approved_members_num': """
1177 73fbaec4 Sofia Papagiannaki
#                     SELECT COUNT(*) FROM im_membership
1178 73fbaec4 Sofia Papagiannaki
#                     WHERE group_id = im_astakosgroup.group_ptr_id
1179 73fbaec4 Sofia Papagiannaki
#                     AND date_joined IS NOT NULL""",
1180 73fbaec4 Sofia Papagiannaki
#                                   'membership_approval_date': """
1181 73fbaec4 Sofia Papagiannaki
#                     SELECT date_joined FROM im_membership
1182 73fbaec4 Sofia Papagiannaki
#                     WHERE group_id = im_astakosgroup.group_ptr_id
1183 73fbaec4 Sofia Papagiannaki
#                     AND person_id = %s""" % request.user.id,
1184 73fbaec4 Sofia Papagiannaki
#                                   'is_member': """
1185 73fbaec4 Sofia Papagiannaki
#                     SELECT CASE WHEN EXISTS(
1186 73fbaec4 Sofia Papagiannaki
#                     SELECT date_joined FROM im_membership
1187 73fbaec4 Sofia Papagiannaki
#                     WHERE group_id = im_astakosgroup.group_ptr_id
1188 73fbaec4 Sofia Papagiannaki
#                     AND person_id = %s)
1189 73fbaec4 Sofia Papagiannaki
#                     THEN 1 ELSE 0 END""" % request.user.id,
1190 73fbaec4 Sofia Papagiannaki
#                                   'is_owner': """
1191 73fbaec4 Sofia Papagiannaki
#                     SELECT CASE WHEN EXISTS(
1192 73fbaec4 Sofia Papagiannaki
#                     SELECT id FROM im_astakosuser_owner
1193 73fbaec4 Sofia Papagiannaki
#                     WHERE astakosgroup_id = im_astakosgroup.group_ptr_id
1194 73fbaec4 Sofia Papagiannaki
#                     AND astakosuser_id = %s)
1195 73fbaec4 Sofia Papagiannaki
#                     THEN 1 ELSE 0 END""" % request.user.id,
1196 73fbaec4 Sofia Papagiannaki
#                     'is_owner': """SELECT CASE WHEN EXISTS(
1197 73fbaec4 Sofia Papagiannaki
#                         SELECT id FROM im_astakosuser_owner
1198 73fbaec4 Sofia Papagiannaki
#                         WHERE astakosgroup_id = im_astakosgroup.group_ptr_id
1199 73fbaec4 Sofia Papagiannaki
#                         AND astakosuser_id = %s)
1200 73fbaec4 Sofia Papagiannaki
#                         THEN 1 ELSE 0 END""" % request.user.id,
1201 73fbaec4 Sofia Papagiannaki
#                     })
1202 73fbaec4 Sofia Papagiannaki
#         
1203 73fbaec4 Sofia Papagiannaki
#         # validate sorting
1204 73fbaec4 Sofia Papagiannaki
#         sort_form = AstakosGroupSortForm(request.GET)
1205 73fbaec4 Sofia Papagiannaki
#         if sort_form.is_valid():
1206 73fbaec4 Sofia Papagiannaki
#             sorting = sort_form.cleaned_data.get('sorting')
1207 73fbaec4 Sofia Papagiannaki
#         queryset = queryset.order_by(sorting)
1208 73fbaec4 Sofia Papagiannaki
# 
1209 73fbaec4 Sofia Papagiannaki
#     else:
1210 73fbaec4 Sofia Papagiannaki
#         queryset = AstakosGroup.objects.none()
1211 73fbaec4 Sofia Papagiannaki
#     return object_list(
1212 73fbaec4 Sofia Papagiannaki
#         request,
1213 73fbaec4 Sofia Papagiannaki
#         queryset,
1214 73fbaec4 Sofia Papagiannaki
#         paginate_by=PAGINATE_BY_ALL,
1215 73fbaec4 Sofia Papagiannaki
#         page=request.GET.get('page') or 1,
1216 73fbaec4 Sofia Papagiannaki
#         template_name='im/astakosgroup_list.html',
1217 73fbaec4 Sofia Papagiannaki
#         extra_context=dict(form=form,
1218 73fbaec4 Sofia Papagiannaki
#                            is_search=True,
1219 73fbaec4 Sofia Papagiannaki
#                            q=q,
1220 73fbaec4 Sofia Papagiannaki
#                            sorting=sorting))
1221 73fbaec4 Sofia Papagiannaki
1222 73fbaec4 Sofia Papagiannaki
1223 73fbaec4 Sofia Papagiannaki
# @require_http_methods(["GET", "POST"])
1224 73fbaec4 Sofia Papagiannaki
# @signed_terms_required
1225 73fbaec4 Sofia Papagiannaki
# @login_required
1226 73fbaec4 Sofia Papagiannaki
# def group_all(request, extra_context=None, **kwargs):
1227 73fbaec4 Sofia Papagiannaki
#     q = AstakosGroup.objects.select_related()
1228 73fbaec4 Sofia Papagiannaki
#     q = q.filter(~Q(kind__name='default'))
1229 73fbaec4 Sofia Papagiannaki
#     q = q.filter(approval_date__isnull=False)
1230 73fbaec4 Sofia Papagiannaki
#     q = q.extra(select={
1231 73fbaec4 Sofia Papagiannaki
#                 'groupname': "auth_group.name",
1232 73fbaec4 Sofia Papagiannaki
#                 'kindname': "im_groupkind.name",
1233 73fbaec4 Sofia Papagiannaki
#                 'approved_members_num': """
1234 73fbaec4 Sofia Papagiannaki
#                     SELECT COUNT(*) FROM im_membership
1235 73fbaec4 Sofia Papagiannaki
#                     WHERE group_id = im_astakosgroup.group_ptr_id
1236 73fbaec4 Sofia Papagiannaki
#                     AND date_joined IS NOT NULL""",
1237 73fbaec4 Sofia Papagiannaki
#                 'membership_approval_date': """
1238 73fbaec4 Sofia Papagiannaki
#                     SELECT date_joined FROM im_membership
1239 73fbaec4 Sofia Papagiannaki
#                     WHERE group_id = im_astakosgroup.group_ptr_id
1240 73fbaec4 Sofia Papagiannaki
#                     AND person_id = %s""" % request.user.id,
1241 73fbaec4 Sofia Papagiannaki
#                 'is_member': """
1242 73fbaec4 Sofia Papagiannaki
#                     SELECT CASE WHEN EXISTS(
1243 73fbaec4 Sofia Papagiannaki
#                     SELECT date_joined FROM im_membership
1244 73fbaec4 Sofia Papagiannaki
#                     WHERE group_id = im_astakosgroup.group_ptr_id
1245 73fbaec4 Sofia Papagiannaki
#                     AND person_id = %s)
1246 73fbaec4 Sofia Papagiannaki
#                     THEN 1 ELSE 0 END""" % request.user.id,
1247 73fbaec4 Sofia Papagiannaki
#                  'is_owner': """SELECT CASE WHEN EXISTS(
1248 73fbaec4 Sofia Papagiannaki
#                         SELECT id FROM im_astakosuser_owner
1249 73fbaec4 Sofia Papagiannaki
#                         WHERE astakosgroup_id = im_astakosgroup.group_ptr_id
1250 73fbaec4 Sofia Papagiannaki
#                         AND astakosuser_id = %s)
1251 73fbaec4 Sofia Papagiannaki
#                         THEN 1 ELSE 0 END""" % request.user.id,   })
1252 73fbaec4 Sofia Papagiannaki
#     
1253 73fbaec4 Sofia Papagiannaki
#     # validate sorting
1254 73fbaec4 Sofia Papagiannaki
#     sorting = 'groupname'
1255 73fbaec4 Sofia Papagiannaki
#     sort_form = AstakosGroupSortForm(request.GET)
1256 73fbaec4 Sofia Papagiannaki
#     if sort_form.is_valid():
1257 73fbaec4 Sofia Papagiannaki
#         sorting = sort_form.cleaned_data.get('sorting')
1258 73fbaec4 Sofia Papagiannaki
#     q = q.order_by(sorting)
1259 73fbaec4 Sofia Papagiannaki
#     
1260 73fbaec4 Sofia Papagiannaki
#     return object_list(
1261 73fbaec4 Sofia Papagiannaki
#         request,
1262 73fbaec4 Sofia Papagiannaki
#         q,
1263 73fbaec4 Sofia Papagiannaki
#         paginate_by=PAGINATE_BY_ALL,
1264 73fbaec4 Sofia Papagiannaki
#         page=request.GET.get('page') or 1,
1265 73fbaec4 Sofia Papagiannaki
#         template_name='im/astakosgroup_list.html',
1266 73fbaec4 Sofia Papagiannaki
#         extra_context=dict(form=AstakosGroupSearchForm(),
1267 73fbaec4 Sofia Papagiannaki
#                            is_search=True,
1268 73fbaec4 Sofia Papagiannaki
#                            sorting=sorting))
1269 73fbaec4 Sofia Papagiannaki
1270 73fbaec4 Sofia Papagiannaki
1271 73fbaec4 Sofia Papagiannaki
##@require_http_methods(["POST"])
1272 73fbaec4 Sofia Papagiannaki
# @require_http_methods(["POST", "GET"])
1273 73fbaec4 Sofia Papagiannaki
# @signed_terms_required
1274 73fbaec4 Sofia Papagiannaki
# @login_required
1275 73fbaec4 Sofia Papagiannaki
# def group_join(request, group_id):
1276 73fbaec4 Sofia Papagiannaki
#     m = Membership(group_id=group_id,
1277 73fbaec4 Sofia Papagiannaki
#                    person=request.user,
1278 73fbaec4 Sofia Papagiannaki
#                    date_requested=datetime.now())
1279 73fbaec4 Sofia Papagiannaki
#     try:
1280 73fbaec4 Sofia Papagiannaki
#         m.save()
1281 73fbaec4 Sofia Papagiannaki
#         post_save_redirect = reverse(
1282 73fbaec4 Sofia Papagiannaki
#             'group_detail',
1283 73fbaec4 Sofia Papagiannaki
#             kwargs=dict(group_id=group_id))
1284 73fbaec4 Sofia Papagiannaki
#         return HttpResponseRedirect(post_save_redirect)
1285 73fbaec4 Sofia Papagiannaki
#     except IntegrityError, e:
1286 73fbaec4 Sofia Papagiannaki
#         logger.exception(e)
1287 73fbaec4 Sofia Papagiannaki
#         msg = _(astakos_messages.GROUP_JOIN_FAILURE)
1288 73fbaec4 Sofia Papagiannaki
#         messages.error(request, msg)
1289 73fbaec4 Sofia Papagiannaki
#         return group_search(request)
1290 73fbaec4 Sofia Papagiannaki
# 
1291 73fbaec4 Sofia Papagiannaki
# 
1292 73fbaec4 Sofia Papagiannaki
# @require_http_methods(["POST"])
1293 73fbaec4 Sofia Papagiannaki
# @signed_terms_required
1294 73fbaec4 Sofia Papagiannaki
# @login_required
1295 73fbaec4 Sofia Papagiannaki
# def group_leave(request, group_id):
1296 73fbaec4 Sofia Papagiannaki
#     try:
1297 73fbaec4 Sofia Papagiannaki
#         m = Membership.objects.select_related().get(
1298 73fbaec4 Sofia Papagiannaki
#             group__id=group_id,
1299 73fbaec4 Sofia Papagiannaki
#             person=request.user)
1300 73fbaec4 Sofia Papagiannaki
#     except Membership.DoesNotExist:
1301 73fbaec4 Sofia Papagiannaki
#         return HttpResponseBadRequest(_(astakos_messages.NOT_MEMBER))
1302 73fbaec4 Sofia Papagiannaki
#     if request.user in m.group.owner.all():
1303 73fbaec4 Sofia Papagiannaki
#         return HttpResponseForbidden(_(astakos_messages.OWNER_CANNOT_LEAVE_GROUP))
1304 73fbaec4 Sofia Papagiannaki
#     return delete_object(
1305 73fbaec4 Sofia Papagiannaki
#         request,
1306 73fbaec4 Sofia Papagiannaki
#         model=Membership,
1307 73fbaec4 Sofia Papagiannaki
#         object_id=m.id,
1308 73fbaec4 Sofia Papagiannaki
#         template_name='im/astakosgroup_list.html',
1309 73fbaec4 Sofia Papagiannaki
#         post_delete_redirect=reverse(
1310 73fbaec4 Sofia Papagiannaki
#             'group_detail',
1311 73fbaec4 Sofia Papagiannaki
#             kwargs=dict(group_id=group_id)))
1312 73fbaec4 Sofia Papagiannaki
1313 73fbaec4 Sofia Papagiannaki
1314 73fbaec4 Sofia Papagiannaki
# def handle_membership(func):
1315 73fbaec4 Sofia Papagiannaki
#     @wraps(func)
1316 73fbaec4 Sofia Papagiannaki
#     def wrapper(request, group_id, user_id):
1317 73fbaec4 Sofia Papagiannaki
#         try:
1318 73fbaec4 Sofia Papagiannaki
#             m = Membership.objects.select_related().get(
1319 73fbaec4 Sofia Papagiannaki
#                 group__id=group_id,
1320 73fbaec4 Sofia Papagiannaki
#                 person__id=user_id)
1321 73fbaec4 Sofia Papagiannaki
#         except Membership.DoesNotExist:
1322 73fbaec4 Sofia Papagiannaki
#             return HttpResponseBadRequest(_(astakos_messages.NOT_MEMBER))
1323 73fbaec4 Sofia Papagiannaki
#         else:
1324 73fbaec4 Sofia Papagiannaki
#             if request.user not in m.group.owner.all():
1325 73fbaec4 Sofia Papagiannaki
#                 return HttpResponseForbidden(_(astakos_messages.NOT_OWNER))
1326 73fbaec4 Sofia Papagiannaki
#             func(request, m)
1327 73fbaec4 Sofia Papagiannaki
#             return group_detail(request, group_id)
1328 73fbaec4 Sofia Papagiannaki
#     return wrapper
1329 01ac12d5 Sofia Papagiannaki
1330 5ce3ce4f Sofia Papagiannaki
1331 ae497612 Olga Brani
#@require_http_methods(["POST"])
1332 73fbaec4 Sofia Papagiannaki
# @require_http_methods(["POST", "GET"])
1333 73fbaec4 Sofia Papagiannaki
# @signed_terms_required
1334 73fbaec4 Sofia Papagiannaki
# @login_required
1335 73fbaec4 Sofia Papagiannaki
# @handle_membership
1336 73fbaec4 Sofia Papagiannaki
# def approve_member(request, membership):
1337 73fbaec4 Sofia Papagiannaki
#     try:
1338 73fbaec4 Sofia Papagiannaki
#         membership.approve()
1339 73fbaec4 Sofia Papagiannaki
#         realname = membership.person.realname
1340 73fbaec4 Sofia Papagiannaki
#         msg = _(astakos_messages.MEMBER_JOINED_GROUP) % locals()
1341 73fbaec4 Sofia Papagiannaki
#         messages.success(request, msg)
1342 73fbaec4 Sofia Papagiannaki
#     except AssertionError:
1343 73fbaec4 Sofia Papagiannaki
#         msg = _(astakos_messages.GROUP_MAX_PARTICIPANT_NUMBER_REACHED)
1344 73fbaec4 Sofia Papagiannaki
#         messages.error(request, msg)
1345 73fbaec4 Sofia Papagiannaki
#     except BaseException, e:
1346 73fbaec4 Sofia Papagiannaki
#         logger.exception(e)
1347 73fbaec4 Sofia Papagiannaki
#         realname = membership.person.realname
1348 73fbaec4 Sofia Papagiannaki
#         msg = _(astakos_messages.GENERIC_ERROR)
1349 73fbaec4 Sofia Papagiannaki
#         messages.error(request, msg)
1350 5ce3ce4f Sofia Papagiannaki
1351 5ce3ce4f Sofia Papagiannaki
1352 73fbaec4 Sofia Papagiannaki
# @signed_terms_required
1353 73fbaec4 Sofia Papagiannaki
# @login_required
1354 73fbaec4 Sofia Papagiannaki
# @handle_membership
1355 73fbaec4 Sofia Papagiannaki
# def disapprove_member(request, membership):
1356 73fbaec4 Sofia Papagiannaki
#     try:
1357 73fbaec4 Sofia Papagiannaki
#         membership.disapprove()
1358 73fbaec4 Sofia Papagiannaki
#         realname = membership.person.realname
1359 73fbaec4 Sofia Papagiannaki
#         msg = astakos_messages.MEMBER_REMOVED % locals()
1360 73fbaec4 Sofia Papagiannaki
#         messages.success(request, msg)
1361 73fbaec4 Sofia Papagiannaki
#     except BaseException, e:
1362 73fbaec4 Sofia Papagiannaki
#         logger.exception(e)
1363 73fbaec4 Sofia Papagiannaki
#         msg = _(astakos_messages.GENERIC_ERROR)
1364 73fbaec4 Sofia Papagiannaki
#         messages.error(request, msg)
1365 ffb1e7a8 Sofia Papagiannaki
1366 5ce3ce4f Sofia Papagiannaki
1367 73fbaec4 Sofia Papagiannaki
@require_http_methods(["GET"])
1368 ae497612 Olga Brani
@require_http_methods(["POST", "GET"])
1369 badcb2a9 Kostas Papadimitriou
@valid_astakos_user_required
1370 666c7490 Sofia Papagiannaki
def resource_usage(request):
1371 52343ac8 Olga Brani
    def with_class(entry):
1372 52343ac8 Olga Brani
        entry['load_class'] = 'red'
1373 52343ac8 Olga Brani
        max_value = float(entry['maxValue'])
1374 52343ac8 Olga Brani
        curr_value = float(entry['currValue'])
1375 394c9834 Olga Brani
        entry['ratio_limited']= 0
1376 639e0352 Olga Brani
        if max_value > 0 :
1377 c0b26605 Sofia Papagiannaki
            entry['ratio'] = (curr_value / max_value) * 100
1378 c0b26605 Sofia Papagiannaki
        else:
1379 792c2f3b Olga Brani
            entry['ratio'] = 0
1380 52343ac8 Olga Brani
        if entry['ratio'] < 66:
1381 9a06d96f Olga Brani
            entry['load_class'] = 'yellow'
1382 52343ac8 Olga Brani
        if entry['ratio'] < 33:
1383 9a06d96f Olga Brani
            entry['load_class'] = 'green'
1384 394c9834 Olga Brani
        if entry['ratio']<0:
1385 394c9834 Olga Brani
            entry['ratio'] = 0
1386 394c9834 Olga Brani
        if entry['ratio']>100:
1387 394c9834 Olga Brani
            entry['ratio_limited'] = 100
1388 394c9834 Olga Brani
        else:
1389 394c9834 Olga Brani
            entry['ratio_limited'] = entry['ratio']
1390 c630fee6 Kostas Papadimitriou
1391 9a06d96f Olga Brani
        return entry
1392 9a06d96f Olga Brani
1393 52343ac8 Olga Brani
    def pluralize(entry):
1394 9a06d96f Olga Brani
        entry['plural'] = engine.plural(entry.get('name'))
1395 9a06d96f Olga Brani
        return entry
1396 52343ac8 Olga Brani
1397 666c7490 Sofia Papagiannaki
    result = callpoint.get_user_usage(request.user.id)
1398 820b18e0 Sofia Papagiannaki
    if result.is_success:
1399 820b18e0 Sofia Papagiannaki
        backenddata = map(with_class, result.data)
1400 820b18e0 Sofia Papagiannaki
        data = map(pluralize, result.data)
1401 9a06d96f Olga Brani
    else:
1402 820b18e0 Sofia Papagiannaki
        data = None
1403 820b18e0 Sofia Papagiannaki
        messages.error(request, result.reason)
1404 172ce682 Sofia Papagiannaki
    resource_catalog = result.data
1405 172ce682 Sofia Papagiannaki
#     resource_catalog = ResourcePresentation(RESOURCES_PRESENTATION_DATA)
1406 172ce682 Sofia Papagiannaki
#     resource_catalog.update_from_result_report(result)
1407 666c7490 Sofia Papagiannaki
    return render_response('im/resource_usage.html',
1408 9a06d96f Olga Brani
                           data=data,
1409 3cbd5e47 Olga Brani
                           context_instance=get_context(request),
1410 c0b26605 Sofia Papagiannaki
                           resource_catalog=resource_catalog,
1411 3cbd5e47 Olga Brani
                           result=result)
1412 9a06d96f Olga Brani
1413 1b866d9e Olga Brani
1414 73fbaec4 Sofia Papagiannaki
# def group_create_list(request):
1415 73fbaec4 Sofia Papagiannaki
#     form = PickResourceForm()
1416 73fbaec4 Sofia Papagiannaki
#     return render_response(
1417 73fbaec4 Sofia Papagiannaki
#         template='im/astakosgroup_create_list.html',
1418 73fbaec4 Sofia Papagiannaki
#         context_instance=get_context(request),)
1419 6e029beb Sofia Papagiannaki
1420 5ce3ce4f Sofia Papagiannaki
1421 f8f86e83 root
##@require_http_methods(["GET"])
1422 f8f86e83 root
#@require_http_methods(["POST", "GET"])
1423 f8f86e83 root
#@signed_terms_required
1424 f8f86e83 root
#@login_required
1425 f8f86e83 root
#def billing(request):
1426 f8f86e83 root
#
1427 f8f86e83 root
#    today = datetime.today()
1428 f8f86e83 root
#    month_last_day = calendar.monthrange(today.year, today.month)[1]
1429 f8f86e83 root
#    start = request.POST.get('datefrom', None)
1430 f8f86e83 root
#    if start:
1431 f8f86e83 root
#        today = datetime.fromtimestamp(int(start))
1432 f8f86e83 root
#        month_last_day = calendar.monthrange(today.year, today.month)[1]
1433 f8f86e83 root
#
1434 f8f86e83 root
#    start = datetime(today.year, today.month, 1).strftime("%s")
1435 f8f86e83 root
#    end = datetime(today.year, today.month, month_last_day).strftime("%s")
1436 f8f86e83 root
#    r = request_billing.apply(args=('pgerakios@grnet.gr',
1437 f8f86e83 root
#                                    int(start) * 1000,
1438 f8f86e83 root
#                                    int(end) * 1000))
1439 f8f86e83 root
#    data = {}
1440 f8f86e83 root
#
1441 f8f86e83 root
#    try:
1442 f8f86e83 root
#        status, data = r.result
1443 f8f86e83 root
#        data = _clear_billing_data(data)
1444 f8f86e83 root
#        if status != 200:
1445 f8f86e83 root
#            messages.error(request, _(astakos_messages.BILLING_ERROR) % status)
1446 f8f86e83 root
#    except:
1447 f8f86e83 root
#        messages.error(request, r.result)
1448 f8f86e83 root
#
1449 f8f86e83 root
#    return render_response(
1450 f8f86e83 root
#        template='im/billing.html',
1451 f8f86e83 root
#        context_instance=get_context(request),
1452 f8f86e83 root
#        data=data,
1453 f8f86e83 root
#        zerodate=datetime(month=1, year=1970, day=1),
1454 f8f86e83 root
#        today=today,
1455 f8f86e83 root
#        start=int(start),
1456 f8f86e83 root
#        month_last_day=month_last_day)
1457 9a06d96f Olga Brani
1458 54213d7a Sofia Papagiannaki
1459 f8f86e83 root
#def _clear_billing_data(data):
1460 f8f86e83 root
#
1461 f8f86e83 root
#    # remove addcredits entries
1462 f8f86e83 root
#    def isnotcredit(e):
1463 f8f86e83 root
#        return e['serviceName'] != "addcredits"
1464 f8f86e83 root
#
1465 f8f86e83 root
#    # separate services
1466 f8f86e83 root
#    def servicefilter(service_name):
1467 f8f86e83 root
#        service = service_name
1468 f8f86e83 root
#
1469 f8f86e83 root
#        def fltr(e):
1470 f8f86e83 root
#            return e['serviceName'] == service
1471 f8f86e83 root
#        return fltr
1472 f8f86e83 root
#
1473 f8f86e83 root
#    data['bill_nocredits'] = filter(isnotcredit, data['bill'])
1474 f8f86e83 root
#    data['bill_vmtime'] = filter(servicefilter('vmtime'), data['bill'])
1475 f8f86e83 root
#    data['bill_diskspace'] = filter(servicefilter('diskspace'), data['bill'])
1476 f8f86e83 root
#    data['bill_addcredits'] = filter(servicefilter('addcredits'), data['bill'])
1477 f8f86e83 root
#
1478 f8f86e83 root
#    return data
1479 792c2f3b Olga Brani
1480 792c2f3b Olga Brani
1481 e1a80257 Sofia Papagiannaki
# #@require_http_methods(["GET"])
1482 e1a80257 Sofia Papagiannaki
# @require_http_methods(["POST", "GET"])
1483 e1a80257 Sofia Papagiannaki
# @signed_terms_required
1484 e1a80257 Sofia Papagiannaki
# @login_required
1485 e1a80257 Sofia Papagiannaki
# def timeline(request):
1486 e1a80257 Sofia Papagiannaki
# #    data = {'entity':request.user.email}
1487 e1a80257 Sofia Papagiannaki
#     timeline_body = ()
1488 e1a80257 Sofia Papagiannaki
#     timeline_header = ()
1489 e1a80257 Sofia Papagiannaki
# #    form = TimelineForm(data)
1490 e1a80257 Sofia Papagiannaki
#     form = TimelineForm()
1491 e1a80257 Sofia Papagiannaki
#     if request.method == 'POST':
1492 e1a80257 Sofia Papagiannaki
#         data = request.POST
1493 e1a80257 Sofia Papagiannaki
#         form = TimelineForm(data)
1494 e1a80257 Sofia Papagiannaki
#         if form.is_valid():
1495 e1a80257 Sofia Papagiannaki
#             data = form.cleaned_data
1496 e1a80257 Sofia Papagiannaki
#             timeline_header = ('entity', 'resource',
1497 e1a80257 Sofia Papagiannaki
#                                'event name', 'event date',
1498 e1a80257 Sofia Papagiannaki
#                                'incremental cost', 'total cost')
1499 e1a80257 Sofia Papagiannaki
#             timeline_body = timeline_charge(
1500 e1a80257 Sofia Papagiannaki
#                 data['entity'], data['resource'],
1501 e1a80257 Sofia Papagiannaki
#                 data['start_date'], data['end_date'],
1502 e1a80257 Sofia Papagiannaki
#                 data['details'], data['operation'])
1503 f7cf5257 Kostas Papadimitriou
#
1504 e1a80257 Sofia Papagiannaki
#     return render_response(template='im/timeline.html',
1505 e1a80257 Sofia Papagiannaki
#                            context_instance=get_context(request),
1506 e1a80257 Sofia Papagiannaki
#                            form=form,
1507 e1a80257 Sofia Papagiannaki
#                            timeline_header=timeline_header,
1508 e1a80257 Sofia Papagiannaki
#                            timeline_body=timeline_body)
1509 e1a80257 Sofia Papagiannaki
#     return data
1510 5ebebb20 Olga Brani
1511 792c2f3b Olga Brani
1512 f432088a Kostas Papadimitriou
# TODO: action only on POST and user should confirm the removal
1513 d2633501 Kostas Papadimitriou
@require_http_methods(["GET", "POST"])
1514 d2633501 Kostas Papadimitriou
@login_required
1515 d2633501 Kostas Papadimitriou
@signed_terms_required
1516 d2633501 Kostas Papadimitriou
def remove_auth_provider(request, pk):
1517 f432088a Kostas Papadimitriou
    try:
1518 f432088a Kostas Papadimitriou
        provider = request.user.auth_providers.get(pk=pk)
1519 f432088a Kostas Papadimitriou
    except AstakosUserAuthProvider.DoesNotExist:
1520 f432088a Kostas Papadimitriou
        raise Http404
1521 f432088a Kostas Papadimitriou
1522 d2633501 Kostas Papadimitriou
    if provider.can_remove():
1523 d2633501 Kostas Papadimitriou
        provider.delete()
1524 d2633501 Kostas Papadimitriou
        return HttpResponseRedirect(reverse('edit_profile'))
1525 d2633501 Kostas Papadimitriou
    else:
1526 f432088a Kostas Papadimitriou
        raise PermissionDenied
1527 5ebebb20 Olga Brani
1528 792c2f3b Olga Brani
1529 5ebebb20 Olga Brani
def how_it_works(request):
1530 5ebebb20 Olga Brani
    return render_response(
1531 ccab6eb5 Sofia Papagiannaki
        'im/how_it_works.html',
1532 ccab6eb5 Sofia Papagiannaki
        context_instance=get_context(request))
1533 e1a80257 Sofia Papagiannaki
1534 bfe23b13 Sofia Papagiannaki
@transaction.commit_manually
1535 172ce682 Sofia Papagiannaki
def _create_object(request, model=None, template_name=None,
1536 172ce682 Sofia Papagiannaki
        template_loader=template_loader, extra_context=None, post_save_redirect=None,
1537 172ce682 Sofia Papagiannaki
        login_required=False, context_processors=None, form_class=None):
1538 172ce682 Sofia Papagiannaki
    """
1539 4e748491 Sofia Papagiannaki
    Based of django.views.generic.create_update.create_object which displays a
1540 172ce682 Sofia Papagiannaki
    summary page before creating the object.
1541 172ce682 Sofia Papagiannaki
    """
1542 bfe23b13 Sofia Papagiannaki
    rollback = False
1543 172ce682 Sofia Papagiannaki
    response = None
1544 4e748491 Sofia Papagiannaki
1545 4e748491 Sofia Papagiannaki
    if extra_context is None: extra_context = {}
1546 4e748491 Sofia Papagiannaki
    if login_required and not request.user.is_authenticated():
1547 4e748491 Sofia Papagiannaki
        return redirect_to_login(request.path)
1548 ccab6eb5 Sofia Papagiannaki
    try:
1549 f7cf5257 Kostas Papadimitriou
1550 172ce682 Sofia Papagiannaki
        model, form_class = get_model_and_form_class(model, form_class)
1551 172ce682 Sofia Papagiannaki
        extra_context['edit'] = 0
1552 172ce682 Sofia Papagiannaki
        if request.method == 'POST':
1553 172ce682 Sofia Papagiannaki
            form = form_class(request.POST, request.FILES)
1554 172ce682 Sofia Papagiannaki
            if form.is_valid():
1555 172ce682 Sofia Papagiannaki
                verify = request.GET.get('verify')
1556 172ce682 Sofia Papagiannaki
                edit = request.GET.get('edit')
1557 172ce682 Sofia Papagiannaki
                if verify == '1':
1558 172ce682 Sofia Papagiannaki
                    extra_context['show_form'] = False
1559 172ce682 Sofia Papagiannaki
                    extra_context['form_data'] = form.cleaned_data
1560 172ce682 Sofia Papagiannaki
                elif edit == '1':
1561 172ce682 Sofia Papagiannaki
                    extra_context['show_form'] = True
1562 172ce682 Sofia Papagiannaki
                else:
1563 172ce682 Sofia Papagiannaki
                    new_object = form.save()
1564 f7cf5257 Kostas Papadimitriou
1565 172ce682 Sofia Papagiannaki
                    msg = _("The %(verbose_name)s was created successfully.") %\
1566 172ce682 Sofia Papagiannaki
                                {"verbose_name": model._meta.verbose_name}
1567 172ce682 Sofia Papagiannaki
                    messages.success(request, msg, fail_silently=True)
1568 172ce682 Sofia Papagiannaki
                    response = redirect(post_save_redirect, new_object)
1569 172ce682 Sofia Papagiannaki
        else:
1570 172ce682 Sofia Papagiannaki
            form = form_class()
1571 b8f05f8d Sofia Papagiannaki
    except BaseException, e:
1572 b8f05f8d Sofia Papagiannaki
        logger.exception(e)
1573 b8f05f8d Sofia Papagiannaki
        messages.error(request, _(astakos_messages.GENERIC_ERROR))
1574 bfe23b13 Sofia Papagiannaki
        rollback = True
1575 bfe23b13 Sofia Papagiannaki
    finally:
1576 bfe23b13 Sofia Papagiannaki
        if rollback:
1577 bfe23b13 Sofia Papagiannaki
            transaction.rollback()
1578 bfe23b13 Sofia Papagiannaki
        else:
1579 bfe23b13 Sofia Papagiannaki
            transaction.commit()
1580 4e748491 Sofia Papagiannaki
1581 172ce682 Sofia Papagiannaki
        if response == None:
1582 172ce682 Sofia Papagiannaki
            # Create the template, context, response
1583 172ce682 Sofia Papagiannaki
            if not template_name:
1584 172ce682 Sofia Papagiannaki
                template_name = "%s/%s_form.html" %\
1585 172ce682 Sofia Papagiannaki
                     (model._meta.app_label, model._meta.object_name.lower())
1586 172ce682 Sofia Papagiannaki
            t = template_loader.get_template(template_name)
1587 172ce682 Sofia Papagiannaki
            c = RequestContext(request, {
1588 172ce682 Sofia Papagiannaki
                'form': form
1589 172ce682 Sofia Papagiannaki
            }, context_processors)
1590 172ce682 Sofia Papagiannaki
            apply_extra_context(extra_context, c)
1591 172ce682 Sofia Papagiannaki
            response = HttpResponse(t.render(c))
1592 172ce682 Sofia Papagiannaki
        return response
1593 172ce682 Sofia Papagiannaki
1594 4e748491 Sofia Papagiannaki
@transaction.commit_manually
1595 4e748491 Sofia Papagiannaki
def _update_object(request, model=None, object_id=None, slug=None,
1596 4e748491 Sofia Papagiannaki
        slug_field='slug', template_name=None, template_loader=template_loader,
1597 4e748491 Sofia Papagiannaki
        extra_context=None, post_save_redirect=None, login_required=False,
1598 4e748491 Sofia Papagiannaki
        context_processors=None, template_object_name='object',
1599 4e748491 Sofia Papagiannaki
        form_class=None):
1600 4e748491 Sofia Papagiannaki
    """
1601 4e748491 Sofia Papagiannaki
    Based of django.views.generic.create_update.update_object which displays a
1602 4e748491 Sofia Papagiannaki
    summary page before updating the object.
1603 4e748491 Sofia Papagiannaki
    """
1604 4e748491 Sofia Papagiannaki
    rollback = False
1605 4e748491 Sofia Papagiannaki
    response = None
1606 4e748491 Sofia Papagiannaki
1607 4e748491 Sofia Papagiannaki
    if extra_context is None: extra_context = {}
1608 4e748491 Sofia Papagiannaki
    if login_required and not request.user.is_authenticated():
1609 4e748491 Sofia Papagiannaki
        return redirect_to_login(request.path)
1610 f7cf5257 Kostas Papadimitriou
1611 4e748491 Sofia Papagiannaki
    try:
1612 4e748491 Sofia Papagiannaki
        model, form_class = get_model_and_form_class(model, form_class)
1613 4e748491 Sofia Papagiannaki
        obj = lookup_object(model, object_id, slug, slug_field)
1614 f7cf5257 Kostas Papadimitriou
1615 4e748491 Sofia Papagiannaki
        if request.method == 'POST':
1616 4e748491 Sofia Papagiannaki
            form = form_class(request.POST, request.FILES, instance=obj)
1617 4e748491 Sofia Papagiannaki
            if form.is_valid():
1618 4e748491 Sofia Papagiannaki
                verify = request.GET.get('verify')
1619 4e748491 Sofia Papagiannaki
                edit = request.GET.get('edit')
1620 4e748491 Sofia Papagiannaki
                if verify == '1':
1621 4e748491 Sofia Papagiannaki
                    extra_context['show_form'] = False
1622 4e748491 Sofia Papagiannaki
                    extra_context['form_data'] = form.cleaned_data
1623 4e748491 Sofia Papagiannaki
                elif edit == '1':
1624 4e748491 Sofia Papagiannaki
                    extra_context['show_form'] = True
1625 f7cf5257 Kostas Papadimitriou
                else:
1626 4e748491 Sofia Papagiannaki
                    obj = form.save()
1627 4e748491 Sofia Papagiannaki
                    msg = _("The %(verbose_name)s was updated successfully.") %\
1628 4e748491 Sofia Papagiannaki
                                {"verbose_name": model._meta.verbose_name}
1629 4e748491 Sofia Papagiannaki
                    messages.success(request, msg, fail_silently=True)
1630 4e748491 Sofia Papagiannaki
                    response = redirect(post_save_redirect, obj)
1631 4e748491 Sofia Papagiannaki
        else:
1632 4e748491 Sofia Papagiannaki
            form = form_class(instance=obj)
1633 4e748491 Sofia Papagiannaki
    except BaseException, e:
1634 4e748491 Sofia Papagiannaki
        logger.exception(e)
1635 4e748491 Sofia Papagiannaki
        messages.error(request, _(astakos_messages.GENERIC_ERROR))
1636 4e748491 Sofia Papagiannaki
        rollback = True
1637 4e748491 Sofia Papagiannaki
    finally:
1638 4e748491 Sofia Papagiannaki
        if rollback:
1639 4e748491 Sofia Papagiannaki
            transaction.rollback()
1640 4e748491 Sofia Papagiannaki
        else:
1641 4e748491 Sofia Papagiannaki
            transaction.commit()
1642 4e748491 Sofia Papagiannaki
        if response == None:
1643 4e748491 Sofia Papagiannaki
            if not template_name:
1644 4e748491 Sofia Papagiannaki
                template_name = "%s/%s_form.html" %\
1645 4e748491 Sofia Papagiannaki
                    (model._meta.app_label, model._meta.object_name.lower())
1646 4e748491 Sofia Papagiannaki
            t = template_loader.get_template(template_name)
1647 4e748491 Sofia Papagiannaki
            c = RequestContext(request, {
1648 4e748491 Sofia Papagiannaki
                'form': form,
1649 4e748491 Sofia Papagiannaki
                template_object_name: obj,
1650 4e748491 Sofia Papagiannaki
            }, context_processors)
1651 4e748491 Sofia Papagiannaki
            apply_extra_context(extra_context, c)
1652 4e748491 Sofia Papagiannaki
            response = HttpResponse(t.render(c))
1653 4e748491 Sofia Papagiannaki
            populate_xheaders(request, response, model, getattr(obj, obj._meta.pk.attname))
1654 4e748491 Sofia Papagiannaki
        return response
1655 4e748491 Sofia Papagiannaki
1656 172ce682 Sofia Papagiannaki
@require_http_methods(["GET", "POST"])
1657 172ce682 Sofia Papagiannaki
@signed_terms_required
1658 172ce682 Sofia Papagiannaki
@login_required
1659 172ce682 Sofia Papagiannaki
def project_add(request):
1660 172ce682 Sofia Papagiannaki
    result = callpoint.list_resources()
1661 172ce682 Sofia Papagiannaki
    if not result.is_success:
1662 172ce682 Sofia Papagiannaki
        messages.error(
1663 172ce682 Sofia Papagiannaki
            request,
1664 172ce682 Sofia Papagiannaki
            'Unable to retrieve system resources: %s' % result.reason
1665 172ce682 Sofia Papagiannaki
    )
1666 172ce682 Sofia Papagiannaki
    else:
1667 172ce682 Sofia Papagiannaki
        resource_catalog = result.data
1668 172ce682 Sofia Papagiannaki
    extra_context = {'resource_catalog':resource_catalog, 'show_form':True}
1669 172ce682 Sofia Papagiannaki
    return _create_object(request, template_name='im/projects/projectapplication_form.html',
1670 172ce682 Sofia Papagiannaki
        extra_context=extra_context, post_save_redirect='/im/project/list/',
1671 172ce682 Sofia Papagiannaki
        form_class=ProjectApplicationForm)
1672 ccab6eb5 Sofia Papagiannaki
1673 e1a80257 Sofia Papagiannaki
1674 e1a80257 Sofia Papagiannaki
@require_http_methods(["GET"])
1675 e1a80257 Sofia Papagiannaki
@signed_terms_required
1676 e1a80257 Sofia Papagiannaki
@login_required
1677 f3342849 Sofia Papagiannaki
def project_list(request):
1678 2a965273 Sofia Papagiannaki
    q = ProjectApplication.objects.filter(owner=request.user)
1679 2a965273 Sofia Papagiannaki
    q |= ProjectApplication.objects.filter(
1680 2a965273 Sofia Papagiannaki
        project__in=request.user.projectmembership_set.values_list('project', flat=True)
1681 2a965273 Sofia Papagiannaki
    )
1682 ccab6eb5 Sofia Papagiannaki
    q = q.select_related()
1683 73fbaec4 Sofia Papagiannaki
    sorting = 'name'
1684 8327782d Sofia Papagiannaki
    sort_form = ProjectSortForm(request.GET)
1685 8327782d Sofia Papagiannaki
    if sort_form.is_valid():
1686 8327782d Sofia Papagiannaki
        sorting = sort_form.cleaned_data.get('sorting')
1687 8327782d Sofia Papagiannaki
    q = q.order_by(sorting)
1688 f7cf5257 Kostas Papadimitriou
1689 e1a80257 Sofia Papagiannaki
    return object_list(
1690 e1a80257 Sofia Papagiannaki
        request,
1691 2a965273 Sofia Papagiannaki
        q,
1692 e1a80257 Sofia Papagiannaki
        paginate_by=PAGINATE_BY_ALL,
1693 e1a80257 Sofia Papagiannaki
        page=request.GET.get('page') or 1,
1694 71a38edf Sofia Papagiannaki
        template_name='im/projects/project_list.html',
1695 71a38edf Sofia Papagiannaki
        extra_context={
1696 71a38edf Sofia Papagiannaki
            'is_search':False,
1697 bfe23b13 Sofia Papagiannaki
            'sorting':sorting
1698 71a38edf Sofia Papagiannaki
        }
1699 71a38edf Sofia Papagiannaki
    )
1700 e1a80257 Sofia Papagiannaki
1701 f3342849 Sofia Papagiannaki
@require_http_methods(["GET", "POST"])
1702 e1a80257 Sofia Papagiannaki
@signed_terms_required
1703 e1a80257 Sofia Papagiannaki
@login_required
1704 73fbaec4 Sofia Papagiannaki
def project_update(request, application_id):
1705 8327782d Sofia Papagiannaki
    result = callpoint.list_resources()
1706 8327782d Sofia Papagiannaki
    if not result.is_success:
1707 8327782d Sofia Papagiannaki
        messages.error(
1708 8327782d Sofia Papagiannaki
            request,
1709 8327782d Sofia Papagiannaki
            'Unable to retrieve system resources: %s' % result.reason
1710 8327782d Sofia Papagiannaki
    )
1711 172ce682 Sofia Papagiannaki
    else:
1712 172ce682 Sofia Papagiannaki
        resource_catalog = result.data
1713 5200e864 Sofia Papagiannaki
    extra_context = {'resource_catalog':resource_catalog, 'show_form':True}
1714 4e748491 Sofia Papagiannaki
    return _update_object(
1715 f3342849 Sofia Papagiannaki
        request,
1716 73fbaec4 Sofia Papagiannaki
        object_id=application_id,
1717 8327782d Sofia Papagiannaki
        template_name='im/projects/projectapplication_form.html',
1718 8327782d Sofia Papagiannaki
        extra_context=extra_context, post_save_redirect='/im/project/list/',
1719 8327782d Sofia Papagiannaki
        form_class=ProjectApplicationForm)
1720 17a2f450 Sofia Papagiannaki
1721 e1a80257 Sofia Papagiannaki
1722 e1a80257 Sofia Papagiannaki
@require_http_methods(["GET", "POST"])
1723 e1a80257 Sofia Papagiannaki
@signed_terms_required
1724 e1a80257 Sofia Papagiannaki
@login_required
1725 73fbaec4 Sofia Papagiannaki
@transaction.commit_manually
1726 73fbaec4 Sofia Papagiannaki
def project_detail(request, application_id):
1727 8327782d Sofia Papagiannaki
    result = callpoint.list_resources()
1728 172ce682 Sofia Papagiannaki
    if not result.is_success:
1729 172ce682 Sofia Papagiannaki
        messages.error(
1730 172ce682 Sofia Papagiannaki
            request,
1731 172ce682 Sofia Papagiannaki
            'Unable to retrieve system resources: %s' % result.reason
1732 172ce682 Sofia Papagiannaki
    )
1733 172ce682 Sofia Papagiannaki
    else:
1734 172ce682 Sofia Papagiannaki
        resource_catalog = result.data
1735 172ce682 Sofia Papagiannaki
#     resource_catalog = ResourcePresentation(RESOURCES_PRESENTATION_DATA)
1736 172ce682 Sofia Papagiannaki
#     resource_catalog.update_from_result(result)
1737 ccab6eb5 Sofia Papagiannaki
1738 bfe23b13 Sofia Papagiannaki
    addmembers_form = AddProjectMembersForm()
1739 ccab6eb5 Sofia Papagiannaki
    if request.method == 'POST':
1740 bfe23b13 Sofia Papagiannaki
        addmembers_form = AddProjectMembersForm(request.POST)
1741 ccab6eb5 Sofia Papagiannaki
        if addmembers_form.is_valid():
1742 ccab6eb5 Sofia Papagiannaki
            try:
1743 73fbaec4 Sofia Papagiannaki
                rollback = False
1744 73fbaec4 Sofia Papagiannaki
                map(lambda u: accept_membership(
1745 73fbaec4 Sofia Papagiannaki
                        application_id,
1746 73fbaec4 Sofia Papagiannaki
                        u,
1747 73fbaec4 Sofia Papagiannaki
                        request_user=request.user),
1748 73fbaec4 Sofia Papagiannaki
                    addmembers_form.valid_users)
1749 73fbaec4 Sofia Papagiannaki
            except (IOError, PermissionDenied), e:
1750 73fbaec4 Sofia Papagiannaki
                messages.error(request, e)
1751 bfe23b13 Sofia Papagiannaki
            except BaseException, e:
1752 73fbaec4 Sofia Papagiannaki
                rollback = True
1753 bfe23b13 Sofia Papagiannaki
                messages.error(request, e)
1754 73fbaec4 Sofia Papagiannaki
            finally:
1755 73fbaec4 Sofia Papagiannaki
                if rollback == True:
1756 73fbaec4 Sofia Papagiannaki
                    transaction.rollback()
1757 73fbaec4 Sofia Papagiannaki
                else:
1758 73fbaec4 Sofia Papagiannaki
                    transaction.commit()
1759 bfe23b13 Sofia Papagiannaki
            addmembers_form = AddProjectMembersForm()
1760 f7cf5257 Kostas Papadimitriou
1761 bfe23b13 Sofia Papagiannaki
    # validate sorting
1762 bfe23b13 Sofia Papagiannaki
    sorting = 'person__email'
1763 73fbaec4 Sofia Papagiannaki
    form = ProjectMembersSortForm(request.GET or request.POST)
1764 bfe23b13 Sofia Papagiannaki
    if form.is_valid():
1765 bfe23b13 Sofia Papagiannaki
        sorting = form.cleaned_data.get('sorting')
1766 ccab6eb5 Sofia Papagiannaki
1767 f3342849 Sofia Papagiannaki
    return object_detail(
1768 f3342849 Sofia Papagiannaki
        request,
1769 71a38edf Sofia Papagiannaki
        queryset=ProjectApplication.objects.select_related(),
1770 73fbaec4 Sofia Papagiannaki
        object_id=application_id,
1771 71a38edf Sofia Papagiannaki
        template_name='im/projects/project_detail.html',
1772 71a38edf Sofia Papagiannaki
        extra_context={
1773 8327782d Sofia Papagiannaki
            'resource_catalog':resource_catalog,
1774 bfe23b13 Sofia Papagiannaki
            'sorting':sorting,
1775 bfe23b13 Sofia Papagiannaki
            'addmembers_form':addmembers_form
1776 71a38edf Sofia Papagiannaki
        }
1777 f3342849 Sofia Papagiannaki
    )
1778 e1a80257 Sofia Papagiannaki
1779 e1a80257 Sofia Papagiannaki
@require_http_methods(["GET", "POST"])
1780 e1a80257 Sofia Papagiannaki
@signed_terms_required
1781 e1a80257 Sofia Papagiannaki
@login_required
1782 e1a80257 Sofia Papagiannaki
def project_search(request):
1783 6dadd24a Sofia Papagiannaki
    queryset = ProjectApplication.objects
1784 bfe23b13 Sofia Papagiannaki
    if request.method == 'GET':
1785 6dadd24a Sofia Papagiannaki
        form = ProjectSearchForm()
1786 6dadd24a Sofia Papagiannaki
        queryset = queryset.none()
1787 bfe23b13 Sofia Papagiannaki
    else:
1788 6dadd24a Sofia Papagiannaki
        form = ProjectSearchForm(request.POST)
1789 bfe23b13 Sofia Papagiannaki
        if form.is_valid():
1790 bfe23b13 Sofia Papagiannaki
            q = form.cleaned_data['q'].strip()
1791 6dadd24a Sofia Papagiannaki
            queryset = queryset.filter(~Q(project__last_approval_date__isnull=True))
1792 73fbaec4 Sofia Papagiannaki
            queryset = queryset.filter(name__contains=q)
1793 f7cf5257 Kostas Papadimitriou
    sorting = 'name'
1794 bfe23b13 Sofia Papagiannaki
    # validate sorting
1795 73fbaec4 Sofia Papagiannaki
    sort_form = ProjectSortForm(request.GET)
1796 bfe23b13 Sofia Papagiannaki
    if sort_form.is_valid():
1797 bfe23b13 Sofia Papagiannaki
        sorting = sort_form.cleaned_data.get('sorting')
1798 bfe23b13 Sofia Papagiannaki
    queryset = queryset.order_by(sorting)
1799 bfe23b13 Sofia Papagiannaki
    return object_list(
1800 bfe23b13 Sofia Papagiannaki
        request,
1801 bfe23b13 Sofia Papagiannaki
        queryset,
1802 bfe23b13 Sofia Papagiannaki
        paginate_by=PAGINATE_BY_ALL,
1803 bfe23b13 Sofia Papagiannaki
        page=request.GET.get('page') or 1,
1804 6dadd24a Sofia Papagiannaki
        template_name='im/projects/project_list.html',
1805 bfe23b13 Sofia Papagiannaki
        extra_context=dict(
1806 bfe23b13 Sofia Papagiannaki
            form=form,
1807 bfe23b13 Sofia Papagiannaki
            is_search=True,
1808 bfe23b13 Sofia Papagiannaki
            sorting=sorting
1809 bfe23b13 Sofia Papagiannaki
        )
1810 bfe23b13 Sofia Papagiannaki
    )
1811 bfe23b13 Sofia Papagiannaki
1812 e1a80257 Sofia Papagiannaki
1813 e1a80257 Sofia Papagiannaki
@require_http_methods(["GET"])
1814 e1a80257 Sofia Papagiannaki
@signed_terms_required
1815 e1a80257 Sofia Papagiannaki
@login_required
1816 e1a80257 Sofia Papagiannaki
def project_all(request):
1817 73fbaec4 Sofia Papagiannaki
    q = ProjectApplication.objects.filter(
1818 73fbaec4 Sofia Papagiannaki
        ~Q(project__last_approval_date__isnull=True))
1819 bfe23b13 Sofia Papagiannaki
    q = q.select_related()
1820 73fbaec4 Sofia Papagiannaki
    sorting = 'name'
1821 bfe23b13 Sofia Papagiannaki
    sort_form = ProjectSortForm(request.GET)
1822 bfe23b13 Sofia Papagiannaki
    if sort_form.is_valid():
1823 bfe23b13 Sofia Papagiannaki
        sorting = sort_form.cleaned_data.get('sorting')
1824 bfe23b13 Sofia Papagiannaki
    q = q.order_by(sorting)
1825 f7cf5257 Kostas Papadimitriou
1826 bfe23b13 Sofia Papagiannaki
    return object_list(
1827 bfe23b13 Sofia Papagiannaki
        request,
1828 bfe23b13 Sofia Papagiannaki
        q,
1829 bfe23b13 Sofia Papagiannaki
        paginate_by=PAGINATE_BY_ALL,
1830 bfe23b13 Sofia Papagiannaki
        page=request.GET.get('page') or 1,
1831 bfe23b13 Sofia Papagiannaki
        template_name='im/projects/project_list.html',
1832 bfe23b13 Sofia Papagiannaki
        extra_context={
1833 6dadd24a Sofia Papagiannaki
            'form':ProjectSearchForm(),
1834 bfe23b13 Sofia Papagiannaki
            'is_search':True,
1835 bfe23b13 Sofia Papagiannaki
            'sorting':sorting
1836 bfe23b13 Sofia Papagiannaki
        }
1837 bfe23b13 Sofia Papagiannaki
    )
1838 e1a80257 Sofia Papagiannaki
1839 73fbaec4 Sofia Papagiannaki
@require_http_methods(["POST"])
1840 e1a80257 Sofia Papagiannaki
@signed_terms_required
1841 e1a80257 Sofia Papagiannaki
@login_required
1842 bfe23b13 Sofia Papagiannaki
@transaction.commit_manually
1843 73fbaec4 Sofia Papagiannaki
def project_join(request, application_id):
1844 73fbaec4 Sofia Papagiannaki
    next = request.POST.get('next')
1845 73fbaec4 Sofia Papagiannaki
    if not next:
1846 73fbaec4 Sofia Papagiannaki
        return HttpResponseBadRequest(
1847 73fbaec4 Sofia Papagiannaki
            _(astakos_messages.MISSING_NEXT_PARAMETER))
1848 73fbaec4 Sofia Papagiannaki
1849 bfe23b13 Sofia Papagiannaki
    rollback = False
1850 bfe23b13 Sofia Papagiannaki
    try:
1851 73fbaec4 Sofia Papagiannaki
        join_project(application_id, request.user)
1852 73fbaec4 Sofia Papagiannaki
    except (IOError, PermissionDenied), e:
1853 bfe23b13 Sofia Papagiannaki
        messages.error(request, e)
1854 b8f05f8d Sofia Papagiannaki
    except BaseException, e:
1855 b8f05f8d Sofia Papagiannaki
        logger.exception(e)
1856 b8f05f8d Sofia Papagiannaki
        messages.error(request, _(astakos_messages.GENERIC_ERROR))
1857 bfe23b13 Sofia Papagiannaki
        rollback = True
1858 bfe23b13 Sofia Papagiannaki
    else:
1859 bfe23b13 Sofia Papagiannaki
        return project_detail(request, id)
1860 bfe23b13 Sofia Papagiannaki
    finally:
1861 bfe23b13 Sofia Papagiannaki
        if rollback:
1862 bfe23b13 Sofia Papagiannaki
            transaction.rollback()
1863 bfe23b13 Sofia Papagiannaki
        else:
1864 bfe23b13 Sofia Papagiannaki
            transaction.commit()
1865 bfe23b13 Sofia Papagiannaki
1866 73fbaec4 Sofia Papagiannaki
    next = restrict_next(
1867 73fbaec4 Sofia Papagiannaki
        request.POST.get('next'),
1868 73fbaec4 Sofia Papagiannaki
        domain=COOKIE_DOMAIN)
1869 73fbaec4 Sofia Papagiannaki
    return redirect(next)
1870 bfe23b13 Sofia Papagiannaki
1871 73fbaec4 Sofia Papagiannaki
@require_http_methods(["POST"])
1872 e1a80257 Sofia Papagiannaki
@signed_terms_required
1873 e1a80257 Sofia Papagiannaki
@login_required
1874 73fbaec4 Sofia Papagiannaki
@transaction.commit_manually
1875 73fbaec4 Sofia Papagiannaki
def project_leave(request, application_id):
1876 73fbaec4 Sofia Papagiannaki
    next = request.POST.get('next')
1877 73fbaec4 Sofia Papagiannaki
    if not next:
1878 73fbaec4 Sofia Papagiannaki
        return HttpResponseBadRequest(
1879 73fbaec4 Sofia Papagiannaki
            _(astakos_messages.MISSING_NEXT_PARAMETER))
1880 e1a80257 Sofia Papagiannaki
1881 73fbaec4 Sofia Papagiannaki
    rollback = False
1882 73fbaec4 Sofia Papagiannaki
    try:
1883 73fbaec4 Sofia Papagiannaki
        leave_project(application_id, request.user)
1884 73fbaec4 Sofia Papagiannaki
    except (IOError, PermissionDenied), e:
1885 73fbaec4 Sofia Papagiannaki
        messages.error(request, e)
1886 73fbaec4 Sofia Papagiannaki
    except BaseException, e:
1887 73fbaec4 Sofia Papagiannaki
        logger.exception(e)
1888 73fbaec4 Sofia Papagiannaki
        messages.error(_(astakos_messages.GENERIC_ERRO))
1889 73fbaec4 Sofia Papagiannaki
        rollback = True
1890 73fbaec4 Sofia Papagiannaki
    finally:
1891 73fbaec4 Sofia Papagiannaki
        if rollback:
1892 73fbaec4 Sofia Papagiannaki
            transaction.rollback()
1893 73fbaec4 Sofia Papagiannaki
        else:
1894 73fbaec4 Sofia Papagiannaki
            transaction.commit()
1895 f7cf5257 Kostas Papadimitriou
1896 73fbaec4 Sofia Papagiannaki
    next = restrict_next(
1897 73fbaec4 Sofia Papagiannaki
        request.POST.get('next'),
1898 73fbaec4 Sofia Papagiannaki
        domain=COOKIE_DOMAIN)
1899 73fbaec4 Sofia Papagiannaki
    return redirect(next)
1900 bfe23b13 Sofia Papagiannaki
1901 bfe23b13 Sofia Papagiannaki
@require_http_methods(["GET"])
1902 e1a80257 Sofia Papagiannaki
@signed_terms_required
1903 e1a80257 Sofia Papagiannaki
@login_required
1904 73fbaec4 Sofia Papagiannaki
@transaction.commit_manually
1905 73fbaec4 Sofia Papagiannaki
def project_approve_member(request, application_id, user_id):
1906 73fbaec4 Sofia Papagiannaki
    rollback = False
1907 73fbaec4 Sofia Papagiannaki
    try:
1908 73fbaec4 Sofia Papagiannaki
        m = accept_membership(application_id, user_id, request.user)
1909 73fbaec4 Sofia Papagiannaki
    except (IOError, PermissionDenied), e:
1910 73fbaec4 Sofia Papagiannaki
        messages.error(request, e)
1911 73fbaec4 Sofia Papagiannaki
    except BaseException, e:
1912 73fbaec4 Sofia Papagiannaki
        logger.exception(e)
1913 73fbaec4 Sofia Papagiannaki
        messages.error(_(astakos_messages.GENERIC_ERRO))
1914 73fbaec4 Sofia Papagiannaki
        rollback = True
1915 73fbaec4 Sofia Papagiannaki
    else:
1916 73fbaec4 Sofia Papagiannaki
        realname = m.person.realname
1917 73fbaec4 Sofia Papagiannaki
        msg = _(astakos_messages.USER_JOINED_PROJECT) % locals()
1918 73fbaec4 Sofia Papagiannaki
        messages.success(request, msg)
1919 73fbaec4 Sofia Papagiannaki
    finally:
1920 73fbaec4 Sofia Papagiannaki
        if rollback:
1921 73fbaec4 Sofia Papagiannaki
            transaction.rollback()
1922 73fbaec4 Sofia Papagiannaki
        else:
1923 73fbaec4 Sofia Papagiannaki
            transaction.commit()
1924 73fbaec4 Sofia Papagiannaki
    return project_detail(request, application_id)
1925 bfe23b13 Sofia Papagiannaki
1926 bfe23b13 Sofia Papagiannaki
@require_http_methods(["GET"])
1927 bfe23b13 Sofia Papagiannaki
@signed_terms_required
1928 bfe23b13 Sofia Papagiannaki
@login_required
1929 73fbaec4 Sofia Papagiannaki
@transaction.commit_manually
1930 73fbaec4 Sofia Papagiannaki
def project_remove_member(request, application_id, user_id):
1931 73fbaec4 Sofia Papagiannaki
    rollback = False
1932 73fbaec4 Sofia Papagiannaki
    try:
1933 73fbaec4 Sofia Papagiannaki
        m = remove_membership(application_id, user_id, request.user)
1934 73fbaec4 Sofia Papagiannaki
    except (IOError, PermissionDenied), e:
1935 73fbaec4 Sofia Papagiannaki
        messages.error(request, e)
1936 73fbaec4 Sofia Papagiannaki
    except BaseException, e:
1937 73fbaec4 Sofia Papagiannaki
        logger.exception(e)
1938 73fbaec4 Sofia Papagiannaki
        messages.error(_(astakos_messages.GENERIC_ERRO))
1939 73fbaec4 Sofia Papagiannaki
        rollback = True
1940 73fbaec4 Sofia Papagiannaki
    else:
1941 73fbaec4 Sofia Papagiannaki
        realname = m.person.realname
1942 73fbaec4 Sofia Papagiannaki
        msg = _(astakos_messages.USER_LEFT_PROJECT) % locals()
1943 73fbaec4 Sofia Papagiannaki
        messages.success(request, msg)
1944 73fbaec4 Sofia Papagiannaki
    finally:
1945 73fbaec4 Sofia Papagiannaki
        if rollback:
1946 73fbaec4 Sofia Papagiannaki
            transaction.rollback()
1947 73fbaec4 Sofia Papagiannaki
        else:
1948 73fbaec4 Sofia Papagiannaki
            transaction.commit()
1949 73fbaec4 Sofia Papagiannaki
    return project_detail(request, application_id)
1950 bfe23b13 Sofia Papagiannaki
1951 bfe23b13 Sofia Papagiannaki
@require_http_methods(["GET"])
1952 e1a80257 Sofia Papagiannaki
@signed_terms_required
1953 e1a80257 Sofia Papagiannaki
@login_required
1954 73fbaec4 Sofia Papagiannaki
@transaction.commit_manually
1955 73fbaec4 Sofia Papagiannaki
def project_reject_member(request, application_id, user_id):
1956 73fbaec4 Sofia Papagiannaki
    rollback = False
1957 73fbaec4 Sofia Papagiannaki
    try:
1958 73fbaec4 Sofia Papagiannaki
        m = reject_membership(application_id, user_id, request.user)
1959 73fbaec4 Sofia Papagiannaki
    except (IOError, PermissionDenied), e:
1960 73fbaec4 Sofia Papagiannaki
        messages.error(request, e)
1961 73fbaec4 Sofia Papagiannaki
    except BaseException, e:
1962 73fbaec4 Sofia Papagiannaki
        logger.exception(e)
1963 73fbaec4 Sofia Papagiannaki
        messages.error(_(astakos_messages.GENERIC_ERRO))
1964 73fbaec4 Sofia Papagiannaki
        rollback = True
1965 73fbaec4 Sofia Papagiannaki
    else:
1966 73fbaec4 Sofia Papagiannaki
        realname = m.person.realname
1967 73fbaec4 Sofia Papagiannaki
        msg = _(astakos_messages.USER_LEFT_PROJECT) % locals()
1968 73fbaec4 Sofia Papagiannaki
        messages.success(request, msg)
1969 73fbaec4 Sofia Papagiannaki
    finally:
1970 73fbaec4 Sofia Papagiannaki
        if rollback:
1971 73fbaec4 Sofia Papagiannaki
            transaction.rollback()
1972 73fbaec4 Sofia Papagiannaki
        else:
1973 73fbaec4 Sofia Papagiannaki
            transaction.commit()
1974 47b77c8b Sofia Papagiannaki
    return project_detail(request, application_id)
1975 c630fee6 Kostas Papadimitriou