Ejemplo n.º 1
0
def test_dashboard_blocks(rf):
    request = rf.get("/")
    with replace_modules([ATestModule]):
        block_ids = set()
        for block in chain(*(m.get_dashboard_blocks(request) for m in get_modules())):
            block_ids.add(block.id)
        assert block_ids >= set(["test-0", "test-1", "test-2", "test-3", "test-4"])
Ejemplo n.º 2
0
def get_menu_entry_categories(request):
    menu_categories = {}
    menu_category_icons = {}
    modules = list(get_modules())

    for module in modules:
        menu_category_icons.update(
            (force_text(key), force_text(value))
            for (key, value) in module.get_menu_category_icons().items())

    for module in modules:
        for entry in (module.get_menu_entries(request=request) or ()):
            category_name = force_text(entry.category or module.name)
            category = menu_categories.get(category_name)
            if not category:
                menu_categories[category_name] = category = _MenuCategory(
                    name=category_name,
                    icon=menu_category_icons.get(category_name,
                                                 "fa fa-circle"))
            category.entries.append(entry)

    return SortedDict(
        sorted(
            (c.name, c)
            for c in sorted(menu_categories.values(), key=lambda c: c.name)))
def test_permission_group_form_updates_members(regular_user):
    with replace_modules([ARestrictedTestModule]):
        modules = [m for m in get_modules()]
        test_module = modules[0]
        module_permissions = test_module.get_required_permissions()

        assert module_permissions

        group = get_default_permission_group()
        form = PermissionGroupForm(instance=group, prefix=None)

        assert not group.permissions.all()
        assert not group.user_set.all()

        data = {
            "name": "New Name",
            "modules": [force_text(test_module.name)],
            "members": [force_text(regular_user.pk)],
        }

        form = PermissionGroupForm(instance=group, prefix=None, data=data)
        form.save()

        module_permissions = [get_permission_object_from_string(m) for m in module_permissions]
        assert group.name == "New Name"
        assert set(module_permissions) == set(group.permissions.all())
        assert regular_user in group.user_set.all()

        form = PermissionGroupForm(instance=group, prefix=None, data={"name": "Name"})
        form.save()

        assert not group.permissions.all()
        assert not group.user_set.all()
Ejemplo n.º 4
0
def get_activity(request, n_entries=30, cutoff_hours=10):
    """
    Get Activity objects from all modules as a list in latest-first order.

    :param request: Request context
    :type request: django.http.request.HttpRequest
    :param n_entries: Number of entries to return in total.
    :type n_entries: int
    :param cutoff_hours: Calculate cutoff datetime so the oldest entry should be at most this old
    :type cutoff_hours: float
    :return: List of Activity objects
    :rtype: list[Activity]
    """

    cutoff_dt = now() - datetime.timedelta(hours=cutoff_hours)
    activities = []
    for module in get_modules():
        for activity in islice(module.get_activity(request, cutoff=cutoff_dt),
                               n_entries):
            heappush(activities,
                     (-time.mktime(activity.datetime.timetuple()), activity))
    out = []
    while activities and len(out) < n_entries:
        out.append(heappop(activities)[1])
    return out
Ejemplo n.º 5
0
def test_dashboard_blocks(rf):
    request = rf.get("/")
    with replace_modules([TestModule]):
        block_ids = set()
        for block in chain(*(m.get_dashboard_blocks(request) for m in get_modules())):
            block_ids.add(block.id)
        assert block_ids >= set(["test-0", "test-1", "test-2", "test-3", "test-4"])
Ejemplo n.º 6
0
 def get_context_data(self, **kwargs):
     context = super(DashboardView, self).get_context_data(**kwargs)
     context["notifications"] = notifications = []
     context["blocks"] = blocks = []
     for module in get_modules():
         notifications.extend(module.get_notifications(request=self.request))
         blocks.extend(module.get_dashboard_blocks(request=self.request))
     context["activity"] = get_activity(request=self.request)
     return context
Ejemplo n.º 7
0
 def get_context_data(self, **kwargs):
     context = super(DashboardView, self).get_context_data(**kwargs)
     context["notifications"] = notifications = []
     context["blocks"] = blocks = []
     for module in get_modules():
         notifications.extend(module.get_notifications(request=self.request))
         blocks.extend(module.get_dashboard_blocks(request=self.request))
     context["activity"] = get_activity(request=self.request)
     return context
Ejemplo n.º 8
0
 def _get_enabled_modules(self, permissions):
     if not self.instance.pk:
         return []
     permissions = set(permissions)
     modules = []
     for module in get_modules():
         # Ignore modules that haven't configured a name
         if module.name != "_Base_" and set(module.get_required_permissions()).issubset(permissions):
             modules.append(force_text(module.name))
     return modules
Ejemplo n.º 9
0
def get_model_url(object, kind="detail"):
    """
    Get a an admin object URL for the given object or object class by interrogating
    each admin module.

    Raises `NoModelUrl` if lookup fails

    :param object: Model or object class.
    :type object: class
    :param kind: URL kind. Currently "new", "list", "edit", "detail".
    :type kind: str
    :return: Resolved URL.
    :rtype: str
    """
    for module in get_modules():
        url = module.get_model_url(object, kind)
        if url:
            return url
    raise NoModelUrl("Can't get object URL of kind %s: %r" % (kind, object))
Ejemplo n.º 10
0
def get_model_url(object, kind="detail"):
    """
    Get a an admin object URL for the given object or object class by interrogating
    each admin module.

    Raises `NoModelUrl` if lookup fails

    :param object: Model or object class.
    :type object: class
    :param kind: URL kind. Currently "new", "list", "edit", "detail".
    :type kind: str
    :return: Resolved URL.
    :rtype: str
    """
    for module in get_modules():
        url = module.get_model_url(object, kind)
        if url:
            return url
    raise NoModelUrl("Can't get object URL of kind %s: %r" % (kind, object))
Ejemplo n.º 11
0
def get_search_results(request, query):
    fuzzer = FuzzyMatcher(query)
    normal_results = []
    menu_entry_results = []
    for module in get_modules():
        normal_results.extend(module.get_search_results(request, query) or ())
        for menu_entry in module.get_menu_entries(request) or ():
            texts = (menu_entry.get_search_query_texts() or ())
            if any(fuzzer.test(text) for text in texts):
                menu_entry_results.append(
                    SearchResult(text=menu_entry.text,
                                 url=menu_entry.url,
                                 icon=menu_entry.icon,
                                 category=menu_entry.category,
                                 relevance=90,
                                 is_action=True))
    results = sorted(chain(normal_results, menu_entry_results),
                     key=lambda r: r.relevance,
                     reverse=True)
    return results
Ejemplo n.º 12
0
def get_menu_entry_categories(request):
    menu_categories = {}
    menu_category_icons = {}
    modules = list(get_modules())

    for module in modules:
        menu_category_icons.update(
            (force_text(key), force_text(value)) for (key, value) in module.get_menu_category_icons().items()
        )

    for module in modules:
        for entry in module.get_menu_entries(request=request) or ():
            category_name = force_text(entry.category or module.name)
            category = menu_categories.get(category_name)
            if not category:
                menu_categories[category_name] = category = _MenuCategory(
                    name=category_name, icon=menu_category_icons.get(category_name, "fa fa-circle")
                )
            category.entries.append(entry)

    return SortedDict(sorted((c.name, c) for c in sorted(menu_categories.values(), key=lambda c: c.name)))
Ejemplo n.º 13
0
def test_permissions_for_menu_entries(rf, admin_user):
    permissions = set(["shoop.add_product", "shoop.delete_product", "shoop.change_product"])

    request = rf.get("/")
    request.user = StaffUser()
    request.user.permissions = permissions

    with replace_modules([ARestrictedTestModule]):
        modules = [m for m in get_modules()]
        assert request.user.permissions == modules[0].get_required_permissions()

        categories = get_menu_entry_categories(request)
        assert categories

        # Make sure category is displayed if user has correct permissions
        test_category_menu_entries = categories.get("RestrictedTest")
        assert any(me.text == "OK" for me in test_category_menu_entries)

        # No menu items should be displayed if user has no permissions
        request.user.permissions = []
        categories = get_menu_entry_categories(request)
        assert not categories
Ejemplo n.º 14
0
def get_activity(request, n_entries=30, cutoff_hours=10):
    """
    Get Activity objects from all modules as a list in latest-first order.

    :param request: Request context
    :type request: django.http.request.HttpRequest
    :param n_entries: Number of entries to return in total.
    :type n_entries: int
    :param cutoff_hours: Calculate cutoff datetime so the oldest entry should be at most this old
    :type cutoff_hours: float
    :return: List of Activity objects
    :rtype: list[Activity]
    """

    cutoff_dt = now() - datetime.timedelta(hours=cutoff_hours)
    activities = []
    for module in get_modules():
        for activity in islice(module.get_activity(request, cutoff=cutoff_dt), n_entries):
            heappush(activities, (-time.mktime(activity.datetime.timetuple()), activity))
    out = []
    while activities and len(out) < n_entries:
        out.append(heappop(activities)[1])
    return out
Ejemplo n.º 15
0
def get_search_results(request, query):
    fuzzer = FuzzyMatcher(query)
    normal_results = []
    menu_entry_results = []
    for module in get_modules():
        normal_results.extend(module.get_search_results(request, query) or ())
        for menu_entry in module.get_menu_entries(request) or ():
            texts = (menu_entry.get_search_query_texts() or ())
            if any(fuzzer.test(text) for text in texts):
                menu_entry_results.append(SearchResult(
                    text=menu_entry.text,
                    url=menu_entry.url,
                    icon=menu_entry.icon,
                    category=menu_entry.category,
                    relevance=90,
                    is_action=True
                ))
    results = sorted(
        chain(normal_results, menu_entry_results),
        key=lambda r: r.relevance,
        reverse=True
    )
    return results
Ejemplo n.º 16
0
def test_notifications(rf):
    request = rf.get("/")
    with replace_modules([TestModule]):
        assert any(n.text == "OK" for n in chain(*(m.get_notifications(request) for m in get_modules())))
Ejemplo n.º 17
0
 def _get_module_choices(self):
     return set((force_text(module.name), force_text(module.name)) for module in get_modules())
Ejemplo n.º 18
0
def test_notifications(rf):
    request = rf.get("/")
    with replace_modules([ATestModule]):
        assert any(n.text == "OK" for n in chain(*(m.get_notifications(request) for m in get_modules())))
Ejemplo n.º 19
0
 def _get_required_permissions(self, modules):
     permissions = set()
     for module in [m for m in get_modules() if m.name in modules]:
         permissions.update(set(module.get_required_permissions()))
     return permissions
Ejemplo n.º 20
0
def _get_admin_module_for_url(url_names):
    for module in get_modules():
        for url in module.get_urls():
            if url.name in url_names:
                return module
Ejemplo n.º 21
0
def _get_admin_module_for_url(url_names):
    for module in get_modules():
        for url in module.get_urls():
            if url.name in url_names:
                return module