details:
    type: markbookEntry
    name: Markbook - Marks
    table: gibbonMarkbookEntry
    modes: { update: true, insert: true, export: true }
access:
    module: Markbook
    action: Edit Markbook_everything
primaryKey:
    gibbonMarkbookEntryID
uniqueKeys:
    - [ gibbonMarkbookColumnID, gibbonPersonIDStudent ]
table:
    gibbonSchoolYearID: 
        name: "School Year"
        desc: "School year name, as set in School Admin. Must already exist."
        args: { filter: schoolyear, required: true, custom: true, readonly: true }
        relationship: { table: gibbonSchoolYear, key: gibbonSchoolYearID, field: name  }
    gibbonCourseID: 
        name: "Course"
        desc: "Short Name"
        args: { filter: string, required: true, custom: true, readonly: true }
        relationship: { table: gibbonCourse, key: gibbonCourseID, field: [ nameShort, gibbonSchoolYearID ]  }
    gibbonCourseClassID: 
        name: "Class"
        desc: "Short Name"
        args: { filter: string, required: true, custom: true, readonly: true }
        relationship: { table: gibbonCourseClass, key: gibbonCourseClassID, field: [ nameShort, gibbonCourseID ]  }
    gibbonMarkbookColumnID: 
        name: "Markbook Column"
        desc: "Name"
        args: { filter: string, required: true }
        relationship: { table: gibbonMarkbookColumn, key: gibbonMarkbookColumnID, field: [ name, gibbonCourseClassID ]  }
    gibbonPersonIDStudent: 
        name: "Student"
        desc: "Username, Email or Student ID"
        args: { filter: string, required: true }
        relationship: { table: gibbonPerson, key: gibbonPersonID, join: gibbonCourseClassPerson, on: [gibbonPersonID, gibbonPersonID], field: [username, gibbonCourseClassID] }
    attainmentValue: 
        name: "Attainment Value"
        desc: ""
        args: { filter: string, custom: true }
    attainmentValueRaw: 
        name: "Attainment Raw Value"
        desc: ""
        args: { filter: string, custom: true }
    attainmentDescriptor: 
        name: "Attainment Descriptor"
        desc: ""
        args: { filter: string, linked: attainmentValue }
        relationship: { table: gibbonScaleGrade, key: descriptor, join: gibbonMarkbookColumn, on: [gibbonScaleIDAttainment, gibbonScaleID], field: [ value, gibbonMarkbookColumnID ] }
    attainmentConcern: 
        name: "Attainment Concern?"
        desc: ""
        args: { filter: string, custom: true }
    effortValue: 
        name: "Effort Value"
        desc: ""
        args: { filter: string, custom: true }
    effortDescriptor: 
        name: "Effort Descriptor"
        desc: ""
        args: { filter: string, linked: effortValue }
        relationship: { table: gibbonScaleGrade, key: descriptor, join: gibbonMarkbookColumn, on: [gibbonScaleIDEffort, gibbonScaleID], field: [ value, gibbonMarkbookColumnID ] }
    effortConcern: 
        name: "Effort Concern?"
        desc: ""
        args: { filter: string, custom: true }
    comment: 
        name: "Comment"
        desc: ""
        args: { filter: string, custom: true }
