Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (63.9 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 73fbaec4 Sofia Papagiannaki
    create_object, update_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 73fbaec4 Sofia Papagiannaki
    ProjectApplication, ProjectMembership, Project)
77 73fbaec4 Sofia Papagiannaki
from astakos.im.util import (
78 73fbaec4 Sofia Papagiannaki
    get_context, prepare_response, get_query, restrict_next)
79 e1a80257 Sofia Papagiannaki
from astakos.im.forms import (
80 e1a80257 Sofia Papagiannaki
    LoginForm, InvitationForm, ProfileForm,
81 e1a80257 Sofia Papagiannaki
    FeedbackForm, SignApprovalTermsForm,
82 e1a80257 Sofia Papagiannaki
    EmailChangeForm,
83 73fbaec4 Sofia Papagiannaki
#     AstakosGroupCreationForm, AstakosGroupSearchForm,
84 73fbaec4 Sofia Papagiannaki
#     AstakosGroupUpdateForm, AddGroupMembersForm,
85 73fbaec4 Sofia Papagiannaki
#     MembersSortForm, AstakosGroupSortForm,
86 73fbaec4 Sofia Papagiannaki
#     TimelineForm, PickResourceForm,
87 73fbaec4 Sofia Papagiannaki
#     AstakosGroupCreationSummaryForm,
88 bfe23b13 Sofia Papagiannaki
    ProjectApplicationForm, ProjectSortForm,
89 73fbaec4 Sofia Papagiannaki
    AddProjectMembersForm, ProjectSearchForm,
90 73fbaec4 Sofia Papagiannaki
    ProjectMembersSortForm)
91 f3342849 Sofia Papagiannaki
from astakos.im.functions import (
92 f3342849 Sofia Papagiannaki
    send_feedback, SendMailError,
93 f3342849 Sofia Papagiannaki
    logout as auth_logout,
94 f3342849 Sofia Papagiannaki
    activate as activate_func,
95 73fbaec4 Sofia Papagiannaki
    invite,
96 f3342849 Sofia Papagiannaki
    send_activation as send_activation_func,
97 73fbaec4 Sofia Papagiannaki
#     send_group_creation_notification,
98 73fbaec4 Sofia Papagiannaki
    SendNotificationError,
99 73fbaec4 Sofia Papagiannaki
    accept_membership, reject_membership, remove_membership,
100 73fbaec4 Sofia Papagiannaki
    leave_project, join_project)
101 73fbaec4 Sofia Papagiannaki
# from astakos.im.endpoints.qh import timeline_charge
102 f3342849 Sofia Papagiannaki
from astakos.im.settings import (
103 f3342849 Sofia Papagiannaki
    COOKIE_DOMAIN, LOGOUT_NEXT,
104 f3342849 Sofia Papagiannaki
    LOGGING_LEVEL, PAGINATE_BY,
105 73fbaec4 Sofia Papagiannaki
    RESOURCES_PRESENTATION_DATA, PAGINATE_BY_ALL)
106 f8f86e83 root
#from astakos.im.tasks import request_billing
107 820b18e0 Sofia Papagiannaki
from astakos.im.api.callpoint import AstakosCallpoint
108 64cd4730 Antony Chazapis
109 792c2f3b Olga Brani
from astakos.im import settings
110 792c2f3b Olga Brani
from astakos.im import auth_providers
111 ae497612 Olga Brani
112 e015e9e6 Sofia Papagiannaki
logger = logging.getLogger(__name__)
113 e015e9e6 Sofia Papagiannaki
114 820b18e0 Sofia Papagiannaki
callpoint = AstakosCallpoint()
115 9a06d96f Olga Brani
116 b2ffa772 Sofia Papagiannaki
def render_response(template, tab=None, status=200, context_instance=None, **kwargs):
117 890b0eaf Sofia Papagiannaki
    """
118 890b0eaf Sofia Papagiannaki
    Calls ``django.template.loader.render_to_string`` with an additional ``tab``
119 890b0eaf Sofia Papagiannaki
    keyword argument and returns an ``django.http.HttpResponse`` with the
120 890b0eaf Sofia Papagiannaki
    specified ``status``.
121 890b0eaf Sofia Papagiannaki
    """
122 64cd4730 Antony Chazapis
    if tab is None:
123 881c856c Sofia Papagiannaki
        tab = template.partition('_')[0].partition('.html')[0]
124 64cd4730 Antony Chazapis
    kwargs.setdefault('tab', tab)
125 661c4479 Sofia Papagiannaki
    html = template_loader.render_to_string(
126 5ce3ce4f Sofia Papagiannaki
        template, kwargs, context_instance=context_instance)
127 c301698f Sofia Papagiannaki
    response = HttpResponse(html, status=status)
128 c301698f Sofia Papagiannaki
    return response
129 64cd4730 Antony Chazapis
130 792c2f3b Olga Brani
def requires_auth_provider(provider_id, **perms):
131 792c2f3b Olga Brani
    """
132 792c2f3b Olga Brani
    """
133 792c2f3b Olga Brani
    def decorator(func, *args, **kwargs):
134 792c2f3b Olga Brani
        @wraps(func)
135 792c2f3b Olga Brani
        def wrapper(request, *args, **kwargs):
136 792c2f3b Olga Brani
            provider = auth_providers.get_provider(provider_id)
137 792c2f3b Olga Brani
138 792c2f3b Olga Brani
            if not provider or not provider.is_active():
139 792c2f3b Olga Brani
                raise PermissionDenied
140 792c2f3b Olga Brani
141 792c2f3b Olga Brani
            if provider:
142 792c2f3b Olga Brani
                for pkey, value in perms.iteritems():
143 792c2f3b Olga Brani
                    attr = 'is_available_for_%s' % pkey.lower()
144 792c2f3b Olga Brani
                    if getattr(provider, attr)() != value:
145 c4b1a172 Kostas Papadimitriou
                        msg = provider.get_message("NOT_ACTIVE_FOR_" + pkey.upper())
146 c4b1a172 Kostas Papadimitriou
                        messages.error(request, msg)
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 270dd48d Sofia Papagiannaki
    Decorator checkes 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 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
185 270dd48d Sofia Papagiannaki
@signed_terms_required
186 1f3b4b39 Sofia Papagiannaki
def index(request, login_template_name='im/login.html', profile_template_name='im/profile.html', extra_context=None):
187 890b0eaf Sofia Papagiannaki
    """
188 dcf55476 Sofia Papagiannaki
    If there is logged on user renders the profile page otherwise renders login page.
189 176023aa Kostas Papadimitriou

190 890b0eaf Sofia Papagiannaki
    **Arguments**
191 176023aa Kostas Papadimitriou

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

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

200 890b0eaf Sofia Papagiannaki
    ``extra_context``
201 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
202 176023aa Kostas Papadimitriou

203 890b0eaf Sofia Papagiannaki
    **Template:**
204 176023aa Kostas Papadimitriou

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

207 890b0eaf Sofia Papagiannaki
    """
208 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
209 dcf55476 Sofia Papagiannaki
    template_name = login_template_name
210 dcf55476 Sofia Papagiannaki
    if request.user.is_authenticated():
211 f534fb96 Sofia Papagiannaki
        return HttpResponseRedirect(reverse('astakos.im.views.edit_profile'))
212 792c2f3b Olga Brani
213 ab7e3a9e Kostas Papadimitriou
    third_party_token = request.GET.get('key', False)
214 ab7e3a9e Kostas Papadimitriou
    if third_party_token:
215 ab7e3a9e Kostas Papadimitriou
        messages.info(request, astakos_messages.AUTH_PROVIDER_LOGIN_TO_ADD)
216 ab7e3a9e Kostas Papadimitriou
217 ef20ea07 Sofia Papagiannaki
    return render_response(
218 ef20ea07 Sofia Papagiannaki
        template_name,
219 ef20ea07 Sofia Papagiannaki
        login_form = LoginForm(request=request),
220 ef20ea07 Sofia Papagiannaki
        context_instance = get_context(request, extra_context)
221 ef20ea07 Sofia Papagiannaki
    )
222 5ce3ce4f Sofia Papagiannaki
223 64cd4730 Antony Chazapis
224 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
225 890b0eaf Sofia Papagiannaki
@login_required
226 270dd48d Sofia Papagiannaki
@signed_terms_required
227 890b0eaf Sofia Papagiannaki
@transaction.commit_manually
228 aab4d540 Sofia Papagiannaki
def invite(request, template_name='im/invitations.html', extra_context=None):
229 890b0eaf Sofia Papagiannaki
    """
230 890b0eaf Sofia Papagiannaki
    Allows a user to invite somebody else.
231 176023aa Kostas Papadimitriou

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

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

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

241 890b0eaf Sofia Papagiannaki
    **Arguments**
242 176023aa Kostas Papadimitriou

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

247 890b0eaf Sofia Papagiannaki
    ``extra_context``
248 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
249 176023aa Kostas Papadimitriou

250 890b0eaf Sofia Papagiannaki
    **Template:**
251 176023aa Kostas Papadimitriou

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

254 890b0eaf Sofia Papagiannaki
    **Settings:**
255 176023aa Kostas Papadimitriou

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

258 890b0eaf Sofia Papagiannaki
    * LOGIN_URL: login uri
259 890b0eaf Sofia Papagiannaki
    """
260 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
261 64cd4730 Antony Chazapis
    status = None
262 64cd4730 Antony Chazapis
    message = None
263 8f5a3a06 Sofia Papagiannaki
    form = InvitationForm()
264 5ce3ce4f Sofia Papagiannaki
265 18ffbee1 Sofia Papagiannaki
    inviter = request.user
266 64cd4730 Antony Chazapis
    if request.method == 'POST':
267 8f5a3a06 Sofia Papagiannaki
        form = InvitationForm(request.POST)
268 64cd4730 Antony Chazapis
        if inviter.invitations > 0:
269 8f5a3a06 Sofia Papagiannaki
            if form.is_valid():
270 8f5a3a06 Sofia Papagiannaki
                try:
271 9a06d96f Olga Brani
                    email = form.cleaned_data.get('username')
272 9a06d96f Olga Brani
                    realname = form.cleaned_data.get('realname')
273 73fbaec4 Sofia Papagiannaki
                    invite(inviter, email, realname)
274 ae497612 Olga Brani
                    message = _(astakos_messages.INVITATION_SENT) % locals()
275 24406ae3 Sofia Papagiannaki
                    messages.success(request, message)
276 8f5a3a06 Sofia Papagiannaki
                except SendMailError, e:
277 8f5a3a06 Sofia Papagiannaki
                    message = e.message
278 24406ae3 Sofia Papagiannaki
                    messages.error(request, message)
279 8f5a3a06 Sofia Papagiannaki
                    transaction.rollback()
280 18ffbee1 Sofia Papagiannaki
                except BaseException, e:
281 ae497612 Olga Brani
                    message = _(astakos_messages.GENERIC_ERROR)
282 24406ae3 Sofia Papagiannaki
                    messages.error(request, message)
283 18ffbee1 Sofia Papagiannaki
                    logger.exception(e)
284 18ffbee1 Sofia Papagiannaki
                    transaction.rollback()
285 18ffbee1 Sofia Papagiannaki
                else:
286 18ffbee1 Sofia Papagiannaki
                    transaction.commit()
287 64cd4730 Antony Chazapis
        else:
288 ae497612 Olga Brani
            message = _(astakos_messages.MAX_INVITATION_NUMBER_REACHED)
289 24406ae3 Sofia Papagiannaki
            messages.error(request, message)
290 176023aa Kostas Papadimitriou
291 a196eb7e Sofia Papagiannaki
    sent = [{'email': inv.username,
292 d6ae71a2 root
             'realname': inv.realname,
293 d6ae71a2 root
             'is_consumed': inv.is_consumed}
294 5ce3ce4f Sofia Papagiannaki
            for inv in request.user.invitations_sent.all()]
295 77e2ad52 root
    kwargs = {'inviter': inviter,
296 5ce3ce4f Sofia Papagiannaki
              'sent': sent}
297 0905ccd2 Sofia Papagiannaki
    context = get_context(request, extra_context, **kwargs)
298 0905ccd2 Sofia Papagiannaki
    return render_response(template_name,
299 5ce3ce4f Sofia Papagiannaki
                           invitation_form=form,
300 5ce3ce4f Sofia Papagiannaki
                           context_instance=context)
301 5ce3ce4f Sofia Papagiannaki
302 64cd4730 Antony Chazapis
303 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
304 890b0eaf Sofia Papagiannaki
@login_required
305 270dd48d Sofia Papagiannaki
@signed_terms_required
306 aab4d540 Sofia Papagiannaki
def edit_profile(request, template_name='im/profile.html', extra_context=None):
307 890b0eaf Sofia Papagiannaki
    """
308 890b0eaf Sofia Papagiannaki
    Allows a user to edit his/her profile.
309 176023aa Kostas Papadimitriou

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

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

316 890b0eaf Sofia Papagiannaki
    **Arguments**
317 176023aa Kostas Papadimitriou

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

322 890b0eaf Sofia Papagiannaki
    ``extra_context``
323 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
324 176023aa Kostas Papadimitriou

325 890b0eaf Sofia Papagiannaki
    **Template:**
326 176023aa Kostas Papadimitriou

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

329 92defad4 Sofia Papagiannaki
    **Settings:**
330 176023aa Kostas Papadimitriou

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

333 92defad4 Sofia Papagiannaki
    * LOGIN_URL: login uri
334 890b0eaf Sofia Papagiannaki
    """
335 aab4d540 Sofia Papagiannaki
    extra_context = extra_context or {}
336 bf0c6de5 Sofia Papagiannaki
    form = ProfileForm(
337 bf0c6de5 Sofia Papagiannaki
        instance=request.user,
338 bf0c6de5 Sofia Papagiannaki
        session_key=request.session.session_key
339 bf0c6de5 Sofia Papagiannaki
    )
340 15efc749 Sofia Papagiannaki
    extra_context['next'] = request.GET.get('next')
341 64cd4730 Antony Chazapis
    if request.method == 'POST':
342 bf0c6de5 Sofia Papagiannaki
        form = ProfileForm(
343 bf0c6de5 Sofia Papagiannaki
            request.POST,
344 bf0c6de5 Sofia Papagiannaki
            instance=request.user,
345 bf0c6de5 Sofia Papagiannaki
            session_key=request.session.session_key
346 bf0c6de5 Sofia Papagiannaki
        )
347 890b0eaf Sofia Papagiannaki
        if form.is_valid():
348 64cd4730 Antony Chazapis
            try:
349 c301698f Sofia Papagiannaki
                prev_token = request.user.auth_token
350 c301698f Sofia Papagiannaki
                user = form.save()
351 bf0c6de5 Sofia Papagiannaki
                form = ProfileForm(
352 bf0c6de5 Sofia Papagiannaki
                    instance=user,
353 bf0c6de5 Sofia Papagiannaki
                    session_key=request.session.session_key
354 bf0c6de5 Sofia Papagiannaki
                )
355 217994f8 Sofia Papagiannaki
                next = restrict_next(
356 217994f8 Sofia Papagiannaki
                    request.POST.get('next'),
357 217994f8 Sofia Papagiannaki
                    domain=COOKIE_DOMAIN
358 217994f8 Sofia Papagiannaki
                )
359 1a3675a0 Sofia Papagiannaki
                if next:
360 1a3675a0 Sofia Papagiannaki
                    return redirect(next)
361 ae497612 Olga Brani
                msg = _(astakos_messages.PROFILE_UPDATED)
362 24406ae3 Sofia Papagiannaki
                messages.success(request, msg)
363 890b0eaf Sofia Papagiannaki
            except ValueError, ve:
364 24406ae3 Sofia Papagiannaki
                messages.success(request, ve)
365 23447441 Sofia Papagiannaki
    elif request.method == "GET":
366 792c2f3b Olga Brani
        request.user.is_verified = True
367 792c2f3b Olga Brani
        request.user.save()
368 792c2f3b Olga Brani
369 792c2f3b Olga Brani
    # existing providers
370 792c2f3b Olga Brani
    user_providers = request.user.get_active_auth_providers()
371 792c2f3b Olga Brani
372 792c2f3b Olga Brani
    # providers that user can add
373 792c2f3b Olga Brani
    user_available_providers = request.user.get_available_auth_providers()
374 792c2f3b Olga Brani
375 0905ccd2 Sofia Papagiannaki
    return render_response(template_name,
376 8f5a3a06 Sofia Papagiannaki
                           profile_form = form,
377 792c2f3b Olga Brani
                           user_providers = user_providers,
378 792c2f3b Olga Brani
                           user_available_providers = user_available_providers,
379 0905ccd2 Sofia Papagiannaki
                           context_instance = get_context(request,
380 c301698f Sofia Papagiannaki
                                                          extra_context))
381 5ce3ce4f Sofia Papagiannaki
382 64cd4730 Antony Chazapis
383 10ed0073 Sofia Papagiannaki
@transaction.commit_manually
384 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
385 5e992f29 Kostas Papadimitriou
def signup(request, template_name='im/signup.html',
386 5e992f29 Kostas Papadimitriou
           on_success='im/signup_complete.html', extra_context=None,
387 5e992f29 Kostas Papadimitriou
           on_success_redirect='/im/profile/',
388 5e992f29 Kostas Papadimitriou
           backend=None):
389 890b0eaf Sofia Papagiannaki
    """
390 890b0eaf Sofia Papagiannaki
    Allows a user to create a local account.
391 176023aa Kostas Papadimitriou

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

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

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

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

405 890b0eaf Sofia Papagiannaki
    **Arguments**
406 5ce3ce4f Sofia Papagiannaki

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

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

415 890b0eaf Sofia Papagiannaki
    ``extra_context``
416 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
417 176023aa Kostas Papadimitriou

418 890b0eaf Sofia Papagiannaki
    **Template:**
419 5ce3ce4f Sofia Papagiannaki

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

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

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

512 890b0eaf Sofia Papagiannaki
    **Arguments**
513 176023aa Kostas Papadimitriou

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

518 890b0eaf Sofia Papagiannaki
    ``extra_context``
519 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
520 176023aa Kostas Papadimitriou

521 890b0eaf Sofia Papagiannaki
    **Template:**
522 176023aa Kostas Papadimitriou

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

525 890b0eaf Sofia Papagiannaki
    **Settings:**
526 176023aa Kostas Papadimitriou

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

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