def edit_project(request, project_id): 
    project = Project.objects.select_related(depth=1).get(id=int(project_id))
    parent_project = project.parent_project
    if not project.is_editable_by(request.user):
        return HttpResponseRedirect('/permission_denied/edit_project/not_author')

    if parent_project:
        if not _is_author_of_parent_project(request.user, parent_project.created_by):
            return HttpResponseRedirect('/permission_denied/add_project/not_parent_project_author')

    sectors = ", ".join([sector.name for sector in Sector.objects.all()])
    implementors = ", ".join([implementor.name for implementor in Implementor.objects.all()])
    action = "edit_project/" + project_id + "/"
    if request.method == 'POST':
        form = ProjectForm(request.POST)
        link_titles = request.POST.getlist('link_title')
        link_urls =  request.POST.getlist('link_url')
        tags = request.POST.get("tags")
        video_urls = [request.POST.get(video_id) for video_id in request.POST.keys() if video_id.startswith("video_url")]
        
        if form.is_valid(): 
            project.link_set.all().delete()
            project.sector_set.clear()
            project.implementor_set.clear()
            _set_project_status(project, request)
            project.save()
            _create_links(request, project_id, link_titles, link_urls)
            _add_project_details(form, project, request, parent_project)
            return _add_edit_success_page(project,request,"edit")
        else:
            return _render_response(request, form, action, sectors, implementors, 
                                    project, parent_project, video_urls, link_titles, link_urls, 
                                    project.resource_set.all(), title="Edit Project")
    else:
        form = _create_initial_data_from_project(project)
        video_urls = [video.url for video in project.video_set.all()]
        links = project.link_set.all()
        link_titles = [link.title for link in links]
        link_urls = [link.url for link in links]
        return _render_response(request, form, action, sectors, implementors, 
                                project, parent_project, video_urls, link_titles, link_urls, 
                                project.resource_set.all(), title="Edit Project")
def add_project(request): 
    parent_project = _get_parent(request.META['QUERY_STRING'])
    # check for authorness... Can't use 'user_passes_test' decorator
    # because it doesn't handle redirects properly
    if not _is_project_author(request.user):
        return HttpResponseRedirect('/permission_denied/add_project/not_author')

    if parent_project:
        if not _is_author_of_parent_project(request.user, parent_project.created_by):
            return HttpResponseRedirect('/permission_denied/add_project/not_parent_project_author')

    sectors = ", ".join([sector.name for sector in Sector.objects.all()])
    implementors = ", ".join([implementor.name for implementor in Implementor.objects.all()])
    action = 'add_project?parent_id='
    if parent_project:
        action = action + str(parent_project.id)

    if request.method == 'POST':
        form = ProjectForm(request.POST)
        project_id = request.POST.get("project_id")
        link_titles = request.POST.getlist('link_title')
        link_urls =  request.POST.getlist('link_url')
        video_urls = [request.POST.get(video_id) for video_id in request.POST.keys() if video_id.startswith("video_url")]
        project = Project.objects.get(id=int(project_id))

        if form.is_valid():
            _create_links(request, project_id, link_titles, link_urls)
            _set_project_status(project, request)
            _add_project_details(form, project, request, parent_project)
            return _add_edit_success_page(project, request, "add")
        else:
            return _render_response(request, form, action, sectors, 
                                    implementors, project, parent_project, video_urls, link_titles, 
                                    link_urls, project.resource_set.all(), title="Add Project")
    else:
        form = ProjectForm()
        project = _create_new_project(request)
        return _render_response(request, form, action, 
                                sectors, implementors, project, parent_project, title="Add Project")