mirror of
https://github.com/Ombi-app/Ombi.git
synced 2025-08-21 05:43:19 -07:00
User management, migration and newsletter
This commit is contained in:
parent
11ecbf04f6
commit
42c437905e
26 changed files with 888 additions and 389 deletions
|
@ -22,7 +22,10 @@
|
|||
|
||||
// Select a user to populate on the right side
|
||||
$scope.selectUser = function (id) {
|
||||
$scope.selectedUser = $scope.users.find(x => x.id === id);
|
||||
var user = $scope.users.filter(function (item) {
|
||||
return item.id === id;
|
||||
});
|
||||
$scope.selectedUser = user[0];
|
||||
}
|
||||
|
||||
// Get all users in the system
|
||||
|
@ -64,6 +67,15 @@
|
|||
});
|
||||
};
|
||||
|
||||
$scope.hasClaim = function(claim) {
|
||||
var claims = $scope.selectedUser.claimsArray;
|
||||
|
||||
var result = claims.some(function (item) {
|
||||
return item === claim.name;
|
||||
});
|
||||
return result;
|
||||
};
|
||||
|
||||
$scope.$watch('claims|filter:{selected:true}',
|
||||
function (nv) {
|
||||
$scope.selectedClaims = nv.map(function (claim) {
|
||||
|
@ -74,7 +86,7 @@
|
|||
|
||||
|
||||
$scope.updateUser = function () {
|
||||
|
||||
userManagementService.updateUser($scope.selectedUser.id, $scope.selectedUser.claimsItem);
|
||||
}
|
||||
|
||||
function getBaseUrl() {
|
||||
|
|
|
@ -24,10 +24,20 @@
|
|||
return $http.get('/usermanagement/claims');
|
||||
}
|
||||
|
||||
var updateUser = function (id, claims) {
|
||||
|
||||
return $http({
|
||||
url: '/usermanagement/updateUser',
|
||||
method: "POST",
|
||||
data: { id: id, claims: claims }
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
getUsers: getUsers,
|
||||
addUser: addUser,
|
||||
getClaims: getClaims
|
||||
getClaims: getClaims,
|
||||
updateUser: updateUser,
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -54,6 +54,9 @@ namespace PlexRequests.UI.Jobs
|
|||
|
||||
private IEnumerable<IJobDetail> CreateJobs()
|
||||
{
|
||||
var settingsService = Service.Resolve<ISettingsService<ScheduledJobsSettings>>();
|
||||
var s = settingsService.GetSettings();
|
||||
|
||||
var jobs = new List<IJobDetail>();
|
||||
|
||||
var jobList = new List<IJobDetail>
|
||||
|
@ -66,9 +69,13 @@ namespace PlexRequests.UI.Jobs
|
|||
JobBuilder.Create<StoreBackup>().WithIdentity("StoreBackup", "Database").Build(),
|
||||
JobBuilder.Create<StoreCleanup>().WithIdentity("StoreCleanup", "Database").Build(),
|
||||
JobBuilder.Create<UserRequestLimitResetter>().WithIdentity("UserRequestLimiter", "Request").Build(),
|
||||
JobBuilder.Create<RecentlyAdded>().WithIdentity("RecentlyAddedModel", "Email").Build()
|
||||
};
|
||||
|
||||
if (!string.IsNullOrEmpty(s.RecentlyAddedCron))
|
||||
{
|
||||
jobList.Add(JobBuilder.Create<RecentlyAdded>().WithIdentity("RecentlyAddedModel", "Email").Build());
|
||||
}
|
||||
|
||||
|
||||
jobs.AddRange(jobList);
|
||||
|
||||
|
@ -112,66 +119,76 @@ namespace PlexRequests.UI.Jobs
|
|||
|
||||
var plexAvailabilityChecker =
|
||||
TriggerBuilder.Create()
|
||||
.WithIdentity("PlexAvailabilityChecker", "Plex")
|
||||
.StartNow()
|
||||
.WithSimpleSchedule(x => x.WithIntervalInMinutes(s.PlexAvailabilityChecker).RepeatForever())
|
||||
.Build();
|
||||
.WithIdentity("PlexAvailabilityChecker", "Plex")
|
||||
.StartNow()
|
||||
.WithSimpleSchedule(x => x.WithIntervalInMinutes(s.PlexAvailabilityChecker).RepeatForever())
|
||||
.Build();
|
||||
|
||||
var srCacher =
|
||||
TriggerBuilder.Create()
|
||||
.WithIdentity("SickRageCacher", "Cache")
|
||||
.StartNow()
|
||||
.WithSimpleSchedule(x => x.WithIntervalInMinutes(s.SickRageCacher).RepeatForever())
|
||||
.Build();
|
||||
.WithIdentity("SickRageCacher", "Cache")
|
||||
.StartNow()
|
||||
.WithSimpleSchedule(x => x.WithIntervalInMinutes(s.SickRageCacher).RepeatForever())
|
||||
.Build();
|
||||
|
||||
var sonarrCacher =
|
||||
TriggerBuilder.Create()
|
||||
.WithIdentity("SonarrCacher", "Cache")
|
||||
.StartNow()
|
||||
.WithSimpleSchedule(x => x.WithIntervalInMinutes(s.SonarrCacher).RepeatForever())
|
||||
.Build();
|
||||
.WithIdentity("SonarrCacher", "Cache")
|
||||
.StartNow()
|
||||
.WithSimpleSchedule(x => x.WithIntervalInMinutes(s.SonarrCacher).RepeatForever())
|
||||
.Build();
|
||||
|
||||
var cpCacher =
|
||||
TriggerBuilder.Create()
|
||||
.WithIdentity("CouchPotatoCacher", "Cache")
|
||||
.StartNow()
|
||||
.WithSimpleSchedule(x => x.WithIntervalInMinutes(s.CouchPotatoCacher).RepeatForever())
|
||||
.Build();
|
||||
.WithIdentity("CouchPotatoCacher", "Cache")
|
||||
.StartNow()
|
||||
.WithSimpleSchedule(x => x.WithIntervalInMinutes(s.CouchPotatoCacher).RepeatForever())
|
||||
.Build();
|
||||
|
||||
var storeBackup =
|
||||
TriggerBuilder.Create()
|
||||
.WithIdentity("StoreBackup", "Database")
|
||||
.StartNow()
|
||||
.WithSimpleSchedule(x => x.WithIntervalInHours(s.StoreBackup).RepeatForever())
|
||||
.Build();
|
||||
.WithIdentity("StoreBackup", "Database")
|
||||
.StartNow()
|
||||
.WithSimpleSchedule(x => x.WithIntervalInHours(s.StoreBackup).RepeatForever())
|
||||
.Build();
|
||||
|
||||
var storeCleanup =
|
||||
TriggerBuilder.Create()
|
||||
.WithIdentity("StoreCleanup", "Database")
|
||||
.StartNow()
|
||||
.WithSimpleSchedule(x => x.WithIntervalInHours(s.StoreCleanup).RepeatForever())
|
||||
.Build();
|
||||
.WithIdentity("StoreCleanup", "Database")
|
||||
.StartNow()
|
||||
.WithSimpleSchedule(x => x.WithIntervalInHours(s.StoreCleanup).RepeatForever())
|
||||
.Build();
|
||||
|
||||
var userRequestLimiter =
|
||||
TriggerBuilder.Create()
|
||||
.WithIdentity("UserRequestLimiter", "Request")
|
||||
.StartAt(DateTimeOffset.Now.AddMinutes(5)) // Everything has started on application start, lets wait 5 minutes
|
||||
.WithSimpleSchedule(x => x.WithIntervalInHours(s.UserRequestLimitResetter).RepeatForever())
|
||||
.Build();
|
||||
.WithIdentity("UserRequestLimiter", "Request")
|
||||
.StartAt(DateBuilder.FutureDate(5, IntervalUnit.Minute))
|
||||
// Everything has started on application start, lets wait 5 minutes
|
||||
.WithSimpleSchedule(x => x.WithIntervalInHours(s.UserRequestLimitResetter).RepeatForever())
|
||||
.Build();
|
||||
|
||||
var plexEpCacher =
|
||||
TriggerBuilder.Create()
|
||||
.WithIdentity("PlexEpisodeCacher", "Cache")
|
||||
.StartAt(DateTimeOffset.Now.AddMinutes(5))
|
||||
.WithSimpleSchedule(x => x.WithIntervalInHours(s.PlexEpisodeCacher).RepeatForever())
|
||||
.Build();
|
||||
.WithIdentity("PlexEpisodeCacher", "Cache")
|
||||
.StartAt(DateBuilder.FutureDate(5, IntervalUnit.Minute))
|
||||
.WithSimpleSchedule(x => x.WithIntervalInHours(s.PlexEpisodeCacher).RepeatForever())
|
||||
.Build();
|
||||
|
||||
|
||||
var cronJob = string.IsNullOrEmpty(s.RecentlyAddedCron);
|
||||
if (!cronJob)
|
||||
{
|
||||
var rencentlyAdded =
|
||||
TriggerBuilder.Create()
|
||||
.WithIdentity("RecentlyAddedModel", "Email")
|
||||
.StartNow()
|
||||
.WithCronSchedule(s.RecentlyAddedCron)
|
||||
.WithSimpleSchedule(x => x.WithIntervalInHours(2).RepeatForever())
|
||||
.Build();
|
||||
|
||||
triggers.Add(rencentlyAdded);
|
||||
}
|
||||
|
||||
var rencentlyAdded =
|
||||
TriggerBuilder.Create()
|
||||
.WithIdentity("RecentlyAddedModel", "Email")
|
||||
.StartNow()
|
||||
.WithSimpleSchedule(x => x.WithIntervalInHours(2).RepeatForever())
|
||||
.Build();
|
||||
|
||||
|
||||
triggers.Add(plexAvailabilityChecker);
|
||||
|
@ -182,7 +199,6 @@ namespace PlexRequests.UI.Jobs
|
|||
triggers.Add(storeCleanup);
|
||||
triggers.Add(userRequestLimiter);
|
||||
triggers.Add(plexEpCacher);
|
||||
triggers.Add(rencentlyAdded);
|
||||
|
||||
return triggers;
|
||||
}
|
||||
|
|
|
@ -1,50 +1,51 @@
|
|||
#region Copyright
|
||||
// /************************************************************************
|
||||
// Copyright (c) 2016 Jamie Rees
|
||||
// File: SearchTvShowViewModel.cs
|
||||
// Created By: Jamie Rees
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
// ************************************************************************/
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace PlexRequests.UI.Models
|
||||
{
|
||||
public class SearchMovieViewModel : SearchViewModel
|
||||
{
|
||||
public bool Adult { get; set; }
|
||||
public string BackdropPath { get; set; }
|
||||
public List<int> GenreIds { get; set; }
|
||||
public int Id { get; set; }
|
||||
public string OriginalLanguage { get; set; }
|
||||
public string OriginalTitle { get; set; }
|
||||
public string Overview { get; set; }
|
||||
public double Popularity { get; set; }
|
||||
public string PosterPath { get; set; }
|
||||
public DateTime? ReleaseDate { get; set; }
|
||||
public string Title { get; set; }
|
||||
public bool Video { get; set; }
|
||||
public double VoteAverage { get; set; }
|
||||
public int VoteCount { get; set; }
|
||||
}
|
||||
#region Copyright
|
||||
// /************************************************************************
|
||||
// Copyright (c) 2016 Jamie Rees
|
||||
// File: SearchTvShowViewModel.cs
|
||||
// Created By: Jamie Rees
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
// ************************************************************************/
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace PlexRequests.UI.Models
|
||||
{
|
||||
public class SearchMovieViewModel : SearchViewModel
|
||||
{
|
||||
public bool Adult { get; set; }
|
||||
public string BackdropPath { get; set; }
|
||||
public List<int> GenreIds { get; set; }
|
||||
public int Id { get; set; }
|
||||
public string OriginalLanguage { get; set; }
|
||||
public string OriginalTitle { get; set; }
|
||||
public string Overview { get; set; }
|
||||
public double Popularity { get; set; }
|
||||
public string PosterPath { get; set; }
|
||||
public DateTime? ReleaseDate { get; set; }
|
||||
public string Title { get; set; }
|
||||
public bool Video { get; set; }
|
||||
public double VoteAverage { get; set; }
|
||||
public int VoteCount { get; set; }
|
||||
public bool AlreadyInCp { get; set; }
|
||||
}
|
||||
}
|
|
@ -17,6 +17,7 @@ namespace PlexRequests.UI.Models
|
|||
public string EmailAddress { get; set; }
|
||||
public UserManagementPlexInformation PlexInfo { get; set; }
|
||||
public string[] ClaimsArray { get; set; }
|
||||
public List<UserManagementUpdateModel.ClaimsModel> ClaimsItem { get; set; }
|
||||
}
|
||||
|
||||
public class UserManagementPlexInformation
|
||||
|
@ -57,5 +58,22 @@ namespace PlexRequests.UI.Models
|
|||
[JsonProperty("email")]
|
||||
public string EmailAddress { get; set; }
|
||||
}
|
||||
|
||||
public class UserManagementUpdateModel
|
||||
{
|
||||
[JsonProperty("id")]
|
||||
public string Id { get; set; }
|
||||
[JsonProperty("claims")]
|
||||
public List<ClaimsModel> Claims { get; set; }
|
||||
|
||||
public class ClaimsModel
|
||||
{
|
||||
[JsonProperty("name")]
|
||||
public string Name { get; set; }
|
||||
[JsonProperty("selected")]
|
||||
public bool Selected { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -63,7 +63,7 @@ using PlexRequests.Store.Models;
|
|||
using PlexRequests.Store.Repository;
|
||||
using PlexRequests.UI.Helpers;
|
||||
using PlexRequests.UI.Models;
|
||||
|
||||
using Quartz;
|
||||
using Action = PlexRequests.Helpers.Analytics.Action;
|
||||
|
||||
namespace PlexRequests.UI.Modules
|
||||
|
@ -97,7 +97,7 @@ namespace PlexRequests.UI.Modules
|
|||
private IJobRecord JobRecorder { get; }
|
||||
private IAnalytics Analytics { get; }
|
||||
private IRecentlyAdded RecentlyAdded { get; }
|
||||
private ISettingsService<NotificationSettingsV2> NotifySettings { get; }
|
||||
private ISettingsService<NotificationSettingsV2> NotifySettings { get; }
|
||||
|
||||
private static Logger Log = LogManager.GetCurrentClassLogger();
|
||||
public AdminModule(ISettingsService<PlexRequestSettings> prService,
|
||||
|
@ -210,7 +210,7 @@ namespace PlexRequests.UI.Modules
|
|||
|
||||
Post["/autoupdate"] = x => AutoUpdate();
|
||||
|
||||
Post["/testslacknotification", true] = async (x,ct) => await TestSlackNotification();
|
||||
Post["/testslacknotification", true] = async (x, ct) => await TestSlackNotification();
|
||||
|
||||
Get["/slacknotification"] = _ => SlackNotifications();
|
||||
Post["/slacknotification"] = _ => SaveSlackNotifications();
|
||||
|
@ -975,7 +975,8 @@ namespace PlexRequests.UI.Modules
|
|||
SonarrCacher = s.SonarrCacher,
|
||||
StoreBackup = s.StoreBackup,
|
||||
StoreCleanup = s.StoreCleanup,
|
||||
JobRecorder = jobsDict
|
||||
JobRecorder = jobsDict,
|
||||
RecentlyAddedCron = s.RecentlyAddedCron
|
||||
};
|
||||
return View["SchedulerSettings", model];
|
||||
}
|
||||
|
@ -986,6 +987,21 @@ namespace PlexRequests.UI.Modules
|
|||
Analytics.TrackEventAsync(Category.Admin, Action.Update, "Update ScheduledJobs", Username, CookieHelper.GetAnalyticClientId(Cookies));
|
||||
var settings = this.Bind<ScheduledJobsSettings>();
|
||||
|
||||
if (!string.IsNullOrEmpty(settings.RecentlyAddedCron))
|
||||
{
|
||||
// Validate CRON
|
||||
var isValid = CronExpression.IsValidExpression(settings.RecentlyAddedCron);
|
||||
|
||||
if (!isValid)
|
||||
{
|
||||
return Response.AsJson(new JsonResponseModel
|
||||
{
|
||||
Result = false,
|
||||
Message =
|
||||
$"CRON {settings.RecentlyAddedCron} is not valid. Please ensure you are using a valid CRON."
|
||||
});
|
||||
}
|
||||
}
|
||||
var result = await ScheduledJobSettings.SaveSettingsAsync(settings);
|
||||
|
||||
return Response.AsJson(result
|
||||
|
|
|
@ -35,6 +35,7 @@ namespace PlexRequests.UI.Modules
|
|||
Get["/local/{id}"] = x => LocalDetails((Guid)x.id);
|
||||
Get["/plex/{id}", true] = async (x, ct) => await PlexDetails(x.id);
|
||||
Get["/claims"] = x => GetClaims();
|
||||
Post["/updateuser"] = x => UpdateUser();
|
||||
}
|
||||
|
||||
private ICustomUserMapper UserMapper { get; }
|
||||
|
@ -57,15 +58,35 @@ namespace PlexRequests.UI.Modules
|
|||
|
||||
var userProps = ByteConverterHelper.ReturnObject<UserProperties>(user.UserProperties);
|
||||
|
||||
model.Add(new UserManagementUsersViewModel
|
||||
var m = new UserManagementUsersViewModel
|
||||
{
|
||||
Id = user.UserGuid,
|
||||
Claims = claimsString,
|
||||
Username = user.UserName,
|
||||
Type = UserType.LocalUser,
|
||||
EmailAddress = userProps.EmailAddress,
|
||||
ClaimsArray = claims
|
||||
});
|
||||
ClaimsArray = claims,
|
||||
ClaimsItem = new List<UserManagementUpdateModel.ClaimsModel>()
|
||||
};
|
||||
|
||||
// Add all of the current claims
|
||||
foreach (var c in claims)
|
||||
{
|
||||
m.ClaimsItem.Add(new UserManagementUpdateModel.ClaimsModel { Name = c, Selected = true });
|
||||
}
|
||||
|
||||
var allClaims = UserMapper.GetAllClaims();
|
||||
|
||||
// Get me the current claims that the user does not have
|
||||
var missingClaims = allClaims.Except(claims);
|
||||
|
||||
// Add them into the view
|
||||
foreach (var missingClaim in missingClaims)
|
||||
{
|
||||
m.ClaimsItem.Add(new UserManagementUpdateModel.ClaimsModel { Name = missingClaim, Selected = false });
|
||||
}
|
||||
|
||||
model.Add(m);
|
||||
}
|
||||
|
||||
var plexSettings = await PlexSettings.GetSettingsAsync();
|
||||
|
@ -121,6 +142,44 @@ namespace PlexRequests.UI.Modules
|
|||
return Response.AsJson(new JsonResponseModel { Result = false, Message = "Could not save user" });
|
||||
}
|
||||
|
||||
private Response UpdateUser()
|
||||
{
|
||||
var body = Request.Body.AsString();
|
||||
if (string.IsNullOrEmpty(body))
|
||||
{
|
||||
return Response.AsJson(new JsonResponseModel { Result = false, Message = "Could not save user, invalid JSON body" });
|
||||
}
|
||||
|
||||
var model = JsonConvert.DeserializeObject<UserManagementUpdateModel>(body);
|
||||
|
||||
if (string.IsNullOrWhiteSpace(model.Id))
|
||||
{
|
||||
return Response.AsJson(new JsonResponseModel
|
||||
{
|
||||
Result = true,
|
||||
Message = "Couldn't find the user"
|
||||
});
|
||||
}
|
||||
|
||||
var claims = new List<string>();
|
||||
|
||||
foreach (var c in model.Claims)
|
||||
{
|
||||
if (c.Selected)
|
||||
{
|
||||
claims.Add(c.Name);
|
||||
}
|
||||
}
|
||||
|
||||
var userFound = UserMapper.GetUser(new Guid(model.Id));
|
||||
|
||||
userFound.Claims = ByteConverterHelper.ReturnBytes(claims.ToArray());
|
||||
|
||||
var user = UserMapper.EditUser(userFound);
|
||||
|
||||
return Response.AsJson(user);
|
||||
}
|
||||
|
||||
private Response LocalDetails(Guid id)
|
||||
{
|
||||
var localUser = UserMapper.GetUser(id);
|
||||
|
|
|
@ -48,29 +48,40 @@ namespace PlexRequests.UI
|
|||
{
|
||||
try
|
||||
{
|
||||
Debug.WriteLine("Starting StartupConfiguration");
|
||||
Debug.WriteLine("Starting StartupConfiguration");
|
||||
var resolver = new DependancyResolver();
|
||||
|
||||
Debug.WriteLine("Created DI Resolver");
|
||||
Debug.WriteLine("Created DI Resolver");
|
||||
var modules = resolver.GetModules();
|
||||
Debug.WriteLine("Getting all the modules");
|
||||
Debug.WriteLine("Getting all the modules");
|
||||
|
||||
|
||||
Debug.WriteLine("Modules found finished.");
|
||||
Debug.WriteLine("Modules found finished.");
|
||||
var kernel = new StandardKernel(modules);
|
||||
Debug.WriteLine("Created Kernel and Injected Modules");
|
||||
Debug.WriteLine("Created Kernel and Injected Modules");
|
||||
|
||||
Debug.WriteLine("Added Contravariant Binder");
|
||||
Debug.WriteLine("Added Contravariant Binder");
|
||||
kernel.Components.Add<IBindingResolver, ContravariantBindingResolver>();
|
||||
|
||||
Debug.WriteLine("Start the bootstrapper with the Kernel.ı");
|
||||
app.UseNancy(options => options.Bootstrapper = new Bootstrapper(kernel));
|
||||
Debug.WriteLine("Finished bootstrapper");
|
||||
Debug.WriteLine("Start the bootstrapper with the Kernel.");
|
||||
app.UseNancy(options => options.Bootstrapper = new Bootstrapper(kernel));
|
||||
Debug.WriteLine("Finished bootstrapper");
|
||||
|
||||
|
||||
Debug.WriteLine("Migrating DB Now");
|
||||
var runner = kernel.Get<IMigrationRunner>();
|
||||
runner.MigrateToLatest();
|
||||
|
||||
|
||||
Debug.WriteLine("Settings up Scheduler");
|
||||
var scheduler = new Scheduler();
|
||||
scheduler.StartScheduler();
|
||||
|
||||
var runner = kernel.Get<IMigrationRunner>();
|
||||
runner.MigrateToLatest();
|
||||
//var c = kernel.Get<IRecentlyAdded>();
|
||||
//c.Test();
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
catch (Exception exception)
|
||||
|
|
|
@ -16,12 +16,30 @@
|
|||
<small>Note: This will require you to setup your email notifications</small>
|
||||
@if (Model.SendRecentlyAddedEmail)
|
||||
{
|
||||
<input type="checkbox" id="SendRecentlyAddedEmail" name="SendRecentlyAddedEmail" checked="checked"><label for="SendRecentlyAddedEmail">Send out a weekly email of recently added content to all your Plex 'Friends'</label>
|
||||
<input type="checkbox" id="SendRecentlyAddedEmail" name="SendRecentlyAddedEmail" checked="checked"><label for="SendRecentlyAddedEmail">Enable the newsletter of recently added content</label>
|
||||
}
|
||||
else
|
||||
{
|
||||
<input type="checkbox" id="SendRecentlyAddedEmail" name="SendRecentlyAddedEmail"><label for="SendRecentlyAddedEmail">Send out a weekly email of recently added content to all your Plex 'Friends'</label>
|
||||
<input type="checkbox" id="SendRecentlyAddedEmail" name="SendRecentlyAddedEmail"><label for="SendRecentlyAddedEmail">Enable the newsletter of recently added content</label>
|
||||
}
|
||||
|
||||
@if (Model.SendToPlexUsers)
|
||||
{
|
||||
<input type="checkbox" id="SendToPlexUsers" name="SendToPlexUsers" checked="checked"><label for="SendToPlexUsers">Send to all of your Plex 'Friends'</label>
|
||||
}
|
||||
else
|
||||
{
|
||||
<input type="checkbox" id="SendToPlexUsers" name="SendToPlexUsers"><label for="SendToPlexUsers">Send to all of your Plex 'Friends'</label>
|
||||
}
|
||||
|
||||
|
||||
<div class="form-group">
|
||||
<label for="StoreCleanup" class="control-label">A comma separated list of email addresses you want the newsletter to go to (For users that are not in your Plex Friends)</label>
|
||||
<div>
|
||||
<input type="text" class="form-control form-control-custom " placeholder="email@address.com;second@address.com" id="StoreCleanup" name="StoreCleanup" value="@Model.CustomUsers">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
<button id="recentlyAddedBtn" class="btn btn-primary-outline">Send test email to Admin</button>
|
||||
|
|
|
@ -78,11 +78,12 @@
|
|||
<input type="text" class="form-control form-control-custom " id="UserRequestLimitResetter" name="UserRequestLimitResetter" value="@Model.UserRequestLimitResetter">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<small>Please note, this uses a Quartz CRON job, you can build a CRON <a href="http://www.cronmaker.com/">Here</a></small>
|
||||
<div class="form-group">
|
||||
<label for="RecentlyAdded" class="control-label">Recently Added Email (hours)</label>
|
||||
<label for="RecentlyAddedCron" class="control-label">Recently Added Email (CRON)</label>
|
||||
<div>
|
||||
<input type="text" class="form-control form-control-custom " id="RecentlyAdded" name="RecentlyAdded" value="@Model.RecentlyAdded">
|
||||
<input type="text" class="form-control form-control-custom " id="RecentlyAddedCron" name="RecentlyAddedCron" value="@Model.RecentlyAddedCron">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
|
@ -188,19 +188,20 @@
|
|||
<form method="POST" action="@url/search/request/{{type}}" id="form{{id}}">
|
||||
<input name="{{type}}Id" type="text" value="{{id}}" hidden="hidden" />
|
||||
{{#if_eq type "movie"}}
|
||||
{{#if_eq available true}}
|
||||
<button style="text-align: right" class="btn btn-success-outline disabled" disabled><i class="fa fa-check"></i> @UI.Search_Available</button>
|
||||
<br />
|
||||
<br />
|
||||
<a style="text-align: right" class="btn btn-sm btn-primary-outline" href="{{url}}" target="_blank"><i class="fa fa-eye"></i> @UI.Search_ViewInPlex</a>
|
||||
{{else}}
|
||||
{{#if_eq requested true}}
|
||||
<button style="text-align: right" class="btn btn-primary-outline disabled" disabled><i class="fa fa-check"></i> @UI.Search_Requested</button>
|
||||
{{else}}
|
||||
<button id="{{id}}" style="text-align: right" class="btn btn-primary-outline requestMovie" type="submit"><i class="fa fa-plus"></i> @UI.Search_Request</button>
|
||||
{{/if_eq}}
|
||||
{{/if_eq}}
|
||||
{{#if_eq available true}}
|
||||
<button style="text-align: right" class="btn btn-success-outline disabled" disabled><i class="fa fa-check"></i> @UI.Search_Available</button>
|
||||
<br />
|
||||
<br />
|
||||
<a style="text-align: right" class="btn btn-sm btn-primary-outline" href="{{url}}" target="_blank"><i class="fa fa-eye"></i> @UI.Search_ViewInPlex</a>
|
||||
{{else}}
|
||||
{{#if_eq requested true}}
|
||||
<button style="text-align: right" class="btn btn-primary-outline disabled" disabled><i class="fa fa-check"></i> @UI.Search_Requested</button>
|
||||
{{else}}
|
||||
<button id="{{id}}" style="text-align: right" class="btn btn-primary-outline requestMovie" type="submit"><i class="fa fa-plus"></i> @UI.Search_Request</button>
|
||||
{{/if_eq}}
|
||||
{{/if_eq}}
|
||||
{{/if_eq}}
|
||||
|
||||
{{#if_eq type "tv"}}
|
||||
{{#if_eq tvFullyAvailable true}}
|
||||
@*//TODO Not used yet*@
|
||||
|
|
|
@ -116,8 +116,8 @@
|
|||
|
||||
<strong>Modify Roles:</strong>
|
||||
<!--Load all claims-->
|
||||
<div class="checkbox" ng-repeat="claim in claims">
|
||||
<input id="claimCheckboxEdit_{{$id}}" class="checkbox-custom" name="selectedClaims[]" ng-checked="@*//TODO: Need to figure our how to preselect them*@" ng-model="claim.selected" type="checkbox" value="claim" />
|
||||
<div class="checkbox" ng-repeat="claim in selectedUser.claimsItem">
|
||||
<input id="claimCheckboxEdit_{{$id}}" class="checkbox-custom" name="selectedClaims[]" ng-checked="claim.selected" ng-model="claim.selected" type="checkbox" value="claim" />
|
||||
<label for="claimCheckboxEdit_{{$id}}">{{claim.name}}</label>
|
||||
</div>
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue