src/ldt/ldt/ldt_utils/views/project.py
author cavaliet
Tue, 04 Dec 2012 13:55:35 +0100
changeset 1013 7b5c49cab8f1
parent 814 fb232b3266b0
child 1035 85322320d89c
permissions -rw-r--r--
remove useless template and unused import.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
     1
from django.conf import settings
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
     2
from django.contrib.auth.decorators import login_required
319
c45aed3c7a89 Remove unused imports in views
verrierj
parents: 315
diff changeset
     3
from django.contrib.auth.models import Group
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
     4
from django.core.urlresolvers import reverse
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
     5
from django.db.models import Q
319
c45aed3c7a89 Remove unused imports in views
verrierj
parents: 315
diff changeset
     6
from django.http import HttpResponse, HttpResponseRedirect, HttpResponseServerError
c45aed3c7a89 Remove unused imports in views
verrierj
parents: 315
diff changeset
     7
from django.shortcuts import render_to_response, get_object_or_404
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
     8
from django.template import RequestContext
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
     9
from django.utils import simplejson
319
c45aed3c7a89 Remove unused imports in views
verrierj
parents: 315
diff changeset
    10
from django.utils.translation import ugettext as _
c45aed3c7a89 Remove unused imports in views
verrierj
parents: 315
diff changeset
    11
from ldt.ldt_utils.forms import LdtAddForm, AddProjectForm, CopyProjectForm
c45aed3c7a89 Remove unused imports in views
verrierj
parents: 315
diff changeset
    12
from guardian.shortcuts import get_objects_for_group, get_objects_for_user
c45aed3c7a89 Remove unused imports in views
verrierj
parents: 315
diff changeset
    13
from ldt.ldt_utils.models import Content, Project
c45aed3c7a89 Remove unused imports in views
verrierj
parents: 315
diff changeset
    14
from ldt.ldt_utils.utils import boolean_convert
c45aed3c7a89 Remove unused imports in views
verrierj
parents: 315
diff changeset
    15
from ldt.security.utils import (assign_perm_to_obj, add_change_attr, get_userlist,
c45aed3c7a89 Remove unused imports in views
verrierj
parents: 315
diff changeset
    16
                                get_userlist_model)
333
4ddf8c0eeab4 Image size is checked before save + project image can be set manually
verrierj
parents: 330
diff changeset
    17
from ldt.user.forms import PictureForm
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    18
import lxml.etree
644
94429061bbfa First step of pagination for contents and projet in workspace home.
cavaliet
parents: 560
diff changeset
    19
import math
1013
7b5c49cab8f1 remove useless template and unused import.
cavaliet
parents: 814
diff changeset
    20
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    21
330
806188af5027 Projects have an icon identical to one of the media they contain, if this icon is different from the default icon. Icons can be set using ./manage.py setprojecticon once icons have been added to contents.
verrierj
parents: 323
diff changeset
    22
@login_required
806188af5027 Projects have an icon identical to one of the media they contain, if this icon is different from the default icon. Icons can be set using ./manage.py setprojecticon once icons have been added to contents.
verrierj
parents: 323
diff changeset
    23
def create_ldt_view(request):
806188af5027 Projects have an icon identical to one of the media they contain, if this icon is different from the default icon. Icons can be set using ./manage.py setprojecticon once icons have been added to contents.
verrierj
parents: 323
diff changeset
    24
    redirect_to = ''
806188af5027 Projects have an icon identical to one of the media they contain, if this icon is different from the default icon. Icons can be set using ./manage.py setprojecticon once icons have been added to contents.
verrierj
parents: 323
diff changeset
    25
    if request.method == "POST" :
806188af5027 Projects have an icon identical to one of the media they contain, if this icon is different from the default icon. Icons can be set using ./manage.py setprojecticon once icons have been added to contents.
verrierj
parents: 323
diff changeset
    26
        form = LdtAddForm(request.POST)
333
4ddf8c0eeab4 Image size is checked before save + project image can be set manually
verrierj
parents: 330
diff changeset
    27
        picture_form = PictureForm(None, request.POST, request.FILES)
330
806188af5027 Projects have an icon identical to one of the media they contain, if this icon is different from the default icon. Icons can be set using ./manage.py setprojecticon once icons have been added to contents.
verrierj
parents: 323
diff changeset
    28
        form_status = "none"
806188af5027 Projects have an icon identical to one of the media they contain, if this icon is different from the default icon. Icons can be set using ./manage.py setprojecticon once icons have been added to contents.
verrierj
parents: 323
diff changeset
    29
        contents = Content.safe_objects.all()
333
4ddf8c0eeab4 Image size is checked before save + project image can be set manually
verrierj
parents: 330
diff changeset
    30
        
4ddf8c0eeab4 Image size is checked before save + project image can be set manually
verrierj
parents: 330
diff changeset
    31
        if form.is_valid() and picture_form.is_valid():              
330
806188af5027 Projects have an icon identical to one of the media they contain, if this icon is different from the default icon. Icons can be set using ./manage.py setprojecticon once icons have been added to contents.
verrierj
parents: 323
diff changeset
    32
                     
333
4ddf8c0eeab4 Image size is checked before save + project image can be set manually
verrierj
parents: 330
diff changeset
    33
            user = request.user                      
330
806188af5027 Projects have an icon identical to one of the media they contain, if this icon is different from the default icon. Icons can be set using ./manage.py setprojecticon once icons have been added to contents.
verrierj
parents: 323
diff changeset
    34
            project = Project.create_project(title=form.cleaned_data['title'], user=user, 
806188af5027 Projects have an icon identical to one of the media they contain, if this icon is different from the default icon. Icons can be set using ./manage.py setprojecticon once icons have been added to contents.
verrierj
parents: 323
diff changeset
    35
                                             contents=form.cleaned_data['contents'],
333
4ddf8c0eeab4 Image size is checked before save + project image can be set manually
verrierj
parents: 330
diff changeset
    36
                                             description=form.cleaned_data['description'],
4ddf8c0eeab4 Image size is checked before save + project image can be set manually
verrierj
parents: 330
diff changeset
    37
                                             set_icon=False)
4ddf8c0eeab4 Image size is checked before save + project image can be set manually
verrierj
parents: 330
diff changeset
    38
            
4ddf8c0eeab4 Image size is checked before save + project image can be set manually
verrierj
parents: 330
diff changeset
    39
            picture_form.model = project
4ddf8c0eeab4 Image size is checked before save + project image can be set manually
verrierj
parents: 330
diff changeset
    40
            picture_form.save()
4ddf8c0eeab4 Image size is checked before save + project image can be set manually
verrierj
parents: 330
diff changeset
    41
            
330
806188af5027 Projects have an icon identical to one of the media they contain, if this icon is different from the default icon. Icons can be set using ./manage.py setprojecticon once icons have been added to contents.
verrierj
parents: 323
diff changeset
    42
            if form.cleaned_data["share"]:
806188af5027 Projects have an icon identical to one of the media they contain, if this icon is different from the default icon. Icons can be set using ./manage.py setprojecticon once icons have been added to contents.
verrierj
parents: 323
diff changeset
    43
                assign_perm_to_obj(project, form.cleaned_data["read_list"], form.cleaned_data["write_list"], user)
806188af5027 Projects have an icon identical to one of the media they contain, if this icon is different from the default icon. Icons can be set using ./manage.py setprojecticon once icons have been added to contents.
verrierj
parents: 323
diff changeset
    44
            form_status = "saved"
806188af5027 Projects have an icon identical to one of the media they contain, if this icon is different from the default icon. Icons can be set using ./manage.py setprojecticon once icons have been added to contents.
verrierj
parents: 323
diff changeset
    45
            is_gecko = ((request.META['HTTP_USER_AGENT'].lower().find("firefox")) > -1);
806188af5027 Projects have an icon identical to one of the media they contain, if this icon is different from the default icon. Icons can be set using ./manage.py setprojecticon once icons have been added to contents.
verrierj
parents: 323
diff changeset
    46
            if is_gecko :
806188af5027 Projects have an icon identical to one of the media they contain, if this icon is different from the default icon. Icons can be set using ./manage.py setprojecticon once icons have been added to contents.
verrierj
parents: 323
diff changeset
    47
                redirect_to = reverse('index_project_full', args=[project.ldt_id])
806188af5027 Projects have an icon identical to one of the media they contain, if this icon is different from the default icon. Icons can be set using ./manage.py setprojecticon once icons have been added to contents.
verrierj
parents: 323
diff changeset
    48
            else:
806188af5027 Projects have an icon identical to one of the media they contain, if this icon is different from the default icon. Icons can be set using ./manage.py setprojecticon once icons have been added to contents.
verrierj
parents: 323
diff changeset
    49
                return HttpResponseRedirect(reverse('index_project', args=[project.ldt_id]))   
806188af5027 Projects have an icon identical to one of the media they contain, if this icon is different from the default icon. Icons can be set using ./manage.py setprojecticon once icons have been added to contents.
verrierj
parents: 323
diff changeset
    50
     
806188af5027 Projects have an icon identical to one of the media they contain, if this icon is different from the default icon. Icons can be set using ./manage.py setprojecticon once icons have been added to contents.
verrierj
parents: 323
diff changeset
    51
    else:
806188af5027 Projects have an icon identical to one of the media they contain, if this icon is different from the default icon. Icons can be set using ./manage.py setprojecticon once icons have been added to contents.
verrierj
parents: 323
diff changeset
    52
        form = LdtAddForm()
333
4ddf8c0eeab4 Image size is checked before save + project image can be set manually
verrierj
parents: 330
diff changeset
    53
        picture_form = PictureForm()
330
806188af5027 Projects have an icon identical to one of the media they contain, if this icon is different from the default icon. Icons can be set using ./manage.py setprojecticon once icons have been added to contents.
verrierj
parents: 323
diff changeset
    54
        contents = Content.safe_objects.all()             
806188af5027 Projects have an icon identical to one of the media they contain, if this icon is different from the default icon. Icons can be set using ./manage.py setprojecticon once icons have been added to contents.
verrierj
parents: 323
diff changeset
    55
        form_status = "none"    
806188af5027 Projects have an icon identical to one of the media they contain, if this icon is different from the default icon. Icons can be set using ./manage.py setprojecticon once icons have been added to contents.
verrierj
parents: 323
diff changeset
    56
    
806188af5027 Projects have an icon identical to one of the media they contain, if this icon is different from the default icon. Icons can be set using ./manage.py setprojecticon once icons have been added to contents.
verrierj
parents: 323
diff changeset
    57
    return render_to_response('ldt/ldt_utils/create_ldt.html', {'contents': contents, 'form': form, 'form_status':form_status,
806188af5027 Projects have an icon identical to one of the media they contain, if this icon is different from the default icon. Icons can be set using ./manage.py setprojecticon once icons have been added to contents.
verrierj
parents: 323
diff changeset
    58
                                                                'redirect_to': redirect_to, 'create_project_action':reverse(create_ldt_view), 'language_code' : settings.LANGUAGE_CODE[2:],
333
4ddf8c0eeab4 Image size is checked before save + project image can be set manually
verrierj
parents: 330
diff changeset
    59
                                                                'elem_list': get_userlist(request.user), 'profile_picture_form': picture_form}, context_instance=RequestContext(request))
330
806188af5027 Projects have an icon identical to one of the media they contain, if this icon is different from the default icon. Icons can be set using ./manage.py setprojecticon once icons have been added to contents.
verrierj
parents: 323
diff changeset
    60
   
806188af5027 Projects have an icon identical to one of the media they contain, if this icon is different from the default icon. Icons can be set using ./manage.py setprojecticon once icons have been added to contents.
verrierj
parents: 323
diff changeset
    61
  
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    62
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    63
@login_required
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    64
def create_project(request, iri_id): 
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    65
    content = get_object_or_404(Content.safe_objects, iri_id=iri_id)
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    66
    contents = [ content, ]
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    67
    groups = request.user.groups.exclude(name=settings.PUBLIC_GROUP_NAME)
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    68
    redirect_to = ''
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    69
    form_status = "none"
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    70
    
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    71
    if request.method == "POST" :        
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    72
        form = AddProjectForm(request.POST)
333
4ddf8c0eeab4 Image size is checked before save + project image can be set manually
verrierj
parents: 330
diff changeset
    73
        picture_form = PictureForm(None, request.POST, request.FILES)
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    74
        
333
4ddf8c0eeab4 Image size is checked before save + project image can be set manually
verrierj
parents: 330
diff changeset
    75
        if form.is_valid() and picture_form.is_valid():
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    76
            user = request.user
333
4ddf8c0eeab4 Image size is checked before save + project image can be set manually
verrierj
parents: 330
diff changeset
    77
            project = Project.create_project(title=form.cleaned_data['title'],
4ddf8c0eeab4 Image size is checked before save + project image can be set manually
verrierj
parents: 330
diff changeset
    78
                                             user=user, contents=contents, 
4ddf8c0eeab4 Image size is checked before save + project image can be set manually
verrierj
parents: 330
diff changeset
    79
                                             description=form.cleaned_data['description'], 
4ddf8c0eeab4 Image size is checked before save + project image can be set manually
verrierj
parents: 330
diff changeset
    80
                                             set_icon=False)
4ddf8c0eeab4 Image size is checked before save + project image can be set manually
verrierj
parents: 330
diff changeset
    81
            picture_form.model = project
4ddf8c0eeab4 Image size is checked before save + project image can be set manually
verrierj
parents: 330
diff changeset
    82
            picture_form.save()
4ddf8c0eeab4 Image size is checked before save + project image can be set manually
verrierj
parents: 330
diff changeset
    83
                                   
4ddf8c0eeab4 Image size is checked before save + project image can be set manually
verrierj
parents: 330
diff changeset
    84
            form_status = "saved"
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    85
            if form.cleaned_data["share"]:
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    86
                assign_perm_to_obj(project, form.cleaned_data["read_list"], form.cleaned_data["write_list"], user)
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    87
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    88
            # Modal window is not used with firefox
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    89
            is_gecko = ((request.META['HTTP_USER_AGENT'].lower().find("firefox")) > -1);
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    90
            if is_gecko :
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    91
                redirect_to = reverse('index_project_full', args=[project.ldt_id])
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    92
            else:
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    93
                return HttpResponseRedirect(reverse('index_project', args=[project.ldt_id]))
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    94
    else:
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    95
        form = AddProjectForm()
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    96
           
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    97
    return render_to_response('ldt/ldt_utils/create_ldt.html', {'form':form, 'form_status': form_status, 'contents':contents,'groups' : groups,
321
c68744402249 Change urls used in reverse to be compatible with the new organization
verrierj
parents: 319
diff changeset
    98
                                                                'redirect_to': redirect_to, 'elem_list': get_userlist(request.user), 'create_project_action':reverse("ldt.ldt_utils.views.project.create_project", args=[iri_id])}, context_instance=RequestContext(request))
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    99
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   100
@login_required
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   101
def update_project(request, ldt_id):
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   102
    project = get_object_or_404(Project.safe_objects, ldt_id=ldt_id)
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   103
    contents = project.contents.all()
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   104
    groups = request.user.groups.exclude(name=settings.PUBLIC_GROUP_NAME)
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   105
    member_list, admin_list = get_userlist_model(project, request.user)
790
015f40d64d43 Update of "reinitialize" button : Test if a content have a front_project before catching its id
rougeronj
parents: 780
diff changeset
   106
    display_reset= False
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   107
    
790
015f40d64d43 Update of "reinitialize" button : Test if a content have a front_project before catching its id
rougeronj
parents: 780
diff changeset
   108
    if contents[0].front_project != None:
015f40d64d43 Update of "reinitialize" button : Test if a content have a front_project before catching its id
rougeronj
parents: 780
diff changeset
   109
        if contents[0].front_project.ldt_id == ldt_id:
015f40d64d43 Update of "reinitialize" button : Test if a content have a front_project before catching its id
rougeronj
parents: 780
diff changeset
   110
            display_reset = True        
780
35631012b6d4 Commit Julien:
Julien Rougeron <julien.rougeron@iri.centrepompidou.fr>
parents: 646
diff changeset
   111
    
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   112
    if request.method == "POST" :
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   113
        submit_action = request.REQUEST.get("submit_button", False)
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   114
        if submit_action == "prepare_delete":
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   115
            errors = []
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   116
            if project.state == 2:
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   117
                errors.append(_("the project %(title)s is published. please unpublish before deleting.") % {'title':project.title})
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   118
                message = _("can not delete the project. Please correct the following error")
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   119
                title = _('title error deleting project')
392
65c1898141da Front projects are created by admins
verrierj
parents: 384
diff changeset
   120
            elif project.content_set.count() != 0:
65c1898141da Front projects are created by admins
verrierj
parents: 384
diff changeset
   121
                errors.append(_("the project %(title)s is the front project of %(content)s. please delete this content first.") % {'title':project.title, 'content':project.content_set.all()[0]})
65c1898141da Front projects are created by admins
verrierj
parents: 384
diff changeset
   122
                message = _("can not delete the project. Please correct the following error")
65c1898141da Front projects are created by admins
verrierj
parents: 384
diff changeset
   123
                title = _('title error deleting project')
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   124
            else:
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   125
                message = _("please confirm deleting project %(title)s") % {'title':project.title}
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   126
                title = _("confirm deletion")
808
0f8e34108677 Embed_player is now the same as Raphael's version
grandjoncl
parents: 790
diff changeset
   127
            return render_to_response('ldt/ldt_utils/error_confirm_popup.html', {'errors':errors, 'message':message, 'title': title}, context_instance=RequestContext(request))
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   128
        elif submit_action == "delete":
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   129
            if project.state != 2:
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   130
                project.delete()
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   131
            form_status = 'deleted'
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   132
            form = AddProjectForm()
333
4ddf8c0eeab4 Image size is checked before save + project image can be set manually
verrierj
parents: 330
diff changeset
   133
            picture_form = PictureForm()
780
35631012b6d4 Commit Julien:
Julien Rougeron <julien.rougeron@iri.centrepompidou.fr>
parents: 646
diff changeset
   134
        elif submit_action == "prepare_reset":
35631012b6d4 Commit Julien:
Julien Rougeron <julien.rougeron@iri.centrepompidou.fr>
parents: 646
diff changeset
   135
            errors=[]
35631012b6d4 Commit Julien:
Julien Rougeron <julien.rougeron@iri.centrepompidou.fr>
parents: 646
diff changeset
   136
            message = _("please confirm reseting project %(title)s") % {'title':project.title}
35631012b6d4 Commit Julien:
Julien Rougeron <julien.rougeron@iri.centrepompidou.fr>
parents: 646
diff changeset
   137
            title = _("confirm reset")
814
fb232b3266b0 Add "reset front project button" in the content creation/update form
rougeronj
parents: 808
diff changeset
   138
            return render_to_response('ldt/ldt_utils/reset_confirm_popup.html', {'errors':errors, 'message':message, 'title': title}, context_instance=RequestContext(request))
780
35631012b6d4 Commit Julien:
Julien Rougeron <julien.rougeron@iri.centrepompidou.fr>
parents: 646
diff changeset
   139
        elif submit_action == "reset":
35631012b6d4 Commit Julien:
Julien Rougeron <julien.rougeron@iri.centrepompidou.fr>
parents: 646
diff changeset
   140
            #TODO : verifier index de la recher maj
35631012b6d4 Commit Julien:
Julien Rougeron <julien.rougeron@iri.centrepompidou.fr>
parents: 646
diff changeset
   141
            contents[0].create_front_project()
35631012b6d4 Commit Julien:
Julien Rougeron <julien.rougeron@iri.centrepompidou.fr>
parents: 646
diff changeset
   142
            contents[0].save()
35631012b6d4 Commit Julien:
Julien Rougeron <julien.rougeron@iri.centrepompidou.fr>
parents: 646
diff changeset
   143
            project.delete()
35631012b6d4 Commit Julien:
Julien Rougeron <julien.rougeron@iri.centrepompidou.fr>
parents: 646
diff changeset
   144
            form_status= 'saved'
35631012b6d4 Commit Julien:
Julien Rougeron <julien.rougeron@iri.centrepompidou.fr>
parents: 646
diff changeset
   145
            form = AddProjectForm()
35631012b6d4 Commit Julien:
Julien Rougeron <julien.rougeron@iri.centrepompidou.fr>
parents: 646
diff changeset
   146
            picture_form = PictureForm()
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   147
        else:
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   148
            form_status = 'none' 
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   149
            form = AddProjectForm(request.POST)
333
4ddf8c0eeab4 Image size is checked before save + project image can be set manually
verrierj
parents: 330
diff changeset
   150
            picture_form = PictureForm(None, request.POST, request.FILES)
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   151
            
333
4ddf8c0eeab4 Image size is checked before save + project image can be set manually
verrierj
parents: 330
diff changeset
   152
            if form.is_valid() and picture_form.is_valid():          
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   153
                if project.title != form.cleaned_data['title'] or project.description != form.cleaned_data['description']:
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   154
                    project.title = form.cleaned_data['title']
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   155
                    project.description = form.cleaned_data['description']
560
1cb2a4a573e1 correct annoations api handler + ldt encoding
ymh <ymh.work@gmail.com>
parents: 549
diff changeset
   156
                    ldt = lxml.etree.fromstring(project.ldt_encoded)
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   157
                    res = ldt.xpath("/iri/project")
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   158
                    res[0].set("title", project.title)
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   159
                    res[0].set("abstract", project.description)
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   160
                    project.ldt = lxml.etree.tostring(ldt, pretty_print=True)
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   161
                    project.save()                    
333
4ddf8c0eeab4 Image size is checked before save + project image can be set manually
verrierj
parents: 330
diff changeset
   162
                 
4ddf8c0eeab4 Image size is checked before save + project image can be set manually
verrierj
parents: 330
diff changeset
   163
                picture_form.model = project
4ddf8c0eeab4 Image size is checked before save + project image can be set manually
verrierj
parents: 330
diff changeset
   164
                picture_form.save()   
549
0313c23ffe7e Minor bugs about permission caching
verrierj
parents: 392
diff changeset
   165
                assign_perm_to_obj(project, form.cleaned_data["read_list"], form.cleaned_data["write_list"], request.user)
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   166
                form_status = "saved"
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   167
    else:
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   168
        form = AddProjectForm({'title':unicode(project.title), 'description':unicode(project.get_description())})
333
4ddf8c0eeab4 Image size is checked before save + project image can be set manually
verrierj
parents: 330
diff changeset
   169
        picture_form = PictureForm()
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   170
        
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   171
        form_status = 'none'
780
35631012b6d4 Commit Julien:
Julien Rougeron <julien.rougeron@iri.centrepompidou.fr>
parents: 646
diff changeset
   172
        
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   173
    return render_to_response('ldt/ldt_utils/create_ldt.html', {'form':form, 'form_status':form_status, 'groups': groups, 'elem_list': get_userlist(request.user), 
780
35631012b6d4 Commit Julien:
Julien Rougeron <julien.rougeron@iri.centrepompidou.fr>
parents: 646
diff changeset
   174
                                                                'ldt_id': ldt_id, 'contents':contents, 'display_reset':display_reset, 'member_list': member_list, 'admin_list': admin_list,
333
4ddf8c0eeab4 Image size is checked before save + project image can be set manually
verrierj
parents: 330
diff changeset
   175
                                                                'create_project_action':reverse("ldt.ldt_utils.views.project.update_project", args=[ldt_id]),
4ddf8c0eeab4 Image size is checked before save + project image can be set manually
verrierj
parents: 330
diff changeset
   176
                                                                'profile_picture_form': picture_form}, context_instance=RequestContext(request))
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   177
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   178
@login_required
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   179
def copy_project(request, ldt_id, group_id=0): 
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   180
    
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   181
    project = get_object_or_404(Project.safe_objects, ldt_id=ldt_id)
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   182
    if request.method == "POST" :
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   183
        form = CopyProjectForm(request.POST)
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   184
        
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   185
        if form.is_valid():
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   186
            user = request.user
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   187
            group_id = form.cleaned_data['group']
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   188
            group = Group.objects.get(id=group_id) if group_id and group_id > 0 else None
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   189
            project = project.copy_project(title=form.cleaned_data['title'], user=user, group=group)
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   190
            is_gecko = ((request.META['HTTP_USER_AGENT'].lower().find("firefox")) > -1);
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   191
            if is_gecko:
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   192
                return HttpResponseRedirect(reverse('index_project_full', args=[project.ldt_id]))
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   193
            else:
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   194
                return HttpResponseRedirect(reverse('index_project', args=[project.ldt_id]))
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   195
    else:
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   196
        form = CopyProjectForm()
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   197
    # Modal window is not used with firefox, so we ask to submit the form in _parent in firefox case.
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   198
    target_parent = ((request.META['HTTP_USER_AGENT'].lower().find("firefox")) > -1);
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   199
    return render_to_response('ldt/ldt_utils/copy_ldt.html', {'form':form, 'project':project, 'group_id':group_id, 'target_parent':target_parent}, context_instance=RequestContext(request))
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   200
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   201
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   202
@login_required
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   203
def projects_filter(request, filter, is_owner=False, status=0, id_group=0):
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   204
    is_owner = boolean_convert(is_owner)
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   205
    status = int(status)
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   206
    id_group = int(id_group)
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   207
    query = Q()
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   208
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   209
    if is_owner:
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   210
        owner = None
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   211
        try:
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   212
            owner = request.user
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   213
        except:
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   214
            return HttpResponseServerError("<h1>User not found</h1>")
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   215
        query &= Q(owner=owner)
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   216
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   217
    if status > 0:
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   218
        query &= Q(state=status)
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   219
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   220
    if filter:
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   221
        if len(filter) > 0 and filter[0] == '_':
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   222
            filter = filter[1:]
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   223
        query &= Q(title__icontains=filter)
392
65c1898141da Front projects are created by admins
verrierj
parents: 384
diff changeset
   224
           
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   225
    is_gecko = ((request.META['HTTP_USER_AGENT'].lower().find("firefox")) > -1);
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   226
    show_username = True
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   227
    
646
97f5db87d71c Enhance pagination with public project and quick search.
cavaliet
parents: 644
diff changeset
   228
    project_nb = None
97f5db87d71c Enhance pagination with public project and quick search.
cavaliet
parents: 644
diff changeset
   229
    nb_pj_pages = None
97f5db87d71c Enhance pagination with public project and quick search.
cavaliet
parents: 644
diff changeset
   230
    num_page = 0
97f5db87d71c Enhance pagination with public project and quick search.
cavaliet
parents: 644
diff changeset
   231
    if request.GET.has_key('num_page'):
97f5db87d71c Enhance pagination with public project and quick search.
cavaliet
parents: 644
diff changeset
   232
        num_page = int(request.GET["num_page"])
97f5db87d71c Enhance pagination with public project and quick search.
cavaliet
parents: 644
diff changeset
   233
    
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   234
    if id_group > 0:    # Search inside a group
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   235
        grp = Group.objects.get(id=id_group)
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   236
        project_list = get_objects_for_group(grp, 'ldt_utils.view_project').filter(query)
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   237
    elif id_group == -1:# Search inside projects shared with a specific user
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   238
        project_list = get_objects_for_user(request.user, 'ldt_utils.view_project', use_groups=False).exclude(owner=request.user)
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   239
    else:
646
97f5db87d71c Enhance pagination with public project and quick search.
cavaliet
parents: 644
diff changeset
   240
        # We paginate in these cases : user's project or published
97f5db87d71c Enhance pagination with public project and quick search.
cavaliet
parents: 644
diff changeset
   241
        if status==2:
97f5db87d71c Enhance pagination with public project and quick search.
cavaliet
parents: 644
diff changeset
   242
            project_list = Project.safe_objects.filter(query).exclude(title__startswith='front')
97f5db87d71c Enhance pagination with public project and quick search.
cavaliet
parents: 644
diff changeset
   243
        else:
97f5db87d71c Enhance pagination with public project and quick search.
cavaliet
parents: 644
diff changeset
   244
            project_list = Project.safe_objects.filter(query)
97f5db87d71c Enhance pagination with public project and quick search.
cavaliet
parents: 644
diff changeset
   245
        project_nb = float(project_list.count()) #@UndefinedVariable
97f5db87d71c Enhance pagination with public project and quick search.
cavaliet
parents: 644
diff changeset
   246
        nb_pj_pages = int(math.ceil(project_nb / settings.LDT_MAX_PROJECTS_PER_PAGE))
97f5db87d71c Enhance pagination with public project and quick search.
cavaliet
parents: 644
diff changeset
   247
        project_list = project_list[(num_page*settings.LDT_MAX_PROJECTS_PER_PAGE):((num_page+1)*settings.LDT_MAX_PROJECTS_PER_PAGE)] #@UndefinedVariable
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   248
        show_username = False
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   249
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   250
    project_list = add_change_attr(request.user, project_list)
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   251
    
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   252
    if status == 2:
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   253
        url_templ = "ldt/ldt_utils/partial/publishedprojectslist.html"
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   254
    else:
646
97f5db87d71c Enhance pagination with public project and quick search.
cavaliet
parents: 644
diff changeset
   255
        url_templ = "ldt/ldt_utils/partial/projectslist.html"
97f5db87d71c Enhance pagination with public project and quick search.
cavaliet
parents: 644
diff changeset
   256
    
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   257
    return render_to_response(url_templ,
646
97f5db87d71c Enhance pagination with public project and quick search.
cavaliet
parents: 644
diff changeset
   258
                              {'projects': project_list, 'nb_pj_pages': nb_pj_pages, 'project_nb': project_nb, 'current_project_page':float(num_page),
97f5db87d71c Enhance pagination with public project and quick search.
cavaliet
parents: 644
diff changeset
   259
                               'show_username':show_username, 'group_id':id_group, 'is_gecko': is_gecko
97f5db87d71c Enhance pagination with public project and quick search.
cavaliet
parents: 644
diff changeset
   260
                               },
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   261
                              context_instance=RequestContext(request))
323
f85caa66acf4 Fix bugs in new url organization
verrierj
parents: 321
diff changeset
   262
       
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   263
@login_required
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   264
def publish(request, id):
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   265
    ldt = get_object_or_404(Project.safe_objects, ldt_id=id)
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   266
    ldt.publish()
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   267
    return HttpResponse(simplejson.dumps({'res':True, 'ldt': {'id': ldt.id, 'state':ldt.state, 'ldt_id': ldt.ldt_id}}, ensure_ascii=False), mimetype='application/json')
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   268
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   269
@login_required
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   270
def unpublish(request, id):
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   271
    ldt = get_object_or_404(Project.safe_objects, ldt_id=id)
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   272
    ldt.unpublish()
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   273
    return HttpResponse(simplejson.dumps({'res':True, 'ldt': {'id': ldt.id, 'state':ldt.state, 'ldt_id': ldt.ldt_id}}, ensure_ascii=False), mimetype='application/json')
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   274
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   275
  
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   276
def created_ldt(request):
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
   277
    return render_to_response('ldt/ldt_utils/save_done.html', context_instance=RequestContext(request))
644
94429061bbfa First step of pagination for contents and projet in workspace home.
cavaliet
parents: 560
diff changeset
   278
94429061bbfa First step of pagination for contents and projet in workspace home.
cavaliet
parents: 560
diff changeset
   279
94429061bbfa First step of pagination for contents and projet in workspace home.
cavaliet
parents: 560
diff changeset
   280
def get_projects_page(num_page, user):
94429061bbfa First step of pagination for contents and projet in workspace home.
cavaliet
parents: 560
diff changeset
   281
    project_nb = float(Project.safe_objects.filter(owner=user).count()) #@UndefinedVariable
94429061bbfa First step of pagination for contents and projet in workspace home.
cavaliet
parents: 560
diff changeset
   282
    nb_pj_pages = int(math.ceil(project_nb / settings.LDT_MAX_PROJECTS_PER_PAGE))
94429061bbfa First step of pagination for contents and projet in workspace home.
cavaliet
parents: 560
diff changeset
   283
    project_list = add_change_attr(user, Project.safe_objects.filter(owner=user)[(num_page*settings.LDT_MAX_PROJECTS_PER_PAGE):((num_page+1)*settings.LDT_MAX_PROJECTS_PER_PAGE)]) #@UndefinedVariable
94429061bbfa First step of pagination for contents and projet in workspace home.
cavaliet
parents: 560
diff changeset
   284
    return project_nb, nb_pj_pages, project_list
646
97f5db87d71c Enhance pagination with public project and quick search.
cavaliet
parents: 644
diff changeset
   285
97f5db87d71c Enhance pagination with public project and quick search.
cavaliet
parents: 644
diff changeset
   286
97f5db87d71c Enhance pagination with public project and quick search.
cavaliet
parents: 644
diff changeset
   287
def get_published_projects_page(num_page):
97f5db87d71c Enhance pagination with public project and quick search.
cavaliet
parents: 644
diff changeset
   288
    project_nb = float(Project.safe_objects.filter(state=2).exclude(title__startswith='front').count()) #@UndefinedVariable
97f5db87d71c Enhance pagination with public project and quick search.
cavaliet
parents: 644
diff changeset
   289
    nb_pj_pages = int(math.ceil(project_nb / settings.LDT_MAX_PROJECTS_PER_PAGE))
97f5db87d71c Enhance pagination with public project and quick search.
cavaliet
parents: 644
diff changeset
   290
    project_list = Project.safe_objects.filter(state=2).exclude(title__startswith='front')[(num_page*settings.LDT_MAX_PROJECTS_PER_PAGE):((num_page+1)*settings.LDT_MAX_PROJECTS_PER_PAGE)] #@UndefinedVariable
97f5db87d71c Enhance pagination with public project and quick search.
cavaliet
parents: 644
diff changeset
   291
    return project_nb, nb_pj_pages, project_list