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()]))
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()]))
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)
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()]))
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)
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)
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)
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)
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'))
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()]))
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)
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)
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")
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
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)
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 })
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)
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)
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)
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)
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)
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})
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)
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)
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)
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)
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)
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)
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)
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)
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)
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'))
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)
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)
def hasAdminPermission(user, project): return userHasAdminPermission(user, project)
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 })
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 })
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})
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})
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)
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})
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 })
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 })
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 })
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)
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)