def resource(request, ref=None):
    saved = False # set saved to false until post is successful
    uri = Namespace("http://data.library.oregonstate.edu/person/")[ref]
    data = ''
    # deal with updates if this is a form submit
    if request.method == 'POST':
        # get data to delete
        resource = queryManager.describe(uri)
        try:
            resource = resource
        except:
            resource = {}
        
        # get form data and put it in a dict
        resForm = ResourceForm(request.POST)
        VariantFormSet = formset_factory(VariantForm)
        varForm = VariantFormSet(request.POST)
        if resForm.is_valid() and varForm.is_valid():
            data = {
                'res': resForm.cleaned_data,
                'var': varForm.cleaned_data
                }
            saved = processForm(uri, data, resource)

    # if the uri exists, try to describe it and build an edit form 
    # retrieving data again if we just processed a form

    resource = queryManager.describe(uri)
    if resource:
        forms = buildForm(resource)
    else:
        #TODO: return a useful error
        return HttpResponse("resource not found", status=404) 

    return render_to_response("resource.tpl", {'uri': str(uri), 'short': uri.split('/')[-1], 'res': resource, 'form': forms['form'], 'variants': forms['variants'], 'saved': saved, 'data': resource})
def new(request, ref=None):
    uriNeeded = True
    while uriNeeded == True:
        # assign an identifier
        identifier = pynoid.mint('zeek', random.randint(0, 100000))
        uri = Namespace("http://data.library.oregonstate.edu/person/")[identifier]
        uriNeeded = queryManager.ask(uri) # if this identifier is already in use, let's get another one
    forms = buildForm()
       
    return render_to_response("resource.tpl", {'uri': str(uri), 'short': uri.split('/')[-1], 'res': {}, 'form': forms['form'], 'variants': forms['variants']})
def merge(request, uriMerge=None, uriTarget=None):
    uriMerge = Namespace("http://data.library.oregonstate.edu/person/")[uriMerge]
    uriTarget = Namespace("http://data.library.oregonstate.edu/person/")[uriTarget]
    merge = queryManager.describe(uriMerge)
    target = queryManager.describe(uriTarget)

    if request.method == 'POST':
        sameAs = "INSERT DATA {<" + uriMerge + "> owl:sameAs <" + uriTarget + "> .}"
        queryManager.update(sameAs)
        # get form data and put it in a dict
        resForm = ResourceForm(request.POST)
        VariantFormSet = formset_factory(VariantForm)
        varForm = VariantFormSet(request.POST)
        if resForm.is_valid() and varForm.is_valid():
            data = {
                'res': resForm.cleaned_data,
                'var': varForm.cleaned_data
                }
            saved = processForm(uriTarget, data, resource)

    # these labels will be merged into the target as skos:hiddenLabel
    #TODO: exclude duplicate names
    mergeLabels = [str(ns['skos']['prefLabel']), str(ns['skos']['altLabel']), str(ns['skos']['hiddenLabel']), str(ns['foaf']['name'])]
    for field in merge:
        if field in mergeLabels:
            for value in merge[field]:
                if str(ns['skos']['hiddenLabel']) in target:
                    target[str(ns['skos']['hiddenLabel'])].append(value)
                else: 
                    target[str(ns['skos']['hiddenLabel'])] = merge[field]

    #TODO: mark old record for deletion
    # do this with a hidden form?
    
    forms = buildForm(target)
    data = target
    return render_to_response("merge.tpl", {'uriMerge': str(uriMerge), 'uri': str(uriTarget), 'mergeShort': uriMerge.split('/')[-1], 'short': uriTarget.split('/')[-1], 'res': target, 'form': forms['form'], 'variants': forms['variants']})