Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / views.py @ 5200e864

History | View | Annotate | Download (65.5 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 172ce682 Sofia Papagiannaki
    apply_extra_context, 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 279d6e51 Olga Brani
                        #TODO: add session message
146 c630fee6 Kostas Papadimitriou
                        return HttpResponseRedirect(reverse('login'))
147 792c2f3b Olga Brani
            return func(request, *args)
148 792c2f3b Olga Brani
        return wrapper
149 792c2f3b Olga Brani
    return decorator
150 792c2f3b Olga Brani
151 63ecdd20 Sofia Papagiannaki
152 63ecdd20 Sofia Papagiannaki
def requires_anonymous(func):
153 63ecdd20 Sofia Papagiannaki
    """
154 270dd48d Sofia Papagiannaki
    Decorator checkes whether the request.user is not Anonymous and in that case
155 7482228b Sofia Papagiannaki
    redirects to `logout`.
156 63ecdd20 Sofia Papagiannaki
    """
157 63ecdd20 Sofia Papagiannaki
    @wraps(func)
158 63ecdd20 Sofia Papagiannaki
    def wrapper(request, *args):
159 63ecdd20 Sofia Papagiannaki
        if not request.user.is_anonymous():
160 63ecdd20 Sofia Papagiannaki
            next = urlencode({'next': request.build_absolute_uri()})
161 270dd48d Sofia Papagiannaki
            logout_uri = reverse(logout) + '?' + next
162 270dd48d Sofia Papagiannaki
            return HttpResponseRedirect(logout_uri)
163 63ecdd20 Sofia Papagiannaki
        return func(request, *args)
164 63ecdd20 Sofia Papagiannaki
    return wrapper
165 63ecdd20 Sofia Papagiannaki
166 5ce3ce4f Sofia Papagiannaki
167 270dd48d Sofia Papagiannaki
def signed_terms_required(func):
168 270dd48d Sofia Papagiannaki
    """
169 270dd48d Sofia Papagiannaki
    Decorator checkes whether the request.user is Anonymous and in that case
170 270dd48d Sofia Papagiannaki
    redirects to `logout`.
171 270dd48d Sofia Papagiannaki
    """
172 270dd48d Sofia Papagiannaki
    @wraps(func)
173 270dd48d Sofia Papagiannaki
    def wrapper(request, *args, **kwargs):
174 fcf90160 Sofia Papagiannaki
        if request.user.is_authenticated() and not request.user.signed_terms:
175 270dd48d Sofia Papagiannaki
            params = urlencode({'next': request.build_absolute_uri(),
176 5ce3ce4f Sofia Papagiannaki
                                'show_form': ''})
177 270dd48d Sofia Papagiannaki
            terms_uri = reverse('latest_terms') + '?' + params
178 270dd48d Sofia Papagiannaki
            return HttpResponseRedirect(terms_uri)
179 270dd48d Sofia Papagiannaki
        return func(request, *args, **kwargs)
180 270dd48d Sofia Papagiannaki
    return wrapper
181 270dd48d Sofia Papagiannaki
182 5ce3ce4f Sofia Papagiannaki
183 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
184 270dd48d Sofia Papagiannaki
@signed_terms_required
185 1f3b4b39 Sofia Papagiannaki
def index(request, login_template_name='im/login.html', profile_template_name='im/profile.html', extra_context=None):
186 890b0eaf Sofia Papagiannaki
    """
187 dcf55476 Sofia Papagiannaki
    If there is logged on user renders the profile page otherwise renders login page.
188 176023aa Kostas Papadimitriou

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

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

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

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

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

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

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

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

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

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

236 890b0eaf Sofia Papagiannaki
    **Arguments**
237 176023aa Kostas Papadimitriou

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

242 890b0eaf Sofia Papagiannaki
    ``extra_context``
243 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
244 176023aa Kostas Papadimitriou

245 890b0eaf Sofia Papagiannaki
    **Template:**
246 176023aa Kostas Papadimitriou

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

249 890b0eaf Sofia Papagiannaki
    **Settings:**
250 176023aa Kostas Papadimitriou

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

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

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

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

311 890b0eaf Sofia Papagiannaki
    **Arguments**
312 176023aa Kostas Papadimitriou

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

317 890b0eaf Sofia Papagiannaki
    ``extra_context``
318 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
319 176023aa Kostas Papadimitriou

320 890b0eaf Sofia Papagiannaki
    **Template:**
321 176023aa Kostas Papadimitriou

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

324 92defad4 Sofia Papagiannaki
    **Settings:**
325 176023aa Kostas Papadimitriou

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

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

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

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

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

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

397 890b0eaf Sofia Papagiannaki
    **Arguments**
398 5ce3ce4f Sofia Papagiannaki

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

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

407 890b0eaf Sofia Papagiannaki
    ``extra_context``
408 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
409 176023aa Kostas Papadimitriou

410 890b0eaf Sofia Papagiannaki
    **Template:**
411 5ce3ce4f Sofia Papagiannaki

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

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

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

507 890b0eaf Sofia Papagiannaki
    **Arguments**
508 176023aa Kostas Papadimitriou

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

513 890b0eaf Sofia Papagiannaki
    ``extra_context``
514 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
515 176023aa Kostas Papadimitriou

516 890b0eaf Sofia Papagiannaki
    **Template:**
517 176023aa Kostas Papadimitriou

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

520 890b0eaf Sofia Papagiannaki
    **Settings:**
521 176023aa Kostas Papadimitriou

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

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