Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Consensus simple merging #8953

Open
wants to merge 129 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 128 commits
Commits
Show all changes
129 commits
Select commit Hold shift + click to select a range
3f1feb1
Port server changes
zhiltsov-max Jan 13, 2025
00993e5
Port ui changes
zhiltsov-max Jan 13, 2025
389611f
Rename task Consensus tag
zhiltsov-max Jan 13, 2025
7d05dfd
Move consensus tag to parent jobs
zhiltsov-max Jan 13, 2025
1138992
Fix job item column width
zhiltsov-max Jan 13, 2025
2dc777c
Rename consensus jobs per job to consensus replicas field
zhiltsov-max Jan 13, 2025
b7f5f8e
Move to per job replica counts
zhiltsov-max Jan 13, 2025
68c51a3
Revert some changes
zhiltsov-max Jan 13, 2025
0329596
Update changelog
zhiltsov-max Jan 13, 2025
ab04a6d
Apply isort
zhiltsov-max Jan 14, 2025
3d7c1a2
Fix double assignment
zhiltsov-max Jan 14, 2025
3226dd7
Refactor
zhiltsov-max Jan 14, 2025
824cf82
Fix backups
zhiltsov-max Jan 14, 2025
a866667
Merge branch 'develop' into zm/consensus-task-creation
zhiltsov-max Jan 14, 2025
02d78b9
Fix field sending
zhiltsov-max Jan 14, 2025
b8b096c
Add task creation and data access tests
zhiltsov-max Jan 14, 2025
8f8a406
Update test assets
zhiltsov-max Jan 14, 2025
35b7ef1
Add backup tests
zhiltsov-max Jan 14, 2025
4ea54b4
Merge branch 'develop' into zm/consensus-task-creation
zhiltsov-max Jan 14, 2025
4c41c2a
Fix python 3.9 compatibility
zhiltsov-max Jan 15, 2025
2879010
Add annotations test for consensus task
zhiltsov-max Jan 15, 2025
f3de175
Fix project backup import
zhiltsov-max Jan 15, 2025
f92a3c3
Fix honeypot task selection
zhiltsov-max Jan 15, 2025
7bd100d
Add ui
zhiltsov-max Jan 15, 2025
5b7e2c2
Merge branch 'develop' into zm/consensus-task-creation
zhiltsov-max Jan 16, 2025
2eaddc3
Add server
zhiltsov-max Jan 16, 2025
9fa8dcb
Fixes
zhiltsov-max Jan 16, 2025
0e36b7d
Increase timeouts
zhiltsov-max Jan 17, 2025
16a1570
Fix invalid inheritance in tests
zhiltsov-max Jan 17, 2025
5d62dce
Merge branch 'zm/fix-test-inheritance' into zm/consensus-task-creation
zhiltsov-max Jan 17, 2025
781150a
Merge branch 'develop' into zm/consensus-task-creation
zhiltsov-max Jan 20, 2025
587d802
Revert extra change
zhiltsov-max Jan 20, 2025
259a23f
Update cvat-ui/src/components/jobs-page/jobs-filter-configuration.ts
zhiltsov-max Jan 20, 2025
083e60c
Merge branch 'develop' into zm/consensus-task-creation
zhiltsov-max Jan 20, 2025
489b8ee
Merge remote-tracking branch 'origin/zm/consensus-task-creation' into…
zhiltsov-max Jan 20, 2025
b0615d4
Extend job filter tests
zhiltsov-max Jan 20, 2025
1ecd6cf
Merge branch 'zm/consensus-task-creation' into zm/consensus-simple-me…
zhiltsov-max Jan 21, 2025
d7db85c
Merge branch 'develop' into zm/consensus-task-creation
klakhov Jan 22, 2025
14bd5d2
Refactor some code
zhiltsov-max Jan 22, 2025
607df7e
Fix consensus settings saves in ui
zhiltsov-max Jan 22, 2025
eef091a
applied ui changes
klakhov Jan 23, 2025
34d9515
Merge branch 'develop' into zm/consensus-task-creation
klakhov Jan 23, 2025
fb9b1aa
revert not necessary change
klakhov Jan 23, 2025
60bf620
Merge branch 'develop' into zm/consensus-task-creation
klakhov Jan 23, 2025
6c069a3
Refactor merging
zhiltsov-max Jan 23, 2025
815b45e
Refactor
zhiltsov-max Jan 24, 2025
00c3af2
Update server schema
zhiltsov-max Jan 27, 2025
3066452
Include deferred rq jobs in 202 response
zhiltsov-max Jan 27, 2025
fe5ef04
Create settings only for tasks with at least 1 consensus job
zhiltsov-max Jan 27, 2025
4983082
Update test assets
zhiltsov-max Jan 27, 2025
651f94a
Add debug task for consensus worker
zhiltsov-max Jan 27, 2025
b89ea7b
Add tests
zhiltsov-max Jan 27, 2025
8fee320
Disallow null value in task consensus_replicas
zhiltsov-max Jan 28, 2025
aa62db5
Rename related field
zhiltsov-max Jan 28, 2025
78a816e
Rename job type to consensus_replica
zhiltsov-max Jan 28, 2025
9c59005
Format code
zhiltsov-max Jan 28, 2025
9bc2494
Finalize job type renaming
zhiltsov-max Jan 28, 2025
6e20db0
Fix job cards on jobs page
zhiltsov-max Jan 28, 2025
9e60289
Revert extra change
zhiltsov-max Jan 28, 2025
054e262
Fix job type filter name
zhiltsov-max Jan 28, 2025
37400e9
Merge branch 'develop' into zm/consensus-task-creation
zhiltsov-max Jan 28, 2025
1075e0e
Update migration
zhiltsov-max Jan 28, 2025
5e9acb2
Add related query name
zhiltsov-max Jan 28, 2025
d3f9e1e
Merge branch 'develop' into zm/consensus-task-creation
zhiltsov-max Jan 30, 2025
7ce6904
Merge branch 'zm/consensus-task-creation' into zm/consensus-simple-me…
zhiltsov-max Jan 30, 2025
98907bf
Update migration
zhiltsov-max Jan 30, 2025
bd6268c
Update test data
zhiltsov-max Jan 30, 2025
deeac24
Merge branch 'develop' into zm/consensus-task-creation
zhiltsov-max Jan 30, 2025
6d168b3
Merge branch 'zm/consensus-task-creation' into zm/consensus-simple-me…
zhiltsov-max Jan 30, 2025
9c98cb1
Refactor some code
zhiltsov-max Jan 30, 2025
59050e3
Rename action
zhiltsov-max Jan 30, 2025
433cc20
Remove extra file
zhiltsov-max Jan 30, 2025
386d801
Update consensus job type uses
zhiltsov-max Jan 30, 2025
7bfa9c6
Refactor job actions menu, add modal on parent job merge
zhiltsov-max Jan 30, 2025
97f8813
Remove extra code
zhiltsov-max Jan 30, 2025
ddc7c58
Remove extra changes
zhiltsov-max Jan 30, 2025
8b2f709
Remove unused method
zhiltsov-max Jan 30, 2025
e5492a3
Make symbols public
zhiltsov-max Jan 30, 2025
5f42a3a
Update rq job status handling
zhiltsov-max Jan 30, 2025
2d37ee2
Update field name
zhiltsov-max Jan 30, 2025
0217037
Add type annotations
zhiltsov-max Jan 30, 2025
06434b8
Update test
zhiltsov-max Jan 30, 2025
9c6b747
Merge branch 'develop' into zm/refactor-quality-reports-impl
zhiltsov-max Jan 30, 2025
2a1c126
Add helm chart for consensus worker
zhiltsov-max Jan 30, 2025
fc829b1
Fix .gitignore
zhiltsov-max Jan 30, 2025
10019b8
Merge branch 'zm/refactor-quality-reports-impl' into zm/consensus-sim…
zhiltsov-max Jan 30, 2025
ba65cfb
Fix merge
zhiltsov-max Jan 30, 2025
d951f1a
Merge branch 'zm/refactor-quality-reports-impl' into zm/consensus-sim…
zhiltsov-max Jan 30, 2025
08d8421
Use fully qualified symbol name for internal datumaro symbols
zhiltsov-max Jan 31, 2025
5c2c10d
Merge branch 'zm/refactor-quality-reports-impl' into zm/consensus-sim…
zhiltsov-max Jan 31, 2025
25fb6c3
Fix some type references
zhiltsov-max Jan 31, 2025
b94d430
Refactor segment matching
zhiltsov-max Jan 31, 2025
abe9823
Merge branch 'zm/refactor-quality-reports-impl' into zm/consensus-sim…
zhiltsov-max Jan 31, 2025
8b7c83f
Fix skeleton cluster distance computation in merging
zhiltsov-max Jan 31, 2025
d3dea88
Update merging call to the recent datumaro api
zhiltsov-max Jan 31, 2025
d8b9837
t
zhiltsov-max Jan 31, 2025
bdb81aa
Refactor, improve code reuse
zhiltsov-max Jan 31, 2025
f618be4
Refactor
zhiltsov-max Jan 31, 2025
95ad74c
Merge branch 'develop' into zm/refactor-quality-reports-impl
zhiltsov-max Jan 31, 2025
66a74de
Fix warning
zhiltsov-max Jan 31, 2025
616be3a
Merge branch 'zm/refactor-quality-reports-impl' into zm/consensus-sim…
zhiltsov-max Jan 31, 2025
bcbe859
Fix warning
zhiltsov-max Jan 31, 2025
879d05e
Reduce code duplication
zhiltsov-max Jan 31, 2025
c0b1f31
Update license headers
zhiltsov-max Jan 31, 2025
41cd670
Fix warning
zhiltsov-max Jan 31, 2025
a2e9fc8
Fix warning
zhiltsov-max Jan 31, 2025
b1383bd
Fix warning
zhiltsov-max Jan 31, 2025
8002a7a
Merge branch 'zm/refactor-quality-reports-impl' into zm/consensus-sim…
zhiltsov-max Jan 31, 2025
1b6ce43
Refactor
zhiltsov-max Jan 31, 2025
bf5d53d
Refactor
zhiltsov-max Jan 31, 2025
6b2e9d1
Improve merge notification message
zhiltsov-max Feb 3, 2025
fefb258
Add missing statistics accumulation in skeleton merging
zhiltsov-max Feb 3, 2025
3c1d4cd
Fix merge status checks
zhiltsov-max Feb 3, 2025
61a0f1b
Fix segmentation merging - don't match masks to polygons
zhiltsov-max Feb 3, 2025
340f2c4
Disable annotation grouping
zhiltsov-max Feb 3, 2025
dc62d51
remove extra ignore
zhiltsov-max Feb 3, 2025
3ed23e9
Merge branch 'develop' into zm/refactor-quality-reports-impl
zhiltsov-max Feb 3, 2025
d45e8b3
Merge branch 'zm/refactor-quality-reports-impl' into zm/consensus-sim…
zhiltsov-max Feb 3, 2025
cc51852
Fix merging for tasks with tracks
zhiltsov-max Feb 3, 2025
8ccd0d8
Remove unused statistics collection code
zhiltsov-max Feb 3, 2025
846d477
Fix shape label computation
zhiltsov-max Feb 3, 2025
fcbed3a
Remove extra import
zhiltsov-max Feb 3, 2025
b9e605e
Fix symbol
zhiltsov-max Feb 3, 2025
ff7d32c
Add more tests
zhiltsov-max Feb 3, 2025
45dd8ae
Improve code reuse for rego rules
zhiltsov-max Feb 3, 2025
a6e6aa8
Fix task test assets
zhiltsov-max Feb 3, 2025
d03eb46
Merge branch 'develop' into zm/consensus-simple-merging
zhiltsov-max Feb 4, 2025
f3f9c9a
Fix merge
zhiltsov-max Feb 4, 2025
84df74d
Merge branch 'develop' into zm/consensus-simple-merging
zhiltsov-max Feb 5, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,26 @@
],
"justMyCode": false,
},
{
"name": "REST API tests: Attach to RQ consensus worker",
"type": "debugpy",
"request": "attach",
"connect": {
"host": "127.0.0.1",
"port": 9096
},
"pathMappings": [
{
"localRoot": "${workspaceFolder}",
"remoteRoot": "/home/django/"
},
{
"localRoot": "${workspaceFolder}/.env",
"remoteRoot": "/opt/venv",
}
],
"justMyCode": false,
},
{
"type": "pwa-chrome",
"request": "launch",
Expand Down Expand Up @@ -383,6 +403,28 @@
},
"console": "internalConsole"
},
{
"name": "server: RQ - consensus",
"type": "debugpy",
"request": "launch",
"stopOnEntry": false,
"justMyCode": false,
"python": "${command:python.interpreterPath}",
"program": "${workspaceRoot}/manage.py",
"args": [
"rqworker",
"consensus",
"--worker-class",
"cvat.rqworker.SimpleWorker"
],
"django": true,
"cwd": "${workspaceFolder}",
"env": {
"DJANGO_LOG_SERVER_HOST": "localhost",
"DJANGO_LOG_SERVER_PORT": "8282"
},
"console": "internalConsole"
},
{
"name": "server: migrate",
"type": "debugpy",
Expand Down Expand Up @@ -566,6 +608,7 @@
"server: RQ - analytics reports",
"server: RQ - cleaning",
"server: RQ - chunks",
"server: RQ - consensus",
]
}
]
Expand Down
16 changes: 16 additions & 0 deletions cvat-core/src/api-implementation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import { ArgumentError } from './exceptions';
import {
AnalyticsReportFilter, QualityConflictsFilter, QualityReportsFilter,
QualitySettingsFilter, SerializedAsset,
ConsensusSettingsFilter,
Comment on lines 35 to +36
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
QualitySettingsFilter, SerializedAsset,
ConsensusSettingsFilter,
QualitySettingsFilter, SerializedAsset, ConsensusSettingsFilter,

} from './server-response-types';
import QualityReport from './quality-report';
import QualityConflict, { ConflictSeverity } from './quality-conflict';
Expand All @@ -46,6 +47,7 @@ import { convertDescriptions, getServerAPISchema } from './server-schema';
import { JobType } from './enums';
import { PaginatedResource } from './core-types';
import CVATCore from '.';
import ConsensusSettings from './consensus-settings';
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should place it before annotation-actions


function implementationMixin(func: Function, implementation: Function): void {
Object.assign(func, { implementation });
Expand Down Expand Up @@ -414,6 +416,20 @@ export default function implementAPI(cvat: CVATCore): CVATCore {
return webhooks;
});

implementationMixin(cvat.consensus.settings.get, async (filter: ConsensusSettingsFilter) => {
checkFilter(filter, {
taskID: isInteger,
});

const params = fieldsToSnakeCase(filter);

const settings = await serverProxy.consensus.settings.get(params);
const schema = await getServerAPISchema();
const descriptions = convertDescriptions(schema.components.schemas.ConsensusSettings.properties);

return new ConsensusSettings({ ...settings, descriptions });
});

implementationMixin(cvat.analytics.quality.reports, async (filter: QualityReportsFilter) => {
checkFilter(filter, {
page: isInteger,
Expand Down
9 changes: 9 additions & 0 deletions cvat-core/src/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -378,6 +378,14 @@ function build(): CVATCore {
return result;
},
},
consensus: {
settings: {
async get(filter = {}) {
const result = await PluginRegistry.apiWrapper(cvat.consensus.settings.get, filter);
return result;
},
},
},
analytics: {
performance: {
async reports(filter = {}) {
Expand Down Expand Up @@ -482,6 +490,7 @@ function build(): CVATCore {
cvat.cloudStorages = Object.freeze(cvat.cloudStorages);
cvat.organizations = Object.freeze(cvat.organizations);
cvat.webhooks = Object.freeze(cvat.webhooks);
cvat.consensus = Object.freeze(cvat.consensus);
cvat.analytics = Object.freeze(cvat.analytics);
cvat.classes = Object.freeze(cvat.classes);
cvat.utils = Object.freeze(cvat.utils);
Expand Down
87 changes: 87 additions & 0 deletions cvat-core/src/consensus-settings.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
// Copyright (C) 2024 CVAT.ai Corporation
//
// SPDX-License-Identifier: MIT

import { SerializedConsensusSettingsData } from './server-response-types';
import PluginRegistry from './plugins';
import serverProxy from './server-proxy';
import { convertDescriptions, getServerAPISchema } from './server-schema';

export default class ConsensusSettings {
#id: number;
#task: number;
#iouThreshold: number;
#quorum: number;
#descriptions: Record<string, string>;

constructor(initialData: SerializedConsensusSettingsData) {
this.#id = initialData.id;
this.#task = initialData.task;
this.#iouThreshold = initialData.iou_threshold;
this.#quorum = initialData.quorum;
this.#descriptions = initialData.descriptions;
}

get id(): number {
return this.#id;
}

get task(): number {
return this.#task;
}

get iouThreshold(): number {
return this.#iouThreshold;
}

set iouThreshold(newVal: number) {
this.#iouThreshold = newVal;
}

get quorum(): number {
return this.#quorum;
}

set quorum(newVal: number) {
this.#quorum = newVal;
}

get descriptions(): Record<string, string> {
const descriptions: Record<string, string> = Object.keys(this.#descriptions).reduce((acc, key) => {
const camelCaseKey = _.camelCase(key);
acc[camelCaseKey] = this.#descriptions[key];
return acc;
}, {});

return descriptions;
}

public toJSON(): SerializedConsensusSettingsData {
const result: SerializedConsensusSettingsData = {
iou_threshold: this.#iouThreshold,
quorum: this.#quorum,
};

return result;
}

public async save(): Promise<ConsensusSettings> {
const result = await PluginRegistry.apiWrapper.call(this, ConsensusSettings.prototype.save);
return result;
}
}

Object.defineProperties(ConsensusSettings.prototype.save, {
implementation: {
writable: false,
enumerable: false,
value: async function implementation(): Promise<ConsensusSettings> {
const result = await serverProxy.consensus.settings.update(
this.id, this.toJSON(),
);
const schema = await getServerAPISchema();
const descriptions = convertDescriptions(schema.components.schemas.ConsensusSettings.properties);
return new ConsensusSettings({ ...result, descriptions });
},
},
});
7 changes: 7 additions & 0 deletions cvat-core/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import {
AnalyticsReportFilter, QualityConflictsFilter, QualityReportsFilter, QualitySettingsFilter,
ConsensusSettingsFilter,
} from './server-response-types';
import PluginRegistry from './plugins';
import serverProxy from './server-proxy';
Expand All @@ -30,6 +31,7 @@ import Webhook from './webhook';
import QualityReport from './quality-report';
import QualityConflict from './quality-conflict';
import QualitySettings from './quality-settings';
import ConsensusSettings from './consensus-settings';
import AnalyticsReport from './analytics-report';
import AnnotationGuide from './guide';
import { JobValidationLayout, TaskValidationLayout } from './validation-layout';
Expand Down Expand Up @@ -139,6 +141,11 @@ export default interface CVATCore {
webhooks: {
get: any;
};
consensus: {
settings: {
get: (filter: ConsensusSettingsFilter) => Promise<ConsensusSettings>;
};
}
analytics: {
quality: {
reports: (filter: QualityReportsFilter) => Promise<PaginatedResource<QualityReport>>;
Expand Down
81 changes: 81 additions & 0 deletions cvat-core/src/server-proxy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
SerializedInvitationData, SerializedCloudStorage, SerializedFramesMetaData, SerializedCollection,
SerializedQualitySettingsData, APIQualitySettingsFilter, SerializedQualityConflictData, APIQualityConflictsFilter,
SerializedQualityReportData, APIQualityReportsFilter, SerializedAnalyticsReport, APIAnalyticsReportFilter,
SerializedConsensusSettingsData, APIConsensusSettingsFilter,
SerializedRequest, SerializedJobValidationLayout, SerializedTaskValidationLayout,
} from './server-response-types';
import { PaginatedResource, UpdateStatusData } from './core-types';
Expand Down Expand Up @@ -244,7 +245,7 @@
return new ServerError(message, 0);
}

function prepareData(details) {

Check warning on line 248 in cvat-core/src/server-proxy.ts

View workflow job for this annotation

GitHub Actions / Linter

Missing return type on function
const data = new FormData();
for (const [key, value] of Object.entries(details)) {
if (Array.isArray(value)) {
Expand Down Expand Up @@ -286,7 +287,7 @@
return requestId++;
}

async function get(url: string, requestConfig) {

Check warning on line 290 in cvat-core/src/server-proxy.ts

View workflow job for this annotation

GitHub Actions / Linter

Missing return type on function
return new Promise((resolve, reject) => {
const newRequestId = getRequestId();
requests[newRequestId] = { resolve, reject };
Expand Down Expand Up @@ -767,6 +768,41 @@
}
}

async function mergeConsensusJobs(id: number, instanceType: string): Promise<void> {
const { backendAPI } = config;
const url = `${backendAPI}/consensus/merges`;
const params = {
rq_id: null,
};
const requestBody = {
task_id: undefined,
job_id: undefined,
};

if (instanceType === 'task') requestBody.task_id = id;
else requestBody.job_id = id;

return new Promise<void>((resolve, reject) => {
async function request() {

Check warning on line 786 in cvat-core/src/server-proxy.ts

View workflow job for this annotation

GitHub Actions / Linter

Missing return type on function
try {
const response = await Axios.post(url, requestBody, { params });
params.rq_id = response.data.rq_id;
klakhov marked this conversation as resolved.
Show resolved Hide resolved
const { status } = response;
if (status === 202) {
setTimeout(request, 3000);
} else if (status === 201) {
resolve();
} else {
reject(generateError(response));
}
} catch (errorData) {
reject(generateError(errorData));
}
}
setTimeout(request);
});
}

async function getLabels(filter: {
job_id?: number,
task_id?: number,
Expand Down Expand Up @@ -2182,6 +2218,42 @@
}
}

async function getConsensusSettings(
filter: APIConsensusSettingsFilter,
): Promise<SerializedConsensusSettingsData> {
const { backendAPI } = config;

try {
const response = await Axios.get(`${backendAPI}/consensus/settings`, {
params: {
...filter,
},
});

return response.data.results[0];
} catch (errorData) {
throw generateError(errorData);
}
}

async function updateConsensusSettings(
settingsID: number,
settingsData: SerializedConsensusSettingsData,
): Promise<SerializedConsensusSettingsData> {
const params = enableOrganization();
const { backendAPI } = config;

try {
const response = await Axios.patch(`${backendAPI}/consensus/settings/${settingsID}`, settingsData, {
params,
});

return response.data;
} catch (errorData) {
throw generateError(errorData);
}
}

async function getQualityConflicts(
filter: APIQualityConflictsFilter,
): Promise<SerializedQualityConflictData[]> {
Expand Down Expand Up @@ -2411,6 +2483,7 @@
backup: backupTask,
restore: restoreTask,
validationLayout: validationLayout('tasks'),
mergeConsensusJobs,
}),

labels: Object.freeze({
Expand All @@ -2427,6 +2500,7 @@
delete: deleteJob,
exportDataset: exportDataset('jobs'),
validationLayout: validationLayout('jobs'),
mergeConsensusJobs,
}),

users: Object.freeze({
Expand Down Expand Up @@ -2531,6 +2605,13 @@
}),
}),

consensus: Object.freeze({
settings: Object.freeze({
get: getConsensusSettings,
update: updateConsensusSettings,
}),
}),

requests: Object.freeze({
list: getRequestsList,
status: getRequestStatus,
Expand Down
15 changes: 15 additions & 0 deletions cvat-core/src/server-response-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -240,8 +240,15 @@ export interface SerializedOrganization {
export interface APIQualitySettingsFilter extends APICommonFilterParams {
task_id?: number;
}

export type QualitySettingsFilter = Camelized<APIQualitySettingsFilter>;

export interface APIConsensusSettingsFilter extends APICommonFilterParams {
task_id?: number;
}

export type ConsensusSettingsFilter = Camelized<APIConsensusSettingsFilter>;

export interface SerializedQualitySettingsData {
id?: number;
task?: number;
Expand Down Expand Up @@ -330,6 +337,14 @@ export interface SerializedQualityReportData {
};
}

export interface SerializedConsensusSettingsData {
id?: number;
task?: number;
quorum?: number;
iou_threshold?: number;
descriptions?: Record<string, string>;
}

export interface SerializedDataEntry {
date?: string;
value?: number | Record<string, number>
Expand Down
Loading
Loading