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"])
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()
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
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"])
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
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
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
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))
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))
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
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_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
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
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
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())))
def _get_module_choices(self): return set((force_text(module.name), force_text(module.name)) for module in get_modules())
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())))
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
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
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