fix #2978 - allow host users and admins to have personalized pages

This commit is contained in:
sbwalker 2023-07-10 16:13:56 -04:00
parent 62ad99d0b6
commit 3891dea009
4 changed files with 66 additions and 52 deletions

View File

@ -471,6 +471,12 @@
private async Task ToggleEditMode(bool EditMode) private async Task ToggleEditMode(bool EditMode)
{ {
Page page = null;
if (PageState.Page.IsPersonalizable && PageState.User != null && UserSecurity.IsAuthorized(PageState.User, RoleNames.Registered))
{
page = await PageService.AddPageAsync(PageState.Page.PageId, PageState.User.UserId);
}
if (_showEditMode) if (_showEditMode)
{ {
if (EditMode) if (EditMode)
@ -490,9 +496,8 @@
} }
else else
{ {
if (PageState.Page.IsPersonalizable && PageState.User != null) if (PageState.Page.IsPersonalizable && PageState.User != null && UserSecurity.IsAuthorized(PageState.User, RoleNames.Registered))
{ {
var page = await PageService.AddPageAsync(PageState.Page.PageId, PageState.User.UserId);
PageState.EditMode = true; PageState.EditMode = true;
NavigationManager.NavigateTo(NavigateUrl(page.Path, "edit=" + ((PageState.EditMode) ? "true" : "false"))); NavigationManager.NavigateTo(NavigateUrl(page.Path, "edit=" + ((PageState.EditMode) ? "true" : "false")));
} }

View File

@ -223,12 +223,12 @@
} }
if (page == null) if (page == null)
{ {
// look for personalized page
page = await PageService.GetPageAsync(route.PagePath, site.SiteId); page = await PageService.GetPageAsync(route.PagePath, site.SiteId);
} }
else else
{ {
if (user != null && page.IsPersonalizable) // look for personalized page
if (user != null && page.IsPersonalizable && !UserSecurity.IsAuthorized(user, PermissionNames.Edit, page.PermissionList))
{ {
var personalized = await PageService.GetPageAsync(route.PagePath + "/" + user.Username, site.SiteId); var personalized = await PageService.GetPageAsync(route.PagePath + "/" + user.Username, site.SiteId);
if (personalized != null) if (personalized != null)

View File

@ -9,6 +9,7 @@ using System.Net;
using Oqtane.Enums; using Oqtane.Enums;
using Oqtane.Infrastructure; using Oqtane.Infrastructure;
using Oqtane.Repository; using Oqtane.Repository;
using System.IO;
namespace Oqtane.Controllers namespace Oqtane.Controllers
{ {
@ -177,64 +178,68 @@ namespace Oqtane.Controllers
User user = _userPermissions.GetUser(User); User user = _userPermissions.GetUser(User);
if (parent != null && parent.SiteId == _alias.SiteId && parent.IsPersonalizable && user.UserId == int.Parse(userid)) if (parent != null && parent.SiteId == _alias.SiteId && parent.IsPersonalizable && user.UserId == int.Parse(userid))
{ {
page = new Page(); page = _pages.GetPage(parent.Path + "/" + user.Username, parent.SiteId);
page.SiteId = parent.SiteId; if (page == null)
page.ParentId = parent.PageId;
page.Name = user.Username;
page.Path = parent.Path + "/" + page.Name;
page.Title = page.Name + " - " + parent.Name;
page.Order = 0;
page.IsNavigation = false;
page.Url = "";
page.ThemeType = parent.ThemeType;
page.DefaultContainerType = parent.DefaultContainerType;
page.Icon = parent.Icon;
page.PermissionList = new List<Permission>()
{ {
new Permission(PermissionNames.View, int.Parse(userid), true), page = new Page();
new Permission(PermissionNames.View, RoleNames.Everyone, true), page.SiteId = parent.SiteId;
new Permission(PermissionNames.Edit, int.Parse(userid), true) page.ParentId = parent.PageId;
}; page.Name = (!string.IsNullOrEmpty(user.DisplayName)) ? user.DisplayName : user.Username;
page.IsPersonalizable = false; page.Path = parent.Path + "/" + user.Username;
page.UserId = int.Parse(userid); page.Title = page.Name + " - " + parent.Name;
page = _pages.AddPage(page); page.Order = 0;
page.IsNavigation = false;
// copy modules page.Url = "";
List<PageModule> pagemodules = _pageModules.GetPageModules(page.SiteId).ToList(); page.ThemeType = parent.ThemeType;
foreach (PageModule pm in pagemodules.Where(item => item.PageId == parent.PageId && !item.IsDeleted)) page.DefaultContainerType = parent.DefaultContainerType;
{ page.Icon = parent.Icon;
Module module = new Module(); page.PermissionList = new List<Permission>()
module.SiteId = page.SiteId;
module.PageId = page.PageId;
module.ModuleDefinitionName = pm.Module.ModuleDefinitionName;
module.AllPages = false;
module.PermissionList = new List<Permission>()
{ {
new Permission(PermissionNames.View, int.Parse(userid), true), new Permission(PermissionNames.View, int.Parse(userid), true),
new Permission(PermissionNames.View, RoleNames.Everyone, true), new Permission(PermissionNames.View, RoleNames.Everyone, true),
new Permission(PermissionNames.Edit, int.Parse(userid), true) new Permission(PermissionNames.Edit, int.Parse(userid), true)
}; };
module = _modules.AddModule(module); page.IsPersonalizable = false;
page.UserId = int.Parse(userid);
page = _pages.AddPage(page);
string content = _modules.ExportModule(pm.ModuleId); // copy modules
if (content != "") List<PageModule> pagemodules = _pageModules.GetPageModules(page.SiteId).ToList();
foreach (PageModule pm in pagemodules.Where(item => item.PageId == parent.PageId && !item.IsDeleted))
{ {
_modules.ImportModule(module.ModuleId, content); Module module = new Module();
module.SiteId = page.SiteId;
module.PageId = page.PageId;
module.ModuleDefinitionName = pm.Module.ModuleDefinitionName;
module.AllPages = false;
module.PermissionList = new List<Permission>()
{
new Permission(PermissionNames.View, int.Parse(userid), true),
new Permission(PermissionNames.View, RoleNames.Everyone, true),
new Permission(PermissionNames.Edit, int.Parse(userid), true)
};
module = _modules.AddModule(module);
string content = _modules.ExportModule(pm.ModuleId);
if (content != "")
{
_modules.ImportModule(module.ModuleId, content);
}
PageModule pagemodule = new PageModule();
pagemodule.PageId = page.PageId;
pagemodule.ModuleId = module.ModuleId;
pagemodule.Title = pm.Title;
pagemodule.Pane = pm.Pane;
pagemodule.Order = pm.Order;
pagemodule.ContainerType = pm.ContainerType;
_pageModules.AddPageModule(pagemodule);
} }
PageModule pagemodule = new PageModule(); _syncManager.AddSyncEvent(_alias.TenantId, EntityNames.Page, page.PageId, SyncEventActions.Create);
pagemodule.PageId = page.PageId; _syncManager.AddSyncEvent(_alias.TenantId, EntityNames.Site, page.SiteId, SyncEventActions.Refresh);
pagemodule.ModuleId = module.ModuleId;
pagemodule.Title = pm.Title;
pagemodule.Pane = pm.Pane;
pagemodule.Order = pm.Order;
pagemodule.ContainerType = pm.ContainerType;
_pageModules.AddPageModule(pagemodule);
} }
_syncManager.AddSyncEvent(_alias.TenantId, EntityNames.Page, page.PageId, SyncEventActions.Create);
_syncManager.AddSyncEvent(_alias.TenantId, EntityNames.Site, page.SiteId, SyncEventActions.Refresh);
} }
else else
{ {

View File

@ -648,10 +648,14 @@ namespace Oqtane.Controllers
foreach (UserRole userrole in userroles) foreach (UserRole userrole in userroles)
{ {
roles += userrole.Role.Name + ";"; roles += userrole.Role.Name + ";";
if (userrole.Role.Name == RoleNames.Host && userroles.Where(item => item.Role.Name == RoleNames.Admin).FirstOrDefault() == null) if (userrole.Role.Name == RoleNames.Host && !userroles.Any(item => item.Role.Name == RoleNames.Admin))
{ {
roles += RoleNames.Admin + ";"; roles += RoleNames.Admin + ";";
} }
if (userrole.Role.Name == RoleNames.Host && !userroles.Any(item => item.Role.Name == RoleNames.Registered))
{
roles += RoleNames.Registered + ";";
}
} }
if (roles != "") roles = ";" + roles; if (roles != "") roles = ";" + roles;
return roles; return roles;