示例#1
0
 def __init__(self):
     models = [
         m for m in apps.get_app_config('main').get_models()
         if hasattr(m, 'get_absolute_url')
     ]
     generate_graph(models)
     _customize_graph()
     register(
         'NAMED_URL_FORMATS',
         field_class=fields.DictField,
         read_only=True,
         label=_('Formats of all available named urls'),
         help_text=_(
             'Read-only list of key-value pairs that shows the standard format of all '
             'available named URLs.'),
         category=_('Named URL'),
         category_slug='named-url',
     )
     register(
         'NAMED_URL_GRAPH_NODES',
         field_class=fields.DictField,
         read_only=True,
         label=_('List of all named url graph nodes.'),
         help_text=
         _('Read-only list of key-value pairs that exposes named URL graph topology.'
           ' Use this list to programmatically generate named URLs for resources'
           ),
         category=_('Named URL'),
         category_slug='named-url',
     )
示例#2
0
def test_reserved_uri_char_encoding(common_model_class_mock, settings_mock):
    model = common_model_class_mock('model')
    with mock.patch('awx.main.utils.named_url_graph.settings', settings_mock):
        generate_graph([model])
    obj = model(name=u';/?:@=&+我为我蛤续1s')
    assert settings_mock.NAMED_URL_GRAPH[model].generate_named_url(
        obj) == u"%3B%2F%3F%3A%40%3D%26[+]我为我蛤续1s"
示例#3
0
def test_soft_unique_together_being_included(
        common_model_name_not_unique_class_mock, common_model_class_mock,
        settings_mock):
    models = []
    model_1 = common_model_class_mock('model_1')
    models.append(model_1)
    model_2 = common_model_name_not_unique_class_mock(
        (), model_1, model_1, 'model_2', soft_ut=[('name', 'fk_a')])
    models.append(model_2)

    random.shuffle(models)
    with mock.patch('awx.main.utils.named_url_graph.settings', settings_mock):
        generate_graph(models)
    assert settings_mock.NAMED_URL_GRAPH[model_1].model == model_1
    assert settings_mock.NAMED_URL_GRAPH[model_1].fields == ('name', )
    assert settings_mock.NAMED_URL_GRAPH[model_1].adj_list == []

    assert settings_mock.NAMED_URL_GRAPH[model_2].model == model_2
    assert settings_mock.NAMED_URL_GRAPH[model_2].fields == ('name', )
    assert zip(
        *settings_mock.NAMED_URL_GRAPH[model_2].adj_list)[0] == ('fk_a', )
    assert [
        x.model
        for x in zip(*settings_mock.NAMED_URL_GRAPH[model_2].adj_list)[1]
    ] == [model_1]
示例#4
0
def test_reserved_uri_char_decoding(common_model_class_mock, settings_mock):
    model = common_model_class_mock('model')
    with mock.patch('awx.main.utils.named_url_graph.settings', settings_mock):
        generate_graph([model])
    kwargs = {}
    settings_mock.NAMED_URL_GRAPH[model].populate_named_url_query_kwargs(
        kwargs, r"%3B%2F%3F%3A%40%3D%26[+]")
    assert kwargs == {'name': ';/?:@=&+'}
示例#5
0
def test_unicode_decoding(common_model_class_mock, settings_mock):
    model = common_model_class_mock('model')
    with mock.patch('awx.main.utils.named_url_graph.settings', settings_mock):
        generate_graph([model])
    kwargs = {}
    settings_mock.NAMED_URL_GRAPH[model].populate_named_url_query_kwargs(
        kwargs, r"%E6%88%91%E4%B8%BA%E6%88%91%E8%9B%A4%E7%BB%AD1s")
    assert kwargs == {'name': u'我为我蛤续1s'}
示例#6
0
def test_generate_named_url(common_model_name_not_unique_class_mock,
                            common_model_class_mock, settings_mock):
    """
    graph topology:

         model_1
            |   \
       fk_a |    \ fk_b
            |     \
            v      v
        model_2_1 model_2_2
            |
            | fk_a
            |
            v
         model_3
    """
    models = []
    model_3 = common_model_class_mock('model_3')
    models.append(model_3)
    model_2_1 = common_model_name_not_unique_class_mock(
        ('name', 'fk_a', 'str_with_choices_a'),
        model_3,
        model_3,
        'model_2_1',
    )
    models.append(model_2_1)
    model_2_2 = common_model_class_mock('model_2_2')
    models.append(model_2_2)
    model_1 = common_model_name_not_unique_class_mock(
        ('name', 'fk_a', 'fk_b'),
        model_2_1,
        model_2_2,
        'model_1',
    )
    models.append(model_1)
    random.shuffle(models)
    with mock.patch('awx.main.utils.named_url_graph.settings', settings_mock):
        generate_graph(models)
    obj_3 = model_3(name='cat')
    obj_2_2 = model_2_2(name='dog')
    obj_2_1 = model_2_1(name='bob', str_with_choices_a='foo', fk_a=obj_3)
    obj_1 = model_1(name='alice', fk_a=obj_2_1, fk_b=obj_2_2)
    obj_1.fk_b = None
    assert settings_mock.NAMED_URL_GRAPH[model_1].generate_named_url(
        obj_1) == 'alice++bob+foo++cat++'
    obj_1.fk_b = obj_2_2
    assert settings_mock.NAMED_URL_GRAPH[model_1].generate_named_url(
        obj_1) == 'alice++bob+foo++cat++dog'
    obj_2_1.fk_a = None
    assert settings_mock.NAMED_URL_GRAPH[model_1].generate_named_url(
        obj_1) == 'alice++bob+foo++++dog'
    obj_1.fk_a = None
    assert settings_mock.NAMED_URL_GRAPH[model_1].generate_named_url(
        obj_1) == 'alice++++dog'
    obj_1.fk_b = None
    assert settings_mock.NAMED_URL_GRAPH[model_1].generate_named_url(
        obj_1) == 'alice++++'
示例#7
0
def test_contenttype_being_ignored(common_model_name_not_unique_class_mock,
                                   settings_mock):
    model = common_model_name_not_unique_class_mock(
        ('name', 'fk_a'),
        ContentType,
        ContentType,
        'model',
    )
    with mock.patch('awx.main.utils.named_url_graph.settings', settings_mock):
        generate_graph([model])
    assert settings_mock.NAMED_URL_GRAPH[model].model == model
    assert settings_mock.NAMED_URL_GRAPH[model].fields == ('name', )
    assert settings_mock.NAMED_URL_GRAPH[model].adj_list == []
示例#8
0
def test_populate_named_url_query_kwargs(
        common_model_name_not_unique_class_mock, common_model_class_mock,
        settings_mock, input_, output):
    """
    graph topology:

         model_1
            |   \
       fk_a |    \ fk_b
            |     \
            v      v
        model_2_1 model_2_2
            |
            | fk_a
            |
            v
         model_3
    """
    models = []
    model_3 = common_model_class_mock('model_3')
    models.append(model_3)
    model_2_1 = common_model_name_not_unique_class_mock(
        ('name', 'fk_a', 'str_with_choices_a'),
        model_3,
        model_3,
        'model_2_1',
    )
    models.append(model_2_1)
    model_2_2 = common_model_class_mock('model_2_2')
    models.append(model_2_2)
    model_1 = common_model_name_not_unique_class_mock(
        ('name', 'fk_a', 'fk_b'),
        model_2_1,
        model_2_2,
        'model_1',
    )
    models.append(model_1)
    random.shuffle(models)
    with mock.patch('awx.main.utils.named_url_graph.settings', settings_mock):
        generate_graph(models)
    kwargs = {}
    assert settings_mock.NAMED_URL_GRAPH[
        model_1].populate_named_url_query_kwargs(kwargs, input_)
    assert kwargs == output
示例#9
0
def test_populate_named_url_invalid_query_kwargs(
        common_model_name_not_unique_class_mock, common_model_class_mock,
        settings_mock, input_):
    models = []
    model_2 = common_model_class_mock('model_2')
    models.append(model_2)
    model_1 = common_model_name_not_unique_class_mock(
        ('name', 'fk_a', 'str_with_choices_a'),
        model_2,
        model_2,
        'model_1',
    )
    models.append(model_1)
    random.shuffle(models)
    with mock.patch('awx.main.utils.named_url_graph.settings', settings_mock):
        generate_graph(models)
    kwargs = {}
    assert not settings_mock.NAMED_URL_GRAPH[
        model_1].populate_named_url_query_kwargs(kwargs, input_)
示例#10
0
def test_invalid_generation(common_model_name_not_unique_class_mock,
                            common_model_class_mock, settings_mock,
                            unique_together):
    models = []
    valid_parent_out_of_range = common_model_class_mock(
        'valid_parent_out_of_range')
    invalid_parent = common_model_name_not_unique_class_mock(
        ('integer', 'name'),
        valid_parent_out_of_range,
        valid_parent_out_of_range,
        'invalid_parent',
    )
    models.append(invalid_parent)
    model_1 = common_model_name_not_unique_class_mock(
        unique_together, invalid_parent, valid_parent_out_of_range, 'model_1')
    models.append(model_1)

    random.shuffle(models)
    with mock.patch('awx.main.utils.named_url_graph.settings', settings_mock):
        generate_graph(models)
    assert not settings_mock.NAMED_URL_FORMATS
示例#11
0
def test_largest_graph_is_generated(common_model_name_not_unique_class_mock,
                                    common_model_class_mock, settings_mock):
    """
    Graph topology:

            model_1
               |
               | fk_a
               |
               V
            model_2
            /     \
      fk_b /       \ fk_a
          /         \
         V           V
    valid_model invalid_model
    """
    models = []
    valid_model = common_model_class_mock('valid_model')
    models.append(valid_model)
    invalid_model = common_model_class_mock('invalid_model')
    model_2 = common_model_name_not_unique_class_mock(
        (('name', 'fk_a'), ('name', 'fk_b')),
        invalid_model,
        valid_model,
        'model_2',
    )
    models.append(model_2)
    model_1 = common_model_name_not_unique_class_mock(
        ('name', 'fk_a'),
        model_2,
        model_2,
        'model_1',
    )
    models.append(model_1)

    random.shuffle(models)
    with mock.patch('awx.main.utils.named_url_graph.settings', settings_mock):
        generate_graph(models)

    assert settings_mock.NAMED_URL_GRAPH[model_1].model == model_1
    assert settings_mock.NAMED_URL_GRAPH[model_1].fields == ('name', )
    assert zip(
        *settings_mock.NAMED_URL_GRAPH[model_1].adj_list)[0] == ('fk_a', )
    assert [
        x.model
        for x in zip(*settings_mock.NAMED_URL_GRAPH[model_1].adj_list)[1]
    ] == [model_2]

    assert settings_mock.NAMED_URL_GRAPH[model_2].model == model_2
    assert settings_mock.NAMED_URL_GRAPH[model_2].fields == ('name', )
    assert zip(
        *settings_mock.NAMED_URL_GRAPH[model_2].adj_list)[0] == ('fk_b', )
    assert [
        x.model
        for x in zip(*settings_mock.NAMED_URL_GRAPH[model_2].adj_list)[1]
    ] == [valid_model]

    assert settings_mock.NAMED_URL_GRAPH[valid_model].model == valid_model
    assert settings_mock.NAMED_URL_GRAPH[valid_model].fields == ('name', )
    assert settings_mock.NAMED_URL_GRAPH[valid_model].adj_list == []

    assert invalid_model not in settings_mock.NAMED_URL_GRAPH
示例#12
0
def test_graph_generation(common_model_class_mock,
                          common_model_name_not_unique_class_mock,
                          settings_mock):
    """
    Graph topology:

                model_1
                   /\
             fk_a /  \ fk_b
                 /    \
                V      V
          model_2_1   model_2_2
               /\fk_b /\
         fk_a /  \   /  \ fk_b
             /    \ /fk_a\
            V      V      V
     model_3_1 model_3_2 model_3_3
    """
    models = []
    model_3_1 = common_model_class_mock('model_3_1')
    models.append(model_3_1)
    model_3_2 = common_model_class_mock('model_3_2')
    models.append(model_3_2)
    model_3_3 = common_model_class_mock('model_3_3')
    models.append(model_3_3)
    model_2_1 = common_model_name_not_unique_class_mock(
        ('name', 'fk_b', 'fk_a'),
        model_3_1,
        model_3_2,
        'model_2_1',
    )
    models.append(model_2_1)
    model_2_2 = common_model_name_not_unique_class_mock(
        ('name', 'fk_b', 'fk_a'),
        model_3_2,
        model_3_3,
        'model_2_2',
    )
    models.append(model_2_2)
    model_1 = common_model_name_not_unique_class_mock(
        ('name', 'fk_a', 'fk_b'),
        model_2_1,
        model_2_2,
        'model_1',
    )
    models.append(model_1)
    random.shuffle(models)
    with mock.patch('awx.main.utils.named_url_graph.settings', settings_mock):
        generate_graph(models)

    assert settings_mock.NAMED_URL_GRAPH[model_1].model == model_1
    assert settings_mock.NAMED_URL_GRAPH[model_1].fields == ('name', )
    assert zip(*settings_mock.NAMED_URL_GRAPH[model_1].adj_list)[0] == ('fk_a',
                                                                        'fk_b')
    assert [
        x.model
        for x in zip(*settings_mock.NAMED_URL_GRAPH[model_1].adj_list)[1]
    ] == [model_2_1, model_2_2]

    assert settings_mock.NAMED_URL_GRAPH[model_2_1].model == model_2_1
    assert settings_mock.NAMED_URL_GRAPH[model_2_1].fields == ('name', )
    assert zip(
        *settings_mock.NAMED_URL_GRAPH[model_2_1].adj_list)[0] == ('fk_a',
                                                                   'fk_b')
    assert [
        x.model
        for x in zip(*settings_mock.NAMED_URL_GRAPH[model_2_1].adj_list)[1]
    ] == [model_3_1, model_3_2]

    assert settings_mock.NAMED_URL_GRAPH[model_2_2].model == model_2_2
    assert settings_mock.NAMED_URL_GRAPH[model_2_2].fields == ('name', )
    assert zip(
        *settings_mock.NAMED_URL_GRAPH[model_2_2].adj_list)[0] == ('fk_a',
                                                                   'fk_b')
    assert [
        x.model
        for x in zip(*settings_mock.NAMED_URL_GRAPH[model_2_2].adj_list)[1]
    ] == [model_3_2, model_3_3]

    assert settings_mock.NAMED_URL_GRAPH[model_3_1].model == model_3_1
    assert settings_mock.NAMED_URL_GRAPH[model_3_1].fields == ('name', )
    assert settings_mock.NAMED_URL_GRAPH[model_3_1].adj_list == []

    assert settings_mock.NAMED_URL_GRAPH[model_3_2].model == model_3_2
    assert settings_mock.NAMED_URL_GRAPH[model_3_2].fields == ('name', )
    assert settings_mock.NAMED_URL_GRAPH[model_3_2].adj_list == []

    assert settings_mock.NAMED_URL_GRAPH[model_3_3].model == model_3_3
    assert settings_mock.NAMED_URL_GRAPH[model_3_3].fields == ('name', )
    assert settings_mock.NAMED_URL_GRAPH[model_3_3].adj_list == []