Source code for uw.scientia.uef_records

"""Cyon record type definitions.
"""

from collections import namedtuple

from .uef_lines import UEFRecord
from .uef_types import *

__all__ = [
    'UEFDeclareEntityRecord',
    'UEFNameRecord',
    'UEFDescriptionRecord',
    'UEFNameGroupRecord',
    'UEFDescriptionForGroupRecord',
    'UEFMemberToGroupRecord',
    'UEFDepartmentRecord',
    'UEFSizeCapacityRecord',
    'UEFSuitabilityRecord',
    'UEFStudentRecord',
    'UEFPreferenceTimeRecord',
    'UEFDurationRecord',
    'UEFStartAndEndDaysRecord',
    'UEFWeekPatternRecord',
    'UEFUnavailableOnSingleDayRecord',
    'UEFUnavailablesAcrossWeekPatternRecord',
    'UEFUnavailableDaysRecord',
    'UEFExamAvailablesAcrossWeekPatternRecord',
    'UEFRequiredSuitabilityForStaffMemberRecord',
    'UEFRequiredSuitabilityForLocationRecord',
    'UEFCandidateNumberRecord',
    'UEFExaminationsRecord',
    'UEFNotesRecord',
]

class UEFHostRecord (UEFRecord):
    def __init__ (self, base, key, *values):
        super ().__init__ (base)
        self.__key = key
        nt, field_defs = self.field_defs
        self.__values = nt (*(f (v) for f, v in zip (field_defs, values)))

    @property
    def key (self):
        return self.__key

    @property
    def values (self):
        return self.__values

    @property
    def fields (self):
        yield from super ().fields
        yield self.key
        for v in self.values:
            yield v.format ()

def declareRecord (field, fields):
    names = [n for n, t in fields]
    nt = namedtuple ('__'.join (names) or '__', names)
    field_defs = nt (*(t for n, t in fields))

    class result (UEFHostRecord):
        @property
        def field (self):
            return field

        @property
        def field_defs (self):
            return nt, field_defs

    return result

UEFDeclareEntityRecord = declareRecord (0, [])

UEFNameRecord = declareRecord (4, [('name', UEFTextNullable)])

UEFDescriptionRecord = declareRecord (5, [('description', UEFTextNullable)])

UEFNameGroupRecord = declareRecord (14, [('name', UEFTextNullable)])

UEFDescriptionForGroupRecord = declareRecord (15, [('description', UEFTextNullable)])

UEFMemberToGroupRecord = declareRecord (16, [
    ('operator', UEFSetOperator),
    ('member_key', UEFHostKeyNullable),
])

UEFDepartmentRecord = declareRecord (20, [('department_key', UEFTextNullable)])

UEFSizeCapacityRecord = declareRecord (21, [('capacity', UEFPositiveInteger)])

UEFSuitabilityRecord = declareRecord (23, [
    ('operator', UEFSetOperator),
    ('suitability_key', UEFHostKeyNullable),
    ('primary', UEFBoolean),
])

UEFStudentRecord = declareRecord (30, [
    ('operator', UEFSetOperator),
    ('student_key', UEFHostKeyNullable),
])

UEFPreferenceTimeRecord = declareRecord (50, [
    ('day_of_week', UEFWeekDay),
    ('start_time', UEFMinuteTime),
    ('end_time', UEFMinuteTime),
    ('preference', UEFPreference),
    ('start', UEFBoolean),
])

UEFDurationRecord = declareRecord (60, [('duration', UEFDuration)])

UEFStartAndEndDaysRecord = declareRecord (61, [
    ('start_day', UEFPositiveInteger),
    ('end_day', UEFPositiveInteger),
])

UEFWeekPatternRecord = declareRecord (63, [('week_pattern', UEFWeekPattern)])

UEFUnavailableOnSingleDayRecord = declareRecord (80, [
    ('operator', UEFSetOperator),
    ('day', UEFPositiveInteger),
    ('start_time', UEFMinuteTime),
    ('end_time', UEFMinuteTime),
])

UEFUnavailablesAcrossWeekPatternRecord = declareRecord (81, [
    ('operator', UEFSetOperator),
    ('week_pattern', UEFWeekPattern),
    ('day_of_week', UEFWeekDay),
    ('start_time', UEFMinuteTime),
    ('end_time', UEFMinuteTime),
])

UEFUnavailableDaysRecord = declareRecord (82, [
    ('operator', UEFSetOperator),
    ('start_day', UEFPositiveInteger),
    ('end_day', UEFPositiveInteger),
])

UEFExamAvailablesAcrossWeekPatternRecord = declareRecord (91, [
    ('operator', UEFSetOperator),
    ('week_pattern', UEFWeekPattern),
    ('day_of_week', UEFWeekDay),
    ('start_time', UEFMinuteTime),
    ('end_time', UEFMinuteTime),
])

UEFRequiredSuitabilityForStaffMemberRecord = declareRecord (152, [
    ('operator', UEFSetOperator),
    ('suitability_key', UEFHostKeyNullable),
])

UEFRequiredSuitabilityForLocationRecord = declareRecord (162, [
    ('operator', UEFSetOperator),
    ('suitability_key', UEFHostKeyNullable),
])

UEFCandidateNumberRecord = declareRecord (186, [
    ('examination_key', UEFHostKeyNullable),
    ('candidate_number', UEFText),
])

UEFExaminationsRecord = declareRecord (189, [
    ('operator', UEFSetOperator),
    ('examination_key', UEFHostKeyNullable),
    ('quarantined', UEFBoolean),
])

UEFNotesRecord = declareRecord (190, [
    ('operator', UEFSetOperator),
    ('text_line', UEFTextNullable),
])