improvements based on user import testing
This commit is contained in:
parent
30ad442dd1
commit
edac046fcd
|
@ -17,7 +17,7 @@
|
||||||
<div class="row mb-1 align-items-center">
|
<div class="row mb-1 align-items-center">
|
||||||
<Label Class="col-sm-3" For="username" HelpText="A unique username for a user. Note that this field can not be modified once it is saved." ResourceKey="Username"></Label>
|
<Label Class="col-sm-3" For="username" HelpText="A unique username for a user. Note that this field can not be modified once it is saved." ResourceKey="Username"></Label>
|
||||||
<div class="col-sm-9">
|
<div class="col-sm-9">
|
||||||
<input id="username" class="form-control" @bind="@username" />
|
<input id="username" class="form-control" @bind="@_username" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row mb-1 align-items-center">
|
<div class="row mb-1 align-items-center">
|
||||||
|
@ -33,7 +33,7 @@
|
||||||
<Label Class="col-sm-3" For="confirm" HelpText="Please enter the password again to confirm it matches with the value above" ResourceKey="Confirm"></Label>
|
<Label Class="col-sm-3" For="confirm" HelpText="Please enter the password again to confirm it matches with the value above" ResourceKey="Confirm"></Label>
|
||||||
<div class="col-sm-9">
|
<div class="col-sm-9">
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<input id="confirm" type="@_passwordtype" class="form-control" @bind="@confirm" autocomplete="new-password" required />
|
<input id="confirm" type="@_passwordtype" class="form-control" @bind="@_confirm" autocomplete="new-password" required />
|
||||||
<button type="button" class="btn btn-secondary" @onclick="@TogglePassword" tabindex="-1">@_togglepassword</button>
|
<button type="button" class="btn btn-secondary" @onclick="@TogglePassword" tabindex="-1">@_togglepassword</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -41,17 +41,25 @@
|
||||||
<div class="row mb-1 align-items-center">
|
<div class="row mb-1 align-items-center">
|
||||||
<Label Class="col-sm-3" For="email" HelpText="The email address where the user will receive notifications" ResourceKey="Email"></Label>
|
<Label Class="col-sm-3" For="email" HelpText="The email address where the user will receive notifications" ResourceKey="Email"></Label>
|
||||||
<div class="col-sm-9">
|
<div class="col-sm-9">
|
||||||
<input id="email" class="form-control" @bind="@email" />
|
<input id="email" class="form-control" @bind="@_email" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row mb-1 align-items-center">
|
<div class="row mb-1 align-items-center">
|
||||||
<Label Class="col-sm-3" For="displayname" HelpText="The full name of the user" ResourceKey="DisplayName"></Label>
|
<Label Class="col-sm-3" For="displayname" HelpText="The full name of the user" ResourceKey="DisplayName"></Label>
|
||||||
<div class="col-sm-9">
|
<div class="col-sm-9">
|
||||||
<input id="displayname" class="form-control" @bind="@displayname" />
|
<input id="displayname" class="form-control" @bind="@_displayname" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1 align-items-center">
|
||||||
|
<Label Class="col-sm-3" For="notify" HelpText="Indicate if new users should receive an email notification" ResourceKey="Notify">Notify? </Label>
|
||||||
|
<div class="col-sm-9">
|
||||||
|
<select id="notify" class="form-select" @bind="@_notify" required>
|
||||||
|
<option value="True">@SharedLocalizer["Yes"]</option>
|
||||||
|
<option value="False">@SharedLocalizer["No"]</option>
|
||||||
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
}
|
}
|
||||||
</TabPanel>
|
</TabPanel>
|
||||||
<TabPanel Name="Profile" ResourceKey="Profile">
|
<TabPanel Name="Profile" ResourceKey="Profile">
|
||||||
|
@ -96,13 +104,14 @@
|
||||||
|
|
||||||
@code {
|
@code {
|
||||||
private string _passwordrequirements;
|
private string _passwordrequirements;
|
||||||
private string username = string.Empty;
|
private string _username = string.Empty;
|
||||||
private string _password = string.Empty;
|
private string _password = string.Empty;
|
||||||
private string _passwordtype = "password";
|
private string _passwordtype = "password";
|
||||||
private string _togglepassword = string.Empty;
|
private string _togglepassword = string.Empty;
|
||||||
private string confirm = string.Empty;
|
private string _confirm = string.Empty;
|
||||||
private string email = string.Empty;
|
private string _email = string.Empty;
|
||||||
private string displayname = string.Empty;
|
private string _displayname = string.Empty;
|
||||||
|
private string _notify = "True";
|
||||||
private List<Profile> profiles;
|
private List<Profile> profiles;
|
||||||
private Dictionary<string, string> settings;
|
private Dictionary<string, string> settings;
|
||||||
private string category = string.Empty;
|
private string category = string.Empty;
|
||||||
|
@ -139,17 +148,18 @@
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (username != string.Empty && _password != string.Empty && confirm != string.Empty && email != string.Empty && ValidateProfiles())
|
if (_username != string.Empty && _password != string.Empty && _confirm != string.Empty && _email != string.Empty && ValidateProfiles())
|
||||||
{
|
{
|
||||||
if (_password == confirm)
|
if (_password == _confirm)
|
||||||
{
|
{
|
||||||
var user = new User();
|
var user = new User();
|
||||||
user.SiteId = PageState.Site.SiteId;
|
user.SiteId = PageState.Site.SiteId;
|
||||||
user.Username = username;
|
user.Username = _username;
|
||||||
user.Password = _password;
|
user.Password = _password;
|
||||||
user.Email = email;
|
user.Email = _email;
|
||||||
user.DisplayName = string.IsNullOrWhiteSpace(displayname) ? username : displayname;
|
user.DisplayName = string.IsNullOrWhiteSpace(_displayname) ? _username : _displayname;
|
||||||
user.PhotoFileId = null;
|
user.PhotoFileId = null;
|
||||||
|
user.SuppressNotification = !bool.Parse(_notify);
|
||||||
|
|
||||||
user = await UserService.AddUserAsync(user);
|
user = await UserService.AddUserAsync(user);
|
||||||
|
|
||||||
|
@ -161,7 +171,7 @@
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
await logger.LogError("Error Adding User {Username} {Email}", username, email);
|
await logger.LogError("Error Adding User {Username} {Email}", _username, _email);
|
||||||
AddModuleMessage(Localizer["Error.User.AddCheckPass"], MessageType.Error);
|
AddModuleMessage(Localizer["Error.User.AddCheckPass"], MessageType.Error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -177,7 +187,7 @@
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
await logger.LogError(ex, "Error Adding User {Username} {Email} {Error}", username, email, ex.Message);
|
await logger.LogError(ex, "Error Adding User {Username} {Email} {Error}", _username, _email, ex.Message);
|
||||||
AddModuleMessage(Localizer["Error.User.Add"], MessageType.Error);
|
AddModuleMessage(Localizer["Error.User.Add"], MessageType.Error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,15 @@
|
||||||
<FileManager Id="importfile" @ref="_filemanager" Filter="txt" />
|
<FileManager Id="importfile" @ref="_filemanager" Filter="txt" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="row mb-1 align-items-center">
|
||||||
|
<Label Class="col-sm-3" For="notify" HelpText="Indicate if new users should receive an email notification" ResourceKey="Notify">Notify? </Label>
|
||||||
|
<div class="col-sm-9">
|
||||||
|
<select id="notify" class="form-select" @bind="@_notify" required>
|
||||||
|
<option value="True">@SharedLocalizer["Yes"]</option>
|
||||||
|
<option value="False">@SharedLocalizer["No"]</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<br />
|
<br />
|
||||||
<button type="button" class="btn btn-success" @onclick="ImportUsers">@Localizer["Import"]</button>
|
<button type="button" class="btn btn-success" @onclick="ImportUsers">@Localizer["Import"]</button>
|
||||||
|
@ -25,6 +34,8 @@
|
||||||
|
|
||||||
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
|
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
|
||||||
|
|
||||||
|
private string _notify = "True";
|
||||||
|
|
||||||
private async Task ImportUsers()
|
private async Task ImportUsers()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
@ -33,10 +44,10 @@
|
||||||
if (fileid != -1)
|
if (fileid != -1)
|
||||||
{
|
{
|
||||||
ShowProgressIndicator();
|
ShowProgressIndicator();
|
||||||
var results = await UserService.ImportUsersAsync(PageState.Site.SiteId, fileid);
|
var results = await UserService.ImportUsersAsync(PageState.Site.SiteId, fileid, bool.Parse(_notify));
|
||||||
if (bool.Parse(results["Success"]))
|
if (bool.Parse(results["Success"]))
|
||||||
{
|
{
|
||||||
AddModuleMessage(string.Format(Localizer["Message.Import.Success"], results["Rows"], results["Users"]), MessageType.Success);
|
AddModuleMessage(string.Format(Localizer["Message.Import.Success"], results["Users"]), MessageType.Success);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -171,4 +171,10 @@
|
||||||
<data name="Password.Placeholder" xml:space="preserve">
|
<data name="Password.Placeholder" xml:space="preserve">
|
||||||
<value>Password</value>
|
<value>Password</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Notify.HelpText" xml:space="preserve">
|
||||||
|
<value>Indicate if new users should receive an email notification</value>
|
||||||
|
</data>
|
||||||
|
<data name="Notify.Text" xml:space="preserve">
|
||||||
|
<value>Notify?</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
|
@ -1,4 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<root>
|
<root>
|
||||||
<!--
|
<!--
|
||||||
Microsoft ResX Schema
|
Microsoft ResX Schema
|
||||||
|
@ -133,7 +133,7 @@
|
||||||
<value>User Import Failed. Please Review Your Event Log For More Detailed Information.</value>
|
<value>User Import Failed. Please Review Your Event Log For More Detailed Information.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Message.Import.Success" xml:space="preserve">
|
<data name="Message.Import.Success" xml:space="preserve">
|
||||||
<value>Users Imported Successfully. {0} Rows Processed, {1} Users Imported.</value>
|
<value>User Import Successful. {0} Users Imported.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Message.Import.Validation" xml:space="preserve">
|
<data name="Message.Import.Validation" xml:space="preserve">
|
||||||
<value>You Must Specify A User File For Import</value>
|
<value>You Must Specify A User File For Import</value>
|
||||||
|
@ -141,4 +141,10 @@
|
||||||
<data name="Template" xml:space="preserve">
|
<data name="Template" xml:space="preserve">
|
||||||
<value>Template</value>
|
<value>Template</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Notify.HelpText" xml:space="preserve">
|
||||||
|
<value>Indicate if new users should receive an email notification</value>
|
||||||
|
</data>
|
||||||
|
<data name="Notify.Text" xml:space="preserve">
|
||||||
|
<value>Notify?</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
|
@ -146,8 +146,10 @@ namespace Oqtane.Services
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Bulk import of users
|
/// Bulk import of users
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <param name="siteId">ID of a <see cref="Site"/></param>
|
||||||
/// <param name="fileId">ID of a <see cref="File"/></param>
|
/// <param name="fileId">ID of a <see cref="File"/></param>
|
||||||
|
/// <param name="notify">Indicates if new users should be notified by email</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<Dictionary<string, string>> ImportUsersAsync(int siteId, int fileId);
|
Task<Dictionary<string, string>> ImportUsersAsync(int siteId, int fileId, bool notify);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -127,9 +127,9 @@ namespace Oqtane.Services
|
||||||
return string.Format(passwordValidationCriteriaTemplate, minimumlength, uniquecharacters, digitRequirement, uppercaseRequirement, lowercaseRequirement, punctuationRequirement);
|
return string.Format(passwordValidationCriteriaTemplate, minimumlength, uniquecharacters, digitRequirement, uppercaseRequirement, lowercaseRequirement, punctuationRequirement);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<Dictionary<string, string>> ImportUsersAsync(int siteId, int fileId)
|
public async Task<Dictionary<string, string>> ImportUsersAsync(int siteId, int fileId, bool notify)
|
||||||
{
|
{
|
||||||
return await PostJsonAsync<Dictionary<string, string>>($"{Apiurl}/import?siteid={siteId}&fileid={fileId}", null);
|
return await PostJsonAsync<Dictionary<string, string>>($"{Apiurl}/import?siteid={siteId}&fileid={fileId}¬ify={notify}", null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -372,14 +372,14 @@ namespace Oqtane.Controllers
|
||||||
return requirements;
|
return requirements;
|
||||||
}
|
}
|
||||||
|
|
||||||
// POST api/<controller>/import?siteid=x&fileid=y
|
// POST api/<controller>/import?siteid=x&fileid=y¬ify=z
|
||||||
[HttpPost("import")]
|
[HttpPost("import")]
|
||||||
[Authorize(Roles = RoleNames.Admin)]
|
[Authorize(Roles = RoleNames.Admin)]
|
||||||
public async Task<Dictionary<string, string>> Import(string siteid, string fileid)
|
public async Task<Dictionary<string, string>> Import(string siteid, string fileid, string notify)
|
||||||
{
|
{
|
||||||
if (int.TryParse(siteid, out int SiteId) && SiteId == _tenantManager.GetAlias().SiteId && int.TryParse(fileid, out int FileId))
|
if (int.TryParse(siteid, out int SiteId) && SiteId == _tenantManager.GetAlias().SiteId && int.TryParse(fileid, out int FileId) && bool.TryParse(notify, out bool Notify))
|
||||||
{
|
{
|
||||||
return await _userManager.ImportUsers(SiteId, FileId);
|
return await _userManager.ImportUsers(SiteId, FileId, Notify);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -19,6 +19,6 @@ namespace Oqtane.Managers
|
||||||
User VerifyTwoFactor(User user, string token);
|
User VerifyTwoFactor(User user, string token);
|
||||||
Task<User> LinkExternalAccount(User user, string token, string type, string key, string name);
|
Task<User> LinkExternalAccount(User user, string token, string type, string key, string name);
|
||||||
Task<bool> ValidatePassword(string password);
|
Task<bool> ValidatePassword(string password);
|
||||||
Task<Dictionary<string, string>> ImportUsers(int siteId, int fileId);
|
Task<Dictionary<string, string>> ImportUsers(int siteId, int fileId, bool notify);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -158,10 +158,13 @@ namespace Oqtane.Managers
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
string url = alias.Protocol + alias.Name;
|
if (!user.SuppressNotification)
|
||||||
string body = "Dear " + user.DisplayName + ",\n\nA User Account Has Been Successfully Created For You With The Username " + user.Username + ". Please Visit " + url + " And Use The Login Option To Sign In. If You Do Not Know Your Password, Use The Forgot Password Option On The Login Page To Reset Your Account.\n\nThank You!";
|
{
|
||||||
var notification = new Notification(user.SiteId, User, "User Account Notification", body);
|
string url = alias.Protocol + alias.Name;
|
||||||
_notifications.AddNotification(notification);
|
string body = "Dear " + user.DisplayName + ",\n\nA User Account Has Been Successfully Created For You With The Username " + user.Username + ". Please Visit " + url + " And Use The Login Option To Sign In. If You Do Not Know Your Password, Use The Forgot Password Option On The Login Page To Reset Your Account.\n\nThank You!";
|
||||||
|
var notification = new Notification(user.SiteId, User, "User Account Notification", body);
|
||||||
|
_notifications.AddNotification(notification);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
User.Password = ""; // remove sensitive information
|
User.Password = ""; // remove sensitive information
|
||||||
|
@ -183,7 +186,7 @@ namespace Oqtane.Managers
|
||||||
{
|
{
|
||||||
identityuser.Email = user.Email;
|
identityuser.Email = user.Email;
|
||||||
var valid = true;
|
var valid = true;
|
||||||
if (user.Password != "")
|
if (!string.IsNullOrEmpty(user.Password))
|
||||||
{
|
{
|
||||||
var validator = new PasswordValidator<IdentityUser>();
|
var validator = new PasswordValidator<IdentityUser>();
|
||||||
var result = await validator.ValidateAsync(_identityUserManager, null, user.Password);
|
var result = await validator.ValidateAsync(_identityUserManager, null, user.Password);
|
||||||
|
@ -195,7 +198,10 @@ namespace Oqtane.Managers
|
||||||
}
|
}
|
||||||
if (valid)
|
if (valid)
|
||||||
{
|
{
|
||||||
await _identityUserManager.UpdateAsync(identityuser);
|
if (!string.IsNullOrEmpty(user.Password))
|
||||||
|
{
|
||||||
|
await _identityUserManager.UpdateAsync(identityuser); // requires password to be provided
|
||||||
|
}
|
||||||
|
|
||||||
user = _users.UpdateUser(user);
|
user = _users.UpdateUser(user);
|
||||||
_syncManager.AddSyncEvent(_tenantManager.GetAlias().TenantId, EntityNames.User, user.UserId, SyncEventActions.Update);
|
_syncManager.AddSyncEvent(_tenantManager.GetAlias().TenantId, EntityNames.User, user.UserId, SyncEventActions.Update);
|
||||||
|
@ -460,7 +466,7 @@ namespace Oqtane.Managers
|
||||||
return result.Succeeded;
|
return result.Succeeded;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<Dictionary<string, string>> ImportUsers(int siteId, int fileId)
|
public async Task<Dictionary<string, string>> ImportUsers(int siteId, int fileId, bool notify)
|
||||||
{
|
{
|
||||||
var success = true;
|
var success = true;
|
||||||
int rows = 0;
|
int rows = 0;
|
||||||
|
@ -489,111 +495,133 @@ namespace Oqtane.Managers
|
||||||
if (!string.IsNullOrEmpty(row.Trim()))
|
if (!string.IsNullOrEmpty(row.Trim()))
|
||||||
{
|
{
|
||||||
var header = row.Replace("\"", "").Split('\t');
|
var header = row.Replace("\"", "").Split('\t');
|
||||||
|
if (header[0].Trim() == "Email")
|
||||||
// detail rows
|
|
||||||
while (reader.Peek() > -1)
|
|
||||||
{
|
{
|
||||||
row = reader.ReadLine();
|
for (int index = 4; index < header.Length - 1; index++)
|
||||||
rows++;
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(row.Trim()))
|
|
||||||
{
|
{
|
||||||
var values = row.Replace("\"", "").Split('\t');
|
if (!string.IsNullOrEmpty(header[index].Trim()) && !profiles.Any(item => item.Name == header[index].Trim()))
|
||||||
|
|
||||||
// user
|
|
||||||
var email = (values.Length > 0) ? values[0].Trim() : "";
|
|
||||||
var username = (values.Length > 1) ? values[1].Trim() : "";
|
|
||||||
var displayname = (values.Length > 2) ? values[2].Trim() : "";
|
|
||||||
|
|
||||||
var user = _users.GetUser(username, email);
|
|
||||||
if (user == null)
|
|
||||||
{
|
{
|
||||||
user = new User();
|
_logger.Log(LogLevel.Error, this, LogFunction.Create, "User Import Contains Profile Name {Profile} Which Does Not Exist", header[index]);
|
||||||
user.SiteId = siteId;
|
success = false;
|
||||||
user.Email = values[0];
|
}
|
||||||
user.Username = (!string.IsNullOrEmpty(username)) ? username : user.Email;
|
}
|
||||||
user.DisplayName = (!string.IsNullOrEmpty(displayname)) ? displayname : user.Username;
|
}
|
||||||
user = await AddUser(user);
|
else
|
||||||
|
{
|
||||||
|
_logger.Log(LogLevel.Error, this, LogFunction.Create, "User Import File Is Not In Correct Format. Please Use Template Provided.");
|
||||||
|
success = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (success)
|
||||||
|
{
|
||||||
|
// detail rows
|
||||||
|
while (reader.Peek() > -1)
|
||||||
|
{
|
||||||
|
row = reader.ReadLine();
|
||||||
|
rows++;
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(row.Trim()))
|
||||||
|
{
|
||||||
|
var values = row.Replace("\"", "").Split('\t');
|
||||||
|
|
||||||
|
// user
|
||||||
|
var email = (values.Length > 0) ? values[0].Trim() : "";
|
||||||
|
var username = (values.Length > 1) ? values[1].Trim() : "";
|
||||||
|
var displayname = (values.Length > 2) ? values[2].Trim() : "";
|
||||||
|
|
||||||
|
var user = _users.GetUser(username, email);
|
||||||
if (user == null)
|
if (user == null)
|
||||||
{
|
{
|
||||||
_logger.Log(LogLevel.Error, this, LogFunction.Create, "Error Importing User {Email} {Username} {DisplayName}", email, username, displayname);
|
user = new User();
|
||||||
success = false;
|
user.SiteId = siteId;
|
||||||
}
|
user.Email = values[0];
|
||||||
}
|
user.Username = (!string.IsNullOrEmpty(username)) ? username : user.Email;
|
||||||
else
|
user.DisplayName = (!string.IsNullOrEmpty(displayname)) ? displayname : user.Username;
|
||||||
{
|
user.EmailConfirmed = true;
|
||||||
if (!string.IsNullOrEmpty(displayname))
|
user.SuppressNotification = !notify;
|
||||||
{
|
user = await AddUser(user);
|
||||||
user.DisplayName = displayname;
|
if (user == null)
|
||||||
user = await UpdateUser(user);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var rolenames = (values.Length > 3) ? values[3].Trim() : "";
|
|
||||||
if (user != null && !string.IsNullOrEmpty(rolenames))
|
|
||||||
{
|
|
||||||
// roles (comma delimited)
|
|
||||||
foreach (var rolename in rolenames.Split(','))
|
|
||||||
{
|
|
||||||
var role = roles.FirstOrDefault(item => item.Name == rolename.Trim());
|
|
||||||
if (role == null)
|
|
||||||
{
|
{
|
||||||
role = new Role();
|
_logger.Log(LogLevel.Error, this, LogFunction.Create, "User Import Error Importing User {Email} {Username} {DisplayName}", email, username, displayname);
|
||||||
role.SiteId = siteId;
|
success = false;
|
||||||
role.Name = rolename.Trim();
|
|
||||||
role.Description = rolename.Trim();
|
|
||||||
role = _roles.AddRole(role);
|
|
||||||
roles.Add(role);
|
|
||||||
}
|
}
|
||||||
if (role != null)
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!string.IsNullOrEmpty(displayname))
|
||||||
{
|
{
|
||||||
var userrole = _userRoles.GetUserRole(user.UserId, role.RoleId, false);
|
user.DisplayName = displayname;
|
||||||
if (userrole == null)
|
user.Password = "";
|
||||||
|
user = await UpdateUser(user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var rolenames = (values.Length > 3) ? values[3].Trim() : "";
|
||||||
|
if (user != null && !string.IsNullOrEmpty(rolenames))
|
||||||
|
{
|
||||||
|
// roles (comma delimited)
|
||||||
|
foreach (var rolename in rolenames.Split(','))
|
||||||
|
{
|
||||||
|
var role = roles.FirstOrDefault(item => item.Name == rolename.Trim());
|
||||||
|
if (role == null)
|
||||||
{
|
{
|
||||||
userrole = new UserRole();
|
role = new Role();
|
||||||
userrole.UserId = user.UserId;
|
role.SiteId = siteId;
|
||||||
userrole.RoleId = role.RoleId;
|
role.Name = rolename.Trim();
|
||||||
_userRoles.AddUserRole(userrole);
|
role.Description = rolename.Trim();
|
||||||
|
role = _roles.AddRole(role);
|
||||||
|
roles.Add(role);
|
||||||
|
}
|
||||||
|
if (role != null)
|
||||||
|
{
|
||||||
|
var userrole = _userRoles.GetUserRole(user.UserId, role.RoleId, false);
|
||||||
|
if (userrole == null)
|
||||||
|
{
|
||||||
|
userrole = new UserRole();
|
||||||
|
userrole.UserId = user.UserId;
|
||||||
|
userrole.RoleId = role.RoleId;
|
||||||
|
_userRoles.AddUserRole(userrole);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (user != null && values.Length > 4)
|
if (user != null && values.Length > 4)
|
||||||
{
|
|
||||||
// profiles
|
|
||||||
var settings = _settings.GetSettings(EntityNames.User, user.UserId);
|
|
||||||
for (int index = 4; index < values.Length - 1; index++)
|
|
||||||
{
|
{
|
||||||
if (header.Length > index && !string.IsNullOrEmpty(values[index].Trim()))
|
// profiles
|
||||||
|
var settings = _settings.GetSettings(EntityNames.User, user.UserId);
|
||||||
|
for (int index = 4; index < values.Length - 1; index++)
|
||||||
{
|
{
|
||||||
var profile = profiles.FirstOrDefault(item => item.Name == header[index].Trim());
|
if (header.Length > index && !string.IsNullOrEmpty(values[index].Trim()))
|
||||||
if (profile != null)
|
|
||||||
{
|
{
|
||||||
var setting = settings.FirstOrDefault(item => item.SettingName == profile.Name);
|
var profile = profiles.FirstOrDefault(item => item.Name == header[index].Trim());
|
||||||
if (setting == null)
|
if (profile != null)
|
||||||
{
|
{
|
||||||
setting = new Setting();
|
var setting = settings.FirstOrDefault(item => item.SettingName == profile.Name);
|
||||||
setting.EntityName = EntityNames.User;
|
if (setting == null)
|
||||||
setting.EntityId = user.UserId;
|
|
||||||
setting.SettingName = profile.Name;
|
|
||||||
setting.SettingValue = values[index].Trim();
|
|
||||||
_settings.AddSetting(setting);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (setting.SettingValue != values[index].Trim())
|
|
||||||
{
|
{
|
||||||
|
setting = new Setting();
|
||||||
|
setting.EntityName = EntityNames.User;
|
||||||
|
setting.EntityId = user.UserId;
|
||||||
|
setting.SettingName = profile.Name;
|
||||||
setting.SettingValue = values[index].Trim();
|
setting.SettingValue = values[index].Trim();
|
||||||
_settings.UpdateSetting(setting);
|
_settings.AddSetting(setting);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (setting.SettingValue != values[index].Trim())
|
||||||
|
{
|
||||||
|
setting.SettingValue = values[index].Trim();
|
||||||
|
_settings.UpdateSetting(setting);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
users++;
|
users++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -627,7 +655,6 @@ namespace Oqtane.Managers
|
||||||
// return results
|
// return results
|
||||||
var result = new Dictionary<string, string>();
|
var result = new Dictionary<string, string>();
|
||||||
result.Add("Success", success.ToString());
|
result.Add("Success", success.ToString());
|
||||||
result.Add("Rows", rows.ToString());
|
|
||||||
result.Add("Users", users.ToString());
|
result.Add("Users", users.ToString());
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|
|
@ -107,6 +107,12 @@ namespace Oqtane.Models
|
||||||
[NotMapped]
|
[NotMapped]
|
||||||
public bool EmailConfirmed { get; set; }
|
public bool EmailConfirmed { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Indicates if new user should be notified by email (set during user creation)
|
||||||
|
/// </summary>
|
||||||
|
[NotMapped]
|
||||||
|
public bool SuppressNotification { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Public User Settings
|
/// Public User Settings
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user