def taxon_merge(request, destination_id, source_id=None):
    # the "source" taxon will be deleted and references to it will be changed
    # to the "destination" taxon
    
    destination = Taxon.objects.get(id=destination_id)

    if source_id is None:
        merge_form = merge_source_form_factory(Taxon, destination)(request.GET)

        if not merge_form.is_valid():
            return redirect('taxon_detail', destination.id)
        source = merge_form.cleaned_data['source']
    else:
        source = Taxon.objects.get(id=source_id)
    
    form_kwargs = {
        'source': source,
        'destination': destination,
    }
    
    if request.method == 'POST':
        form = TaxonMergeForm(data=request.POST, **form_kwargs)
        if form.is_valid():
            form.save()
            return redirect('taxon_detail', destination.id)
    else:
        form = TaxonMergeForm(**form_kwargs)
    
    return render_to_response(
        'taxons/merge_taxon.html',
        {
            'destination': destination,
            'source': source,
            'form': form,
            'media': form.media,
            'destination_fk_refs': map(
                lambda t: (t[0]._meta.verbose_name, t[1].verbose_name, t[2]),
                form.destination_fk_refs
            ),
            'source_fk_refs': map(
                lambda t: (t[0]._meta.verbose_name, t[1].verbose_name, t[2]),
                form.source_fk_refs
            ),
            'destination_m2m_refs': map(
                lambda t: (t[0]._meta.verbose_name, t[1].verbose_name, t[2]),
                form.destination_m2m_refs
            ),
            'source_m2m_refs': map(
                lambda t: (t[0]._meta.verbose_name, t[1].verbose_name, t[2]),
                form.source_m2m_refs
            ),
        },
        context_instance= RequestContext(request),
    )
def taxon_detail(request, taxon_id):
    
    taxon = Taxon.objects.get(id=taxon_id)
    
    merge_form = merge_source_form_factory(Taxon, taxon)()
    template_media = Media(
        js= (settings.JQUERY_FILE,),
    )
    
    return render_to_response(
        'taxons/taxon_detail.html',
        {
            'taxon': taxon,
            'media': template_media + merge_form.media,
            'merge_form': merge_form,
        },
        context_instance= RequestContext(request),
    )
def merge_contact(request, destination_id, source_id=None):
    # the "source" contact will be deleted and references to it will be changed
    # to the "destination" contact
    
    destination = Contact.objects.get(pk=destination_id)

    if source_id is None:
        merge_form = merge_source_form_factory(Contact, destination)(request.GET)

        if not merge_form.is_valid():
            return redirect('contact_detail', destination.pk)
        source = merge_form.cleaned_data['source']
    else:
        source = Contact.objects.get(pk=source_id)
    
    form_kwargs = {
        'source': source,
        'destination': destination,
    }
    
    if request.method == 'POST':
        form = ContactMergeForm(data=request.POST, **form_kwargs)
        if form.is_valid():
            form.save()
            form.delete()
            return redirect('contact_detail', destination.pk)
    else:
        form = ContactMergeForm(**form_kwargs)
    
    return render_to_response(
        'contacts/merge_contact.html',
        {
            'object_name': 'contact',
            'object_name_plural': 'contacts',
            'destination': destination,
            'source': source,
            'form': form,
            'media': form.media,
        },
        context_instance= RequestContext(request),
    )
def contact_detail(request, contact_id):
    
    contact = Contact.objects.get(pk=contact_id)
    
    template_media = Media(js=(settings.JQUERY_FILE,))
    
    context = {
        'contact': contact,
        'media': template_media,
    }

    if request.user.has_perms((
        'contacts.change_contact',
        'contacts.delete_contact',
    )):
        merge_form = merge_source_form_factory(Contact, contact)()
        context['media'] += merge_form.media
        context['merge_form'] = merge_form
    
    return render_to_response(
        'contacts/contact_detail.html',
        context,
        context_instance= RequestContext(request),
    )