You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

147 lines
3.9 KiB

import 'reflect-metadata'
import { Expose, Type } from 'class-transformer'
export type ProjectType =
| 'DocumentClassification'
| 'SequenceLabeling'
| 'Seq2seq'
| 'IntentDetectionAndSlotFilling'
| 'ImageClassification'
| 'ImageCaptioning'
| 'BoundingBox'
| 'Segmentation'
| 'Speech2text'
export class ProjectReadItem {
id: number
name: string
description: string
guideline: string
users: number[]
tags: Object[]
@Expose({ name: 'project_type' })
projectType: ProjectType
@Expose({ name: 'updated_at' })
updatedAt: string
@Expose({ name: 'random_order' })
randomOrder: boolean
@Expose({ name: 'collaborative_annotation' })
collaborative_annotation: boolean
@Expose({ name: 'single_class_classification' })
exclusiveCategories: boolean
@Expose({ name: 'resourcetype' })
resourceType: string
@Expose({ name: 'allow_overlapping' })
allowOverlapping: boolean
@Expose({ name: 'grapheme_mode' })
graphemeMode: boolean
@Expose({ name: 'use_relation' })
useRelation: boolean
@Expose({ name: 'is_text_project' })
isTextProject: boolean
@Expose({ name: 'can_define_label' })
canDefineLabel: boolean
@Expose({ name: 'can_define_relation' })
canDefineRelation: boolean
@Expose({ name: 'can_define_span' })
canDefineSpan: boolean
@Expose({ name: 'can_define_category' })
canDefineCategory: boolean
get annotationPageLink(): string {
const mapping = {
DocumentClassification: 'text-classification',
SequenceLabeling: 'sequence-labeling',
Seq2seq: 'sequence-to-sequence',
IntentDetectionAndSlotFilling: 'intent-detection-and-slot-filling',
ImageClassification: 'image-classification',
ImageCaptioning: 'image-captioning',
BoundingBox: 'object-detection',
Segmentation: 'segmentation',
Speech2text: 'speech-to-text'
}
const url = `/projects/${this.id}/${mapping[this.projectType]}`
return url
}
get taskNames(): string[] {
if (this.projectType === 'IntentDetectionAndSlotFilling') {
return ['DocumentClassification', 'SequenceLabeling']
}
return [this.projectType]
}
}
export class ProjectItemList {
count: number
next: string | null
prev: string | null
@Type(() => ProjectReadItem)
@Expose({ name: 'results' })
items: ProjectReadItem[]
}
export class ProjectWriteItem {
constructor(
public id: number,
public name: string,
public description: string,
public guideline: string,
public project_type: ProjectType,
public random_order: boolean,
public collaborative_annotation: boolean,
public single_class_classification: boolean,
public allow_overlapping: boolean,
public grapheme_mode: boolean,
public use_relation: boolean,
public tags: string[]
) {}
get resourceType(): string {
const mapping = {
DocumentClassification: 'TextClassificationProject',
SequenceLabeling: 'SequenceLabelingProject',
Seq2seq: 'Seq2seqProject',
IntentDetectionAndSlotFilling: 'IntentDetectionAndSlotFillingProject',
ImageClassification: 'ImageClassificationProject',
ImageCaptioning: 'ImageCaptioningProject',
BoundingBox: 'BoundingBoxProject',
Segmentation: 'SegmentationProject',
Speech2text: 'Speech2textProject'
}
return mapping[this.project_type]
}
toObject(): Object {
return {
id: this.id,
name: this.name,
description: this.description,
guideline: this.guideline,
project_type: this.project_type,
random_order: this.random_order,
collaborative_annotation: this.collaborative_annotation,
single_class_classification: this.single_class_classification,
allow_overlapping: this.allow_overlapping,
grapheme_mode: this.grapheme_mode,
use_relation: this.use_relation,
tags: this.tags.map((tag) => ({ text: tag })),
resourcetype: this.resourceType
}
}
}