Example #1
0
def search_group_delete(request, group_id):

    # retrieve group from database
    group = get_object_or_404(SearchGroup, pk=group_id)

    # retrieve associated project
    project = group.profile.project

    # security check
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)

    # delete all facets in this group
    for facet in group.facets.all():
        facet.delete()

    # delete group
    group.delete()

    # re-order all groups in this project
    groups = SearchGroup.objects.filter(
        profile__project=project).order_by('order')
    count = 0
    for group in groups:
        group.order = count
        group.save()
        count += 1

    # redirect to search profile configuration page (GET-POST-REDIRECT)
    return HttpResponseRedirect(
        reverse('search_profile_config', args=[project.short_name.lower()]))
Example #2
0
def search_group_delete(request, group_id):
         
    # retrieve group from database
    group = get_object_or_404(SearchGroup, pk=group_id)
        
    # retrieve associated project
    project = group.profile.project
    
    # security check
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)
        
    # delete all facets in this group
    for facet in group.facets.all():
        facet.delete()
    
    # delete group
    group.delete()
    
    # re-order all groups in this project
    groups = SearchGroup.objects.filter(profile__project=project).order_by('order')
    count = 0
    for group in groups:
        group.order = count
        group.save()
        count += 1
        
    # redirect to search profile configuration page (GET-POST-REDIRECT)
    return HttpResponseRedirect(reverse('search_profile_config', args=[project.short_name.lower()]))
Example #3
0
def search_facet_update(request, facet_id):

    # retrieve facet from database
    facet = get_object_or_404(SearchFacet, pk=facet_id)

    # security check
    project = facet.group.profile.project
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)

    # retrieve list of available facets by executing project-specific query
    facets = _queryFacets(request, project)

    if request.method == 'GET':
        form = SearchFacetForm(project, instance=facet)
        return render_search_facet_form(request, project, form, facets)

    else:

        form = SearchFacetForm(project, request.POST, instance=facet)

        if form.is_valid():
            facet = form.save()
            return HttpResponseRedirect(
                reverse('search_profile_config',
                        args=[project.short_name.lower()]))

        else:
            print 'Form is invalid: %s' % form.errors
            return render_search_facet_form(request, project, form, facets)
Example #4
0
def search_facet_delete(request, facet_id):

    # retrieve facet from database
    facet = get_object_or_404(SearchFacet, pk=facet_id)

    # facet group
    group = facet.group

    # retrieve associated project
    project = group.profile.project

    # security check
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)

    # delete facet
    facet.delete()

    # re-order all group facets
    facets = SearchFacet.objects.filter(group=group).order_by('order')
    count = 0
    for facet in facets:
        facet.order = count
        facet.save()
        count += 1

    # redirect to search profile configuration page (GET-POST-REDIRECT)
    return HttpResponseRedirect(
        reverse('search_profile_config', args=[project.short_name.lower()]))
Example #5
0
def search_facet_update(request, facet_id):
    
    # retrieve facet from database
    facet = get_object_or_404(SearchFacet, pk=facet_id)
       
    # security check
    project = facet.group.profile.project
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)
    
    # retrieve list of available facets by executing project-specific query
    facets = _queryFacets(request, project)
    
    if request.method == 'GET':
        form = SearchFacetForm(project, instance=facet)    
        return render_search_facet_form(request, project, form, facets)
        
    else:
        
        form = SearchFacetForm(project, request.POST, instance=facet)
        
        if form.is_valid():            
            facet = form.save()
            return HttpResponseRedirect(reverse('search_profile_config', args=[project.short_name.lower()])) 
        
        else:     
            print 'Form is invalid: %s' % form.errors
            return render_search_facet_form(request, project, form, facets)
Example #6
0
def search_group_update(request, group_id):

    # retrieve group from database
    group = get_object_or_404(SearchGroup, pk=group_id)

    # security check
    project = group.profile.project
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)

    if request.method == 'GET':
        form = SearchGroupForm(instance=group)
        return render_search_group_form(request, project, form)

    else:

        form = SearchGroupForm(request.POST, instance=group)

        if form.is_valid():
            group = form.save()
            return HttpResponseRedirect(
                reverse('search_profile_config',
                        args=[project.short_name.lower()]))

        else:
            print 'Form is invalid: %s' % form.errors
            return render_search_group_form(request, project, form)
Example #7
0
def search_group_add(request, project_short_name):
    '''View to add a search facet group.'''
    
    # retrieve project from database
    project = get_object_or_404(Project, short_name__iexact=project_short_name)
    
    # security check
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)
    
    if request.method == 'GET':

        search_profile = project.searchprofile
        order = len(search_profile.groups.all())

        form = SearchGroupForm(initial={'profile':search_profile, 'order':order, 'name':'' })
        return render_search_group_form(request, project, form)

    else:
        
        form = SearchGroupForm(request.POST)
        
        if form.is_valid():            
            form.save()
            return HttpResponseRedirect(reverse('search_profile_config', args=[project.short_name.lower()])) 
        
        else:     
            print 'Form is invalid: %s' % form.errors
                        
            return render_search_group_form(request, project, form)
Example #8
0
def membership_list_requested(request, project_short_name):
        
    # load project
    project = get_object_or_404(Project, short_name__iexact=project_short_name)
    
    # check permission
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)
    
    # load user group
    group = project.getUserGroup()
    
    # optional 'match' argument
    match = getQueryDict(request).get('match', None) # works for GET or POST

    if match:
        # lookup specific user
        _users = [mr.user for mr in MembershipRequest.objects.filter(group=group).order_by('user__last_name')]
        users = [user for user in _users if (match in user.first_name.lower()
                                             or match in user.last_name.lower()
                                             or match in user.username.lower()
                                             or match in user.email.lower())]
    else:
        # load all users that have requested membership
        users = [mr.user for mr in MembershipRequest.objects.filter(group=group).order_by('user__last_name')]
             
    title = '%s Pending Users' % project.short_name   
    view_name = 'membership_list_requested'
    return render_membership_page(request, project, users, title, view_name)
Example #9
0
def project_delete(request, project_short_name):
    # retrieve project from database
    project = get_object_or_404(Project, short_name__iexact=project_short_name)

    # limit to local projects only
    if not project.isLocal():
        return HttpResponseForbidden(LOCAL_PROJECTS_ONLY_MESSAGE)

    # check permission
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)

    if request.method == 'GET':
        return render(request, 'cog/project/project_delete.html', {
            'project': project,
            'title': 'Delete Project'
        })

    else:

        # delete all project objects
        deleteProject(project, dryrun=False, rmdir=True)

        # redirect to admin index
        return HttpResponseRedirect(reverse('site_home'))
Example #10
0
def search_facet_delete(request, facet_id):
         
    # retrieve facet from database
    facet = get_object_or_404(SearchFacet, pk=facet_id)
    
    # facet group
    group = facet.group
    
    # retrieve associated project
    project = group.profile.project
    
    # security check
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)
        
    # delete facet
    facet.delete()
    
    # re-order all group facets
    facets = SearchFacet.objects.filter(group=group).order_by('order')
    count = 0
    for facet in facets:
        facet.order = count
        facet.save()
        count += 1
        
    # redirect to search profile configuration page (GET-POST-REDIRECT)
    return HttpResponseRedirect(reverse('search_profile_config', args=[project.short_name.lower()]))
Example #11
0
def search_group_update(request, group_id):
    
    # retrieve group from database
    group = get_object_or_404(SearchGroup, pk=group_id)
       
    # security check
    project = group.profile.project
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)
        
    if request.method == 'GET':
        form = SearchGroupForm(instance=group)    
        return render_search_group_form(request, project, form)
        
    else:
        
        form = SearchGroupForm(request.POST, instance=group)
        
        if form.is_valid():            
            group = form.save()
            return HttpResponseRedirect(reverse('search_profile_config', args=[project.short_name.lower()])) 
        
        else:     
            print 'Form is invalid: %s' % form.errors
            return render_search_group_form(request, project, form)
Example #12
0
def userCanPost(user, post):

    # page editing is restricted to project administrators
    if post.is_restricted:
        return userHasAdminPermission(user, post.project)
    # page can be edited by all project members
    else:
        return userHasContributorPermission(user, post.project)
Example #13
0
def userCanPost(user, post):
    
    # page editing is restricted to project administrators
    if post.is_restricted:
        return userHasAdminPermission(user, post.project)
    # page can be edited by all project members
    else:
        return userHasContributorPermission(user, post.project)
Example #14
0
def membership_process(request, project_short_name):
    # load project
    project = get_object_or_404(Project, short_name__iexact=project_short_name)
    # check permission
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)

    queryDict = getQueryDict(request)
    
    for (name, value) in queryDict.items():

        if name.startswith(NEW_MEMBERSHIP) or name.startswith(OLD_MEMBERSHIP) or name.startswith(NO_MEMBERSHIP):
            (prefix, group_name, user_id) = name.split(":")
            
            group = get_object_or_404(Group, name=group_name)
            user = get_object_or_404(User, pk=user_id)
            
            # HTTP POST parameter from form check-box, all checks are treated as new
            # process checkbox as a new user
            if name.startswith(NEW_MEMBERSHIP):
                status = addMembership(user, group, admin=request.user)

                #only email if user not already a member
                if status == RESULT_SUCCESS:
                    notifyUserOfMembershipGranted(project, group, user, request)

            # process hidden input field that indicates current membership
            # HTTP POST parameter from form hidden field
            # if user has a role, then {{isEnrolled}} turns on the hidden field with value = "on"

            elif name.startswith(OLD_MEMBERSHIP):
                try:
                    # don't delete from group if checkbox is still checked  (e.g. new membership)
                    new_membership = queryDict[encodeMembershipPar(NEW_MEMBERSHIP, group.name, user.id)]
                except KeyError:
                    # checkbox is empty, so remove from group
                    status = cancelMembership(user, group, admin=request.user)
                    if status == RESULT_SUCCESS:
                        notifyUserOfGroupRemoval(project, group, user)
             
            # HTTP GET parameter (when delete link clicked)
            elif name.startswith(NO_MEMBERSHIP):
                # TODO check group here, should remove from all groups
                status = cancelMembership(user, group)
                if status == RESULT_SUCCESS:
                    notifyUserOfGroupRemoval(project, group, user)

    # redirect to the original listing that submitted the processing
    view_name = queryDict['view_name']
    return HttpResponseRedirect(reverse(view_name,
                                        kwargs={'project_short_name': project_short_name})+"?status=success")
Example #15
0
 def isVisible(self, user):
     
     if self.active == False:
         return False
     elif self.private == False:
         return True
     elif userHasUserPermission(user, self):
         return True
     elif userHasContributorPermission(user, self):
         return True
     elif userHasAdminPermission(user, self):
         return True
     else:
         return False
Example #16
0
def search_profile_config(request, project_short_name):

    # retrieve project from database
    project = get_object_or_404(Project, short_name__iexact=project_short_name)

    # retrieve ordered list of search groups and facets
    search_groups = _get_search_groups(project)

    # security check
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)

    if request.method == 'GET':
        # retrieve project search profile
        try:
            profile = project.searchprofile
        # or create a new one
        except ObjectDoesNotExist:
            profile = create_project_search_profile(project)

        form = SearchProfileForm(instance=profile)

        return render_search_profile_form(request, project, form,
                                          search_groups)

    else:

        # create form object from request parameters and existing search profile
        try:
            form = SearchProfileForm(request.POST,
                                     instance=project.searchprofile)
        # or create a new object
        except ObjectDoesNotExist:
            form = SearchProfileForm(request.POST)

        if form.is_valid():

            # save profile to the database
            profile = form.save()

            # redirect to project home (GET-POST-REDIRECT)
            return HttpResponseRedirect(
                reverse('search_profile_config',
                        args=[project.short_name.lower()]))

        else:
            print 'Form is invalid: %s' % form
            return render_search_profile_form(request, project, form,
                                              search_groups)
Example #17
0
def _project_page_update(request, project_short_name, formClass, form_template,
                         form_template_title, display_view):
    """Generic view for updating some project fields."""

    # retrieve project from database
    project = get_object_or_404(Project, short_name__iexact=project_short_name)

    # check permission
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)

    # GET request
    if request.method == 'GET':

        # create form object from model
        form = formClass(instance=project)

        # render form
        return render(request, form_template, {
            'title': form_template_title,
            'project': project,
            'form': form
        })

    # POST request
    else:

        # update object from form data
        form = formClass(request.POST, instance=project)

        # validate form data
        if form.is_valid():

            # persist changes
            project = form.save()

            # redirect to development overview (GET-POST-REDIRECT)
            return HttpResponseRedirect(
                reverse(display_view, args=[project.short_name.lower()]))

        # return to form
        else:
            print 'Form is invalid %s' % form.errors
            return render(request, form_template, {
                'title': form_template_title,
                'project': project,
                'form': form
            })
Example #18
0
def organizational_role_update(request, project_short_name):
    
    # retrieve project from database
    project = get_object_or_404(Project, short_name__iexact=project_short_name)
    
    # check permission
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)
    
    # must build the formset via non-traditional means to pass the current project as a class attribute
    OrganizationalRoleFormSet = inlineformset_factory(Project, OrganizationalRole, extra=1, can_delete=True,
                                                      form=OrganizationalRoleForm, fields="__all__")
    
    # GET request
    if request.method == 'GET':
        # create formset backed up by current saved instances
        organizational_role_formset = OrganizationalRoleFormSet(instance=project)
        
        # display form view
        return render_organizational_role_form(request, project, organizational_role_formset)
        
    # POST request
    else:
        organizational_role_formset = OrganizationalRoleFormSet(request.POST, instance=project)
        
        # validate formset
        if organizational_role_formset.is_valid():
            
            # save changes to databaase
            orgrole_instances = organizational_role_formset.save()
            
            # assign role category and save again
            for role in orgrole_instances:
                role.set_category()
                role.save()
            
            # redirect to governance display (GET-POST-REDIRECT)
            tab = 'roles'
            return HttpResponseRedirect(reverse('governance_display', args=[project.short_name.lower(), tab]))
            
        else:
            print 'Organizational Role formset is invalid: %s' % organizational_role_formset.errors
            
            # redorect to form
            return render_organizational_role_form(request, project, organizational_role_formset)
Example #19
0
def governance_object_update(request, project_short_name, tab, objectType, objectTypeForm, formsetType, title, template,
                             redirect):
    
    # retrieve project from database
    project = get_object_or_404(Project, short_name__iexact=project_short_name)
    
    # check permission
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)
    
    # initialize formset factory for this governance object
    ObjectFormSet = inlineformset_factory(Project, objectType, extra=1, form=objectTypeForm, formset=formsetType, fields="__all__")

    # GET request
    if request.method == 'GET':
        
        # create formset instance associated to current project
        formset = ObjectFormSet(instance=project)
        
        return render_governance_object_form(request, project, formset, title, template)

    # POST method
    else:
        # update formset from POST data
        formset = ObjectFormSet(request.POST, instance=project)
        
        if formset.is_valid():
            
            # save changes to database
            instances = formset.save()
                        
            # set additional object flags
            for instance in instances:
                dict = {}
                if formsetType == InternalCommunicationMeansInlineFormset:
                    dict['internal'] = True
                instance.set_category(dict=dict)
                instance.save()
                       
            # redirect to governance display (GET-POST-REDIRECT)
            return redirect
            
        else:
            print 'Formset is invalid  %s' % formset.errors
            return render_governance_object_form(request, project, formset, title, template)
Example #20
0
def search_profile_import(request, project_short_name):

    # retrieve project from database
    project = get_object_or_404(Project, short_name__iexact=project_short_name)
    
    # security check
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)
    
    scp = SearchConfigParser(project)
    try:
        scp.read()
        message = 'search_config_imported'
    except Exception as e:
        print "ERROR: %s" % e
        message = 'search_config_not_found'        

    return HttpResponseRedirect(reverse('search_profile_config', args=[project.short_name.lower()])+"?message=%s" % message)
Example #21
0
def search_profile_config(request, project_short_name):
    
    # retrieve project from database
    project = get_object_or_404(Project, short_name__iexact=project_short_name)
    
    # retrieve ordered list of search groups and facets
    search_groups = _get_search_groups(project)
    
    # security check
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)

    if request.method == 'GET':
        # retrieve project search profile
        try:
            profile = project.searchprofile
        # or create a new one
        except ObjectDoesNotExist:
            profile = create_project_search_profile(project)
            
        form = SearchProfileForm(instance=profile)
            
        return render_search_profile_form(request, project, form, search_groups)
        
    else:
        
        # create form object from request parameters and existing search profile
        try:
            form = SearchProfileForm(request.POST, instance=project.searchprofile)
        # or create a new object
        except ObjectDoesNotExist:
            form = SearchProfileForm(request.POST)
        
        if form.is_valid():
            
            # save profile to the database
            profile = form.save()
                        
            # redirect to project home (GET-POST-REDIRECT)
            return HttpResponseRedirect(reverse('search_profile_config', args=[project.short_name.lower()]))
            
        else:
            print 'Form is invalid: %s' % form
            return render_search_profile_form(request, project, form, search_groups)
Example #22
0
def membership_list_all(request, project_short_name):
    
    # load project
    project = get_object_or_404(Project, short_name__iexact=project_short_name)
    
    # check permission
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)
    
    # load all users - that match...
    match = getQueryDict(request).get('match', None) # works for GET or POST
    if match:
        users = getUsersThatMatch(match)
    else:
        users = User.objects.all().order_by('last_name')  
                  
    title = 'Assign Project Members From "List Of All Node Users"'
    view_name = 'membership_list_all'
    return render_membership_page(request, project, users, title, view_name)
Example #23
0
def _project_page_update(request, project_short_name, 
                         formClass, form_template, form_template_title, display_view):
    """Generic view for updating some project fields."""
    
    # retrieve project from database
    project = get_object_or_404(Project, short_name__iexact=project_short_name)
    
    # check permission
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)
    
    # GET request
    if request.method == 'GET':
                
        # create form object from model
        form = formClass(instance=project)

        # render form    
        return render(request,
                      form_template,
                      {'title': form_template_title, 'project': project, 'form': form})
    
    # POST request
    else:
        
        # update object from form data
        form = formClass(request.POST, instance=project)
        
        # validate form data
        if form.is_valid():
            
            # persist changes
            project = form.save()
            
            # redirect to development overview (GET-POST-REDIRECT)
            return HttpResponseRedirect(reverse(display_view, args=[project.short_name.lower()]))            
            
        # return to form
        else:
            print 'Form is invalid %s' % form.errors
            return render(request,
                          form_template,
                          {'title': form_template_title, 'project': project, 'form': form})
Example #24
0
def aboutus_update(request, project_short_name, tab):
    """
    View to update the project "About Us" metadata.
    :param request:
    :param project_short_name:
    :param tab:
    :return:
    """

    # retrieve Project from database with the given short_name
    project = get_object_or_404(Project, short_name__iexact=project_short_name)

    # check permission
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)

    # GET request
    if request.method == 'GET':
        # create form object from model
        form = AboutusForm(instance=project)

        return render_aboutus_form(request, project, tab, form)

    # POST request
    else:
        # update existing database model with form data
        form = AboutusForm(request.POST, instance=project)

        if form.is_valid():
            # save project data
            project = form.save()

            # redirect to about us display (GET-POST-REDIRECT)
            return HttpResponseRedirect(
                reverse('aboutus_display',
                        args=[project.short_name.lower(), tab]))

        else:
            # re-display form view
            if not form.is_valid():
                print 'Form is invalid  %s' % form.errors
            return render_aboutus_form(request, project, tab, form)
Example #25
0
def search_profile_import(request, project_short_name):

    # retrieve project from database
    project = get_object_or_404(Project, short_name__iexact=project_short_name)

    # security check
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)

    scp = SearchConfigParser(project)
    try:
        scp.read()
        message = 'search_config_imported'
    except Exception as e:
        print "ERROR: %s" % e
        message = 'search_config_not_found'

    return HttpResponseRedirect(
        reverse('search_profile_config', args=[project.short_name.lower()]) +
        "?message=%s" % message)
Example #26
0
def members_update(request, tab, objectId, objectType, objectMemberType, objectMemberForm, redirect):
    
    # retrieve governance object
    obj = get_object_or_404(objectType, pk=objectId)
    
    # check permission
    if not userHasAdminPermission(request.user, obj.project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)
    
    # formset factory
    users_queryset = projectUsersQuerySet(obj.project)
    ObjectFormSet = inlineformset_factory(objectType, objectMemberType, form=objectMemberForm, extra=3, fields="__all__")

    # GET request
    if request.method == 'GET':
        
        # retrieve current members
        formset = ObjectFormSet(instance=obj)
        for form in formset.forms:
            form.fields['user'].queryset = users_queryset
        
        # render view
        return render_members_form(request, obj, formset, redirect)
        
    # POST request
    else:
        formset = ObjectFormSet(request.POST, instance=obj)
        
        if formset.is_valid():
            
            # save updated members
            instances = formset.save()
            
            # redirect to display (GET-POST-REDIRECT)
            return HttpResponseRedirect(redirect)
                      
        else:
            print 'Formset is invalid: %s' % formset.errors
            
            # redirect to form view
            return render_members_form(request, obj, formset, redirect)
Example #27
0
def search_facet_add(request, project_short_name):

    # retrieve project from database
    project = get_object_or_404(Project, short_name__iexact=project_short_name)

    # security check
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)

    if request.method == 'GET':

        # retrieve list of available facets by executing project-specific query
        facets = _queryFacets(request, project)

        # create default search group, if not existing already
        group = get_or_create_default_search_group(project)

        # assign facet to default search group
        order = group.size()
        facet = SearchFacet(order=order, group=group)
        form = SearchFacetForm(project, instance=facet)

        return render_search_facet_form(request, project, form, facets)

    else:
        form = SearchFacetForm(project, request.POST)

        if form.is_valid():
            facet = form.save()
            return HttpResponseRedirect(
                reverse('search_profile_config',
                        args=[project.short_name.lower()]))

        else:
            print 'Form is invalid: %s' % form.errors

            # must retrieve facets again
            facets = _queryFacets(request, project)

            return render_search_facet_form(request, project, form, facets)
Example #28
0
def aboutus_update(request, project_short_name, tab):
    """
    View to update the project "About Us" metadata.
    :param request:
    :param project_short_name:
    :param tab:
    :return:
    """

    # retrieve Project from database with the given short_name
    project = get_object_or_404(Project, short_name__iexact=project_short_name)

    # check permission
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)

    # GET request
    if request.method == 'GET':
        # create form object from model
        form = AboutusForm(instance=project)

        return render_aboutus_form(request, project, tab, form)

    # POST request
    else:
        # update existing database model with form data
        form = AboutusForm(request.POST, instance=project)

        if form.is_valid():
            # save project data
            project = form.save()

            # redirect to about us display (GET-POST-REDIRECT)
            return HttpResponseRedirect(reverse('aboutus_display', args=[project.short_name.lower(), tab]))

        else:
            # re-display form view
            if not form.is_valid():
                print 'Form is invalid  %s' % form.errors
            return render_aboutus_form(request, project, tab, form)
Example #29
0
def development_update(request, project_short_name):

    # retrieve project from database
    project = get_object_or_404(Project, short_name__iexact=project_short_name)

    # check permission
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)

    # GET request
    if request.method == 'GET':

        # create form object from model
        form = DevelopmentOverviewForm(instance=project)

        # render form
        return render_development_form(request, project, form)

    # POST request
    else:

        # update object from form data
        form = DevelopmentOverviewForm(request.POST, instance=project)

        # validate form data
        if form.is_valid():

            # persist changes
            project = form.save()

            # redirect to development overview (GET-POST-REDIRECT)
            return HttpResponseRedirect(
                reverse('development_display',
                        args=[project.short_name.lower()]))

        # return to form
        else:
            print 'Form is invalid %s' % form.errors
            return render_development_form(request, project, form)
Example #30
0
def search_facet_add(request, project_short_name):
    
    # retrieve project from database
    project = get_object_or_404(Project, short_name__iexact=project_short_name)
    
    # security check
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)
    
    if request.method == 'GET':

        # retrieve list of available facets by executing project-specific query
        facets = _queryFacets(request, project)
        
        # create default search group, if not existing already
        group = get_or_create_default_search_group(project)
        
        # assign facet to default search group
        order = group.size()
        facet = SearchFacet(order=order, group=group)
        form = SearchFacetForm(project, instance=facet)    
        
        return render_search_facet_form(request, project, form, facets)
        
    else:
        form = SearchFacetForm(project, request.POST)
        
        if form.is_valid():            
            facet = form.save()
            return HttpResponseRedirect(reverse('search_profile_config', args=[project.short_name.lower()])) 
        
        else:     
            print 'Form is invalid: %s' % form.errors
            
            # must retrieve facets again
            facets = _queryFacets(request, project)
            
            return render_search_facet_form(request, project, form, facets)
Example #31
0
def development_update(request, project_short_name):
    
    # retrieve project from database
    project = get_object_or_404(Project, short_name__iexact=project_short_name)
    
    # check permission
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)
    
    # GET request
    if request.method == 'GET':
                
        # create form object from model
        form = DevelopmentOverviewForm(instance=project)

        # render form
        return render_development_form(request, project, form)
    
    # POST request
    else:
        
        # update object from form data
        form = DevelopmentOverviewForm(request.POST, instance=project)
        
        # validate form data
        if form.is_valid():
            
            # persist changes
            project = form.save()
            
            # redirect to development overview (GET-POST-REDIRECT)
            return HttpResponseRedirect(reverse('development_display', args=[project.short_name.lower()]))            
            
        # return to form
        else:
            print 'Form is invalid %s' % form.errors
            return render_development_form(request, project, form)
Example #32
0
def search_group_add(request, project_short_name):
    '''View to add a search facet group.'''

    # retrieve project from database
    project = get_object_or_404(Project, short_name__iexact=project_short_name)

    # security check
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)

    if request.method == 'GET':

        search_profile = project.searchprofile
        order = len(search_profile.groups.all())

        form = SearchGroupForm(initial={
            'profile': search_profile,
            'order': order,
            'name': ''
        })
        return render_search_group_form(request, project, form)

    else:

        form = SearchGroupForm(request.POST)

        if form.is_valid():
            form.save()
            return HttpResponseRedirect(
                reverse('search_profile_config',
                        args=[project.short_name.lower()]))

        else:
            print 'Form is invalid: %s' % form.errors

            return render_search_group_form(request, project, form)
Example #33
0
def project_delete(request, project_short_name):
    # retrieve project from database
    project = get_object_or_404(Project, short_name__iexact=project_short_name)
    
    # limit to local projects only
    if not project.isLocal():
        return HttpResponseForbidden(LOCAL_PROJECTS_ONLY_MESSAGE)
    
    # check permission
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)
    
    if request.method == 'GET':
        return render(request,
                      'cog/project/project_delete.html', 
                      {'project': project, 'title': 'Delete Project'})
        
    else:
        
        # delete all project objects
        deleteProject(project, dryrun=False, rmdir=True)
        
        # redirect to admin index
        return HttpResponseRedirect(reverse('site_home'))
Example #34
0
def membership_list_enrolled(request, project_short_name):
    
    # load project
    project = get_object_or_404(Project, short_name__iexact=project_short_name)
    
    # check permission
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)
    
    # optional 'match' argument
    match = getQueryDict(request).get('match', None) # works for GET or POST
    
    if match:
        # filter all users by 'match'
        _users = getUsersThatMatch(match)
        # filter all users by project
        users = [user for user in _users if (user in project.getUserGroup().user_set.all() 
                                             or user in project.getAdminGroup().user_set.all())]     
    else:
        users = list(project.getUsers())
    
    title = '%s Current Users' % project.short_name
    view_name = 'membership_list_enrolled'
    return render_membership_page(request, project, users, title, view_name)
Example #35
0
def _imageformset_update(request, project, tab, clazz, formset_factory,
                         queryset, form_template, upload_dir, thumbnail_size):

    # check permission
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)

    # GET request
    if request.method == 'GET':

        # select object instances associated with current project
        formset = formset_factory(queryset=queryset)

        return render_formset(form_template, request, project, tab, formset)

    # POST request
    else:
        # create formset from POST data
        formset = formset_factory(request.POST,
                                  request.FILES,
                                  queryset=queryset)

        # validate formset
        if formset.is_valid():

            # delete image?
            for form in formset:
                try:
                    # request to delete image or whole object
                    if form.cleaned_data.get('delete_image',
                                             False) or form.cleaned_data.get(
                                                 'DELETE', False):
                        deleteImageAndThumbnail(form.instance)

                except ValueError as error:
                    print error

                # delete object
                if form.cleaned_data.get('DELETE', False):
                    print 'Deleting instance=%s' % form.instance
                    form.instance.delete()

            # persist formset data
            # Note: only objects that have changed are returned
            instances = formset.save(commit=False)

            # assign instance to project and persist
            for instance in instances:

                # replace current image BEFORE the new image is persisted to disk
                # newly uploaded images are characterized by the fact that 'upload_dir' is not present in the path
                if (instance.id is
                        not None  # instance is not new (i.e. it's already in database)
                        and instance.image is
                        not None  # instance contains an image
                        and instance.image.name is not None
                        and not upload_dir in instance.image.name
                    ):  # image has been newly selected
                    obj = clazz.objects.get(pk=instance.id)
                    try:
                        deleteImageAndThumbnail(obj)
                    except ValueError as error:
                        pass  # "The 'image' attribute has no file associated with it"

                instance.project = project
                instance.save()

                # generate image thumbnail, after the image has been saved to disk
                if instance.image is not None:
                    try:
                        generateThumbnail(instance.image.path, thumbnail_size)
                    except ValueError as e:
                        print e
                        pass  # no image supplied

            # redirect to people display (GET-POST-REDIRECT)
            return HttpResponseRedirect(
                reverse('aboutus_display',
                        args=[project.short_name.lower(), tab]))

        else:
            print 'Formset is invalid  %s' % formset.errors
            return render_formset(form_template, request, project, tab,
                                  formset)
Example #36
0
def hasAdminPermission(user, project):
    return userHasAdminPermission(user, project)
Example #37
0
def hasAdminPermission(user, project):
    return userHasAdminPermission(user, project)
Example #38
0
def search_profile_order(request, project_short_name):

    # must reflect name of select widgets in search_order_form.html
    SEARCH_GROUP_KEY = "group_name_"
    SEARCH_FACET_KEY = "_facet_key_"

    # retrieve project from database
    project = get_object_or_404(Project, short_name__iexact=project_short_name)

    # check permission
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)

    # current list of search groups
    groups = _get_search_groups(project)

    # GET
    if request.method == 'GET':

        return render(
            request, 'cog/search/search_order_form.html', {
                'project': project,
                'groups': groups,
                'title': 'Order Search Facets and Groups',
                'errors': {}
            })

    # POST
    else:

        # map (group, new group order)
        groupOrderMap = {}
        valid = True  # form data validation flag
        errors = {}  # form validation errors

        for group, facets in groups.items():

            group_key = SEARCH_GROUP_KEY + str(group.name)
            group_order = request.POST[group_key]
            group.order = int(
                group_order
            )  # reassign the group orde WITHOUT saving to the database for now
            # validate group order
            if group_order in groupOrderMap.values():
                valid = False
                errors[group_key] = "Duplicate search facet number: %d" % int(
                    group_order)
            else:
                groupOrderMap[group_key] = group_order

            facetOrderMap = {}
            for facet in facets:

                facet_key = group_key + SEARCH_FACET_KEY + str(facet.key)
                facet_order = request.POST[facet_key]
                facet.order = facet_order
                # validate facet order within this group
                if facet_order in facetOrderMap.values():
                    valid = False
                    errors[facet_key] = "Duplicate facet number: %d" % int(
                        facet_order)
                else:
                    facetOrderMap[facet_key] = facet_order

        # form data is valid
        if valid:

            # save new ordering for groups, facets
            for group, facets in groups.items():
                group.save()
                for facet in facets:
                    facet.save()

            # redirect to search profile configuration (GET-POST-REDIRECT)
            return HttpResponseRedirect(
                reverse('search_profile_config',
                        args=[project.short_name.lower()]))

        else:
            # return to form to fix validation errors
            return render(
                request, 'cog/search/search_order_form.html', {
                    'project': project,
                    'groups': groups,
                    'title': 'Order Search Facets and Groups',
                    'errors': errors
                })
Example #39
0
def search_profile_order(request, project_short_name):
    
    # must reflect name of select widgets in search_order_form.html
    SEARCH_GROUP_KEY = "group_name_"
    SEARCH_FACET_KEY = "_facet_key_"
    
    # retrieve project from database
    project = get_object_or_404(Project, short_name__iexact=project_short_name)
            
    # check permission
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)
        
    # current list of search groups
    groups = _get_search_groups(project)
    
    # GET
    if request.method == 'GET':
        
        return render(request,
                      'cog/search/search_order_form.html',
                      {'project': project, 
                       'groups': groups,
                       'title': 'Order Search Facets and Groups',
                       'errors':{} })

    # POST
    else:
        
        # map (group, new group order)
        groupOrderMap = {} 
        valid = True  # form data validation flag
        errors = {} # form validation errors
        
        for group, facets in groups.items():
                        
            group_key = SEARCH_GROUP_KEY + str(group.name)
            group_order = request.POST[group_key]
            group.order = int(group_order) # reassign the group orde WITHOUT saving to the database for now
            # validate group order
            if group_order in groupOrderMap.values():
                valid = False
                errors[group_key] = "Duplicate search facet number: %d" % int(group_order)
            else:
                groupOrderMap[group_key] = group_order
                
            facetOrderMap = {}
            for facet in facets:
                
                facet_key = group_key + SEARCH_FACET_KEY + str(facet.key)
                facet_order = request.POST[facet_key]
                facet.order = facet_order
                # validate facet order within this group
                if facet_order in facetOrderMap.values():
                    valid = False
                    errors[facet_key] = "Duplicate facet number: %d" % int(facet_order)
                else:
                    facetOrderMap[facet_key] = facet_order
                
        # form data is valid              
        if valid:
            
            # save new ordering for groups, facets
            for group, facets in groups.items():
                group.save()
                for facet in facets:
                    facet.save()
                            
            # redirect to search profile configuration (GET-POST-REDIRECT)
            return HttpResponseRedirect(reverse('search_profile_config', args=[project.short_name.lower()]))

        else:
            # return to form to fix validation errors
            return render(request,
                          'cog/search/search_order_form.html', 
                          {'project': project, 
                           'groups': groups,
                           'title': 'Order Search Facets and Groups', 
                           'errors':errors })
Example #40
0
def project_update(request, project_short_name):
    
    # retrieve project from database
    project = get_object_or_404(Project, short_name__iexact=project_short_name)
            
    # limit to local projects only
    if not project.isLocal():
        return HttpResponseForbidden(LOCAL_PROJECTS_ONLY_MESSAGE)
            
    # check permission
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)
    
    if request.method == 'GET':
        
        # create project tabs if not existing already
        # (because new tabs were added after the project was initialized)
        tabs = get_or_create_project_tabs(project)  # save=True
        
        # retrieve top-level subfolders
        folders = getTopSubFolders(project)
        
        # create form object from model
        form = ProjectForm(instance=project)
        return render(request,
                      'cog/project/project_form.html', 
                      {'form': form, 'title': 'Update Project', 'project': project, 'action': 'update',
                       'tabs': tabs, 'folders': folders, 'NAVMAP': NAVMAP, 'INVNAVMAP': INVNAVMAP})
    
    else:
        
        # previous project state
        _active = project.active

        # update project instance (from database) form data
        form = ProjectForm(request.POST, request.FILES, instance=project)

        if form.is_valid():
                        
            # save the project
            project = form.save()
            
            # delete logo?
            if form.cleaned_data.get('delete_logo'):
                project.logo.delete()
            
            # initialize project ?
            if not project.isInitialized():
                initProject(project)  
                            
            # update project tabs, persist state
            setActiveProjectTabs(project.tabs.all(), request, save=True)
            
            # create folders with appropriate state
            createOrUpdateProjectSubFolders(project, request)
            
            # notify creator when the project is enabled (i.e. is switched from inactive to active)
            if not _active and project.active:                            
                notifyAuthorOfProjectApproval(project, request)
                        
            # redirect to project home (GET-POST-REDIRECT)
            return HttpResponseRedirect(reverse('project_home', args=[project.short_name.lower()]))

        else:
            print 'Form is invalid %s' % form.errors
            
            # update project tabs, but do not persist state since form had errors
            tabs = get_or_create_project_tabs(project, save=False)
            # set active state of project tabs from HTTP parameters 
            for tablist in tabs:
                setActiveProjectTabs(tablist, request, save=False)
                
            folders = getTopSubFolders(project)
            
            return render(request,
                          'cog/project/project_form.html', 
                          {'form': form, 'title': 'Update Project', 'project': project, 'action': 'update',
                           'tabs': tabs, "folders": folders,
                           'NAVMAP': NAVMAP, 'INVNAVMAP': INVNAVMAP})
Example #41
0
def project_index(request, project_short_name):
    
    TOPIC_ID = "topic_id_"
    PAGE_ID = "_page_id_"
    
    # retrieve project from database
    project = get_object_or_404(Project, short_name__iexact=project_short_name)
    
    # limit to local projects only
    if not project.isLocal():
        return HttpResponseForbidden(LOCAL_PROJECTS_ONLY_MESSAGE)
        
    # check permission
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)
    
    errors = {}
    index = site_index(project)
    
    # GET
    if request.method == 'GET':
        
        return render(request,
                      'cog/project/index_form.html', 
                      {'index': index, 'title': 'Update Site Index', 'project': project, 'errors': errors})
        
    # POST
    else:
        
        # retrieve current index, update according to form data
        index = site_index(project)
        # map (topic, new_order)
        topicMap = {} 
        valid = True  # form data validation flag
        
        for ii in index:
            topic = ii.topic
            pages = ii.pages
            
            # topic: skip first index_item
            if topic is None:
                topickey = TOPIC_ID
            else:
                topickey = TOPIC_ID + str(topic.id)
                topicvalue = request.POST[topickey]
                ii.order = topicvalue
                # validate topic order
                if topicvalue in topicMap.values():
                    valid = False
                    errors[topickey] = "Duplicate topic number: %d" % int(topicvalue)
                else:
                    topicMap[topickey] = topicvalue
                    
            # pages: process all
            pageMap = {}
            for page in pages:
                pagekey = topickey + PAGE_ID + str(page.id)
                pagevalue = request.POST[pagekey]
                page.order = pagevalue
                # validate page order
                if pagevalue in pageMap.values():
                    valid = False
                    errors[pagekey] = "Duplicate page number: %d" % int(pagevalue)
                else:
                    pageMap[page.id] = pagevalue
             
        # form data is valid              
        if valid:
            
            # save new ordering
            for ii in index:
                
                # skip None topic
                if ii.topic is not None:
                    projectTopic = ProjectTopic.objects.get(project=project, topic=ii.topic)
                    projectTopic.order = ii.order
                    projectTopic.save()
                
                # process all topic pages
                for page in ii.pages:
                    page.save()    
                            
            # redirect to project home (GET-POST-REDIRECT)
            return HttpResponseRedirect(reverse('project_home', args=[project.short_name.lower()]))

        else:
            # return to form to fix validation errors
            return render(request,
                          'cog/project/index_form.html', 
                          {'index': index, 'title': 'Update Site Index', 'project': project, 'errors': errors})
Example #42
0
def tags_update(request, project_short_name):
    """
    This creates the list of tags in the new tag form.

    :param request: A request for something.
    :type request: :class:`django.http.request.HttpRequest`
    :param str project_short_name: The name of the project.
    :returns: a constructed ProjectTagForm populated with tags associated with the project.
    :rtype: ProjectTagForm
    :raises: ...
    """

    # retrieve project from database
    project = get_object_or_404(Project, short_name__iexact=project_short_name)
    
    # check permission
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)
            
    # GET request
    if request.method == 'GET':

        # sorting of the tags occurs in the form itself in the _init_ function
        # populate the form with the list of tags associated with this project...they are highlighted.
        # that is project.tags.all().  All tags in the system are ProjectTags.objects.all().
        form = ProjectTagForm(initial={'tags': project.tags.all()})
        return render_tags_form(request, project, form)
        
    else:
        
        # create form from POST data
        form = ProjectTagForm(request.POST)
        
        # validate formset
        if form.is_valid():
                            
            # empty list of project tags                  
            project.tags = [] 
                        
            # fill list with tags from the DB
            for tag in form.cleaned_data['tags']:
                project.tags.add(tag)            
                       
            # associate new tag to project, save
            if len(form.cleaned_data['name'].strip()) > 0:
                tag = form.save()
                project.tags.add(tag)

            # save new list of project tags
            project.save()   
            
            # remove unused tags
            for tag in ProjectTag.objects.all():
                if len(tag.projects.all()) == 0:
                    tag.delete()
            
            # redirect to project home (GET-POST-REDIRECT)
            return HttpResponseRedirect(reverse('project_home', args=[project.short_name.lower()]))
            
        else:
            print 'Form is invalid  %s' % form.errors
            return render_tags_form(request, project, form)
Example #43
0
def project_add(request):
    
    if request.method == 'GET':
        
        # associate project with current node
        current_site = Site.objects.get_current()
        project = Project(active=False, author=request.user, site=current_site)
        
        # optional parent project
        parent_short_name = request.GET.get('parent', None)
        if parent_short_name:
            parent = get_object_or_404(Project, short_name__iexact=parent_short_name)
            # check permission: only administrators of parent project can create parent child
            if not userHasAdminPermission(request.user, parent):
                return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)
            project.parent = parent
        else:
            # check permission: only node administrators can create top-level projects
            # if not request.user.is_staff:
            #    return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)
            parent = None
            
        # create list of unsaved project tabs
        tabs = get_or_create_project_tabs(project, save=False)
        
        # create list of unsaved project folders
        folders = _getUnsavedProjectSubFolders(project, request)

        # set project to be private by default on start-up
        project.private = True
        
        # set project to be shared by default
        project.shared = True
        
        form = ProjectForm(instance=project)

        return render(request,
                      'cog/project/project_form.html',
                      {'form': form, 'title': 'Register New Project', 'project': parent,
                       'action': 'add', 'tabs': tabs, 'folders': folders, })
        
    else:
        
        # create form object from form data
        form = ProjectForm(request.POST, request.FILES)
        
        if form.is_valid():
            
            # save object to the database - including the m2m relations to peer projects
            project = form.save()
            
            # create project tabs
            tabs = get_or_create_project_tabs(project, save=False)
            # set active state of project tabs from HTTP parameters 
            for tablist in tabs:
                setActiveProjectTabs(tablist, request, save=True)
                
            # create folders with appropriate state
            createOrUpdateProjectSubFolders(project, request)
            
            # notify node administrator
            notifySiteAdminsOfProjectRequest(project, request)
            
            # display confirmation message
            mytitle = 'New Project Confirmation'
            messages = ['Thank you for registering project: %s' % project.short_name,
                        'Your request will be reviewed by the node administrators as soon as possible,',
                        'and you will be notified of the outcome by email.']
            return render(request,
                          'cog/common/message.html',
                          {'mytitle': 'New Project Confirmation', 'messages': messages})
                    
        # invalid data
        else:
            
            print "Form is invalid: %s" % form.errors           
            project = form.instance
            
            # create and set state of project tabs, do not persist
            tabs = get_or_create_project_tabs(project=project, save=False)
            for tablist in tabs:
                setActiveProjectTabs(tablist, request, save=False)
                
            # rebuild list of unsaved project folders
            folders = _getUnsavedProjectSubFolders(project, request)

            return render(request,
                          'cog/project/project_form.html', 
                          {'form': form, 'title': 'Register New Project', 'action': 'add', 'tabs': tabs, 'folders': folders})
Example #44
0
def project_index(request, project_short_name):

    TOPIC_ID = "topic_id_"
    PAGE_ID = "_page_id_"

    # retrieve project from database
    project = get_object_or_404(Project, short_name__iexact=project_short_name)

    # limit to local projects only
    if not project.isLocal():
        return HttpResponseForbidden(LOCAL_PROJECTS_ONLY_MESSAGE)

    # check permission
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)

    errors = {}
    index = site_index(project)

    # GET
    if request.method == 'GET':

        return render(
            request, 'cog/project/index_form.html', {
                'index': index,
                'title': 'Update Site Index',
                'project': project,
                'errors': errors
            })

    # POST
    else:

        # retrieve current index, update according to form data
        index = site_index(project)
        # map (topic, new_order)
        topicMap = {}
        valid = True  # form data validation flag

        for ii in index:
            topic = ii.topic
            pages = ii.pages

            # topic: skip first index_item
            if topic is None:
                topickey = TOPIC_ID
            else:
                topickey = TOPIC_ID + str(topic.id)
                topicvalue = request.POST[topickey]
                ii.order = topicvalue
                # validate topic order
                if topicvalue in topicMap.values():
                    valid = False
                    errors[topickey] = "Duplicate topic number: %d" % int(
                        topicvalue)
                else:
                    topicMap[topickey] = topicvalue

            # pages: process all
            pageMap = {}
            for page in pages:
                pagekey = topickey + PAGE_ID + str(page.id)
                pagevalue = request.POST[pagekey]
                page.order = pagevalue
                # validate page order
                if pagevalue in pageMap.values():
                    valid = False
                    errors[pagekey] = "Duplicate page number: %d" % int(
                        pagevalue)
                else:
                    pageMap[page.id] = pagevalue

        # form data is valid
        if valid:

            # save new ordering
            for ii in index:

                # skip None topic
                if ii.topic is not None:
                    projectTopic = ProjectTopic.objects.get(project=project,
                                                            topic=ii.topic)
                    projectTopic.order = ii.order
                    projectTopic.save()

                # process all topic pages
                for page in ii.pages:
                    page.save()

            # redirect to project home (GET-POST-REDIRECT)
            return HttpResponseRedirect(
                reverse('project_home', args=[project.short_name.lower()]))

        else:
            # return to form to fix validation errors
            return render(
                request, 'cog/project/index_form.html', {
                    'index': index,
                    'title': 'Update Site Index',
                    'project': project,
                    'errors': errors
                })
Example #45
0
def project_add(request):

    if request.method == 'GET':

        # associate project with current node
        current_site = Site.objects.get_current()
        project = Project(active=False, author=request.user, site=current_site)

        # optional parent project
        parent_short_name = request.GET.get('parent', None)
        if parent_short_name:
            parent = get_object_or_404(Project,
                                       short_name__iexact=parent_short_name)
            # check permission: only administrators of parent project can create parent child
            if not userHasAdminPermission(request.user, parent):
                return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)
            project.parent = parent
        else:
            # check permission: only node administrators can create top-level projects
            # if not request.user.is_staff:
            #    return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)
            parent = None

        # create list of unsaved project tabs
        tabs = get_or_create_project_tabs(project, save=False)

        # create list of unsaved project folders
        folders = _getUnsavedProjectSubFolders(project, request)

        # set project to be private by default on start-up
        project.private = True

        # set project to be shared by default
        project.shared = True

        form = ProjectForm(instance=project)

        return render(
            request, 'cog/project/project_form.html', {
                'form': form,
                'title': 'Register New Project',
                'project': parent,
                'action': 'add',
                'tabs': tabs,
                'folders': folders,
            })

    else:

        # create form object from form data
        form = ProjectForm(request.POST, request.FILES)

        if form.is_valid():

            # save object to the database - including the m2m relations to peer projects
            project = form.save()

            # create project tabs
            tabs = get_or_create_project_tabs(project, save=False)
            # set active state of project tabs from HTTP parameters
            for tablist in tabs:
                setActiveProjectTabs(tablist, request, save=True)

            # create folders with appropriate state
            createOrUpdateProjectSubFolders(project, request)

            # notify node administrator
            notifySiteAdminsOfProjectRequest(project, request)

            # display confirmation message
            mytitle = 'New Project Confirmation'
            messages = [
                'Thank you for registering project: %s' % project.short_name,
                'Your request will be reviewed by the node administrators as soon as possible,',
                'and you will be notified of the outcome by email.'
            ]
            return render(request, 'cog/common/message.html', {
                'mytitle': 'New Project Confirmation',
                'messages': messages
            })

        # invalid data
        else:

            print "Form is invalid: %s" % form.errors
            project = form.instance

            # create and set state of project tabs, do not persist
            tabs = get_or_create_project_tabs(project=project, save=False)
            for tablist in tabs:
                setActiveProjectTabs(tablist, request, save=False)

            # rebuild list of unsaved project folders
            folders = _getUnsavedProjectSubFolders(project, request)

            return render(
                request, 'cog/project/project_form.html', {
                    'form': form,
                    'title': 'Register New Project',
                    'action': 'add',
                    'tabs': tabs,
                    'folders': folders
                })
Example #46
0
def project_update(request, project_short_name):

    # retrieve project from database
    project = get_object_or_404(Project, short_name__iexact=project_short_name)

    # limit to local projects only
    if not project.isLocal():
        return HttpResponseForbidden(LOCAL_PROJECTS_ONLY_MESSAGE)

    # check permission
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)

    if request.method == 'GET':

        # create project tabs if not existing already
        # (because new tabs were added after the project was initialized)
        tabs = get_or_create_project_tabs(project)  # save=True

        # retrieve top-level subfolders
        folders = getTopSubFolders(project)

        # create form object from model
        form = ProjectForm(instance=project)
        return render(
            request, 'cog/project/project_form.html', {
                'form': form,
                'title': 'Update Project',
                'project': project,
                'action': 'update',
                'tabs': tabs,
                'folders': folders,
                'NAVMAP': NAVMAP,
                'INVNAVMAP': INVNAVMAP
            })

    else:

        # previous project state
        _active = project.active

        # update project instance (from database) form data
        form = ProjectForm(request.POST, request.FILES, instance=project)

        if form.is_valid():

            # save the project
            project = form.save()

            # delete logo?
            if form.cleaned_data.get('delete_logo'):
                project.logo.delete()

            # initialize project ?
            if not project.isInitialized():
                initProject(project)

            # update project tabs, persist state
            setActiveProjectTabs(project.tabs.all(), request, save=True)

            # create folders with appropriate state
            createOrUpdateProjectSubFolders(project, request)

            # notify creator when the project is enabled (i.e. is switched from inactive to active)
            if not _active and project.active:
                notifyAuthorOfProjectApproval(project, request)

            # redirect to project home (GET-POST-REDIRECT)
            return HttpResponseRedirect(
                reverse('project_home', args=[project.short_name.lower()]))

        else:
            print 'Form is invalid %s' % form.errors

            # update project tabs, but do not persist state since form had errors
            tabs = get_or_create_project_tabs(project, save=False)
            # set active state of project tabs from HTTP parameters
            for tablist in tabs:
                setActiveProjectTabs(tablist, request, save=False)

            folders = getTopSubFolders(project)

            return render(
                request, 'cog/project/project_form.html', {
                    'form': form,
                    'title': 'Update Project',
                    'project': project,
                    'action': 'update',
                    'tabs': tabs,
                    "folders": folders,
                    'NAVMAP': NAVMAP,
                    'INVNAVMAP': INVNAVMAP
                })
Example #47
0
def tags_update(request, project_short_name):
    """
    This creates the list of tags in the new tag form.

    :param request: A request for something.
    :type request: :class:`django.http.request.HttpRequest`
    :param str project_short_name: The name of the project.
    :returns: a constructed ProjectTagForm populated with tags associated with the project.
    :rtype: ProjectTagForm
    :raises: ...
    """

    # retrieve project from database
    project = get_object_or_404(Project, short_name__iexact=project_short_name)

    # check permission
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)

    # GET request
    if request.method == 'GET':

        # sorting of the tags occurs in the form itself in the _init_ function
        # populate the form with the list of tags associated with this project...they are highlighted.
        # that is project.tags.all().  All tags in the system are ProjectTags.objects.all().
        form = ProjectTagForm(initial={'tags': project.tags.all()})
        return render_tags_form(request, project, form)

    else:

        # create form from POST data
        form = ProjectTagForm(request.POST)

        # validate formset
        if form.is_valid():

            # empty list of project tags
            project.tags = []

            # fill list with tags from the DB
            for tag in form.cleaned_data['tags']:
                project.tags.add(tag)

            # associate new tag to project, save
            if len(form.cleaned_data['name'].strip()) > 0:
                tag = form.save()
                project.tags.add(tag)

            # save new list of project tags
            project.save()

            # remove unused tags
            for tag in ProjectTag.objects.all():
                if len(tag.projects.all()) == 0:
                    tag.delete()

            # redirect to project home (GET-POST-REDIRECT)
            return HttpResponseRedirect(
                reverse('project_home', args=[project.short_name.lower()]))

        else:
            print 'Form is invalid  %s' % form.errors
            return render_tags_form(request, project, form)
Example #48
0
def _imageformset_update(request, project, tab,
                         clazz, formset_factory, queryset, form_template, upload_dir, thumbnail_size):

    # check permission
    if not userHasAdminPermission(request.user, project):
        return HttpResponseForbidden(PERMISSION_DENIED_MESSAGE)

    # GET request
    if request.method == 'GET':

        # select object instances associated with current project
        formset = formset_factory(queryset=queryset)

        return render_formset(form_template, request, project, tab, formset)

    # POST request
    else:
        # create formset from POST data
        formset = formset_factory(request.POST, request.FILES, queryset=queryset)

        # validate formset
        if formset.is_valid():

            # delete image?
            for form in formset:
                try:
                    # request to delete image or whole object
                    if form.cleaned_data.get('delete_image', False) or form.cleaned_data.get('DELETE', False):
                            deleteImageAndThumbnail(form.instance)

                except ValueError as error:
                    print error
                    
                # delete object
                if form.cleaned_data.get('DELETE', False):
                    print 'Deleting instance=%s' % form.instance
                    form.instance.delete()

            # persist formset data
            # Note: only objects that have changed are returned
            instances = formset.save(commit=False)

            # assign instance to project and persist
            for instance in instances:

                # replace current image BEFORE the new image is persisted to disk
                # newly uploaded images are characterized by the fact that 'upload_dir' is not present in the path
                if (instance.id is not None                      # instance is not new (i.e. it's already in database)
                    and instance.image is not None               # instance contains an image
                    and instance.image.name is not None
                    and not upload_dir in instance.image.name):  # image has been newly selected
                    obj = clazz.objects.get(pk=instance.id)
                    try:
                        deleteImageAndThumbnail(obj)
                    except ValueError as error:
                        pass  # "The 'image' attribute has no file associated with it"

                instance.project = project
                instance.save()

                # generate image thumbnail, after the image has been saved to disk
                if instance.image is not None:
                    try:
                        generateThumbnail(instance.image.path, thumbnail_size)
                    except ValueError as e:
                        print e
                        pass  # no image supplied

            # redirect to people display (GET-POST-REDIRECT)
            return HttpResponseRedirect(reverse('aboutus_display', args=[project.short_name.lower(), tab]))

        else:
            print 'Formset is invalid  %s' % formset.errors
            return render_formset(form_template, request, project, tab, formset)