Esempio n. 1
0
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))
Esempio n. 2
0
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))
Esempio n. 3
0
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))
Esempio n. 4
0
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))