def new_project(request): """ Creation of new project. Template: projects/new_project.html Context: project_form - ``ProjectForm`` instance """ if request.method == 'GET': from_idea = request.GET.get('from_idea') if from_idea: initial = {'idea': from_idea} else: initial = {} project_form = ProjectForm(initial=initial) else: project_form = ProjectForm(request.POST) if project_form.is_valid(): project = project_form.save(commit=False) project.lead = request.user project.save() messages.success(request, 'Your project has been created.') return redirect('edit_project', project.slug) return render_to_response('projects/new_project.html', {'project_form':project_form}, context_instance=RequestContext(request))
def edit_project(request, slug): qs = Project.objects.all() if hasattr(qs, '_gatekeeper'): qs = qs.approved() project = get_object_or_404(qs, slug=slug) if request.user != project.lead and not request.user.is_staff: return HttpResponseForbidden('Only the project lead can edit a project.') if request.method == 'GET': project_form = ProjectForm(instance=project) link_formset = LinkFormSet(instance=project, prefix='links') role_formset = RoleFormSet(instance=project, prefix='roles') feed_data = [{'id':s.feed.id, 'title':s.feed.title, 'url':s.feed.url} for s in project.subscriptions.all()] feed_formset = FeedFormSet(prefix='feeds', initial=feed_data) else: project_form = ProjectForm(request.POST, instance=project) link_formset = LinkFormSet(request.POST, instance=project, prefix='links') role_formset = RoleFormSet(request.POST, instance=project, prefix='roles') feed_formset = FeedFormSet(request.POST, prefix='feeds') # only save if the main form + all three formsets validate if (project_form.is_valid() and link_formset.is_valid() and role_formset.is_valid() and feed_formset.is_valid()): # three simple saves do so much project_form.save() link_formset.save() role_formset.save() # update or create feeds for form in feed_formset.forms: data = dict(form.cleaned_data) if data and not data['DELETE']: feed_id = data.pop('id') data.pop('DELETE') if feed_id: Feed.objects.filter(pk=feed_id).update(**data) else: feed = Feed.objects.create(**data) project.subscriptions.create(feed=feed) # delete feeds in deleted_forms del_ids = [f.cleaned_data['id'] for f in feed_formset.deleted_forms] Feed.objects.filter(pk__in=del_ids).delete() request.user.message_set.create(message='Your changes have been saved.') return redirect(project) # display on GET or failed POST return render_to_response('projects/edit_project.html', {'project':project, 'project_form':project_form, 'role_formset': role_formset, 'link_formset': link_formset, 'feed_formset': feed_formset,}, context_instance=RequestContext(request))
def new_project(request): """ Creation of new project. Template: projects/new_project.html Context: project_form - ``ProjectForm`` instance """ if request.method == 'GET': project_form = ProjectForm() else: project_form = ProjectForm(request.POST) if project_form.is_valid(): project = project_form.save(commit=False) project.lead = request.user project.save() messages.success(request, 'Your project has been created.') return redirect('edit_project', project.slug) return render_to_response('projects/new_project.html', {'project_form': project_form}, context_instance=RequestContext(request))
def edit_project(request, slug): """ Editing of existing project Template: projects/edit_project.html Context: project - ``Project`` instance being edited project_form - ``ProjectForm`` instance role_formset - ``RoleFormSet`` instance for project link_formset - ``LinkFormSet`` instance for project feed_formset - ``FeedFormSet`` instance for project """ qs = Project.objects.all() if hasattr(qs, '_gatekeeper'): qs = qs.approved() project = get_object_or_404(qs, slug=slug) if request.user != project.lead and not request.user.is_staff: return HttpResponseForbidden( 'Only the project lead can edit a project.') if request.method == 'GET': project_form = ProjectForm(instance=project) link_formset = LinkFormSet(instance=project, prefix='links') role_formset = RoleFormSet(instance=project, prefix='roles') feed_data = [{ 'id': s.feed.id, 'title': s.feed.title, 'url': s.feed.url } for s in project.subscriptions.all()] feed_formset = FeedFormSet(prefix='feeds', initial=feed_data) else: project_form = ProjectForm(request.POST, instance=project) link_formset = LinkFormSet(request.POST, instance=project, prefix='links') role_formset = RoleFormSet(request.POST, instance=project, prefix='roles') feed_formset = FeedFormSet(request.POST, prefix='feeds') # only save if the main form + all three formsets validate if (project_form.is_valid() and link_formset.is_valid() and role_formset.is_valid() and feed_formset.is_valid()): # three simple saves do so much project_form.save() link_formset.save() role_formset.save() # update or create feeds for form in feed_formset.forms: data = dict(form.cleaned_data) if data and not data['DELETE']: feed_id = data.pop('id') data.pop('DELETE') if feed_id: Feed.objects.filter(pk=feed_id).update(**data) else: feed = Feed.objects.create(**data) project.subscriptions.create(feed=feed) # delete feeds in deleted_forms del_ids = [ f.cleaned_data['id'] for f in feed_formset.deleted_forms ] Feed.objects.filter(pk__in=del_ids).delete() messages.success(request, 'Your changes have been saved.') return redirect(project) # display on GET or failed POST return render_to_response('projects/edit_project.html', { 'project': project, 'project_form': project_form, 'role_formset': role_formset, 'link_formset': link_formset, 'feed_formset': feed_formset, }, context_instance=RequestContext(request))