Exemplo n.º 1
0
    def test_default_change_form_template(self):
        site = AdminSite()
        site.register(SimpleModel, TranslatableAdmin)
        admin = site._registry[SimpleModel]
        self.assertEqual(admin.default_change_form_template, "admin/change_form.html")

        # Avoid str + __proxy__ errors
        self.assertEqual("default/" + admin.default_change_form_template, "default/admin/change_form.html")
Exemplo n.º 2
0
    def test_no_blogpage_admin(self):
        """
        When there is no page type mounted, the admin page should still be accessable.
        """
        date = datetime(year=2016, month=5, day=1)
        entry = Entry.objects.language('en-us').create(author=self.user, slug='hello-fr', publication_date=date)
        url = reverse(admin_urlname(entry._meta, 'change'), args=(entry.pk,))

        # Make an admin site, avoid dependency on URLs
        admin = AdminSite()
        admin.register(Entry, EntryAdmin)
        model_admin = admin._registry[Entry]
        request = RequestFactory().get(url)
        request.user = self.user

        response = model_admin.change_view(request, str(entry.pk))
        self.assertContains(response, 'page needs to be created first')
    def test_no_blogpage_admin(self):
        """
        When there is no page type mounted, the admin page should still be accessable.
        """
        date = datetime(year=2016, month=5, day=1)
        entry = Entry.objects.language('en-us').create(author=self.user, slug='hello-fr', publication_date=date)
        url = reverse(admin_urlname(entry._meta, 'change'), args=(entry.pk,))

        # Make an admin site, avoid dependency on URLs
        admin = AdminSite()
        admin.register(Entry, EntryAdmin)
        model_admin = admin._registry[Entry]
        request = RequestFactory().get(url)
        request.user = self.user

        response = model_admin.change_view(request, str(entry.pk))
        self.assertContains(response, 'page needs to be created first')
Exemplo n.º 4
0
def register_admin_models(admin_site: AdminSite):
    """Registers dynamically created preferences models for Admin interface.

    :param admin_site: AdminSite object.

    """
    global __MODELS_REGISTRY

    prefs = get_prefs()

    for app_label, prefs_items in prefs.items():

        model_class = get_pref_model_class(app_label, prefs_items,
                                           get_app_prefs)

        if model_class is not None:
            __MODELS_REGISTRY[app_label] = model_class
            admin_site.register(model_class,
                                get_pref_model_admin_class(prefs_items))
class PublishPage(TestCase):
    def setUp(self):
        super(PublishPage, self).setUp()
        self.admin_site = AdminSite('Test Admin')

        class PageAdmin(PublishableAdmin):
            pass

        self.admin_site.register(Page, PageAdmin)
        self.page_admin = PageAdmin(Page, self.admin_site)

    def test_should_be_publish(self):
        self.page1 = Page.objects.create(slug='page1', title='page 1')

        user1 = User.objects.create_superuser('test1', '*****@*****.**',
                                              'pass')

        self.factory = RequestFactory()
        request = self.factory.post('/publish/change_view',
                                    data={'_publish': ''})
        request.user = user1

        self.page_admin.change_view(request, str(self.page1.id))
        self.assertEqual(Page.objects.filter(Page.Q_PUBLISHED,
                                             slug=self.page1.slug).count(), 1)

    def test_should_be_republish(self):
        self.page1 = Page.objects.create(slug='page1', title='page 1')
        self.page1.publish()
        user1 = User.objects.create_superuser('test1', '*****@*****.**',
                                              'pass')

        self.factory = RequestFactory()
        request = self.factory.post('/publish/change_view',
                                    data={'_publish': ''})
        request.user = user1

        self.page_admin.change_view(request, str(self.page1.id))
        self.assertEqual(Page.objects.filter(Page.Q_PUBLISHED,
                                             slug=self.page1.slug).count(), 1)
Exemplo n.º 6
0
class TestGetGrootPermissions(TestCase):
    def setUp(self):
        self.site = AdminSite(name='admin')

    def test_default_perms(self):
        self.site.register(Author, AuthorAdmin)
        author_admin = self.site._registry[Author]

        permissions = author_admin.get_groot_permissions(request=None)

        self.assertListEqual(
            list(permissions.values_list('codename', flat=True)),
            ['add_author', 'change_author', 'delete_author'],
        )

    def test_limited_perms(self):
        self.site.register(Author, AuthorAdmin, groot_permissions=('add_author',))
        author_admin = self.site._registry[Author]

        permissions = author_admin.get_groot_permissions(request=None)

        self.assertListEqual(
            list(permissions.values_list('codename', flat=True)), ['add_author'],
        )
Exemplo n.º 7
0
    def test_admin_registration(self):
        """
        Test how the registration works
        """
        class Model2Admin(PolymorphicParentModelAdmin):
            base_model = Model2A
            list_filter = (PolymorphicChildModelFilter,)
            child_models = (Model2B, Model2C, Model2D)

        class Model2ChildAdmin(PolymorphicChildModelAdmin):
            base_model = Model2A
            base_fieldsets = (
                ("Base fields", {
                    'fields': ('field1',)
                }),
            )

        admin_site = AdminSite()
        admin_site.register(Model2A, Model2Admin)
        admin_site.register(Model2B, Model2ChildAdmin)
        admin_site.register(Model2C, Model2ChildAdmin)
        admin_site.register(Model2D, Model2ChildAdmin)
Exemplo n.º 8
0
from django.contrib.auth.admin import UserAdmin
from django.contrib.admin import AdminSite, ModelAdmin
from django.db import models
from .models import *
from .modeladmin import *


##Admin Site
class AdminSite(AdminSite):
    site_header = 'Ibérica'
    #login_template ='admin/login.html'
    #login_form = AuthForm


admin = AdminSite(name='Ibérica')

admin.register(Usuario.Usuario, UsuarioAdmin)
admin.register(Usuario.Persona)
admin.register(Programa.Disciplina)
admin.register(Programa.SubDisciplina)
admin.register(Programa.Nivel)
admin.register(Programa.Programa)
admin.register(Programa.Comprobante, ComprobanteAdmin)
admin.register(Programa.Inscripcion)
admin.register(Programa.Semana)
admin.register(Programa.Paquete)
admin.register(Programa.Grupo, GrupoModelAdmin)
Exemplo n.º 9
0
        obj.comment = " ".join(["hodor" for x in obj.comment.split()])
        obj.save()

    change_actions = ("hodor",)


admin.site.register(Comment, CommentAdmin)


class RelatedDataAdmin(DjangoObjectActions, admin.ModelAdmin):

    # Object actions
    ################

    def fill_up(self, request, obj):
        if not obj.extra_data:
            # bail because we need a comment
            obj.extra_data = "hodor"
        else:
            obj.extra_data = ""
        obj.save()

    change_actions = ("fill_up",)


admin.site.register(RelatedData, RelatedDataAdmin)


support_admin = AdminSite(name="support")
support_admin.register(Poll, PollAdmin)
class AdminTest(AppTestCase):
    """
    Test the admin functions.
    """

    def setUp(self):
        # Admin objects for all tests.
        self.factory = RequestFactory()
        self.admin_site = AdminSite()
        self.admin_user = User.objects.get(is_superuser=True)

        self.settings = override_settings(
            MIDDLEWARE_CLASSES = (
                'django.middleware.common.CommonMiddleware',
                'django.contrib.sessions.middleware.SessionMiddleware',
                'django.middleware.csrf.CsrfViewMiddleware',
                'django.contrib.auth.middleware.AuthenticationMiddleware',
                'django.contrib.messages.middleware.MessageMiddleware',
            )
        )
        self.settings.enable()

    def tearDown(self):
        self.settings.disable()

    def test_add_page(self):
        """
        Test adding an object with placeholder field via the admin.
        """
        self.admin_site.register(PlaceholderFieldTestPage, PlaceholderFieldTestPageAdmin)
        modeladmin = self.admin_site._registry[PlaceholderFieldTestPage]

        # Get all post data.
        # Includes all inlines, so all inline formsets of other plugins will be added (with TOTAL_FORMS 0)
        contents_slot = PlaceholderFieldTestPage.contents.slot
        formdata = self._get_management_form_data(modeladmin)
        formdata.update({
            'title': 'TEST1',
            'placeholder-fs-TOTAL_FORMS': '1',
            'placeholder-fs-MAX_NUM_FORMS': '',   # Needed for Django <= 1.4.3
            'placeholder-fs-INITIAL_FORMS': '0',  # Needed for Django 1.3
            'placeholder-fs-0-slot': contents_slot,
            'placeholder-fs-0-role': Placeholder.MAIN,
            'rawhtmltestitem-TOTAL_FORMS': '1',
            'rawhtmltestitem-MAX_NUM_FORMS': '',
            'rawhtmltestitem-INITIAL_FORMS': '0',
            'rawhtmltestitem-0-placeholder': '',                   # The placeholder is not defined yet, as item is not yet created.
            'rawhtmltestitem-0-placeholder_slot': contents_slot,   # BaseContentItemFormSet resolves the placeholder after it's created
            'rawhtmltestitem-0-sort_order': '1',
            'rawhtmltestitem-0-html': u'<b>foo</b>',
        })

        # Make a POST to the admin page.
        response = self._post_add(modeladmin, formdata)
        self.assertEqual(response.status_code, 302, "No redirect, received:\n\n{0}".format(self._render_response(response)))

        # Check that the page exists.
        page = PlaceholderFieldTestPage.objects.get(title='TEST1')

        # Check that the placeholder is created,
        # and properly links back to it's parent.
        placeholder = page.contents
        self.assertEqual(placeholder.slot, contents_slot)
        self.assertEqual(placeholder.role, Placeholder.MAIN)
        self.assertEqual(placeholder.parent, page)

        # Check that the ContentItem is created,
        # and properly links back to it's parent.
        rawhtmltestitem = RawHtmlTestItem.objects.get(html=u'<b>foo</b>')
        self.assertEqual(rawhtmltestitem.placeholder, placeholder)
        self.assertEqual(rawhtmltestitem.parent, page)

        # Also check reverse relation of placeholder
        rawhtmltestitem = placeholder.contentitems.all()[0]
        self.assertEqual(rawhtmltestitem.html, u'<b>foo</b>')

    def _post_add(self, modeladmin, formdata):
        opts = modeladmin.opts
        url = reverse('admin:{0}_{1}_add'.format(*_get_url_format(opts)))

        # Build request
        formdata['csrfmiddlewaretoken'] = 'foo'
        request = self.factory.post(url, data=formdata)
        request.COOKIES[settings.CSRF_COOKIE_NAME] = 'foo'

        # Add properties which middleware would typically do
        request.session = {}
        request.user = self.admin_user
        MessageMiddleware().process_request(request)

        # Make a direct call, circumvents login page.
        return modeladmin.add_view(request)

    def _get_management_form_data(self, modeladmin):
        """
        Return the formdata that the management forms need.
        """
        opts = modeladmin.opts
        url = reverse('admin:{0}_{1}_add'.format(*_get_url_format(opts)))
        request = self.factory.get(url)
        request.user = self.admin_user

        if hasattr(modeladmin, 'get_inline_instances'):
            inline_instances = modeladmin.get_inline_instances(request)  # Django 1.4
        else:
            inline_instances = [inline_class(modeladmin.model, self.admin_site) for inline_class in modeladmin.inlines]

        forms = []
        for inline_instance in inline_instances:
            FormSet = inline_instance.get_formset(request)
            formset = FormSet(instance=modeladmin.model())
            forms.append(formset.management_form)

        # In a primitive way, get the form fields.
        # This is not exactly the same as a POST, since that runs through clean()
        formdata = {}
        for form in forms:
            for boundfield in form:
                formdata[boundfield.html_name] = boundfield.value()

        return formdata

    def _render_response(self, response):
        if hasattr(response, 'render'):
            # TemplateResponse
            return u"== Context ==\n{0}\n\n== Response ==\n{1}".format(pformat(response.context_data), response.render().content)
        else:
            return response.content
Exemplo n.º 11
0
# #Uncomment this to test issue #1:
#from fuzziverse.user_admin import user_admin_site
from django.contrib.admin import AdminSite
user_admin_site = AdminSite()

from nested_inline.admin import NestedStackedInline, NestedModelAdmin

from fuzziverse import models
class FileUploadInline(NestedStackedInline):
    model = models.InputTestCase
    min_num = 0
    extra = 1

class ReportInline(NestedStackedInline):
    model = models.Report
    min_num = 0
    extra = 1

class FuzzingAttemptInline(NestedStackedInline):
    model = models.FuzzingAttempt
    min_num = 0
    extra = 1
    inlines = [FileUploadInline]
    readonly_fields = ['created']

class ApplicationAdmin(NestedModelAdmin):
    inlines = [ReportInline, FuzzingAttemptInline]
    search_fields = ['name']
user_admin_site.register(models.Application, ApplicationAdmin)
Exemplo n.º 12
0
from __future__ import unicode_literals

from django.contrib.admin import AdminSite, ModelAdmin, TabularInline

from admin_enhancer import admin as enhanced_admin

from .models import Author, Book, Character, Theme

site = AdminSite()


class EnhancedModelAdmin(enhanced_admin.EnhancedModelAdminMixin, ModelAdmin):
    pass


class CharacterInline(enhanced_admin.EnhancedAdminMixin, TabularInline):
    model = Character


class BookAdmin(EnhancedModelAdmin):
    inlines = (CharacterInline, )
    filter_horizontal = ('themes', )


site.register(Author, EnhancedModelAdmin)
site.register(Book, BookAdmin)
site.register(Theme, EnhancedModelAdmin)
Exemplo n.º 13
0
    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        # Tell Django to populate ForeignKey widgets using a query
        # on the 'other' database.
        return super().formfield_for_foreignkey(db_field,
                                                request,
                                                using=self.using,
                                                **kwargs)

    def formfield_for_manytomany(self, db_field, request, **kwargs):
        # Tell Django to populate ManyToMany widgets using a query
        # on the 'other' database.
        return super().formfield_for_manytomany(db_field,
                                                request,
                                                using=self.using,
                                                **kwargs)


employee_admin_site = AdminSite(name='employees')

employee_admin_site.register(MyUser, MultiDBModelAdmin)
employee_admin_site.register(Group, MultiDBModelAdmin)

employee_admin_site.register(Position, MultiDBModelAdmin)
employee_admin_site.register(EmployeePosition, MultiDBModelAdmin)
employee_admin_site.register(EmployeeProfile, MultiDBModelAdmin)
employee_admin_site.register(Notification, MultiDBModelAdmin)

employee_admin_site.register(Post, MultiDBModelAdmin)
employee_admin_site.register(Topic, MultiDBModelAdmin)
employee_admin_site.register(Message, MultiDBModelAdmin)
Exemplo n.º 14
0
from django.contrib.admin import AdminSite
from .models import Agent, Order

# регистрируем модели в админке
admin_site = AdminSite(name='admin')
admin_site.register([Agent, Order])
from __future__ import unicode_literals

from django.contrib.admin import AdminSite, ModelAdmin, TabularInline

from admin_enhancer import admin as enhanced_admin

from .models import Author, Book, Character, Theme


site = AdminSite()


class EnhancedModelAdmin(enhanced_admin.EnhancedModelAdminMixin, ModelAdmin):
    pass


class CharacterInline(enhanced_admin.EnhancedAdminMixin, TabularInline):
    model = Character


class BookAdmin(EnhancedModelAdmin):
    inlines = (CharacterInline,)
    filter_horizontal = ('themes',)


site.register(Author, EnhancedModelAdmin)
site.register(Book, BookAdmin)
site.register(Theme, EnhancedModelAdmin)
Exemplo n.º 16
0
    list_filter = ["category_id", "designation"]
    inlines = [AttendanceInline]


class AttendanceAdmin(admin.ModelAdmin):
    list_display = ("employee_id", "date", "shift", "project")
    list_filter = ["employee_id", "date", "project"]


class PaymentAdmin(admin.ModelAdmin):
    list_display = ("paid_date", "amount", "paid_details", "project_id")
    list_filter = ["project_id", "amount", "paid_date"]


class EmpPaymentAdmin(admin.ModelAdmin):
    list_display = ("employee", "amount", "type", "month", "year")
    list_filter = ["employee", "month", "year"]


site = AdminSite()
site.site_header = "Omar and Assosciates"

site.register(Project, ProjectAdmin)
site.register(Category)
site.register(Dealer)
site.register(Expense, ExpenseAdmin)
site.register(Employee, EmployeeAdmin)
site.register(Attendance, AttendanceAdmin)
site.register(EmployeePayment, EmpPaymentAdmin)
site.register(Payment, PaymentAdmin)
Exemplo n.º 17
0
from django.conf import settings
from django.contrib.admin import AdminSite
from django.contrib.auth.models import User
from django.contrib.auth.admin import UserAdmin
from django.contrib.flatpages.models import FlatPage
from django.contrib.flatpages.admin import FlatPageAdmin

site = AdminSite()


class CustomUserAdmin(UserAdmin):
    # Remove group editing
    fieldsets = UserAdmin.fieldsets[:-1]

    def has_delete_permission(self, request, obj=None):
        return getattr(settings, 'BACKOFFICE', False)


class CustomFlatPageAdmin(FlatPageAdmin):
    list_filter = []


site.register(User, CustomUserAdmin)
site.register(FlatPage, CustomFlatPageAdmin)
class AdminTestCase(TestCase):
    """
    Testing the admin site
    """
    #: The model to test
    model = None
    #: The admin class to test
    admin_class = None

    @classmethod
    def setUpClass(cls):
        super(AdminTestCase, cls).setUpClass()
        cls.admin_user = User.objects.create_superuser('admin', '*****@*****.**', password='******')

    def setUp(self):
        super(AdminTestCase, self).setUp()

        # Have a separate site, to avoid dependency on polymorphic wrapping or standard admin configuration
        self.admin_site = AdminSite()

        if self.model is not None:
            self.admin_register(self.model, self.admin_class)

    def tearDown(self):
        clear_url_caches()
        set_urlconf(None)

    def register(self, model):
        """Decorator, like admin.register()"""
        def _dec(admin_class):
            self.admin_register(model, admin_class)
            return admin_class
        return _dec

    def admin_register(self, model, admin_site):
        """Register an model with admin to the test case, test client and URL reversing code."""
        self.admin_site.register(model, admin_site)

        # Make sure the URLs are reachable by reverse()
        clear_url_caches()
        set_urlconf(tuple([
            url('^tmp-admin/', self.admin_site.urls)
        ]))

    def get_admin_instance(self, model):
        try:
            return self.admin_site._registry[model]
        except KeyError:
            raise ValueError("Model not registered with admin: {}".format(model))

    @classmethod
    def tearDownClass(cls):
        super(AdminTestCase, cls).tearDownClass()
        clear_url_caches()
        set_urlconf(None)

    def get_add_url(self, model):
        admin_instance = self.get_admin_instance(model)
        return reverse(admin_urlname(admin_instance.opts, 'add'))

    def get_changelist_url(self, model):
        admin_instance = self.get_admin_instance(model)
        return reverse(admin_urlname(admin_instance.opts, 'changelist'))

    def get_change_url(self, model, object_id):
        admin_instance = self.get_admin_instance(model)
        return reverse(admin_urlname(admin_instance.opts, 'change'), args=(object_id,))

    def get_history_url(self, model, object_id):
        admin_instance = self.get_admin_instance(model)
        return reverse(admin_urlname(admin_instance.opts, 'history'), args=(object_id,))

    def get_delete_url(self, model, object_id):
        admin_instance = self.get_admin_instance(model)
        return reverse(admin_urlname(admin_instance.opts, 'delete'), args=(object_id,))

    def admin_get_add(self, model, qs=''):
        """
        Make a direct "add" call to the admin page, circumvening login checks.
        """
        admin_instance = self.get_admin_instance(model)
        request = self.create_admin_request('get', self.get_add_url(model) + qs)
        response = admin_instance.add_view(request)
        self.assertEqual(response.status_code, 200)
        return response

    def admin_post_add(self, model, formdata, qs=''):
        """
        Make a direct "add" call to the admin page, circumvening login checks.
        """
        admin_instance = self.get_admin_instance(model)
        request = self.create_admin_request('post', self.get_add_url(model) + qs, data=formdata)
        response = admin_instance.add_view(request)
        self.assertFormSuccess(request.path, response)
        return response

    def admin_get_changelist(self, model):
        """
        Make a direct "add" call to the admin page, circumvening login checks.
        """
        admin_instance = self.get_admin_instance(model)
        request = self.create_admin_request('get', self.get_changelist_url(model))
        response = admin_instance.changelist_view(request)
        self.assertEqual(response.status_code, 200)
        return response

    def admin_get_change(self, model, object_id, query=None, **extra):
        """
        Perform a GET request on the admin page
        """
        admin_instance = self.get_admin_instance(model)
        request = self.create_admin_request('get', self.get_change_url(model, object_id), data=query, **extra)
        response = admin_instance.change_view(request, str(object_id))
        self.assertEqual(response.status_code, 200)
        return response

    def admin_post_change(self, model, object_id, formdata, **extra):
        """
        Make a direct "add" call to the admin page, circumvening login checks.
        """
        admin_instance = self.get_admin_instance(model)
        request = self.create_admin_request('post', self.get_change_url(model, object_id), data=formdata, **extra)
        response = admin_instance.change_view(request, str(object_id))
        self.assertFormSuccess(request.path, response)
        return response

    def admin_get_history(self, model, object_id, query=None, **extra):
        """
        Perform a GET request on the admin page
        """
        admin_instance = self.get_admin_instance(model)
        request = self.create_admin_request('get', self.get_history_url(model, object_id), data=query, **extra)
        response = admin_instance.history_view(request, str(object_id))
        self.assertEqual(response.status_code, 200)
        return response

    def admin_get_delete(self, model, object_id, query=None, **extra):
        """
        Perform a GET request on the admin delete page
        """
        admin_instance = self.get_admin_instance(model)
        request = self.create_admin_request('get', self.get_delete_url(model, object_id), data=query, **extra)
        response = admin_instance.delete_view(request, str(object_id))
        self.assertEqual(response.status_code, 200)
        return response

    def admin_post_delete(self, model, object_id, **extra):
        """
        Make a direct "add" call to the admin page, circumvening login checks.
        """
        if not extra:
            extra = {'data': {'post': 'yes'}}

        admin_instance = self.get_admin_instance(model)
        request = self.create_admin_request('post', self.get_delete_url(model, object_id), **extra)
        response = admin_instance.delete_view(request, str(object_id))
        self.assertEqual(response.status_code, 302, "Form errors in calling {0}".format(request.path))
        return response

    def create_admin_request(self, method, url, data=None, **extra):
        """
        Construct an Request instance for the admin view.
        """
        factory_method = getattr(RequestFactory(), method)

        if data is not None:
            if method != 'get':
                data['csrfmiddlewaretoken'] = 'foo'
            dummy_request = factory_method(url, data=data)
            dummy_request.user = self.admin_user

            # Add the management form fields if needed.
            # base_data = self._get_management_form_data(dummy_request)
            # base_data.update(data)
            # data = base_data

        request = factory_method(url, data=data, **extra)
        request.COOKIES[settings.CSRF_COOKIE_NAME] = 'foo'
        request.csrf_processing_done = True

        # Add properties which middleware would typically do
        request.session = {}
        request.user = self.admin_user
        MessageMiddleware().process_request(request)
        return request

    def assertFormSuccess(self, request_url, response):
        """
        Assert that the response was a redirect, not a form error.
        """
        self.assertIn(response.status_code, [200, 302])
        if response.status_code != 302:
            context_data = response.context_data
            if 'errors' in context_data:
                errors = response.context_data['errors']
            elif 'form' in context_data:
                errors = context_data['form'].errors
            else:
                raise KeyError("Unknown field for errors in the TemplateResponse!")

            self.assertEqual(response.status_code, 302,
                             "Form errors in calling {0}:\n{1}".format(request_url, errors.as_text()))
        self.assertTrue('/login/?next=' not in response['Location'],
                        "Received login response for {0}".format(request_url))
Exemplo n.º 19
0
from django.contrib.admin import AdminSite
from django.contrib.auth.models import Group
from django.contrib.auth.admin import GroupAdmin

from .users import MyCustomEmailUserAdmin
from ..users.models import MyCustomEmailUser
from .cliente import ClienteAdmin
from ..cliente.models import Cliente
from ..conductor.models import Conductor


class AdminSite(AdminSite):
    """
    Instance of a django admin for private schema
    """
    site_header = 'Admin tenant'


admin_site = AdminSite(name='admin')

admin_site.register(MyCustomEmailUser, MyCustomEmailUserAdmin)
admin_site.register(Cliente, ClienteAdmin)
admin_site.register(Group, GroupAdmin)
admin_site.register(Conductor)
Exemplo n.º 20
0
class AdminTestCase(TestCase):
    """
    Testing the admin site
    """

    #: The model to test
    model = None
    #: The admin class to test
    admin_class = None

    @classmethod
    def setUpClass(cls):
        super().setUpClass()
        cls.admin_user = User.objects.create_superuser("admin",
                                                       "*****@*****.**",
                                                       password="******")

    def setUp(self):
        super().setUp()

        # Have a separate site, to avoid dependency on polymorphic wrapping or standard admin configuration
        self.admin_site = AdminSite()

        if self.model is not None:
            self.admin_register(self.model, self.admin_class)

    def tearDown(self):
        clear_url_caches()
        set_urlconf(None)

    def register(self, model):
        """Decorator, like admin.register()"""
        def _dec(admin_class):
            self.admin_register(model, admin_class)
            return admin_class

        return _dec

    def admin_register(self, model, admin_site):
        """Register an model with admin to the test case, test client and URL reversing code."""
        self.admin_site.register(model, admin_site)

        # Make sure the URLs are reachable by reverse()
        clear_url_caches()
        set_urlconf(tuple([path("tmp-admin/", self.admin_site.urls)]))

    def get_admin_instance(self, model):
        try:
            return self.admin_site._registry[model]
        except KeyError:
            raise ValueError(f"Model not registered with admin: {model}")

    @classmethod
    def tearDownClass(cls):
        super().tearDownClass()
        clear_url_caches()
        set_urlconf(None)

    def get_add_url(self, model):
        admin_instance = self.get_admin_instance(model)
        return reverse(admin_urlname(admin_instance.opts, "add"))

    def get_changelist_url(self, model):
        admin_instance = self.get_admin_instance(model)
        return reverse(admin_urlname(admin_instance.opts, "changelist"))

    def get_change_url(self, model, object_id):
        admin_instance = self.get_admin_instance(model)
        return reverse(admin_urlname(admin_instance.opts, "change"),
                       args=(object_id, ))

    def get_history_url(self, model, object_id):
        admin_instance = self.get_admin_instance(model)
        return reverse(admin_urlname(admin_instance.opts, "history"),
                       args=(object_id, ))

    def get_delete_url(self, model, object_id):
        admin_instance = self.get_admin_instance(model)
        return reverse(admin_urlname(admin_instance.opts, "delete"),
                       args=(object_id, ))

    def admin_get_add(self, model, qs=""):
        """
        Make a direct "add" call to the admin page, circumvening login checks.
        """
        admin_instance = self.get_admin_instance(model)
        request = self.create_admin_request("get",
                                            self.get_add_url(model) + qs)
        response = admin_instance.add_view(request)
        self.assertEqual(response.status_code, 200)
        return response

    def admin_post_add(self, model, formdata, qs=""):
        """
        Make a direct "add" call to the admin page, circumvening login checks.
        """
        admin_instance = self.get_admin_instance(model)
        request = self.create_admin_request("post",
                                            self.get_add_url(model) + qs,
                                            data=formdata)
        response = admin_instance.add_view(request)
        self.assertFormSuccess(request.path, response)
        return response

    def admin_get_changelist(self, model):
        """
        Make a direct "add" call to the admin page, circumvening login checks.
        """
        admin_instance = self.get_admin_instance(model)
        request = self.create_admin_request("get",
                                            self.get_changelist_url(model))
        response = admin_instance.changelist_view(request)
        self.assertEqual(response.status_code, 200)
        return response

    def admin_get_change(self, model, object_id, query=None, **extra):
        """
        Perform a GET request on the admin page
        """
        admin_instance = self.get_admin_instance(model)
        request = self.create_admin_request("get",
                                            self.get_change_url(
                                                model, object_id),
                                            data=query,
                                            **extra)
        response = admin_instance.change_view(request, str(object_id))
        self.assertEqual(response.status_code, 200)
        return response

    def admin_post_change(self, model, object_id, formdata, **extra):
        """
        Make a direct "add" call to the admin page, circumvening login checks.
        """
        admin_instance = self.get_admin_instance(model)
        request = self.create_admin_request("post",
                                            self.get_change_url(
                                                model, object_id),
                                            data=formdata,
                                            **extra)
        response = admin_instance.change_view(request, str(object_id))
        self.assertFormSuccess(request.path, response)
        return response

    def admin_get_history(self, model, object_id, query=None, **extra):
        """
        Perform a GET request on the admin page
        """
        admin_instance = self.get_admin_instance(model)
        request = self.create_admin_request("get",
                                            self.get_history_url(
                                                model, object_id),
                                            data=query,
                                            **extra)
        response = admin_instance.history_view(request, str(object_id))
        self.assertEqual(response.status_code, 200)
        return response

    def admin_get_delete(self, model, object_id, query=None, **extra):
        """
        Perform a GET request on the admin delete page
        """
        admin_instance = self.get_admin_instance(model)
        request = self.create_admin_request("get",
                                            self.get_delete_url(
                                                model, object_id),
                                            data=query,
                                            **extra)
        response = admin_instance.delete_view(request, str(object_id))
        self.assertEqual(response.status_code, 200)
        return response

    def admin_post_delete(self, model, object_id, **extra):
        """
        Make a direct "add" call to the admin page, circumvening login checks.
        """
        if not extra:
            extra = {"data": {"post": "yes"}}

        admin_instance = self.get_admin_instance(model)
        request = self.create_admin_request(
            "post", self.get_delete_url(model, object_id), **extra)
        response = admin_instance.delete_view(request, str(object_id))
        self.assertEqual(response.status_code, 302,
                         f"Form errors in calling {request.path}")
        return response

    def create_admin_request(self, method, url, data=None, **extra):
        """
        Construct an Request instance for the admin view.
        """
        factory_method = getattr(RequestFactory(), method)

        if data is not None:
            if method != "get":
                data["csrfmiddlewaretoken"] = "foo"
            dummy_request = factory_method(url, data=data)
            dummy_request.user = self.admin_user

            # Add the management form fields if needed.
            # base_data = self._get_management_form_data(dummy_request)
            # base_data.update(data)
            # data = base_data

        request = factory_method(url, data=data, **extra)
        request.COOKIES[settings.CSRF_COOKIE_NAME] = "foo"
        request.csrf_processing_done = True

        # Add properties which middleware would typically do
        request.session = {}
        request.user = self.admin_user
        MessageMiddleware(lambda r: HttpResponse("OK?")).process_request(
            request)
        return request

    def assertFormSuccess(self, request_url, response):
        """
        Assert that the response was a redirect, not a form error.
        """
        self.assertIn(response.status_code, [200, 302])
        if response.status_code != 302:
            context_data = response.context_data
            if "errors" in context_data:
                errors = response.context_data["errors"]
            elif "form" in context_data:
                errors = context_data["form"].errors
            else:
                raise KeyError(
                    "Unknown field for errors in the TemplateResponse!")

            self.assertEqual(
                response.status_code,
                302,
                "Form errors in calling {}:\n{}".format(
                    request_url, errors.as_text()),
            )
        self.assertTrue(
            "/login/?next=" not in response["Location"],
            f"Received login response for {request_url}",
        )
Exemplo n.º 21
0
class PageAdmin(admin.ModelAdmin):
    inlines = [PageInline]

class MenuAdmin(admin.ModelAdmin):
    inlines = [MenuInline]

admin.site.register(Student, MyUserAdmin)
admin.site.register(Course)
admin.site.register(Group, GroupAdmin)
admin.site.register(Enroll, EnrollAdmin)
admin.site.register(Period)
admin.site.register(Category)
admin.site.register(MenuItem, MenuAdmin)
admin.site.register(Page, PageAdmin)

admin.site.site_header = _("Academica administrator site")


admin_site = AdminSite(name='matricula_admin')
admin_site.site_header = _("Academica administrator site")


admin_site.register(Student, MyUserAdmin)
admin_site.register(Course)
admin_site.register(Group, GroupAdmin)
admin_site.register(Enroll, EnrollAdmin)
admin_site.register(Period)
admin_site.register(Category)
admin_site.register(MenuItem, MenuItemAdmin)
admin_site.register(Page, PageAdmin)
Exemplo n.º 22
0
from django.contrib.auth.models import User, Group
from django.contrib.auth.admin import UserAdmin, GroupAdmin

from django.contrib.admin import AdminSite


root_site = AdminSite(name='root')
root_site.register(User, UserAdmin)
root_site.register(Group, GroupAdmin)

tenant_site = AdminSite(name='tenant')
tenant_site.register(User, UserAdmin)
tenant_site.register(Group, GroupAdmin)
Exemplo n.º 23
0
class TestPublishableAdmin(TestCase):
    def setUp(self):
        super(TestPublishableAdmin, self).setUp()
        self.page1 = Page.objects.create(slug='page1', title='page 1')
        self.page2 = Page.objects.create(slug='page2', title='page 2')
        self.page1.publish()
        self.page2.publish()

        self.author1 = Author.objects.create(name='a1')
        self.author2 = Author.objects.create(name='a2')
        self.author1.publish()
        self.author2.publish()

        self.admin_site = AdminSite('Test Admin')

        class PageBlockInline(PublishableStackedInline):
            model = PageBlock

        class PageAdmin(PublishableAdmin):
            inlines = [PageBlockInline]

        self.admin_site.register(Page, PageAdmin)
        self.page_admin = PageAdmin(Page, self.admin_site)

        # override urls, so reverse works
        settings.ROOT_URLCONF = patterns(
            '',
            ('^admin/',
             include(self.admin_site.urls)),
        )

    def test_get_publish_status_display(self):
        page = Page.objects.create(slug="hhkkk", title="hjkhjkh")
        self.failUnlessEqual('Changed - not yet published',
                             self.page_admin.get_publish_status_display(page))
        page.publish()
        self.failUnlessEqual('Published',
                             self.page_admin.get_publish_status_display(page))
        page.save()
        self.failUnlessEqual('Changed',
                             self.page_admin.get_publish_status_display(page))

        page.delete()
        self.failUnlessEqual('To be deleted',
                             self.page_admin.get_publish_status_display(page))

    def test_queryset(self):
        # make sure we only get back draft objects
        request = None

        self.failUnlessEqual(
            set([self.page1, self.page1.public, self.page2,
                 self.page2.public]),
            set(Page.objects.all())
        )
        self.failUnlessEqual(
            set([self.page1, self.page2]),
            set(self.page_admin.queryset(request))
        )

    def test_get_actions_global_delete_replaced(self):
        from publish.actions import delete_selected

        class request(object):
            GET = {}

        actions = self.page_admin.get_actions(request)

        self.failUnless('delete_selected' in actions)
        action, name, description = actions['delete_selected']
        self.failUnlessEqual(delete_selected, action)
        self.failUnlessEqual('delete_selected', name)
        self.failUnlessEqual(delete_selected.short_description, description)

    def test_formfield_for_foreignkey(self):
        # foreign key forms fields in admin
        # for publishable models should be filtered
        # to hide public object

        request = None
        parent_field = None
        for field in Page._meta.fields:
            if field.name == 'parent':
                parent_field = field
                break
        self.failUnless(parent_field)

        choice_field = self.page_admin.formfield_for_foreignkey(parent_field,
                                                                request)
        self.failUnless(choice_field)
        self.failUnless(isinstance(choice_field, ModelChoiceField))

        self.failUnlessEqual(
            set([self.page1, self.page1.public, self.page2,
                 self.page2.public]),
            set(Page.objects.all())
        )
        self.failUnlessEqual(
            set([self.page1, self.page2]),
            set(choice_field.queryset)
        )

    def test_formfield_for_manytomany(self):
        request = None
        authors_field = None
        for field in Page._meta.many_to_many:
            if field.name == 'authors':
                authors_field = field
                break
        self.failUnless(authors_field)

        choice_field = self.page_admin.formfield_for_manytomany(authors_field,
                                                                request)
        self.failUnless(choice_field)
        self.failUnless(isinstance(choice_field, ModelMultipleChoiceField))

        self.failUnlessEqual(
            set([self.author1, self.author1.public, self.author2,
                 self.author2.public]),
            set(Author.objects.all())
        )
        self.failUnlessEqual(
            set([self.author1, self.author2]),
            set(choice_field.queryset)
        )

    def test_has_change_permission(self):
        class dummy_request(object):
            method = 'GET'
            REQUEST = {}

            class user(object):
                @classmethod
                def has_perm(cls, permission):
                    return True

        self.failUnless(self.page_admin.has_change_permission(dummy_request))
        self.failUnless(
            self.page_admin.has_change_permission(dummy_request, self.page1))
        self.failIf(self.page_admin.has_change_permission(dummy_request,
                                                          self.page1.public))

        # can view deleted items
        self.page1.publish_state = Publishable.PUBLISH_DELETE
        self.failUnless(
            self.page_admin.has_change_permission(dummy_request, self.page1))

        # but cannot modify them
        dummy_request.method = 'POST'
        self.failIf(
            self.page_admin.has_change_permission(dummy_request, self.page1))

    def test_has_delete_permission(self):
        class dummy_request(object):
            method = 'GET'
            REQUEST = {}

            class user(object):
                @classmethod
                def has_perm(cls, permission):
                    return True

        self.failUnless(self.page_admin.has_delete_permission(dummy_request))
        self.failUnless(
            self.page_admin.has_delete_permission(dummy_request, self.page1))
        self.failIf(self.page_admin.has_delete_permission(dummy_request,
                                                          self.page1.public))

    def test_change_view_normal(self):
        class dummy_request(object):
            method = 'GET'
            REQUEST = {}
            COOKIES = {}
            META = {}

            @classmethod
            def is_ajax(cls):
                return False

            @classmethod
            def is_secure(cls):
                return False

            class user(object):
                @classmethod
                def has_perm(cls, permission):
                    return True

                @classmethod
                def get_and_delete_messages(cls):
                    return []

        response = self.page_admin.change_view(dummy_request,
                                               str(self.page1.id))
        self.failUnless(response is not None)
        self.failIf('deleted' in _get_rendered_content(response))

    def test_change_view_not_deleted(self):
        class dummy_request(object):
            method = 'GET'
            COOKIES = {}
            META = {}

            @classmethod
            def is_ajax(cls):
                return False

            @classmethod
            def is_secure(cls):
                return False

            class user(object):
                @classmethod
                def has_perm(cls, permission):
                    return True

        try:
            self.page_admin.change_view(dummy_request,
                                        unicode(self.page1.public.id))
            self.fail()
        except Http404:
            pass

    def test_change_view_deleted(self):
        class dummy_request(object):
            method = 'GET'
            REQUEST = {}
            COOKIES = {}
            META = {}

            @classmethod
            def is_ajax(cls):
                return False

            @classmethod
            def is_secure(cls):
                return False

            class user(object):
                @classmethod
                def has_perm(cls, permission):
                    return True

                @classmethod
                def get_and_delete_messages(cls):
                    return []

        self.page1.delete()

        response = self.page_admin.change_view(dummy_request,
                                               str(self.page1.id))
        self.failUnless(response is not None)
        self.failUnless('deleted' in _get_rendered_content(response))

    def test_change_view_deleted_POST(self):
        class dummy_request(object):
            csrf_processing_done = True
            method = 'POST'
            COOKIES = {}
            META = {}
            POST = {}

            @classmethod
            def is_ajax(cls):
                return False

            @classmethod
            def is_secure(cls):
                return False

        self.page1.delete()

        try:
            self.page_admin.change_view(dummy_request, str(self.page1.id))
            self.fail()
        except PermissionDenied:
            pass

    def test_change_view_delete_inline(self):
        block = PageBlock.objects.create(page=self.page1,
                                         content='some content')
        page1 = Page.objects.get(pk=self.page1.pk)
        page1.publish()

        user1 = User.objects.create_user('test1', '*****@*****.**', 'jkljkl')

        # fake selecting the delete tickbox for the block

        class dummy_request(object):
            csrf_processing_done = True
            method = 'POST'

            POST = {
                'slug': page1.slug,
                'title': page1.title,
                'content': page1.content,
                'pub_date_0': '2010-02-12',
                'pub_date_1': '17:40:00',
                'pageblock_set-TOTAL_FORMS': '2',
                'pageblock_set-INITIAL_FORMS': '1',
                'pageblock_set-0-id': str(block.id),
                'pageblock_set-0-page': str(page1.id),
                'pageblock_set-0-DELETE': 'yes'
            }
            REQUEST = POST
            FILES = {}
            COOKIES = {}
            META = {}

            @classmethod
            def is_ajax(cls):
                return False

            @classmethod
            def is_secure(cls):
                return False

            class user(object):
                pk = user1.pk

                @classmethod
                def is_authenticated(self):
                    return True

                @classmethod
                def has_perm(cls, permission):
                    return True

                @classmethod
                def get_and_delete_messages(cls):
                    return []

                class message_set(object):
                    @classmethod
                    def create(cls, message=''):
                        pass

            class _messages(object):
                @classmethod
                def add(cls, *message):
                    pass

        block = PageBlock.objects.get(id=block.id)
        public_block = block.public

        response = self.page_admin.change_view(dummy_request, str(page1.id))
        self.assertEqual(302, response.status_code)

        # the block should have been deleted (but not the public one)
        self.failUnlessEqual([public_block], list(PageBlock.objects.all()))
Exemplo n.º 24
0
        ct = registered_model.model
        DynamicModelAdmin = type(
            str("%(site_name)s_%(app_label)s_%(model_name)s_Admin" % dict(
                site_name = slug,
                app_label = ct.app_label,
                model_name = ct.model,
            )),
            (ModelAdmin,),
            dict(
                list_display = [
                    field.name for field in registered_model.list_display.extra(
                        order_by = [list_display_through+'.id']
                    )
                ],
                list_filter = [
                    field.name for field in registered_model.list_filter.all()
                ],
                search_fields = [
                    field.name for field in registered_model.search_fields.all()
                ],
                raw_id_fields = [
                    field.name for field in registered_model.raw_id_fields.all()
                ],
            )
        )
        admin_site.register(
            ct.model_class(),
            DynamicModelAdmin
        )
    urlpatterns.append(url('^%s/' % slug, include(admin_site.urls)))
Exemplo n.º 25
0
        actions = super(PollAdmin, self).get_change_actions(request, object_id, form_url)
        actions = list(actions)
        if not request.user.is_superuser:
            return []

        obj = self.model.objects.get(pk=object_id)
        if obj.question.endswith('?'):
            actions.remove('question_mark')

        return actions
admin.site.register(Poll, PollAdmin)


class CommentAdmin(DjangoObjectActions, admin.ModelAdmin):

    # Object actions
    ################

    def hodor(self, request, obj):
        if not obj.comment:
            # bail because we need a comment
            return
        obj.comment = ' '.join(['hodor' for x in obj.comment.split()])
        obj.save()
    change_actions = ('hodor', )
admin.site.register(Comment, CommentAdmin)


support_admin = AdminSite(name='support')
support_admin.register(Poll, PollAdmin)
Exemplo n.º 26
0
class AdminSite(AdminSite):
    site_title = 'FlexInvest Admin'
    index_title = 'Home'
    branding = "admin/logo.png"

admin_site = AdminSite()

def deactivate_account(modeladmin, request, queryset):
    queryset.update(is_active=False)
deactivate_account.short_description = "Deactivate selected users"

def activate_account(modeladmin, request, queryset):
    queryset.update(is_active=True)
activate_account.short_description = "Activate selected users"

class UserAdmin(UserAdmin):
    list_display = ('username', 'is_active', 'last_login', 'date_joined',)
    list_filter = ('groups', 'is_active',)
    date_hierarchy = 'date_joined'
    actions = [deactivate_account, activate_account]

admin_site.register(User, UserAdmin)
admin_site.register(Permission)
admin_site.register(Group)
admin_site.register(Bond)
admin_site.register(MoneyMarket)
admin_site.register(Residual)
admin_site.register(Trade)
admin_site.register(Cashflow)
class TestPublishSelectedAction(TestCase):
    def setUp(self):
        super(TestPublishSelectedAction, self).setUp()
        self.fp1 = Page.objects.create(slug='fp1', title='FP1')
        self.fp2 = Page.objects.create(slug='fp2', title='FP2')
        self.fp3 = Page.objects.create(slug='fp3', title='FP3')

        self.admin_site = AdminSite('Test Admin')
        self.page_admin = PublishableAdmin(Page, self.admin_site)

        # override urls, so reverse works
        settings.ROOT_URLCONF = patterns(
            '',
            ('^admin/',
             include(self.admin_site.urls)),
        )

    def test_publish_selected_confirm(self):
        pages = Page.objects.exclude(id=self.fp3.id)

        class dummy_request(object):
            META = {}
            POST = {}

            class user(object):
                @classmethod
                def has_perm(cls, *arg):
                    return True

                @classmethod
                def get_and_delete_messages(cls):
                    return []

        response = publish_selected(self.page_admin, dummy_request, pages)

        self.failIf(Page.objects.published().count() > 0)
        self.failUnless(response is not None)
        self.failUnlessEqual(200, response.status_code)

    def test_publish_selected_confirmed(self):
        pages = Page.objects.exclude(id=self.fp3.id)

        class dummy_request(object):
            POST = {'post': True}

            class user(object):
                @classmethod
                def is_authenticated(cls):
                    return True

                @classmethod
                def has_perm(cls, *arg):
                    return True

                class message_set(object):
                    @classmethod
                    def create(cls, message=None):
                        self._message = message

            class _messages(object):
                @classmethod
                def add(cls, *message):
                    self._message = message

        response = publish_selected(self.page_admin, dummy_request, pages)

        self.failUnlessEqual(2, Page.objects.published().count())
        self.failUnless(getattr(self, '_message', None) is not None)
        self.failUnless(response is None)

    def test_convert_all_published_to_html(self):
        self.admin_site.register(Page, PublishableAdmin)

        all_published = NestedSet()

        page = Page.objects.create(slug='here', title='title')
        block = PageBlock.objects.create(page=page, content='stuff here')

        all_published.add(page)
        all_published.add(block, parent=page)

        converted = _convert_all_published_to_html(self.admin_site,
                                                   all_published)

        expected = [
            u'<a href="../../example_app/page/%d/">Page: here (Changed - '
            u'not yet published)</a>' % page.id,
            [u'Page block: PageBlock object']]

        self.failUnlessEqual(expected, converted)

    def test_publish_selected_does_not_have_permission(self):
        self.admin_site.register(Page, PublishableAdmin)
        pages = Page.objects.exclude(id=self.fp3.id)

        class dummy_request(object):
            POST = {}
            META = {}

            class user(object):
                @classmethod
                def has_perm(cls, *arg):
                    return False

                @classmethod
                def get_and_delete_messages(cls):
                    return []

        response = publish_selected(self.page_admin, dummy_request, pages)
        self.failIf(response is None)
        # publish button should not be in response
        self.failIf('value="publish_selected"' in response.content)
        self.failIf('value="Yes, Publish"' in response.content)
        self.failIf('form' in response.content)

        self.failIf(Page.objects.published().count() > 0)

    def test_publish_selected_does_not_have_related_permission(self):
        # check we can't publish when we don't have permission
        # for a related model (in this case authors)
        self.admin_site.register(Author, PublishableAdmin)

        author = Author.objects.create(name='John')
        self.fp1.authors.add(author)

        pages = Page.objects.draft()

        class dummy_request(object):
            POST = {'post': True}

            class _messages(object):
                @classmethod
                def add(cls, *args):
                    return 'message'

            class user(object):
                pk = 1

                @classmethod
                def is_authenticated(cls):
                    return True

                @classmethod
                def has_perm(cls, perm):
                    return perm != 'example_app.publish_author'

        try:
            publish_selected(self.page_admin, dummy_request, pages)

            self.fail()
        except PermissionDenied:
            pass

        self.failIf(Page.objects.published().count() > 0)

    def test_publish_selected_logs_publication(self):
        self.admin_site.register(Page, PublishableAdmin)

        pages = Page.objects.exclude(id=self.fp3.id)

        class dummy_request(object):
            POST = {'post': True}

            class user(object):
                pk = 1

                @classmethod
                def is_authenticated(cls):
                    return True

                @classmethod
                def has_perm(cls, perm):
                    return perm != 'example_app.publish_author'

                class message_set(object):
                    @classmethod
                    def create(cls, message=None):
                        pass

            class _messages(object):
                @classmethod
                def add(cls, *message):
                    pass

        publish_selected(self.page_admin, dummy_request, pages)

        # should have logged two publications
        from django.contrib.admin.models import LogEntry
        from django.contrib.contenttypes.models import ContentType

        ContentType.objects.get_for_model(self.fp1).pk
        self.failUnlessEqual(2, LogEntry.objects.filter().count())
Exemplo n.º 28
0
class AdminTest(AppTestCase):
    """
    Test the admin functions.
    """
    def setUp(self):
        # Admin objects for all tests.
        self.factory = RequestFactory()
        self.admin_site = AdminSite()
        self.admin_user = User.objects.get(is_superuser=True)

        self.settings = override_settings(MIDDLEWARE_CLASSES=(
            'django.middleware.common.CommonMiddleware',
            'django.contrib.sessions.middleware.SessionMiddleware',
            'django.middleware.csrf.CsrfViewMiddleware',
            'django.contrib.auth.middleware.AuthenticationMiddleware',
            'django.contrib.messages.middleware.MessageMiddleware',
        ))
        self.settings.enable()

    def tearDown(self):
        self.settings.disable()

    def test_add_page(self):
        """
        Test adding an object with placeholder field via the admin.
        """
        self.admin_site.register(PlaceholderFieldTestPage,
                                 PlaceholderFieldTestPageAdmin)
        modeladmin = self.admin_site._registry[PlaceholderFieldTestPage]

        # Making a POST call with an unused ID should add the recipe.
        contents_slot = PlaceholderFieldTestPage.contents.slot
        formdata = self._get_management_form_data(modeladmin)
        formdata.update({
            'title': 'TEST1',
            'placeholder-fs-TOTAL_FORMS': '1',
            'placeholder-fs-MAX_NUM_FORMS': '',  # Needed for Django <= 1.4.3
            'placeholder-fs-INITIAL_FORMS': '0',  # Needed for Django 1.3
            'placeholder-fs-0-slot': contents_slot,
            'placeholder-fs-0-role': Placeholder.MAIN,
            'rawhtmltestitem-TOTAL_FORMS': '1',
            'rawhtmltestitem-MAX_NUM_FORMS': '',
            'rawhtmltestitem-INITIAL_FORMS': '0',
            'rawhtmltestitem-0-placeholder':
            '',  # The placeholder is not defined yet, as item is not yet created.
            'rawhtmltestitem-0-placeholder_slot':
            contents_slot,  # BaseContentItemFormSet resolves the placeholder after it's created
            'rawhtmltestitem-0-sort_order': '1',
            'rawhtmltestitem-0-html': u'<b>foo</b>',
        })
        response = self._post_add(modeladmin, formdata)
        self.assertEquals(
            response.status_code, 302, "No redirect, received:\n\n{0}".format(
                self._render_response(response)))

        # Check that the page exists.
        page = PlaceholderFieldTestPage.objects.get(title='TEST1')

        # Check that the placeholder is created,
        # and properly links back to it's parent.
        placeholder = page.contents
        self.assertEqual(placeholder.slot, contents_slot)
        self.assertEqual(placeholder.role, Placeholder.MAIN)
        self.assertEqual(placeholder.parent, page)

        # Check that the ContentItem is created,
        # and properly links back to it's parent.
        rawhtmltestitem = RawHtmlTestItem.objects.get(html=u'<b>foo</b>')
        self.assertEqual(rawhtmltestitem.placeholder, placeholder)
        self.assertEqual(rawhtmltestitem.parent, page)

        # Also check reverse relation of placeholder
        rawhtmltestitem = placeholder.contentitems.all()[0]
        self.assertEqual(rawhtmltestitem.html, u'<b>foo</b>')

    def _post_add(self, modeladmin, formdata):
        opts = modeladmin.opts
        url = reverse('admin:{0}_{1}_add'.format(opts.app_label,
                                                 opts.module_name))

        # Build request
        formdata['csrfmiddlewaretoken'] = 'foo'
        request = self.factory.post(url, data=formdata)
        request.COOKIES[settings.CSRF_COOKIE_NAME] = 'foo'

        # Add properties which middleware would typically do
        request.session = {}
        request.user = self.admin_user
        MessageMiddleware().process_request(request)

        # Make a direct call, circumvents login page.
        return modeladmin.add_view(request)

    def _get_management_form_data(self, modeladmin):
        """
        Return the formdata that the management forms need.
        """
        opts = modeladmin.opts
        url = reverse('admin:{0}_{1}_add'.format(opts.app_label,
                                                 opts.module_name))
        request = self.factory.get(url)

        if hasattr(modeladmin, 'get_inline_instances'):
            inline_instances = modeladmin.get_inline_instances(
                request)  # Django 1.4
        else:
            inline_instances = [
                inline_class(modeladmin.model, self.admin_site)
                for inline_class in modeladmin.inlines
            ]

        forms = []
        for inline_instance in inline_instances:
            FormSet = inline_instance.get_formset(request)
            formset = FormSet(instance=modeladmin.model())
            forms.append(formset.management_form)

        # In a primitive way, get the form fields.
        # This is not exactly the same as a POST, since that runs through clean()
        formdata = {}
        for form in forms:
            for boundfield in form:
                formdata[boundfield.html_name] = boundfield.value()

        return formdata

    def _render_response(self, response):
        if hasattr(response, 'render'):
            # TemplateResponse
            return u"== Context ==\n{0}\n\n== Response ==\n{1}".format(
                pformat(response.context_data),
                response.render().content)
        else:
            return response.content
class AdminTest(AppTestCase):
    """
    Test the admin functions.
    """
    def setUp(self):
        # Admin objects for all tests.
        self.factory = RequestFactory()
        self.admin_site = AdminSite()
        self.admin_user = User.objects.get(is_superuser=True)

        self.settings = override_settings(MIDDLEWARE_CLASSES=(
            "django.middleware.common.CommonMiddleware",
            "django.contrib.sessions.middleware.SessionMiddleware",
            "django.middleware.csrf.CsrfViewMiddleware",
            "django.contrib.auth.middleware.AuthenticationMiddleware",
            "django.contrib.messages.middleware.MessageMiddleware",
        ))
        self.settings.enable()

    def tearDown(self):
        self.settings.disable()

    def test_add_page(self):
        """
        Test adding an object with placeholder field via the admin.
        """
        self.admin_site.register(PlaceholderFieldTestPage,
                                 PlaceholderFieldTestPageAdmin)
        modeladmin = self.admin_site._registry[PlaceholderFieldTestPage]

        # Get all post data.
        # Includes all inlines, so all inline formsets of other plugins will be added (with TOTAL_FORMS 0)
        contents_slot = PlaceholderFieldTestPage.contents.slot
        formdata = self._get_management_form_data(modeladmin)
        formdata.update({
            "title": "TEST1",
            "placeholder-fs-TOTAL_FORMS": "1",
            "placeholder-fs-0-slot": contents_slot,
            "placeholder-fs-0-role": Placeholder.MAIN,
            "rawhtmltestitem-TOTAL_FORMS": "1",
            "rawhtmltestitem-MAX_NUM_FORMS": "",
            "rawhtmltestitem-INITIAL_FORMS": "0",
            "rawhtmltestitem-0-placeholder":
            "",  # The placeholder is not defined yet, as item is not yet created.
            "rawhtmltestitem-0-placeholder_slot":
            contents_slot,  # BaseContentItemFormSet resolves the placeholder after it's created
            "rawhtmltestitem-0-sort_order": "1",
            "rawhtmltestitem-0-html": "<b>foo</b>",
        })

        # Make a POST to the admin page.
        response = self._post_add(modeladmin, formdata)
        self.assertEqual(
            response.status_code,
            302,
            f"No redirect, received:\n\n{self._render_response(response)}",
        )

        # Check that the page exists.
        page = PlaceholderFieldTestPage.objects.get(title="TEST1")

        # Check that the placeholder is created,
        # and properly links back to it's parent.
        placeholder = page.contents
        self.assertEqual(placeholder.slot, contents_slot)
        self.assertEqual(placeholder.role, Placeholder.MAIN)
        self.assertEqual(placeholder.parent, page)

        # Check that the ContentItem is created,
        # and properly links back to it's parent.
        rawhtmltestitem = RawHtmlTestItem.objects.get(html="<b>foo</b>")
        self.assertEqual(rawhtmltestitem.placeholder, placeholder)
        self.assertEqual(rawhtmltestitem.parent, page)

        # Also check reverse relation of placeholder
        rawhtmltestitem = placeholder.contentitems.all()[0]
        self.assertEqual(rawhtmltestitem.html, "<b>foo</b>")

    def test_copy_language_backend(self):
        """
        Testing how the copy button works.
        It calls the ``get_placeholder_data_view`` function.
        """
        self.admin_site.register(PlaceholderFieldTestPage,
                                 PlaceholderFieldTestPageAdmin)
        modeladmin = self.admin_site._registry[PlaceholderFieldTestPage]

        page = factories.create_page()
        placeholder = factories.create_placeholder(page=page)
        item1 = factories.create_content_item(RawHtmlTestItem,
                                              placeholder=placeholder,
                                              html="AA")
        item2 = factories.create_content_item(RawHtmlTestItem,
                                              placeholder=placeholder,
                                              html="BB")

        request = self._get_request(
            admin_urlname(page._meta, "get_placeholder_data"))
        data = modeladmin.get_placeholder_data_view(request, page.pk).jsondata
        self.assertEqual(len(data["formset_forms"]), 2)
        self.assertEqual(data["formset_forms"][0]["model"], "RawHtmlTestItem")
        self.assertEqual(data["formset_forms"][0]["contentitem_id"], item1.pk)
        self.assertEqual(data["formset_forms"][1]["contentitem_id"], item2.pk)
        self.assertTrue("AA" in data["formset_forms"][0]["html"])

    def _get_request(self, url, data=None):
        request = self.factory.post(url, data=data or {})
        request.csrf_processing_done = True
        request.session = {}
        request.user = self.admin_user
        MessageMiddleware().process_request(request)
        return request

    def _post_add(self, modeladmin, formdata):
        opts = modeladmin.opts
        url = reverse(f"admin:{opts.app_label}_{opts.model_name}_add")

        # Build request
        # Add properties which middleware would typically do
        request = self._get_request(url, data=formdata)

        # Make a direct call, circumvents login page.
        return modeladmin.add_view(request)

    def _get_management_form_data(self, modeladmin):
        """
        Return the formdata that the management forms need.
        """
        opts = modeladmin.opts
        url = reverse(f"admin:{opts.app_label}_{opts.model_name}_add")
        request = self.factory.get(url)
        request.user = self.admin_user

        inline_instances = modeladmin.get_inline_instances(request)

        forms = []
        for inline_instance in inline_instances:
            FormSet = inline_instance.get_formset(request)
            formset = FormSet(instance=modeladmin.model())
            forms.append(formset.management_form)

        # In a primitive way, get the form fields.
        # This is not exactly the same as a POST, since that runs through clean()
        formdata = {}
        for form in forms:
            for boundfield in form:
                formdata[boundfield.html_name] = boundfield.value()

        return formdata

    def _render_response(self, response):
        if hasattr(response, "render"):
            # TemplateResponse
            return "== Context ==\n{}\n\n== Response ==\n{}".format(
                pformat(response.context_data),
                response.render().content)
        else:
            return response.content
Exemplo n.º 30
0
from fuzziverse import models


class FileUploadInline(NestedStackedInline):
    model = models.InputTestCase
    min_num = 0
    extra = 1


class ReportInline(NestedStackedInline):
    model = models.Report
    min_num = 0
    extra = 1


class FuzzingAttemptInline(NestedStackedInline):
    model = models.FuzzingAttempt
    min_num = 0
    extra = 1
    inlines = [FileUploadInline]
    readonly_fields = ['created']


class ApplicationAdmin(NestedModelAdmin):
    inlines = [ReportInline, FuzzingAttemptInline]
    search_fields = ['name']


user_admin_site.register(models.Application, ApplicationAdmin)