Skip to content

Commit 304b2b1

Browse files
authored
New: Record Import Exclusion reasons (#14)
1 parent d8426ce commit 304b2b1

File tree

11 files changed

+63
-5
lines changed

11 files changed

+63
-5
lines changed

frontend/src/Settings/ImportLists/ImportListExclusions/ImportListExclusionRow.tsx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,15 @@ interface ImportListExclusionRowProps extends ImportListExclusion {
2020
}
2121

2222
function ImportListExclusionRow(props: ImportListExclusionRowProps) {
23-
const { id, foreignId, type, movieTitle, isSelected, onSelectedChange } =
24-
props;
23+
const {
24+
id,
25+
foreignId,
26+
type,
27+
reason,
28+
movieTitle,
29+
isSelected,
30+
onSelectedChange,
31+
} = props;
2532

2633
const dispatch = useDispatch();
2734

@@ -52,6 +59,7 @@ function ImportListExclusionRow(props: ImportListExclusionRowProps) {
5259
<TableRowCell>{movieTitle}</TableRowCell>
5360
<TableRowCell className={styles.foreignId}>{foreignId}</TableRowCell>
5461
<TableRowCell>{type}</TableRowCell>
62+
<TableRowCell>{reason}</TableRowCell>
5563

5664
<TableRowCell className={styles.actions}>
5765
<IconButton

frontend/src/Settings/ImportLists/ImportListExclusions/ImportListExclusions.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,12 @@ const COLUMNS: Column[] = [
6060
isVisible: true,
6161
isSortable: true,
6262
},
63+
{
64+
name: 'reason',
65+
label: () => translate('Reason'),
66+
isVisible: true,
67+
isSortable: true,
68+
},
6369
{
6470
className: styles.actions,
6571
name: 'actions',
@@ -255,7 +261,7 @@ function ImportListExclusions() {
255261
})}
256262

257263
<TableRow>
258-
<TableRowCell colSpan={4}>
264+
<TableRowCell colSpan={5}>
259265
<SpinnerButton
260266
kind={kinds.DANGER}
261267
isSpinning={isDeleting}

frontend/src/typings/ImportListExclusion.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ export default interface ImportListExclusion extends ModelBase {
44
foreignId: string;
55
movieTitle: string;
66
type: string;
7+
reason: string;
78
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using FluentMigrator;
2+
using NzbDrone.Core.Datastore.Migration.Framework;
3+
4+
namespace NzbDrone.Core.Datastore.Migration
5+
{
6+
[Migration(014)]
7+
public class import_exclusion_reason : NzbDroneMigrationBase
8+
{
9+
protected override void MainDbUpgrade()
10+
{
11+
// Add 'Reason' column to 'ImportExclusions' table with default value 0 (Manual)
12+
Alter.Table("ImportExclusions").AddColumn("Reason").AsInt32().WithDefaultValue(0);
13+
}
14+
}
15+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
namespace NzbDrone.Core.ImportLists.ImportExclusions
2+
{
3+
public enum ImportExclusionReason
4+
{
5+
Manual,
6+
DuringDelete,
7+
PerformerExclusion,
8+
StudioExclusion,
9+
StudioAfterDate,
10+
TagExclusion
11+
}
12+
}

src/NzbDrone.Core/ImportLists/ImportExclusions/ImportListExclusion.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,19 @@ namespace NzbDrone.Core.ImportLists.ImportExclusions
44
{
55
public class ImportListExclusion : ModelBase
66
{
7+
public ImportListExclusion()
8+
{
9+
Reason = ImportExclusionReason.Manual;
10+
}
11+
712
public string ForeignId { get; set; }
813
public string MovieTitle { get; set; }
914
public ImportExclusionType Type { get; set; }
15+
public ImportExclusionReason Reason { get; set; }
1016

1117
public new string ToString()
1218
{
13-
return string.Format("Exclusion: [{0}][{1}][{2}]", Type, ForeignId, MovieTitle);
19+
return string.Format("Exclusion: [{0}-{1}] [{2}] [{3}]", Type, Reason, ForeignId, MovieTitle);
1420
}
1521
}
1622
}

src/NzbDrone.Core/Movies/AddMovieService.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,7 @@ private Movie SetPropertiesAndValidate(Movie newMovie)
263263
{
264264
if (_configService.WhisparrAlwaysExcludeStudiosTag.IsNullOrWhiteSpace())
265265
{
266+
newExclusion.Reason = ImportExclusionReason.StudioExclusion;
266267
_importListExclusionService.AddExclusion(newExclusion);
267268
throw new ValidationException($"Studio: [{newMovie.MovieMetadata.Value.Studio.Title}] has been excluded");
268269
}
@@ -288,6 +289,7 @@ private Movie SetPropertiesAndValidate(Movie newMovie)
288289
{
289290
if (_configService.WhisparrAlwaysExcludeStudiosAfterTag.IsNullOrWhiteSpace())
290291
{
292+
newExclusion.Reason = ImportExclusionReason.StudioAfterDate;
291293
_importListExclusionService.AddExclusion(newExclusion);
292294
throw new ValidationException($"Studio After Date: [{newMovie.MovieMetadata.Value.Studio.Title}] has an after date of {dateTime.ToString("yyyy-MM-dd")}. Marking movie as unmonitored.");
293295
}
@@ -316,6 +318,7 @@ private Movie SetPropertiesAndValidate(Movie newMovie)
316318
{
317319
if (_configService.WhisparrAlwaysExcludePerformersTag.IsNullOrWhiteSpace())
318320
{
321+
newExclusion.Reason = ImportExclusionReason.PerformerExclusion;
319322
_importListExclusionService.AddExclusion(newExclusion);
320323
throw new ValidationException($"Performer: [{string.Join(",", excludedPerformers.Select(ep => ep.ToString()).ToList())}] has been excluded");
321324
}
@@ -351,6 +354,7 @@ private Movie SetPropertiesAndValidate(Movie newMovie)
351354
{
352355
if (_configService.WhisparrAlwaysExcludeTagsTag.IsNullOrWhiteSpace())
353356
{
357+
newExclusion.Reason = ImportExclusionReason.TagExclusion;
354358
_importListExclusionService.AddExclusion(newExclusion);
355359
throw new ValidationException($"Tag(s): [{string.Join(",", exclusions.Select(et => et.ToString()).ToList())}] excluded");
356360
}

src/Whisparr.Api.V3/ImportLists/ImportListExclusionController.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,8 @@ public PagingResource<ImportListExclusionResource> GetImportListExclusionsPaged(
9898
"id",
9999
"foreignId",
100100
"movieTitle",
101-
"movieYear"
101+
"type",
102+
"reason"
102103
},
103104
"id",
104105
SortDirection.Descending);

src/Whisparr.Api.V3/ImportLists/ImportListExclusionResource.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ public class ImportListExclusionResource : ProviderResource<ImportListExclusionR
1010
public string ForeignId { get; set; }
1111
public string MovieTitle { get; set; }
1212
public ImportExclusionType Type { get; set; }
13+
public ImportExclusionReason Reason { get; set; }
1314
}
1415

1516
public static class ImportListExclusionResourceMapper
@@ -27,6 +28,7 @@ public static ImportListExclusionResource ToResource(this ImportListExclusion mo
2728
ForeignId = model.ForeignId,
2829
MovieTitle = model.MovieTitle,
2930
Type = model.Type,
31+
Reason = model.Reason,
3032
};
3133
}
3234

@@ -43,6 +45,7 @@ public static ImportListExclusion ToModel(this ImportListExclusionResource resou
4345
ForeignId = resource.ForeignId,
4446
MovieTitle = resource.MovieTitle,
4547
Type = resource.Type,
48+
Reason = resource.Reason,
4649
};
4750
}
4851

src/Whisparr.Api.V3/Performers/PerformerController.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ public void DeletePerformer(int id, bool deleteFiles = false, bool addImportExcl
206206
exclusion.ForeignId = performer.ForeignId;
207207
exclusion.MovieTitle = performer.Name;
208208
exclusion.Type = ImportExclusionType.Performer;
209+
exclusion.Reason = ImportExclusionReason.DuringDelete;
209210

210211
_exclusionService.AddExclusion(exclusion);
211212
}

0 commit comments

Comments
 (0)