def test_cannot_get_system_nominator(self): form_data = {'url_value': 'http://www.example.com'} project = factories.ProjectFactory() models.Nominator.objects.get().delete() with pytest.raises(http.Http404): url_handler.add_url(project, form_data)
def test_cannot_get_or_create_nominator(self): form_data = { 'url_value': 'http://www.example.com', 'nominator_email': None, 'nominator_name': None, 'nominator_institution': None } project = factories.ProjectFactory() with pytest.raises(http.Http404): url_handler.add_url(project, form_data)
def test_returns_expected(self): project = factories.ProjectWithMetadataFactory() attribute_name = project.metadata.first().name value = 'some_value' form_data = { 'url_value': 'http://www.example.com', 'nominator_email': '*****@*****.**', 'nominator_name': 'John Lambda', 'nominator_institution': 'UNT', attribute_name: value } expected = [ 'You have successfully nominated {0}'.format(form_data['url_value']), 'You have successfully added the {0} "{1}" for {2}'.format( attribute_name, value, form_data['url_value']) ] assert url_handler.add_url(project, form_data) == expected
def url_add(request, slug): #get the project by the project slug project = get_project(slug) #handle the post form_errors = None # get list of institutions to populate autocomplete institutions = get_look_ahead(project) some_errors = {} summary_list = [] req_fields = project.project_metadata_set.filter(required=True) date_fields = project.project_metadata_set.filter(form_type='date') posted_data = None url_entity = None if request.method == 'POST': posted_data = request.POST.copy() form = URLForm(posted_data) form_errors = form.errors # check for required fields of project specific metadata for met in req_fields: if met.metadata.name not in posted_data or \ len(posted_data[met.metadata.name]) == 0 or \ posted_data[met.metadata.name].isspace(): some_errors[met.metadata.name] = \ unicode('This field is required.') # check validity of dates for met in date_fields: if met not in req_fields and not posted_data[met.metadata.name]: pass elif met.metadata.name in posted_data: cleandate = validate_date(posted_data[met.metadata.name]) if cleandate: cleandate = str(cleandate) # check if this fits valid date range. # The following code presumes (too much) if there are # values associated with this metadata date field, the # first date will be the default value for the form. If # two dates are given, in addition to the first date # being the form default, it will be the start of a # range, while the second value will be the end of that # range. If three values are given, the first value is, # as always, default for the form, and the next 2 dates # serve as the start and end points of the valid range. datevals = met.metadata.values.all().order_by('metadata_values') numvals = len(datevals) if numvals > 1: if numvals == 2: rangestart = datevals[0].value rangeend = datevals[1].value elif numvals > 2: rangestart = datevals[1].value rangeend = datevals[2].value if not (cleandate >= rangestart and \ cleandate <= rangeend): some_errors[met.metadata.name] = \ unicode('The date you entered is outside the allowed range.') else: # store the valid date posted_data[met.metadata.name] = cleandate else: posted_data[met.metadata.name] = cleandate else: some_errors[met.metadata.name] = \ unicode('Please enter a valid date format.') # check validity of standard metadata # check if nominator is required by project nominator_fields = ['nominator_name', 'nominator_email', 'nominator_institution'] if project.registration_required: for nominator_field in nominator_fields: if not posted_data[nominator_field].strip(): some_errors[nominator_field] = unicode( 'This field is required.') else: if posted_data['nominator_name'].strip() or\ posted_data['nominator_institution'].strip() or\ posted_data['nominator_email'].strip(): for nominator_field in nominator_fields: if not posted_data[nominator_field].strip(): some_errors[nominator_field] = unicode( 'You must ' +\ 'provide name, institution, and email to ' +\ 'affiliate your name or institution with ' +\ 'nominations. Leave all "Information ' +\ 'About You" fields blank to remain ' +\ 'anonymous.') if form.is_valid(): if not form.cleaned_data['url_value'].strip() == 'http://': # summary_list = add_url(project, form.cleaned_data) if not some_errors: # combine form class data with project specific data posted_data.update(form.cleaned_data) if not posted_data['nominator_email'].strip(): # set anonymous user posted_data['nominator_email'] = 'anonymous' posted_data['nominator_name'] = 'Anonymous' posted_data['nominator_institution'] = 'Anonymous' # handle multivalue metadata and user supplied values posted_data = handle_metadata(request, posted_data) summary_list = add_url(project, posted_data) # send url value to provide metadata link url_entity = posted_data['url_value'] # clear out posted data, so it is not sent back to form posted_data = None else: form_errors.update(some_errors) else: form_errors = 'Please specify the URL' else: form_errors.update(some_errors) form = URLForm() # create metadata/values set metadata_vals = get_metadata(project) if not len(summary_list) > 0: summary_list = None # in case of an error, send back data to repopulate form json_data = None if posted_data: json_data = json.dumps(posted_data.lists()) # send form types for use to repopulate form form_types = {} for pm in project.project_metadata_set.all(): form_types[pm.metadata.name] = str(pm.form_type) return render_to_response( 'nomination/url_add.html', { 'project': project, 'form': form, 'form_errors': form_errors, 'summary_list': summary_list, 'metadata_vals' : metadata_vals, 'json_data' : json_data, 'form_types' : json.dumps(form_types), 'institutions': institutions, 'url_entity': url_entity, }, RequestContext(request, {}), )
def test_cannot_get_or_create_surt(self): form_data = {'url_value': 'http://www.example.com'} project = None with pytest.raises(http.Http404): url_handler.add_url(project, form_data)