def labelset_new(request, source_id): """ Page to create a labelset for a source. """ source = get_object_or_404(Source, id=source_id) showLabelForm = False initiallyCheckedLabels = [] if request.method == 'POST': initiallyCheckedLabels = [int(labelId) for labelId in request.POST.getlist('labels')] if 'create_label' in request.POST: labelForm = NewLabelForm(request.POST, request.FILES) newLabel = None # is_valid() checks for label conflicts in the database (same-name label found, etc.). if labelForm.is_valid(): newLabel = labelForm.instance newLabel.created_by = request.user newLabel.save() messages.success(request, 'Label successfully created.') else: messages.error(request, 'Please correct the errors below.') showLabelForm = True # The labelset form should now have the new label. labelSetForm = NewLabelSetForm() # If a label was added, the user probably wanted to add it to their # labelset, so pre-check that label. if newLabel: initiallyCheckedLabels.append(newLabel.id) else: # 'create_labelset' in request.POST labelSetForm = NewLabelSetForm(request.POST) labelForm = NewLabelForm() if labelSetForm.is_valid(): labelset = labelSetForm.save() source.labelset = labelset source.save() messages.success(request, 'LabelSet successfully created.') return HttpResponseRedirect(reverse('labelset_main', args=[source.id])) else: messages.error(request, 'Please correct the errors below.') else: labelForm = NewLabelForm() labelSetForm = NewLabelSetForm() allLabels = [dict(labelId=str(id), name=label.name, code=label.code, group=label.group.name) for id, label in labelSetForm['labels'].field.choices] # Dict that tells whether a label should be initially checked: {85: True, 86: True, ...}. isInitiallyChecked = dict() for labelId, label in labelSetForm['labels'].field.choices: isInitiallyChecked[labelId] = labelId in initiallyCheckedLabels return render_to_response('annotations/labelset_new.html', { 'showLabelFormInitially': simplejson.dumps(showLabelForm), # Convert Python bool to JSON bool 'labelSetForm': labelSetForm, 'labelForm': labelForm, 'source': source, 'isEditLabelsetForm': False, 'allLabels': allLabels, # label dictionary, for accessing as a template variable 'allLabelsJSON': simplejson.dumps(allLabels), # label dictionary, for JS 'isInitiallyChecked': simplejson.dumps(isInitiallyChecked), }, context_instance=RequestContext(request) )
def labelset_edit(request, source_id): """ Page to edit a source's labelset. """ source = get_object_or_404(Source, id=source_id) labelset = source.labelset if labelset.isEmptyLabelset(): return HttpResponseRedirect(reverse('labelset_new', args=[source.id])) showLabelForm = False labelsInLabelset = [label.id for label in labelset.labels.all()] initiallyCheckedLabels = labelsInLabelset if request.method == 'POST': initiallyCheckedLabels = [int(labelId) for labelId in request.POST.getlist('labels')] if 'create_label' in request.POST: labelForm = NewLabelForm(request.POST, request.FILES) newLabel = None # is_valid() checks for label conflicts in the database (same-name label found, etc.). if labelForm.is_valid(): newLabel = labelForm.instance newLabel.created_by = request.user newLabel.save() messages.success(request, 'Label successfully created.') else: messages.error(request, 'Please correct the errors below.') showLabelForm = True # The labelset form should now have the new label. labelSetForm = NewLabelSetForm() # If a label was added, the user probably wanted to add it to their # labelset, so pre-check that label. if newLabel: initiallyCheckedLabels.append(newLabel.id) elif 'edit_labelset' in request.POST: labelSetForm = NewLabelSetForm(request.POST, instance=labelset) labelForm = NewLabelForm() if labelSetForm.is_valid(): labelSetForm.save() messages.success(request, 'LabelSet successfully edited.') return HttpResponseRedirect(reverse('labelset_main', args=[source.id])) else: messages.error(request, 'Please correct the errors below.') else: # Cancel messages.success(request, 'Edit cancelled.') return HttpResponseRedirect(reverse('labelset_main', args=[source_id])) else: labelForm = NewLabelForm() labelSetForm = NewLabelSetForm(instance=labelset) # Dictionary of info for each label in the labelset form. allLabels = [dict(labelId=str(id), name=label.name, code=label.code, group=label.group.name) for id, label in labelSetForm['labels'].field.choices] # Dict that tells whether a label is already in the labelset: {85: True, 86: True, ...}. # This is basically a workaround around JavaScript's lack of a widely supported "is element in list" function. isInLabelset = dict() for labelId, label in labelSetForm['labels'].field.choices: isInLabelset[labelId] = labelId in labelsInLabelset # Dict that tells whether a label should be initially checked: {85: True, 86: True, ...}. isInitiallyChecked = dict() for labelId, label in labelSetForm['labels'].field.choices: isInitiallyChecked[labelId] = labelId in initiallyCheckedLabels # Dict that tells whether an initially-checked label's status is changeable: {85: True, 86: False, ...}. # A label is unchangeable if it's being used by any annotations in this source. isLabelUnchangeable = dict() for labelId, label in labelSetForm['labels'].field.choices: if labelId in initiallyCheckedLabels: annotationsForLabel = Annotation.objects.filter(image__source=source, label__id=labelId) isLabelUnchangeable[labelId] = len(annotationsForLabel) > 0 else: isLabelUnchangeable[labelId] = False return render_to_response('annotations/labelset_edit.html', { 'showLabelFormInitially': simplejson.dumps(showLabelForm), # Python bool to JSON bool 'labelSetForm': labelSetForm, 'labelForm': labelForm, 'source': source, 'isEditLabelsetForm': True, 'allLabels': allLabels, # label dictionary, for accessing as a template variable 'allLabelsJSON': simplejson.dumps(allLabels), # label dictionary, for JS 'isInLabelset': simplejson.dumps(isInLabelset), 'isInitiallyChecked': simplejson.dumps(isInitiallyChecked), 'isLabelUnchangeable': simplejson.dumps(isLabelUnchangeable), }, context_instance=RequestContext(request) )