Skip to content
Snippets Groups Projects
Commit 22b5ae14 authored by Hangzhi Yu's avatar Hangzhi Yu
Browse files

WIP permission checking with routes

parent 63832932
No related branches found
No related tags found
2 merge requests!1123Resolve "Finalise Vuetify app as SPA",!1066Translations update from Weblate
Pipeline #105094 failed
......@@ -240,45 +240,7 @@ import gqlWhoAmI from "./whoAmI.graphql";
import gqlMessages from "./messages.graphql";
import gqlSystemProperties from "./systemProperties.graphql";
import gqlCustomMenu from "./customMenu.graphql";
function buildMenu(routes, menuKey) {
let menu = {};
// Top-level entries
for (const route of routes) {
if (route.name && route.meta && route.meta[menuKey] && !route.parent) {
let menuItem = {
...route.meta,
name: route.name,
path: route.path,
subMenu: [],
};
menu[menuItem.name] = menuItem;
}
}
// Sub menu entries
for (const route of routes) {
if (
route.name &&
route.meta &&
route.meta[menuKey] &&
route.parent &&
route.parent.name &&
route.parent.name in menu
) {
let menuItem = {
...route.meta,
name: route.name,
path: route.path,
subMenu: [],
};
menu[route.parent.name].subMenu.push(menuItem);
}
}
return Object.values(menu);
}
import gqlGlobalPermissions from "./globalPermissions.graphql";
export default {
data() {
......@@ -289,14 +251,65 @@ export default {
systemProperties: null,
messages: null,
footerMenu: null,
menuPermissions: null,
menuPermissionNames: [],
sideNavMenu: null,
accountMenu: null,
};
},
computed: {
sideNavMenu() {
return buildMenu(this.$router.getRoutes(), "inMenu");
methods: {
generateMenu() {
let permArray = [];
for (const route of this.$router.getRoutes()) {
if (route.meta && route.meta["permission"]) {
permArray.push(route.meta["permission"]);
};
}
this.$data.menuPermissionNames = permArray;
this.$data.accountMenu = this.buildMenu(this.$router.getRoutes(), "inAccountMenu");
this.$data.sideNavMenu = this.buildMenu(this.$router.getRoutes(), "inMenu");
},
accountMenu() {
return buildMenu(this.$router.getRoutes(), "inAccountMenu");
buildMenu(routes, menuKey) {
let menu = {};
// Top-level entries
for (const route of routes) {
if (route.name && route.meta && route.meta[menuKey] && !route.parent) {
let menuItem = {
...route.meta,
name: route.name,
path: route.path,
subMenu: [],
};
menu[menuItem.name] = menuItem;
}
}
// Sub menu entries
for (const route of routes) {
if (
route.name &&
route.meta &&
route.meta[menuKey] &&
route.parent &&
route.parent.name &&
route.parent.name in menu
) {
let menuItem = {
...route.meta,
name: route.name,
path: route.path,
subMenu: [],
};
menu[route.parent.name].subMenu.push(menuItem);
}
}
return Object.values(menu);
},
},
apollo: {
......@@ -322,6 +335,15 @@ export default {
},
update: data => data.customMenuByName
},
menuPermissions: {
query: gqlGlobalPermissions,
variables() {
return {
permissions: this.$data.menuPermissionNames,
};
},
update: data => data.globalPermissionsByName
},
},
watch: {
systemProperties: function (newProperties) {
......
query ($permissions: [String]!){
globalPermissionsByName(permissions: $permissions) {
name
result
}
}
......@@ -19,6 +19,7 @@ from .group import GroupType # noqa
from .installed_apps import AppType
from .message import MessageType
from .notification import MarkNotificationReadMutation, NotificationType
from .permissions import GlobalPermissionType
from .person import PersonMutation, PersonType
from .search import SearchResultType
from .system_properties import SystemPropertiesType
......@@ -50,6 +51,8 @@ class Query(graphene.ObjectType):
custom_menu_by_name = graphene.Field(CustomMenuType, name=graphene.String())
global_permissions_by_name = graphene.List(GlobalPermissionType, permissions=graphene.List(graphene.String))
def resolve_notifications(root, info, **kwargs):
return NotificationType.get_queryset(
Notification.objects.all().order_by("-created"),
......@@ -114,6 +117,10 @@ class Query(graphene.ObjectType):
def resolve_custom_menu_by_name(root, info, name, **kwargs):
return CustomMenu.get_default(name)
def resolve_global_permissions_by_name(root, info, permissions, **kwargs):
return [{"name": permission_name, "result": info.context.user.has_perm(permission_name)} for permission_name in
permissions]
class Mutation(graphene.ObjectType):
update_person = PersonMutation.Field()
......
import graphene
class GlobalPermissionType(graphene.ObjectType):
name = graphene.String()
result = graphene.Boolean()
......@@ -21,7 +21,7 @@
<body>
<main id="app">
<app></app>
<app ref="aleksisApp"></app>
</main>
{% vite_asset 'aleksis/core/assets/index.js' %}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment