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
Example #4
0
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)