mirror of
https://github.com/Ombi-app/Ombi.git
synced 2025-07-11 07:46:05 -07:00
More for #273
This commit is contained in:
parent
6067a4743e
commit
9ffe184dd3
11 changed files with 67 additions and 56 deletions
|
@ -25,19 +25,15 @@
|
||||||
// ************************************************************************/
|
// ************************************************************************/
|
||||||
#endregion
|
#endregion
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
using Moq;
|
using Moq;
|
||||||
|
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
|
|
||||||
using PlexRequests.Api.Interfaces;
|
using PlexRequests.Api.Interfaces;
|
||||||
using PlexRequests.Api.Models.Plex;
|
|
||||||
using PlexRequests.Core;
|
using PlexRequests.Core;
|
||||||
using PlexRequests.Core.SettingModels;
|
using PlexRequests.Core.SettingModels;
|
||||||
using PlexRequests.Helpers.Exceptions;
|
|
||||||
using PlexRequests.Services.Interfaces;
|
using PlexRequests.Services.Interfaces;
|
||||||
using PlexRequests.Store;
|
|
||||||
using PlexRequests.Helpers;
|
using PlexRequests.Helpers;
|
||||||
using PlexRequests.Services.Jobs;
|
using PlexRequests.Services.Jobs;
|
||||||
using PlexRequests.Store.Models;
|
using PlexRequests.Store.Models;
|
||||||
|
|
|
@ -152,7 +152,6 @@ namespace PlexRequests.Services.Jobs
|
||||||
if (names.Length > 1)
|
if (names.Length > 1)
|
||||||
{
|
{
|
||||||
DateTime parsed;
|
DateTime parsed;
|
||||||
//DateTime.TryParseExcat(names[1], "yyyy-MM-dd hh.mm.ss",CultureInfo.CurrentUICulture, DateTimeStyles.None, out parsed);
|
|
||||||
DateTime.TryParse(names[2], out parsed);
|
DateTime.TryParse(names[2], out parsed);
|
||||||
return parsed;
|
return parsed;
|
||||||
|
|
||||||
|
|
|
@ -654,10 +654,8 @@ function buildRequestContext(result, type) {
|
||||||
released: result.released,
|
released: result.released,
|
||||||
available: result.available,
|
available: result.available,
|
||||||
admin: result.admin,
|
admin: result.admin,
|
||||||
issues: result.issues,
|
issueId: result.issueId,
|
||||||
otherMessage: result.otherMessage,
|
|
||||||
requestId: result.id,
|
requestId: result.id,
|
||||||
adminNote: result.adminNotes,
|
|
||||||
imdb: result.imdbId,
|
imdb: result.imdbId,
|
||||||
seriesRequested: result.tvSeriesRequestType,
|
seriesRequested: result.tvSeriesRequestType,
|
||||||
coverArtUrl: result.coverArtUrl,
|
coverArtUrl: result.coverArtUrl,
|
||||||
|
|
|
@ -49,9 +49,7 @@ namespace PlexRequests.UI.Models
|
||||||
public string ReleaseYear { get; set; }
|
public string ReleaseYear { get; set; }
|
||||||
public bool Available { get; set; }
|
public bool Available { get; set; }
|
||||||
public bool Admin { get; set; }
|
public bool Admin { get; set; }
|
||||||
public string Issues { get; set; }
|
public int IssueId { get; set; }
|
||||||
public string OtherMessage { get; set; }
|
|
||||||
public string AdminNotes { get; set; }
|
|
||||||
public string TvSeriesRequestType { get; set; }
|
public string TvSeriesRequestType { get; set; }
|
||||||
public string MusicBrainzId { get; set; }
|
public string MusicBrainzId { get; set; }
|
||||||
public QualityModel[] Qualities { get; set; }
|
public QualityModel[] Qualities { get; set; }
|
||||||
|
|
|
@ -87,21 +87,21 @@ namespace PlexRequests.UI.Modules
|
||||||
|
|
||||||
protected BaseAuthModule(ISettingsService<PlexRequestSettings> pr) : base(pr)
|
protected BaseAuthModule(ISettingsService<PlexRequestSettings> pr) : base(pr)
|
||||||
{
|
{
|
||||||
Service = pr;
|
PlexRequestSettings = pr;
|
||||||
Before += (ctx) => CheckAuth();
|
Before += (ctx) => CheckAuth();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected BaseAuthModule(string modulePath, ISettingsService<PlexRequestSettings> pr) : base(modulePath, pr)
|
protected BaseAuthModule(string modulePath, ISettingsService<PlexRequestSettings> pr) : base(modulePath, pr)
|
||||||
{
|
{
|
||||||
Service = pr;
|
PlexRequestSettings = pr;
|
||||||
Before += (ctx) => CheckAuth();
|
Before += (ctx) => CheckAuth();
|
||||||
}
|
}
|
||||||
|
|
||||||
private ISettingsService<PlexRequestSettings> Service { get; }
|
protected ISettingsService<PlexRequestSettings> PlexRequestSettings { get; }
|
||||||
|
|
||||||
private Response CheckAuth()
|
private Response CheckAuth()
|
||||||
{
|
{
|
||||||
var settings = Service.GetSettings();
|
var settings = PlexRequestSettings.GetSettings();
|
||||||
var baseUrl = settings.BaseUrl;
|
var baseUrl = settings.BaseUrl;
|
||||||
|
|
||||||
var redirectPath = string.IsNullOrEmpty(baseUrl) ? "~/userlogin" : $"~/{baseUrl}/userlogin";
|
var redirectPath = string.IsNullOrEmpty(baseUrl) ? "~/userlogin" : $"~/{baseUrl}/userlogin";
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
using System.Linq;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
using Nancy;
|
using Nancy;
|
||||||
|
@ -23,7 +25,7 @@ namespace PlexRequests.UI.Modules
|
||||||
|
|
||||||
Get["/issuecount", true] = async (x, ct) => await IssueCount();
|
Get["/issuecount", true] = async (x, ct) => await IssueCount();
|
||||||
|
|
||||||
Get["/details/{id}", true] = async (x, ct) => await Details(x.id);
|
Get["/{id}", true] = async (x, ct) => await Details(x.id);
|
||||||
|
|
||||||
Post["/issue", true] = async (x, ct) => await ReportIssue((int)Request.Form.requestId, (IssueState)(int)Request.Form.issue, null);
|
Post["/issue", true] = async (x, ct) => await ReportIssue((int)Request.Form.requestId, (IssueState)(int)Request.Form.issue, null);
|
||||||
Post["/issuecomment", true] = async (x, ct) => await ReportIssue((int)Request.Form.requestId, IssueState.Other, (string)Request.Form.commentArea);
|
Post["/issuecomment", true] = async (x, ct) => await ReportIssue((int)Request.Form.requestId, IssueState.Other, (string)Request.Form.commentArea);
|
||||||
|
@ -40,13 +42,35 @@ namespace PlexRequests.UI.Modules
|
||||||
public async Task<Response> IssueCount()
|
public async Task<Response> IssueCount()
|
||||||
{
|
{
|
||||||
var issues = await IssuesService.GetAllAsync();
|
var issues = await IssuesService.GetAllAsync();
|
||||||
var count = issues.Count(x => x.Deleted == false);
|
var settings = PlexRequestSettings.GetSettings();
|
||||||
|
|
||||||
|
IEnumerable<IssueModel> myIssues;
|
||||||
|
|
||||||
|
if (IsAdmin)
|
||||||
|
{
|
||||||
|
myIssues = issues.Where(x => x.Deleted == false).SelectMany(i => i.Issues);
|
||||||
|
}
|
||||||
|
else if (settings.UsersCanViewOnlyOwnRequests)
|
||||||
|
{
|
||||||
|
myIssues = (from issuesModel in issues
|
||||||
|
from i in issuesModel.Issues
|
||||||
|
where i.UserReported.Equals(Username, StringComparison.CurrentCultureIgnoreCase)
|
||||||
|
select i).ToList();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
myIssues = issues.Where(x => x.Deleted == false).SelectMany(i => i.Issues);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var count = myIssues.Count();
|
||||||
|
|
||||||
return Response.AsJson(count);
|
return Response.AsJson(count);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<Negotiator> Details(int id)
|
public async Task<Negotiator> Details(int id)
|
||||||
{
|
{
|
||||||
|
|
||||||
var issue = await IssuesService.GetAsync(id);
|
var issue = await IssuesService.GetAsync(id);
|
||||||
|
|
||||||
return issue == null
|
return issue == null
|
||||||
|
|
|
@ -76,7 +76,7 @@ namespace PlexRequests.UI.Modules
|
||||||
Get["/"] = _ => LoadRequests();
|
Get["/"] = _ => LoadRequests();
|
||||||
Get["/movies", true] = async (x, ct) => await GetMovies();
|
Get["/movies", true] = async (x, ct) => await GetMovies();
|
||||||
Get["/tvshows", true] = async (c, ct) => await GetTvShows();
|
Get["/tvshows", true] = async (c, ct) => await GetTvShows();
|
||||||
Get["/albums", true] = async (x,ct) => await GetAlbumRequests();
|
Get["/albums", true] = async (x, ct) => await GetAlbumRequests();
|
||||||
Post["/delete", true] = async (x, ct) => await DeleteRequest((int)Request.Form.id);
|
Post["/delete", true] = async (x, ct) => await DeleteRequest((int)Request.Form.id);
|
||||||
Post["/reportissue", true] = async (x, ct) => await ReportIssue((int)Request.Form.requestId, (IssueState)(int)Request.Form.issue, null);
|
Post["/reportissue", true] = async (x, ct) => await ReportIssue((int)Request.Form.requestId, (IssueState)(int)Request.Form.issue, null);
|
||||||
Post["/reportissuecomment", true] = async (x, ct) => await ReportIssue((int)Request.Form.requestId, IssueState.Other, (string)Request.Form.commentArea);
|
Post["/reportissuecomment", true] = async (x, ct) => await ReportIssue((int)Request.Form.requestId, IssueState.Other, (string)Request.Form.commentArea);
|
||||||
|
@ -156,9 +156,7 @@ namespace PlexRequests.UI.Modules
|
||||||
ReleaseYear = movie.ReleaseDate.Year.ToString(),
|
ReleaseYear = movie.ReleaseDate.Year.ToString(),
|
||||||
Available = movie.Available,
|
Available = movie.Available,
|
||||||
Admin = IsAdmin,
|
Admin = IsAdmin,
|
||||||
Issues = movie.Issues.ToString().CamelCaseToWords(),
|
IssueId = movie.IssueId,
|
||||||
OtherMessage = movie.OtherMessage,
|
|
||||||
AdminNotes = movie.AdminNote,
|
|
||||||
Qualities = qualities.ToArray()
|
Qualities = qualities.ToArray()
|
||||||
}).ToList();
|
}).ToList();
|
||||||
|
|
||||||
|
@ -223,9 +221,7 @@ namespace PlexRequests.UI.Modules
|
||||||
ReleaseYear = tv.ReleaseDate.Year.ToString(),
|
ReleaseYear = tv.ReleaseDate.Year.ToString(),
|
||||||
Available = tv.Available,
|
Available = tv.Available,
|
||||||
Admin = IsAdmin,
|
Admin = IsAdmin,
|
||||||
Issues = tv.Issues.ToString().CamelCaseToWords(),
|
IssueId = tv.IssueId,
|
||||||
OtherMessage = tv.OtherMessage,
|
|
||||||
AdminNotes = tv.AdminNote,
|
|
||||||
TvSeriesRequestType = tv.SeasonsRequested,
|
TvSeriesRequestType = tv.SeasonsRequested,
|
||||||
Qualities = qualities.ToArray()
|
Qualities = qualities.ToArray()
|
||||||
};
|
};
|
||||||
|
@ -266,9 +262,7 @@ namespace PlexRequests.UI.Modules
|
||||||
ReleaseYear = album.ReleaseDate.Year.ToString(),
|
ReleaseYear = album.ReleaseDate.Year.ToString(),
|
||||||
Available = album.Available,
|
Available = album.Available,
|
||||||
Admin = IsAdmin,
|
Admin = IsAdmin,
|
||||||
Issues = album.Issues.ToString().CamelCaseToWords(),
|
IssueId = album.IssueId,
|
||||||
OtherMessage = album.OtherMessage,
|
|
||||||
AdminNotes = album.AdminNote,
|
|
||||||
TvSeriesRequestType = album.SeasonsRequested,
|
TvSeriesRequestType = album.SeasonsRequested,
|
||||||
MusicBrainzId = album.MusicBrainzId,
|
MusicBrainzId = album.MusicBrainzId,
|
||||||
ArtistName = album.ArtistName
|
ArtistName = album.ArtistName
|
||||||
|
|
|
@ -510,6 +510,9 @@
|
||||||
<Content Include="Views\Admin\SlackNotifications.cshtml">
|
<Content Include="Views\Admin\SlackNotifications.cshtml">
|
||||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
|
<Content Include="Views\Issues\Index.cshtml">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
<None Include="Web.Debug.config">
|
<None Include="Web.Debug.config">
|
||||||
<DependentUpon>web.config</DependentUpon>
|
<DependentUpon>web.config</DependentUpon>
|
||||||
</None>
|
</None>
|
||||||
|
|
1
PlexRequests.UI/Views/Issues/Index.cshtml
Normal file
1
PlexRequests.UI/Views/Issues/Index.cshtml
Normal file
|
@ -0,0 +1 @@
|
||||||
|
|
|
@ -65,7 +65,7 @@
|
||||||
<li><a href="#" class="filter" data-filter=".approved-true"><i class="fa fa-square-o"></i> Approved</a></li>
|
<li><a href="#" class="filter" data-filter=".approved-true"><i class="fa fa-square-o"></i> Approved</a></li>
|
||||||
<li><a href="#" class="filter" data-filter=".approved-false"><i class="fa fa-square-o"></i> Not Approved</a></li>
|
<li><a href="#" class="filter" data-filter=".approved-false"><i class="fa fa-square-o"></i> Not Approved</a></li>
|
||||||
<li><a href="#" class="filter" data-filter=".available-true"><i class="fa fa-square-o"></i> Available</a></li>
|
<li><a href="#" class="filter" data-filter=".available-true"><i class="fa fa-square-o"></i> Available</a></li>
|
||||||
<li><a href="#" class="filter" data-filter=".available-false"><i class="fa fa-square-o"></i> Not Available</a></li>
|
<li><a href="#" class="filter" data-filter=".available-false"><i class="fa fa-square-o"></i> Not Available</a></li>
|
||||||
<li><a href="#" class="filter" data-filter=".released-true"><i class="fa fa-square-o"></i> Released</a></li>
|
<li><a href="#" class="filter" data-filter=".released-true"><i class="fa fa-square-o"></i> Released</a></li>
|
||||||
<li><a href="#" class="filter" data-filter=".released-false"><i class="fa fa-square-o"></i> Not Released</a></li>
|
<li><a href="#" class="filter" data-filter=".released-false"><i class="fa fa-square-o"></i> Not Released</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -135,7 +135,7 @@
|
||||||
<div class="col-sm-2">
|
<div class="col-sm-2">
|
||||||
{{#if_eq type "movie"}}
|
{{#if_eq type "movie"}}
|
||||||
{{#if posterPath}}
|
{{#if posterPath}}
|
||||||
<img class="img-responsive" src="https://image.tmdb.org/t/p/w150/{{posterPath}}" alt="poster">
|
<img class="img-responsive" src="https://image.tmdb.org/t/p/w150/{{posterPath}}" alt="poster">
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{/if_eq}}
|
{{/if_eq}}
|
||||||
{{#if_eq type "tv"}}
|
{{#if_eq type "tv"}}
|
||||||
|
@ -178,17 +178,13 @@
|
||||||
<div>Requested By: {{requestedUsers}}</div>
|
<div>Requested By: {{requestedUsers}}</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
<div>Requested Date: {{requestedDate}}</div>
|
<div>Requested Date: {{requestedDate}}</div>
|
||||||
<div id="issueArea{{requestId}}">
|
<div>
|
||||||
{{#if otherMessage}}
|
Issue:
|
||||||
<div>Message: {{otherMessage}}</div>
|
{{#if_eq issueId 0}}
|
||||||
|
<i class="fa fa-times"></i>
|
||||||
{{else}}
|
{{else}}
|
||||||
<div>Issue: {{issues}}</div>
|
<a href="/issues/{{issueId}}"><i class="fa fa-check"></i></a>
|
||||||
{{/if}}
|
{{/if_eq}}
|
||||||
</div>
|
|
||||||
<div id="adminNotesArea{{requestId}}">
|
|
||||||
{{#if adminNote}}
|
|
||||||
<div>Note from Admin: {{adminNote}}</div>
|
|
||||||
{{/if}}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-3 col-sm-push-3">
|
<div class="col-sm-3 col-sm-push-3">
|
||||||
|
@ -197,20 +193,20 @@
|
||||||
<form method="POST" action="@formAction/approval/approve" id="approve{{requestId}}">
|
<form method="POST" action="@formAction/approval/approve" id="approve{{requestId}}">
|
||||||
<input name="requestId" type="text" value="{{requestId}}" hidden="hidden" />
|
<input name="requestId" type="text" value="{{requestId}}" hidden="hidden" />
|
||||||
{{#if_eq hasQualities true}}
|
{{#if_eq hasQualities true}}
|
||||||
<div class="btn-group btn-split">
|
<div class="btn-group btn-split">
|
||||||
<button type="button" class="btn btn-sm btn-success-outline approve" id="{{requestId}}" custom-button="{{requestId}}"><i class="fa fa-plus"></i> Approve</button>
|
<button type="button" class="btn btn-sm btn-success-outline approve" id="{{requestId}}" custom-button="{{requestId}}"><i class="fa fa-plus"></i> Approve</button>
|
||||||
<button type="button" class="btn btn-success-outline dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
<button type="button" class="btn btn-success-outline dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||||
<span class="caret"></span>
|
<span class="caret"></span>
|
||||||
<span class="sr-only">Toggle Dropdown</span>
|
<span class="sr-only">Toggle Dropdown</span>
|
||||||
</button>
|
</button>
|
||||||
<ul class="dropdown-menu">
|
<ul class="dropdown-menu">
|
||||||
{{#each qualities}}
|
{{#each qualities}}
|
||||||
<li><a href="#" class="approve-with-quality" id="{{id}}">{{name}}</a></li>
|
<li><a href="#" class="approve-with-quality" id="{{id}}">{{name}}</a></li>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
{{else}}
|
{{else}}
|
||||||
<button id="{{requestId}}" custom-button="{{requestId}}" style="text-align: right" class="btn btn-sm btn-success-outline approve" type="submit"><i class="fa fa-plus"></i> Approve</button>
|
<button id="{{requestId}}" custom-button="{{requestId}}" style="text-align: right" class="btn btn-sm btn-success-outline approve" type="submit"><i class="fa fa-plus"></i> Approve</button>
|
||||||
{{/if_eq}}
|
{{/if_eq}}
|
||||||
</form>
|
</form>
|
||||||
{{/if_eq}}
|
{{/if_eq}}
|
||||||
|
@ -405,7 +401,7 @@
|
||||||
</div>
|
</div>
|
||||||
<form method="POST" action="@formAction/requests/addnote" id="noteForm">
|
<form method="POST" action="@formAction/requests/addnote" id="noteForm">
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<input name="requestId" class="noteId" type="text" hidden="hidden" value=""/>
|
<input name="requestId" class="noteId" type="text" hidden="hidden" value="" />
|
||||||
<textarea class="form-control form-control-custom" rows="3" id="noteArea" name="noteArea"></textarea>
|
<textarea class="form-control form-control-custom" rows="3" id="noteArea" name="noteArea"></textarea>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
<ul class="nav navbar-nav">
|
<ul class="nav navbar-nav">
|
||||||
@Html.GetNavbarUrl(Context, "/search", "Search", "search")
|
@Html.GetNavbarUrl(Context, "/search", "Search", "search")
|
||||||
@Html.GetNavbarUrl(Context, "/requests", "Requests", "plus-circle")
|
@Html.GetNavbarUrl(Context, "/requests", "Requests", "plus-circle")
|
||||||
@Html.GetNavbarUrl(Context, "/issues", "Issues", "exclamation", "<span id=\"issueCount\" class=\"badge\">0</span>")
|
@Html.GetNavbarUrl(Context, "/issues", "Issues", "exclamation", "<span id=\"issueCount\"></span>")
|
||||||
|
|
||||||
</ul>
|
</ul>
|
||||||
<ul class="nav navbar-nav navbar-right">
|
<ul class="nav navbar-nav navbar-right">
|
||||||
|
@ -133,7 +133,9 @@
|
||||||
dataType: "json",
|
dataType: "json",
|
||||||
success: function (response) {
|
success: function (response) {
|
||||||
if (response) {
|
if (response) {
|
||||||
$('#issueCount').html(response);
|
if(response > 0)
|
||||||
|
$('#issueCount').addClass("badge");
|
||||||
|
$('#issueCount').html(+response);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
error: function (e) {
|
error: function (e) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue