fbi-cde/crime-data-api

View on GitHub
crime_data/common/models.py

Summary

Maintainability
F
6 days
Test Coverage
# coding: utf-8
import datetime
from decimal import Decimal

import flask_restful as restful
from crime_data.extensions import db
from sqlalchemy import (BigInteger, Boolean, Column, DateTime, Float,
                        ForeignKey, Integer, SmallInteger, String, Text,
                        UniqueConstraint, func, text)
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import backref, relationship

# db = SQLAlchemy()

#Base = declarative_base()
#metadata = Base.metadata


class RefRace(db.Model):
    __tablename__ = 'ref_race'

    race_id = db.Column(db.SmallInteger, primary_key=True)
    race_code = db.Column(db.String(2), nullable=False, unique=True)
    race_desc = db.Column(db.String(100), nullable=False)
    sort_order = db.Column(db.SmallInteger)
    start_year = db.Column(db.SmallInteger)
    end_year = db.Column(db.SmallInteger)
    notes = db.Column(db.String(1000))


class ArsonMonth(db.Model):
    __tablename__ = 'arson_month'
    __table_args__ = (
        UniqueConstraint('agency_id', 'data_year', 'month_num', 'data_home'), )

    arson_month_id = db.Column(db.BigInteger, primary_key=True)
    data_year = db.Column(db.SmallInteger, nullable=False)
    month_num = db.Column(db.SmallInteger, nullable=False)
    data_home = db.Column(db.String(1), nullable=False)
    source_flag = db.Column(db.String(1), nullable=False)
    reported_flag = db.Column(db.String(1))
    ddocname = db.Column(db.String(100))
    month_included_in = db.Column(db.SmallInteger)
    report_date = db.Column(db.DateTime(True))
    prepared_date = db.Column(db.DateTime(True))
    orig_format = db.Column(db.String(1))
    update_flag = db.Column(db.String(1))
    did = db.Column(db.BigInteger)
    ff_line_number = db.Column(db.BigInteger)
    agency_id = db.Column(db.Integer,
                          db.ForeignKey('ref_agency.agency_id',
                                        deferrable=True,
                                        initially='DEFERRED'),
                          nullable=False,
                          index=True)

    agency = db.relationship('RefAgency')


class ArsonMonthBySubcat(db.Model):
    __tablename__ = 'arson_month_by_subcat'
    __table_args__ = (
        db.UniqueConstraint('arson_month_id', 'subcategory_id'), )

    id = db.Column(db.Integer,
                   primary_key=True,
                   server_default=text(
                       "nextval('arson_month_by_subcat_id_seq'::regclass)"))
    reported_count = db.Column(db.Integer)
    reported_status = db.Column(db.SmallInteger)
    unfounded_count = db.Column(db.Integer)
    unfounded_status = db.Column(db.SmallInteger)
    actual_count = db.Column(db.Integer)
    actual_status = db.Column(db.SmallInteger)
    cleared_count = db.Column(db.Integer)
    cleared_status = db.Column(db.SmallInteger)
    juvenile_cleared_count = db.Column(db.Integer)
    juvenile_cleared_status = db.Column(db.SmallInteger)
    uninhabited_count = db.Column(db.Integer)
    uninhabited_status = db.Column(db.SmallInteger)
    est_damage_value = db.Column(db.BigInteger)
    est_damage_value_status = db.Column(db.SmallInteger)
    arson_month_id = db.Column(db.Integer,
                               db.ForeignKey('arson_month.arson_month_id',
                                             deferrable=True,
                                             initially='DEFERRED'),
                               nullable=False,
                               index=True)
    subcategory_id = db.Column(db.Integer,
                               db.ForeignKey(
                                   'arson_subcategory.subcategory_id',
                                   deferrable=True,
                                   initially='DEFERRED'),
                               nullable=False,
                               index=True)

    arson_month = db.relationship('ArsonMonth')
    subcategory = db.relationship('ArsonSubcategory')


class ArsonSubcategory(db.Model):
    __tablename__ = 'arson_subcategory'

    subcategory_id = db.Column(db.BigInteger, primary_key=True)
    subcategory_name = db.Column(db.String(100))
    subcategory_code = db.Column(db.String(20), unique=True)
    subcat_xml_path = db.Column(db.String(4000))
    subclass_id = db.Column(db.Integer,
                            db.ForeignKey(
                                'arson_subclassification.subclass_id',
                                deferrable=True,
                                initially='DEFERRED'),
                            nullable=False,
                            index=True)

    subclass = db.relationship('ArsonSubclassification')


class ArsonSubclassification(db.Model):
    __tablename__ = 'arson_subclassification'

    subclass_id = db.Column(db.SmallInteger, primary_key=True)
    subclass_name = db.Column(db.String(100))
    subclass_code = db.Column(db.String(20), unique=True)
    subclass_xml_path = db.Column(db.String(4000))


class AsrAgeRange(db.Model):
    __tablename__ = 'asr_age_range'

    age_range_id = db.Column(db.BigInteger, primary_key=True)
    age_range_name = db.Column(db.String(20))
    age_range_code = db.Column(db.String(20), unique=True)
    juvenile_flag = db.Column(db.String(1), nullable=False)
    ff_sort_order = db.Column(db.String(3))
    age_sex = db.Column(db.String(1))
    xml_code = db.Column(db.String(2001))


class AsrAgeSexSubcat(db.Model):
    __tablename__ = 'asr_age_sex_subcat'
    __table_args__ = (UniqueConstraint('asr_month_id', 'offense_subcat_id',
                                       'age_range_id'), )

    id = db.Column(
        db.Integer,
        primary_key=True,
        server_default=text("nextval('asr_age_sex_subcat_id_seq'::regclass)"))
    arrest_count = db.Column(db.Integer)
    arrest_status = db.Column(db.SmallInteger)
    active_flag = db.Column(db.String(1))
    prepared_date = db.Column(db.DateTime(True))
    report_date = db.Column(db.DateTime(True))
    ff_line_number = db.Column(db.BigInteger)
    age_range_id = db.Column(db.Integer,
                             db.ForeignKey('asr_age_range.age_range_id',
                                           deferrable=True,
                                           initially='DEFERRED'),
                             nullable=False,
                             index=True)
    asr_month_id = db.Column(db.Integer,
                             db.ForeignKey('asr_month.asr_month_id',
                                           deferrable=True,
                                           initially='DEFERRED'),
                             nullable=False,
                             index=True)
    offense_subcat_id = db.Column(db.Integer,
                                  db.ForeignKey(
                                      'asr_offense_subcat.offense_subcat_id',
                                      deferrable=True,
                                      initially='DEFERRED'),
                                  nullable=False,
                                  index=True)

    age_range = db.relationship('AsrAgeRange')
    asr_month = db.relationship('AsrMonth')
    offense_subcat = db.relationship('AsrOffenseSubcat')


class AsrEthnicity(db.Model):
    __tablename__ = 'asr_ethnicity'

    ethnicity_id = db.Column(db.BigInteger, primary_key=True)
    ethnicity_name = db.Column(db.String(100))
    ethnicity_code = db.Column(db.String(20), unique=True)
    ff_sort_order = db.Column(db.String(3))


class AsrEthnicityOffense(db.Model):
    __tablename__ = 'asr_ethnicity_offense'
    __table_args__ = (db.UniqueConstraint('asr_month_id', 'offense_subcat_id',
                                          'ethnicity_id', 'juvenile_flag'), )

    id = db.Column(db.Integer,
                   primary_key=True,
                   server_default=text(
                       "nextval('asr_ethnicity_offense_id_seq'::regclass)"))
    juvenile_flag = db.Column(db.String(1), nullable=False)
    arrest_count = db.Column(db.Integer)
    arrest_status = db.Column(db.SmallInteger)
    prepared_date = db.Column(db.DateTime(True))
    report_date = db.Column(db.DateTime(True))
    ff_line_number = db.Column(db.BigInteger)
    asr_month_id = db.Column(db.Integer,
                             db.ForeignKey('asr_month.asr_month_id',
                                           deferrable=True,
                                           initially='DEFERRED'),
                             nullable=False,
                             index=True)
    ethnicity_id = db.Column(db.Integer,
                             db.ForeignKey('asr_ethnicity.ethnicity_id',
                                           deferrable=True,
                                           initially='DEFERRED'),
                             nullable=False,
                             index=True)
    offense_subcat_id = db.Column(db.Integer,
                                  db.ForeignKey(
                                      'asr_offense_subcat.offense_subcat_id',
                                      deferrable=True,
                                      initially='DEFERRED'),
                                  nullable=False,
                                  index=True)

    asr_month = db.relationship('AsrMonth')
    ethnicity = db.relationship('AsrEthnicity')
    offense_subcat = db.relationship('AsrOffenseSubcat')


class AsrMonth(db.Model):
    __tablename__ = 'asr_month'
    __table_args__ = (db.UniqueConstraint('agency_id', 'data_year',
                                          'month_num', 'data_home'), )

    asr_month_id = db.Column(db.BigInteger, primary_key=True)
    data_year = db.Column(db.SmallInteger, nullable=False)
    month_num = db.Column(db.SmallInteger, nullable=False)
    source_flag = db.Column(db.String(1), nullable=False)
    reported_flag = db.Column(db.String(1))
    orig_format = db.Column(db.String(1))
    update_flag = db.Column(db.String(1))
    ff_line_number = db.Column(db.BigInteger)
    ddocname = db.Column(db.String(100))
    did = db.Column(db.BigInteger)
    data_home = db.Column(db.String(1), nullable=False)
    agency_id = db.Column(db.Integer,
                          db.ForeignKey('ref_agency.agency_id',
                                        deferrable=True,
                                        initially='DEFERRED'),
                          nullable=False,
                          index=True)

    agency = db.relationship('RefAgency')


class AsrJuvenileDisposition(AsrMonth):
    __tablename__ = 'asr_juvenile_disposition'

    asr_month_id = db.Column(db.Integer,
                             db.ForeignKey('asr_month.asr_month_id',
                                           deferrable=True,
                                           initially='DEFERRED'),
                             primary_key=True)
    report_date = db.Column(db.DateTime(True))
    prepared_date = db.Column(db.DateTime(True))
    handled_within_dept = db.Column(db.Integer)
    juvenile_court = db.Column(db.Integer)
    welfare_agency = db.Column(db.Integer)
    other_police = db.Column(db.Integer)
    adult_court = db.Column(db.Integer)
    ff_line_number = db.Column(db.BigInteger)


class AsrOffense(db.Model):
    __tablename__ = 'asr_offense'

    offense_id = db.Column(db.BigInteger, primary_key=True)
    offense_name = db.Column(db.String(100))
    offense_code = db.Column(db.String(20), unique=True)
    total_flag = db.Column(db.String(1))
    offense_cat_id = db.Column(db.Integer,
                               db.ForeignKey(
                                   'asr_offense_category.offense_cat_id',
                                   deferrable=True,
                                   initially='DEFERRED'),
                               nullable=False,
                               index=True)

    offense_cat = db.relationship('AsrOffenseCategory')


class AsrOffenseCategory(db.Model):
    __tablename__ = 'asr_offense_category'

    offense_cat_id = db.Column(db.BigInteger, primary_key=True)
    offense_cat_name = db.Column(db.String(100))
    offense_cat_code = db.Column(db.String(20), unique=True)


class AsrOffenseSubcat(db.Model):
    __tablename__ = 'asr_offense_subcat'

    offense_subcat_id = db.Column(db.BigInteger, primary_key=True)
    offense_subcat_name = db.Column(db.String(100))
    offense_subcat_code = db.Column(db.String(20), unique=True)
    srs_offense_code = db.Column(db.String(3))
    master_offense_code = db.Column(db.SmallInteger)
    total_flag = db.Column(db.String(1))
    adult_juv_flag = db.Column(db.String(1))
    offense_id = db.Column(db.Integer,
                           db.ForeignKey('asr_offense.offense_id',
                                         deferrable=True,
                                         initially='DEFERRED'),
                           nullable=False,
                           index=True)

    offense = db.relationship('AsrOffense')


class AsrRaceOffenseSubcat(db.Model):
    __tablename__ = 'asr_race_offense_subcat'
    __table_args__ = (db.UniqueConstraint('asr_month_id', 'offense_subcat_id',
                                          'race_id', 'juvenile_flag'), )

    id = db.Column(db.Integer,
                   primary_key=True,
                   server_default=text(
                       "nextval('asr_race_offense_subcat_id_seq'::regclass)"))
    juvenile_flag = db.Column(db.String(1), nullable=False)
    arrest_count = db.Column(db.Integer)
    arrest_status = db.Column(db.SmallInteger)
    active_flag = db.Column(db.String(1))
    prepared_date = db.Column(db.DateTime(True))
    report_date = db.Column(db.DateTime(True))
    ff_line_number = db.Column(db.BigInteger)
    asr_month_id = db.Column(db.Integer,
                             db.ForeignKey('asr_month.asr_month_id',
                                           deferrable=True,
                                           initially='DEFERRED'),
                             nullable=False,
                             index=True)
    offense_subcat_id = db.Column(db.Integer,
                                  db.ForeignKey(
                                      'asr_offense_subcat.offense_subcat_id',
                                      deferrable=True,
                                      initially='DEFERRED'),
                                  nullable=False,
                                  index=True)
    race_id = db.Column(db.Integer,
                        db.ForeignKey('ref_race.race_id',
                                      deferrable=True,
                                      initially='DEFERRED'),
                        nullable=False,
                        index=True)

    asr_month = db.relationship('AsrMonth')
    offense_subcat = db.relationship('AsrOffenseSubcat')
    race = db.relationship('RefRace')


class CrimeType(db.Model):
    __tablename__ = 'crime_type'

    crime_type_id = db.Column(db.SmallInteger, primary_key=True)
    crime_type_name = db.Column(db.String(50))
    crime_type_sort_order = db.Column(db.SmallInteger)
    crime_flag = db.Column(db.String(1))


class CtArrestee(db.Model):
    __tablename__ = 'ct_arrestee'

    arrestee_id = db.Column(db.BigInteger, primary_key=True)
    age = db.Column(db.SmallInteger)
    sex_code = db.Column(db.String(1))
    ethnicity_id = db.Column(db.Integer,
                             db.ForeignKey('nibrs_ethnicity.ethnicity_id',
                                           deferrable=True,
                                           initially='DEFERRED'),
                             index=True)
    incident_id = db.Column(db.Integer,
                            db.ForeignKey('ct_incident.incident_id',
                                          deferrable=True,
                                          initially='DEFERRED'),
                            nullable=False,
                            index=True)
    race_id = db.Column(db.Integer,
                        db.ForeignKey('ref_race.race_id',
                                      deferrable=True,
                                      initially='DEFERRED'),
                        index=True)

    ethnicity = db.relationship('NibrsEthnicity')
    incident = db.relationship('CtIncident')
    race = db.relationship('RefRace')


class CtIncident(db.Model):
    __tablename__ = 'ct_incident'

    incident_id = db.Column(db.BigInteger, primary_key=True)
    data_year = db.Column(db.SmallInteger, nullable=False)
    incident_number = db.Column(db.String(15))
    incident_date = db.Column(db.DateTime(True))
    source_flag = db.Column(db.String(1), nullable=False)
    ddocname = db.Column(db.String(100))
    report_date = db.Column(db.DateTime(True))
    prepared_date = db.Column(db.DateTime(True))
    report_date_flag = db.Column(db.String(1))
    incident_hour = db.Column(db.SmallInteger)
    cleared_except_flag = db.Column(db.String(1))
    update_flag = db.Column(db.String(1))
    ff_line_number = db.Column(db.BigInteger)
    data_home = db.Column(db.String(1), nullable=False)
    orig_format = db.Column(db.String(1))
    unknown_offender = db.Column(db.String(1))
    did = db.Column(db.BigInteger)
    nibrs_incident_id = db.Column(db.BigInteger)
    agency_id = db.Column(db.Integer,
                          db.ForeignKey('ref_agency.agency_id',
                                        deferrable=True,
                                        initially='DEFERRED'),
                          nullable=False,
                          index=True)
    ct_month_id = db.Column(db.Integer,
                            db.ForeignKey('ct_month.ct_month_id',
                                          deferrable=True,
                                          initially='DEFERRED'),
                            nullable=False,
                            index=True)

    agency = db.relationship('RefAgency')
    ct_month = db.relationship('CtMonth')


class CtMonth(db.Model):
    __tablename__ = 'ct_month'

    ct_month_id = db.Column(db.BigInteger, primary_key=True)
    month_num = db.Column(db.SmallInteger, nullable=False)
    data_year = db.Column(db.SmallInteger, nullable=False)
    reported_status = db.Column(db.String(1))
    reported_count = db.Column(db.Integer)
    update_flag = db.Column(db.String(1))
    ff_line_number = db.Column(db.BigInteger)
    ddocname = db.Column(db.String(100))
    did = db.Column(db.BigInteger)
    data_home = db.Column(db.String(1), nullable=False)
    orig_format = db.Column(db.String(1))
    agency_id = db.Column(db.Integer,
                          db.ForeignKey('ref_agency.agency_id',
                                        deferrable=True,
                                        initially='DEFERRED'),
                          nullable=False,
                          index=True)

    agency = db.relationship('RefAgency')


class CtOffender(db.Model):
    __tablename__ = 'ct_offender'

    offender_id = db.Column(db.BigInteger, primary_key=True)
    age = db.Column(db.SmallInteger)
    sex_code = db.Column(db.String(1))
    ethnicity_id = db.Column(db.Integer,
                             db.ForeignKey('nibrs_ethnicity.ethnicity_id',
                                           deferrable=True,
                                           initially='DEFERRED'),
                             index=True)
    incident_id = db.Column(db.Integer,
                            db.ForeignKey('ct_incident.incident_id',
                                          deferrable=True,
                                          initially='DEFERRED'),
                            nullable=False,
                            index=True)
    race_id = db.Column(db.Integer,
                        db.ForeignKey('ref_race.race_id',
                                      deferrable=True,
                                      initially='DEFERRED'),
                        index=True)

    ethnicity = db.relationship('NibrsEthnicity')
    incident = db.relationship('CtIncident')
    race = db.relationship('RefRace')


class CtOffense(db.Model):
    __tablename__ = 'ct_offense'

    offense_id = db.Column(db.BigInteger, primary_key=True)
    ct_offense_flag = db.Column(db.String(1))
    incident_id = db.Column(db.Integer,
                            db.ForeignKey('ct_incident.incident_id',
                                          deferrable=True,
                                          initially='DEFERRED'),
                            nullable=False,
                            index=True)
    location_id = db.Column(db.Integer,
                            db.ForeignKey('nibrs_location_type.location_id',
                                          deferrable=True,
                                          initially='DEFERRED'),
                            nullable=False,
                            index=True)
    offense_type_id = db.Column(db.Integer,
                                db.ForeignKey(
                                    'nibrs_offense_type.offense_type_id',
                                    deferrable=True,
                                    initially='DEFERRED'),
                                nullable=False,
                                index=True)

    incident = db.relationship('CtIncident')
    location = db.relationship('NibrsLocationType')
    offense_type = db.relationship('NibrsOffenseType')


class CtProperty(db.Model):
    __tablename__ = 'ct_property'

    property_id = db.Column(db.BigInteger, primary_key=True)
    stolen_value = db.Column(db.BigInteger)
    recovered_flag = db.Column(db.String(1))
    date_recovered = db.Column(db.DateTime(True))
    recovered_value = db.Column(db.BigInteger)
    incident_id = db.Column(db.Integer,
                            db.ForeignKey('ct_incident.incident_id',
                                          deferrable=True,
                                          initially='DEFERRED'),
                            nullable=False,
                            index=True)
    prop_desc_id = db.Column(db.Integer,
                             db.ForeignKey('nibrs_prop_desc_type.prop_desc_id',
                                           deferrable=True,
                                           initially='DEFERRED'),
                             nullable=False,
                             index=True)

    incident = db.relationship('CtIncident')
    prop_desc = db.relationship('NibrsPropDescType')


class CtVictim(db.Model):
    __tablename__ = 'ct_victim'
    __table_args__ = (UniqueConstraint('incident_id', 'victim_type_id'), )

    id = db.Column(
        db.Integer,
        primary_key=True,
        server_default=text("nextval('ct_victim_id_seq'::regclass)"))
    incident_id = db.Column(db.Integer,
                            db.ForeignKey('ct_incident.incident_id',
                                          deferrable=True,
                                          initially='DEFERRED'),
                            nullable=False,
                            index=True)
    victim_type_id = db.Column(db.Integer,
                               db.ForeignKey(
                                   'nibrs_victim_type.victim_type_id',
                                   deferrable=True,
                                   initially='DEFERRED'),
                               nullable=False,
                               index=True)

    incident = db.relationship('CtIncident')
    victim_type = db.relationship('NibrsVictimType')


class CtWeapon(db.Model):
    __tablename__ = 'ct_weapon'

    ct_weapon_id = db.Column(db.BigInteger, primary_key=True)
    incident_id = db.Column(db.Integer,
                            db.ForeignKey('ct_incident.incident_id',
                                          deferrable=True,
                                          initially='DEFERRED'),
                            nullable=False,
                            index=True)
    weapon_id = db.Column(db.Integer,
                          db.ForeignKey('nibrs_weapon_type.weapon_id',
                                        deferrable=True,
                                        initially='DEFERRED'),
                          nullable=False,
                          index=True)

    incident = db.relationship('CtIncident')
    weapon = db.relationship('NibrsWeaponType')


class HcBiasMotivation(db.Model):
    __tablename__ = 'hc_bias_motivation'
    __table_args__ = (UniqueConstraint('offense_id', 'bias_id'), )

    id = db.Column(
        db.Integer,
        primary_key=True,
        server_default=text("nextval('hc_bias_motivation_id_seq'::regclass)"))
    bias_id = db.Column(db.Integer,
                        db.ForeignKey('nibrs_bias_list.bias_id',
                                      deferrable=True,
                                      initially='DEFERRED'),
                        nullable=False,
                        index=True)
    offense_id = db.Column(db.Integer,
                           db.ForeignKey('hc_offense.offense_id',
                                         deferrable=True,
                                         initially='DEFERRED'),
                           nullable=False,
                           index=True)

    bias = db.relationship('NibrsBiasList')
    offense = db.relationship('HcOffense')


class HcIncident(db.Model):
    __tablename__ = 'hc_incident'

    incident_id = db.Column(db.BigInteger, primary_key=True)
    incident_no = db.Column(db.String(20))
    incident_date = db.Column(db.DateTime(True))
    data_home = db.Column(db.String(1))
    source_flag = db.Column(db.String(1))
    ddocname = db.Column(db.String(100))
    report_date = db.Column(db.DateTime(True))
    prepared_date = db.Column(db.DateTime(True))
    victim_count = db.Column(db.SmallInteger)
    adult_victim_count = db.Column(db.SmallInteger)
    incident_status = db.Column(db.SmallInteger)
    juvenile_victim_count = db.Column(db.SmallInteger)
    offender_count = db.Column(db.SmallInteger)
    adult_offender_count = db.Column(db.SmallInteger)
    juvenile_offender_count = db.Column(db.SmallInteger)
    update_flag = db.Column(db.String(1))
    ff_line_number = db.Column(db.BigInteger)
    orig_format = db.Column(db.String(1))
    did = db.Column(db.BigInteger)
    nibrs_incident_id = db.Column(db.BigInteger)
    agency_id = db.Column(db.Integer,
                          db.ForeignKey('ref_agency.agency_id',
                                        deferrable=True,
                                        initially='DEFERRED'),
                          nullable=False,
                          index=True)
    hc_quarter_id = db.Column(db.Integer,
                              db.ForeignKey('hc_quarter.hc_quarter_id',
                                            deferrable=True,
                                            initially='DEFERRED'),
                              nullable=False,
                              index=True)
    offender_ethnicity_id = db.Column(
        db.Integer,
        db.ForeignKey('nibrs_ethnicity.ethnicity_id',
                      deferrable=True,
                      initially='DEFERRED'),
        index=True)
    offender_race_id = db.Column(db.Integer,
                                 db.ForeignKey('ref_race.race_id',
                                               deferrable=True,
                                               initially='DEFERRED'),
                                 index=True)

    agency = db.relationship('RefAgency')
    hc_quarter = db.relationship('HcQuarter')
    offender_ethnicity = db.relationship('NibrsEthnicity')
    offender_race = db.relationship('RefRace')


class HcOffense(db.Model):
    __tablename__ = 'hc_offense'

    offense_id = db.Column(db.BigInteger, primary_key=True)
    victim_count = db.Column(db.SmallInteger)
    nibrs_offense_id = db.Column(db.BigInteger)
    incident_id = db.Column(db.Integer,
                            db.ForeignKey('hc_incident.incident_id',
                                          deferrable=True,
                                          initially='DEFERRED'),
                            nullable=False,
                            index=True)
    location_id = db.Column(db.Integer,
                            db.ForeignKey('nibrs_location_type.location_id',
                                          deferrable=True,
                                          initially='DEFERRED'),
                            index=True)
    offense_type_id = db.Column(
        db.Integer,
        db.ForeignKey('nibrs_offense_type.offense_type_id',
                      deferrable=True,
                      initially='DEFERRED'),
        index=True)

    incident = db.relationship('HcIncident')
    location = db.relationship('NibrsLocationType')
    offense_type = db.relationship('NibrsOffenseType')


class HcQuarter(db.Model):
    __tablename__ = 'hc_quarter'
    __table_args__ = (UniqueConstraint('agency_id', 'quarter_num', 'data_year',
                                       'data_home'), )

    quarter_num = db.Column(db.SmallInteger, nullable=False)
    data_year = db.Column(db.SmallInteger, nullable=False)
    reported_status = db.Column(db.String(1))
    reported_count = db.Column(db.BigInteger)
    hc_quarter_id = db.Column(db.BigInteger, primary_key=True)
    update_flag = db.Column(db.String(1))
    orig_format = db.Column(db.String(1))
    ff_line_number = db.Column(db.BigInteger)
    ddocname = db.Column(db.String(100))
    did = db.Column(db.BigInteger)
    data_home = db.Column(db.String(1), nullable=False)
    agency_id = db.Column(db.Integer,
                          db.ForeignKey('ref_agency.agency_id',
                                        deferrable=True,
                                        initially='DEFERRED'),
                          nullable=False,
                          index=True)

    agency = db.relationship('RefAgency')


class HcVictim(db.Model):
    __tablename__ = 'hc_victim'
    __table_args__ = (UniqueConstraint('offense_id', 'victim_type_id'), )

    id = db.Column(
        db.Integer,
        primary_key=True,
        server_default=text("nextval('hc_victim_id_seq'::regclass)"))
    offense_id = db.Column(db.Integer,
                           db.ForeignKey('hc_offense.offense_id',
                                         deferrable=True,
                                         initially='DEFERRED'),
                           nullable=False,
                           index=True)
    victim_type_id = db.Column(db.Integer,
                               db.ForeignKey(
                                   'nibrs_victim_type.victim_type_id',
                                   deferrable=True,
                                   initially='DEFERRED'),
                               nullable=False,
                               index=True)

    offense = db.relationship('HcOffense')
    victim_type = db.relationship('NibrsVictimType')


class HtMonth(db.Model):
    __tablename__ = 'ht_month'
    __table_args__ = (
        UniqueConstraint('agency_id', 'data_year', 'month_num', 'data_home'), )

    ht_month_id = db.Column(db.BigInteger, primary_key=True)
    data_year = db.Column(db.SmallInteger, nullable=False)
    month_num = db.Column(db.SmallInteger, nullable=False)
    data_home = db.Column(db.String(1), nullable=False)
    source_flag = db.Column(db.String(1), nullable=False)
    ddocname = db.Column(db.String(100))
    report_date = db.Column(db.DateTime(True))
    prepared_date = db.Column(db.DateTime(True))
    prepared_by_user = db.Column(db.String(100))
    prepared_by_email = db.Column(db.String(200))
    orig_format = db.Column(db.String(1), nullable=False)
    total_reported_count = db.Column(db.Integer)
    total_unfounded_count = db.Column(db.Integer)
    total_actual_count = db.Column(db.Integer)
    total_cleared_count = db.Column(db.Integer)
    total_juvenile_cleared_count = db.Column(db.Integer)
    update_flag = db.Column(db.String(1))
    reported_flag = db.Column(db.String(1))
    did = db.Column(db.BigInteger)
    ff_line_number = db.Column(db.BigInteger)
    agency_id = db.Column(db.Integer,
                          db.ForeignKey('ref_agency.agency_id',
                                        deferrable=True,
                                        initially='DEFERRED'),
                          nullable=False,
                          index=True)

    agency = db.relationship('RefAgency')


class HtMonthOffenseSubcat(db.Model):
    __tablename__ = 'ht_month_offense_subcat'
    __table_args__ = (UniqueConstraint('offense_subcat_id', 'ht_month_id'), )

    id = db.Column(db.Integer,
                   primary_key=True,
                   server_default=text(
                       "nextval('ht_month_offense_subcat_id_seq'::regclass)"))
    reported_count = db.Column(db.Integer)
    reported_status = db.Column(db.SmallInteger)
    unfounded_count = db.Column(db.Integer)
    unfounded_status = db.Column(db.SmallInteger)
    actual_count = db.Column(db.Integer)
    actual_status = db.Column(db.SmallInteger)
    cleared_count = db.Column(db.Integer)
    cleared_status = db.Column(db.SmallInteger)
    juvenile_cleared_count = db.Column(db.Integer)
    juvenile_cleared_status = db.Column(db.SmallInteger)
    ht_month_id = db.Column(db.Integer,
                            db.ForeignKey('ht_month.ht_month_id',
                                          deferrable=True,
                                          initially='DEFERRED'),
                            nullable=False,
                            index=True)
    offense_subcat_id = db.Column(db.Integer,
                                  db.ForeignKey(
                                      'reta_offense_subcat.offense_subcat_id',
                                      deferrable=True,
                                      initially='DEFERRED'),
                                  nullable=False,
                                  index=True)

    ht_month = db.relationship('HtMonth')
    offense_subcat = db.relationship('RetaOffenseSubcat')


class NibrsActivityType(db.Model):
    __tablename__ = 'nibrs_activity_type'

    activity_type_id = db.Column(db.SmallInteger, primary_key=True)
    activity_type_code = db.Column(db.String(2))
    activity_type_name = db.Column(db.String(100))


class NibrsAge(db.Model):
    __tablename__ = 'nibrs_age'

    age_id = db.Column(db.SmallInteger, primary_key=True)
    age_code = db.Column(db.String(2))
    age_name = db.Column(db.String(100))


class NibrsArrestType(db.Model):
    __tablename__ = 'nibrs_arrest_type'

    arrest_type_id = db.Column(db.SmallInteger, primary_key=True)
    arrest_type_code = db.Column(db.String(1))
    arrest_type_name = db.Column(db.String(100))


class NibrsArrestee(db.Model):
    __tablename__ = 'nibrs_arrestee'

    arrestee_id = db.Column(db.BigInteger, primary_key=True)
    arrestee_seq_num = db.Column(db.BigInteger)
    arrest_num = db.Column(db.String(12))
    arrest_date = db.Column(db.DateTime(True))
    multiple_indicator = db.Column(db.String(1))
    age_num = db.Column(db.SmallInteger)
    sex_code = db.Column(db.String(1))
    resident_code = db.Column(db.String(1))
    under_18_disposition_code = db.Column(db.String(1))
    clearance_ind = db.Column(db.String(1))
    ff_line_number = db.Column(db.BigInteger)
    age_range_low_num = db.Column(db.SmallInteger)
    age_range_high_num = db.Column(db.SmallInteger)
    age_id = db.Column(db.Integer,
                       db.ForeignKey('nibrs_age.age_id',
                                     deferrable=True,
                                     initially='DEFERRED'),
                       nullable=False,
                       index=True)
    arrest_type_id = db.Column(
        db.Integer,
        db.ForeignKey('nibrs_arrest_type.arrest_type_id',
                      deferrable=True,
                      initially='DEFERRED'),
        index=True)
    ethnicity_id = db.Column(db.Integer,
                             db.ForeignKey('nibrs_ethnicity.ethnicity_id',
                                           deferrable=True,
                                           initially='DEFERRED'),
                             index=True)
    incident_id = db.Column(db.Integer,
                            db.ForeignKey('nibrs_incident.incident_id',
                                          deferrable=True,
                                          initially='DEFERRED'),
                            nullable=False,
                            index=True)
    offense_type_id = db.Column(db.Integer,
                                db.ForeignKey(
                                    'nibrs_offense_type.offense_type_id',
                                    deferrable=True,
                                    initially='DEFERRED'),
                                nullable=False,
                                index=True)
    race_id = db.Column(db.Integer,
                        db.ForeignKey('ref_race.race_id',
                                      deferrable=True,
                                      initially='DEFERRED'),
                        nullable=False,
                        index=True)

    age = db.relationship('NibrsAge', backref='arrestees', lazy=False)
    arrest_type = db.relationship('NibrsArrestType',
                                  lazy=False,
                                  backref='arrestees')
    ethnicity = db.relationship('NibrsEthnicity',
                                lazy=False,
                                backref='arrestees')
    incident = db.relationship('NibrsIncident',
                               backref=backref('arrestees',
                                               lazy=False))
    offense_type = db.relationship('NibrsOffenseType', backref='arrestees')
    race = db.relationship('RefRace', lazy=False, backref='arrestees')


class NibrsArresteeWeapon(db.Model):
    __tablename__ = 'nibrs_arrestee_weapon'

    nibrs_arrestee_weapon_id = db.Column(db.BigInteger, primary_key=True)
    arrestee_id = db.Column(db.Integer,
                            db.ForeignKey('nibrs_arrestee.arrestee_id',
                                          deferrable=True,
                                          initially='DEFERRED'),
                            nullable=False,
                            index=True)
    weapon_id = db.Column(db.Integer,
                          db.ForeignKey('nibrs_weapon_type.weapon_id',
                                        deferrable=True,
                                        initially='DEFERRED'),
                          nullable=False,
                          index=True)

    arrestee = db.relationship('NibrsArrestee')
    weapon = db.relationship('NibrsWeaponType')


class NibrsAssignmentType(db.Model):
    __tablename__ = 'nibrs_assignment_type'

    assignment_type_id = db.Column(db.SmallInteger, primary_key=True)
    assignment_type_code = db.Column(db.String(1))
    assignment_type_name = db.Column(db.String(100))


class NibrsBiasList(db.Model):
    __tablename__ = 'nibrs_bias_list'

    bias_id = db.Column(db.SmallInteger, primary_key=True)
    bias_code = db.Column(db.String(2))
    bias_name = db.Column(db.String(100))


class NibrsBiasMotivation(db.Model):
    __tablename__ = 'nibrs_bias_motivation'
    __table_args__ = (UniqueConstraint('bias_id', 'offense_id'), )

    id = db.Column(db.Integer,
                   primary_key=True,
                   server_default=text(
                       "nextval('nibrs_bias_motivation_id_seq'::regclass)"))
    bias_id = db.Column(db.Integer,
                        db.ForeignKey('nibrs_bias_list.bias_id',
                                      deferrable=True,
                                      initially='DEFERRED'),
                        nullable=False,
                        index=True)
    offense_id = db.Column(db.Integer,
                           db.ForeignKey('nibrs_offense.offense_id',
                                         deferrable=True,
                                         initially='DEFERRED'),
                           nullable=False,
                           index=True)

    bias = db.relationship('NibrsBiasList')
    offense = db.relationship('NibrsOffense')


class NibrsCircumstance(db.Model):
    __tablename__ = 'nibrs_circumstances'

    circumstances_id = db.Column(db.SmallInteger, primary_key=True)
    circumstances_type = db.Column(db.String(1))
    circumstances_code = db.Column(db.SmallInteger)
    circumstances_name = db.Column(db.String(100))


class NibrsClearedExcept(db.Model):
    __tablename__ = 'nibrs_cleared_except'

    cleared_except_id = db.Column(db.SmallInteger, primary_key=True)
    cleared_except_code = db.Column(db.String(1))
    cleared_except_name = db.Column(db.String(100))


class NibrsCriminalAct(db.Model):
    __tablename__ = 'nibrs_criminal_act'
    __table_args__ = (UniqueConstraint('criminal_act_id', 'offense_id'), )

    criminal_act_id = db.Column(db.Integer,
                                db.ForeignKey(
                                    'nibrs_criminal_act_type.criminal_act_id',
                                    deferrable=True,
                                    initially='DEFERRED'),
                                primary_key=True,
                                nullable=False,
                                index=True)
    offense_id = db.Column(db.Integer,
                           db.ForeignKey('nibrs_offense.offense_id',
                                         deferrable=True,
                                         initially='DEFERRED'),
                           primary_key=True,
                           nullable=False,
                           index=True)

    criminal_act = db.relationship('NibrsCriminalActType',
                                   backref='criminal_acts')
    offense = db.relationship('NibrsOffense', backref='criminal_acts')


class NibrsCriminalActType(db.Model):
    __tablename__ = 'nibrs_criminal_act_type'

    criminal_act_id = db.Column(db.SmallInteger, primary_key=True)
    criminal_act_code = db.Column(db.String(1))
    criminal_act_name = db.Column(db.String(100))


class NibrsDrugMeasureType(db.Model):
    __tablename__ = 'nibrs_drug_measure_type'

    drug_measure_type_id = db.Column(db.SmallInteger, primary_key=True)
    drug_measure_code = db.Column(db.String(2))
    drug_measure_name = db.Column(db.String(100))


class NibrsEd(db.Model):
    __tablename__ = 'nibrs_eds'

    id = db.Column(
        db.Integer,
        primary_key=True,
        server_default=text("nextval('nibrs_eds_id_seq'::regclass)"))
    ddocname = db.Column(db.String(100))
    data_year = db.Column(db.SmallInteger)
    month_num = db.Column(db.SmallInteger)
    relative_rec_num = db.Column(db.Integer)
    segment_action_type = db.Column(db.String(1))
    ori = db.Column(db.String(9))
    incident_num = db.Column(db.String(12))
    level = db.Column(db.String(1))
    offense_code = db.Column(db.String(3))
    person_seq_num = db.Column(db.String(3))
    type_prop_loss = db.Column(db.String(1))
    data_element_num = db.Column(db.String(3))
    error_num = db.Column(db.SmallInteger)
    data_field = db.Column(db.String(12))
    error_msg = db.Column(db.String(79))
    submission_ser_num = db.Column(db.Integer)


class NibrsEthnicity(db.Model):
    __tablename__ = 'nibrs_ethnicity'

    ethnicity_id = db.Column(db.SmallInteger, primary_key=True)
    ethnicity_code = db.Column(db.String(1))
    ethnicity_name = db.Column(db.String(100))
    hc_flag = db.Column(db.String(1))


class NibrsGrpbArrest(db.Model):
    __tablename__ = 'nibrs_grpb_arrest'

    grpb_arrest_id = db.Column(db.BigInteger, primary_key=True)
    arrest_num = db.Column(db.String(15))
    arrest_date = db.Column(db.DateTime(True))
    arrest_seq_num = db.Column(db.SmallInteger)
    city = db.Column(db.String(4))
    arrest_type_id = db.Column(db.SmallInteger)
    offense_type_id = db.Column(db.BigInteger)
    sex_code = db.Column(db.String(1))
    resident_code = db.Column(db.String(1))
    under_18_disposition_code = db.Column(db.String(1))
    age_num = db.Column(db.SmallInteger)
    arrest_year = db.Column(db.SmallInteger)
    ff_line_number = db.Column(db.BigInteger)
    data_home = db.Column(db.String(1))
    ddocname = db.Column(db.String(100))
    did = db.Column(db.BigInteger)
    age_range_low_num = db.Column(db.SmallInteger)
    age_range_high_num = db.Column(db.SmallInteger)
    age_id = db.Column(db.Integer,
                       db.ForeignKey('nibrs_age.age_id',
                                     deferrable=True,
                                     initially='DEFERRED'),
                       index=True)
    agency_id = db.Column(db.Integer,
                          db.ForeignKey('ref_agency.agency_id',
                                        deferrable=True,
                                        initially='DEFERRED'),
                          nullable=False,
                          index=True)
    ethnicity_id = db.Column(db.Integer,
                             db.ForeignKey('nibrs_ethnicity.ethnicity_id',
                                           deferrable=True,
                                           initially='DEFERRED'),
                             index=True)
    nibrs_month_id = db.Column(db.Integer,
                               db.ForeignKey('nibrs_month.nibrs_month_id',
                                             deferrable=True,
                                             initially='DEFERRED'),
                               nullable=False,
                               index=True)
    race_id = db.Column(db.Integer,
                        db.ForeignKey('ref_race.race_id',
                                      deferrable=True,
                                      initially='DEFERRED'),
                        index=True)

    age = db.relationship('NibrsAge')
    agency = db.relationship('RefAgency')
    ethnicity = db.relationship('NibrsEthnicity')
    nibrs_month = db.relationship('NibrsMonth')
    race = db.relationship('RefRace')


class NibrsGrpbArrestWeapon(db.Model):
    __tablename__ = 'nibrs_grpb_arrest_weapon'

    nibrs_grpb_arrest_weapon_id = db.Column(db.BigInteger, primary_key=True)
    grpb_arrest_id = db.Column(db.Integer,
                               db.ForeignKey(
                                   'nibrs_grpb_arrest.grpb_arrest_id',
                                   deferrable=True,
                                   initially='DEFERRED'),
                               nullable=False,
                               index=True)
    weapon_id = db.Column(db.Integer,
                          db.ForeignKey('nibrs_weapon_type.weapon_id',
                                        deferrable=True,
                                        initially='DEFERRED'),
                          nullable=False,
                          index=True)

    grpb_arrest = db.relationship('NibrsGrpbArrest')
    weapon = db.relationship('NibrsWeaponType')


class NibrsIncident(db.Model):
    __tablename__ = 'nibrs_incident'

    incident_id = db.Column(db.BigInteger, primary_key=True)
    incident_number = db.Column(db.String(15))
    cargo_theft_flag = db.Column(db.String(1))
    submission_date = db.Column(db.DateTime(True))
    incident_date = db.Column(db.DateTime(True))
    report_date_flag = db.Column(db.String(1))
    incident_hour = db.Column(db.SmallInteger)
    cleared_except_date = db.Column(db.DateTime(True))
    incident_status = db.Column(db.SmallInteger)
    data_home = db.Column(db.String(1))
    ddocname = db.Column(db.String(100))
    orig_format = db.Column(db.String(1))
    ff_line_number = db.Column(db.BigInteger)
    did = db.Column(db.BigInteger)
    agency_id = db.Column(db.Integer,
                          db.ForeignKey('ref_agency.agency_id',
                                        deferrable=True,
                                        initially='DEFERRED'),
                          nullable=False,
                          index=True)
    cleared_except_id = db.Column(db.Integer,
                                  db.ForeignKey(
                                      'nibrs_cleared_except.cleared_except_id',
                                      deferrable=True,
                                      initially='DEFERRED'),
                                  nullable=False,
                                  index=True)
    nibrs_month_id = db.Column(db.Integer,
                               db.ForeignKey('nibrs_month.nibrs_month_id',
                                             deferrable=True,
                                             initially='DEFERRED'),
                               nullable=False,
                               index=True)

    agency = db.relationship('RefAgency')
    cleared_except = db.relationship('NibrsClearedExcept', lazy=False)
    nibrs_month = db.relationship('NibrsMonth')


class NibrsInjury(db.Model):
    __tablename__ = 'nibrs_injury'

    injury_id = db.Column(db.SmallInteger, primary_key=True)
    injury_code = db.Column(db.String(1))
    injury_name = db.Column(db.String(100))


class NibrsJustifiableForce(db.Model):
    __tablename__ = 'nibrs_justifiable_force'

    justifiable_force_id = db.Column(db.SmallInteger, primary_key=True)
    justifiable_force_code = db.Column(db.String(1))
    justifiable_force_name = db.Column(db.String(100))


class NibrsLocationType(db.Model):
    __tablename__ = 'nibrs_location_type'

    location_id = db.Column(db.BigInteger, primary_key=True)
    location_code = db.Column(db.String(2))
    location_name = db.Column(db.String(100))


class NibrsMonth(db.Model):
    __tablename__ = 'nibrs_month'
    __table_args__ = (
        UniqueConstraint('agency_id', 'month_num', 'data_year', 'data_home'), )

    nibrs_month_id = db.Column(db.BigInteger, primary_key=True)
    month_num = db.Column(db.SmallInteger, nullable=False)
    data_year = db.Column(db.SmallInteger, nullable=False)
    reported_status = db.Column(db.String(1))
    report_date = db.Column(db.DateTime(True))
    prepared_date = db.Column(db.DateTime(True))
    update_flag = db.Column(db.String(1), nullable=False)
    orig_format = db.Column(db.String(1), nullable=False)
    ff_line_number = db.Column(db.BigInteger)
    data_home = db.Column(db.String(1))
    ddocname = db.Column(db.String(50))
    did = db.Column(db.BigInteger)
    agency_id = db.Column(db.Integer,
                          db.ForeignKey('ref_agency.agency_id',
                                        deferrable=True,
                                        initially='DEFERRED'),
                          nullable=False,
                          index=True)

    agency = db.relationship('RefAgency')


class NibrsOffender(db.Model):
    __tablename__ = 'nibrs_offender'

    offender_id = db.Column(db.BigInteger, primary_key=True)
    offender_seq_num = db.Column(db.SmallInteger)
    age_num = db.Column(db.SmallInteger)
    sex_code = db.Column(db.String(1))
    ff_line_number = db.Column(db.BigInteger)
    age_range_low_num = db.Column(db.SmallInteger)
    age_range_high_num = db.Column(db.SmallInteger)
    age_id = db.Column(db.Integer,
                       db.ForeignKey('nibrs_age.age_id',
                                     deferrable=True,
                                     initially='DEFERRED'),
                       index=True)
    ethnicity_id = db.Column(db.Integer,
                             db.ForeignKey('nibrs_ethnicity.ethnicity_id',
                                           deferrable=True,
                                           initially='DEFERRED'),
                             index=True)
    incident_id = db.Column(db.Integer,
                            db.ForeignKey('nibrs_incident.incident_id',
                                          deferrable=True,
                                          initially='DEFERRED'),
                            nullable=False,
                            index=True)
    race_id = db.Column(db.Integer,
                        db.ForeignKey('ref_race.race_id',
                                      deferrable=True,
                                      initially='DEFERRED'),
                        index=True)

    age = db.relationship('NibrsAge', backref='offenders', lazy=False)
    ethnicity = db.relationship('NibrsEthnicity', backref='offenders')
    incident = db.relationship('NibrsIncident',
                               backref=backref('offenders',
                                               lazy=False))
    race = db.relationship('RefRace', lazy=False, backref='offenders')


class NibrsOffense(db.Model):
    __tablename__ = 'nibrs_offense'

    offense_id = db.Column(db.BigInteger, primary_key=True)
    attempt_complete_flag = db.Column(db.String(1))
    num_premises_entered = db.Column(db.SmallInteger)
    method_entry_code = db.Column(db.String(1))
    ff_line_number = db.Column(db.BigInteger)
    incident_id = db.Column(db.Integer,
                            db.ForeignKey('nibrs_incident.incident_id',
                                          deferrable=True,
                                          initially='DEFERRED'),
                            nullable=False,
                            index=True)
    location_id = db.Column(db.Integer,
                            db.ForeignKey('nibrs_location_type.location_id',
                                          deferrable=True,
                                          initially='DEFERRED'),
                            nullable=False,
                            index=True)
    offense_type_id = db.Column(db.Integer,
                                db.ForeignKey(
                                    'nibrs_offense_type.offense_type_id',
                                    deferrable=True,
                                    initially='DEFERRED'),
                                nullable=False,
                                index=True)

    incident = db.relationship('NibrsIncident',
                               backref=backref('offenses',
                                               lazy=False))
    location = db.relationship('NibrsLocationType',
                               lazy=False,
                               backref='offenses')
    offense_type = db.relationship('NibrsOffenseType',
                                   lazy=False,
                                   backref='offenses')


class NibrsOffenseType(db.Model):
    __tablename__ = 'nibrs_offense_type'

    offense_type_id = db.Column(db.BigInteger, primary_key=True)
    offense_code = db.Column(db.String(5))
    offense_name = db.Column(db.String(100))
    crime_against = db.Column(db.String(100))
    ct_flag = db.Column(db.String(1))
    hc_flag = db.Column(db.String(1))
    hc_code = db.Column(db.String(5))
    offense_category_name = db.Column(db.String(100))


class NibrsPropDescType(db.Model):
    __tablename__ = 'nibrs_prop_desc_type'

    prop_desc_id = db.Column(db.SmallInteger, primary_key=True)
    prop_desc_code = db.Column(db.String(2))
    prop_desc_name = db.Column(db.String(100))


class NibrsPropLossType(db.Model):
    __tablename__ = 'nibrs_prop_loss_type'

    prop_loss_id = db.Column(db.SmallInteger, primary_key=True)
    prop_loss_name = db.Column(db.String(100))


class NibrsProperty(db.Model):
    __tablename__ = 'nibrs_property'

    property_id = db.Column(db.BigInteger, primary_key=True)
    stolen_count = db.Column(db.SmallInteger)
    recovered_count = db.Column(db.SmallInteger)
    ff_line_number = db.Column(db.BigInteger)
    incident_id = db.Column(db.Integer,
                            db.ForeignKey('nibrs_incident.incident_id',
                                          deferrable=True,
                                          initially='DEFERRED'),
                            nullable=False,
                            index=True)
    prop_loss_id = db.Column(db.Integer,
                             db.ForeignKey('nibrs_prop_loss_type.prop_loss_id',
                                           deferrable=True,
                                           initially='DEFERRED'),
                             nullable=False,
                             index=True)

    incident = db.relationship('NibrsIncident',
                               backref=backref('property',
                                               lazy=False))
    prop_loss = db.relationship('NibrsPropLossType',
                                lazy=False,
                                backref='property')


class NibrsPropertyDesc(db.Model):
    __tablename__ = 'nibrs_property_desc'

    property_value = db.Column(db.BigInteger)
    date_recovered = db.Column(db.DateTime(True))
    nibrs_prop_desc_id = db.Column(db.BigInteger, primary_key=True)
    prop_desc_id = db.Column(db.Integer,
                             db.ForeignKey('nibrs_prop_desc_type.prop_desc_id',
                                           deferrable=True,
                                           initially='DEFERRED'),
                             nullable=False,
                             index=True)
    property_id = db.Column(db.Integer,
                            db.ForeignKey('nibrs_property.property_id',
                                          deferrable=True,
                                          initially='DEFERRED'),
                            nullable=False,
                            index=True)

    prop_desc = db.relationship('NibrsPropDescType')
    property = db.relationship('NibrsProperty')


class NibrsRelationship(db.Model):
    __tablename__ = 'nibrs_relationship'

    relationship_id = db.Column(db.SmallInteger, primary_key=True)
    relationship_code = db.Column(db.String(2))
    relationship_name = db.Column(db.String(100))


class NibrsSumMonthTemp(db.Model):
    __tablename__ = 'nibrs_sum_month_temp'

    id = db.Column(db.Integer,
                   primary_key=True,
                   server_default=text(
                       "nextval('nibrs_sum_month_temp_id_seq'::regclass)"))
    nibrs_month_id = db.Column(db.BigInteger)
    agency_id = db.Column(db.BigInteger)
    month_num = db.Column(db.SmallInteger)
    data_year = db.Column(db.SmallInteger)
    reported_status = db.Column(db.String(1))
    report_date = db.Column(db.DateTime(True))
    prepared_date = db.Column(db.DateTime(True))
    orig_format = db.Column(db.String(1))
    ff_line_number = db.Column(db.BigInteger)
    data_home = db.Column(db.String(1))
    ddocname = db.Column(db.String(50))
    did = db.Column(db.BigInteger)
    nibrs_ct_flag = db.Column(db.String(1))
    nibrs_hc_flag = db.Column(db.String(1))
    nibrs_leoka_flag = db.Column(db.String(1))
    nibrs_arson_flag = db.Column(db.String(1))
    nibrs_ht_flag = db.Column(db.String(1))


class NibrsSuspectUsing(db.Model):
    __tablename__ = 'nibrs_suspect_using'
    __table_args__ = (UniqueConstraint('suspect_using_id', 'offense_id'), )

    id = db.Column(
        db.Integer,
        primary_key=True,
        server_default=text("nextval('nibrs_suspect_using_id_seq'::regclass)"))
    offense_id = db.Column(db.Integer,
                           db.ForeignKey('nibrs_offense.offense_id',
                                         deferrable=True,
                                         initially='DEFERRED'),
                           nullable=False,
                           index=True)
    suspect_using_id = db.Column(db.Integer,
                                 db.ForeignKey(
                                     'nibrs_using_list.suspect_using_id',
                                     deferrable=True,
                                     initially='DEFERRED'),
                                 nullable=False,
                                 index=True)

    offense = db.relationship('NibrsOffense')
    suspect_using = db.relationship('NibrsUsingList')


class NibrsSuspectedDrug(db.Model):
    __tablename__ = 'nibrs_suspected_drug'

    est_drug_qty = db.Column(Float(53))
    nibrs_suspected_drug_id = db.Column(db.BigInteger, primary_key=True)
    drug_measure_type_id = db.Column(
        db.Integer,
        db.ForeignKey('nibrs_drug_measure_type.drug_measure_type_id',
                      deferrable=True,
                      initially='DEFERRED'),
        index=True)
    property_id = db.Column(db.Integer,
                            db.ForeignKey('nibrs_property.property_id',
                                          deferrable=True,
                                          initially='DEFERRED'),
                            nullable=False,
                            index=True)
    suspected_drug_type_id = db.Column(
        db.Integer,
        db.ForeignKey('nibrs_suspected_drug_type.suspected_drug_type_id',
                      deferrable=True,
                      initially='DEFERRED'),
        nullable=False,
        index=True)

    drug_measure_type = db.relationship('NibrsDrugMeasureType')
    property = db.relationship('NibrsProperty')
    suspected_drug_type = db.relationship('NibrsSuspectedDrugType')


class NibrsSuspectedDrugType(db.Model):
    __tablename__ = 'nibrs_suspected_drug_type'

    suspected_drug_type_id = db.Column(db.SmallInteger, primary_key=True)
    suspected_drug_code = db.Column(db.String(1))
    suspected_drug_name = db.Column(db.String(100))


class NibrsUsingList(db.Model):
    __tablename__ = 'nibrs_using_list'

    suspect_using_id = db.Column(db.SmallInteger, primary_key=True)
    suspect_using_code = db.Column(db.String(1))
    suspect_using_name = db.Column(db.String(100))


class NibrsVictim(db.Model):
    __tablename__ = 'nibrs_victim'

    victim_id = db.Column(db.BigInteger, primary_key=True)
    victim_seq_num = db.Column(db.SmallInteger)
    outside_agency_id = db.Column(db.BigInteger)
    age_num = db.Column(db.SmallInteger)
    sex_code = db.Column(db.String(1))
    resident_status_code = db.Column(db.String(1))
    agency_data_year = db.Column(db.SmallInteger)
    ff_line_number = db.Column(db.BigInteger)
    age_range_low_num = db.Column(db.SmallInteger)
    age_range_high_num = db.Column(db.SmallInteger)
    activity_type_id = db.Column(
        db.Integer,
        db.ForeignKey('nibrs_activity_type.activity_type_id',
                      deferrable=True,
                      initially='DEFERRED'),
        index=True)
    age_id = db.Column(db.Integer,
                       db.ForeignKey('nibrs_age.age_id',
                                     deferrable=True,
                                     initially='DEFERRED'),
                       index=True)
    assignment_type_id = db.Column(
        db.Integer,
        db.ForeignKey('nibrs_assignment_type.assignment_type_id',
                      deferrable=True,
                      initially='DEFERRED'),
        index=True)
    ethnicity_id = db.Column(db.Integer,
                             db.ForeignKey('nibrs_ethnicity.ethnicity_id',
                                           deferrable=True,
                                           initially='DEFERRED'),
                             index=True)
    incident_id = db.Column(db.Integer,
                            db.ForeignKey('nibrs_incident.incident_id',
                                          deferrable=True,
                                          initially='DEFERRED'),
                            nullable=False,
                            index=True)
    race_id = db.Column(db.Integer,
                        db.ForeignKey('ref_race.race_id',
                                      deferrable=True,
                                      initially='DEFERRED'),
                        index=True)
    victim_type_id = db.Column(db.Integer,
                               db.ForeignKey(
                                   'nibrs_victim_type.victim_type_id',
                                   deferrable=True,
                                   initially='DEFERRED'),
                               nullable=False,
                               index=True)

    activity_type = db.relationship('NibrsActivityType', backref='victims')
    age = db.relationship('NibrsAge', backref='victims', lazy=False)
    assignment_type = db.relationship('NibrsAssignmentType', backref='victims')
    ethnicity = db.relationship('NibrsEthnicity', backref='victims')
    incident = db.relationship('NibrsIncident',
                               backref=backref('victims',
                                               lazy=False))
    race = db.relationship('RefRace', lazy=False, backref='victims')
    victim_type = db.relationship('NibrsVictimType',
                                  lazy=False,
                                  backref='victims')


class NibrsVictimCircumstance(db.Model):
    __tablename__ = 'nibrs_victim_circumstances'
    __table_args__ = (UniqueConstraint('victim_id', 'circumstances_id'), )

    id = db.Column(
        db.Integer,
        primary_key=True,
        server_default=text(
            "nextval('nibrs_victim_circumstances_id_seq'::regclass)"))
    circumstances_id = db.Column(db.Integer,
                                 db.ForeignKey(
                                     'nibrs_circumstances.circumstances_id',
                                     deferrable=True,
                                     initially='DEFERRED'),
                                 nullable=False,
                                 index=True)
    justifiable_force_id = db.Column(
        db.Integer,
        db.ForeignKey('nibrs_justifiable_force.justifiable_force_id',
                      deferrable=True,
                      initially='DEFERRED'),
        index=True)
    victim_id = db.Column(db.Integer,
                          db.ForeignKey('nibrs_victim.victim_id',
                                        deferrable=True,
                                        initially='DEFERRED'),
                          nullable=False,
                          index=True)

    circumstances = db.relationship('NibrsCircumstance')
    justifiable_force = db.relationship('NibrsJustifiableForce')
    victim = db.relationship('NibrsVictim')


class NibrsVictimInjury(db.Model):
    __tablename__ = 'nibrs_victim_injury'
    __table_args__ = (UniqueConstraint('victim_id', 'injury_id'), )

    # id = db.Column(
    #     db.Integer,
    #     primary_key=True,
    #     server_default=text("nextval('nibrs_victim_injury_id_seq'::regclass)"))
    injury_id = db.Column(db.Integer,
                          db.ForeignKey('nibrs_injury.injury_id',
                                        deferrable=True,
                                        initially='DEFERRED'),
                          primary_key=True,
                          nullable=False,
                          index=True)
    victim_id = db.Column(db.Integer,
                          db.ForeignKey('nibrs_victim.victim_id',
                                        deferrable=True,
                                        initially='DEFERRED'),
                          primary_key=True,
                          nullable=False,
                          index=True)

    injury = db.relationship('NibrsInjury')
    victim = db.relationship('NibrsVictim', backref="injuries")


class NibrsVictimOffenderRel(db.Model):
    __tablename__ = 'nibrs_victim_offender_rel'

    nibrs_victim_offender_id = db.Column(db.BigInteger, primary_key=True)
    offender_id = db.Column(db.Integer,
                            db.ForeignKey('nibrs_offender.offender_id',
                                          deferrable=True,
                                          initially='DEFERRED'),
                            nullable=False,
                            index=True)
    relationship_id = db.Column(db.Integer,
                                db.ForeignKey(
                                    'nibrs_relationship.relationship_id',
                                    deferrable=True,
                                    initially='DEFERRED'),
                                nullable=False,
                                index=True)
    victim_id = db.Column(db.Integer,
                          db.ForeignKey('nibrs_victim.victim_id',
                                        deferrable=True,
                                        initially='DEFERRED'),
                          nullable=False,
                          index=True)

    offender = db.relationship('NibrsOffender', backref="relationships")
    relationship_ = db.relationship('NibrsRelationship',
                                    backref="relationships")
    victim = db.relationship('NibrsVictim', backref="relationships")


class NibrsVictimOffense(db.Model):
    __tablename__ = 'nibrs_victim_offense'
    __table_args__ = (UniqueConstraint('victim_id', 'offense_id'), )

    id = db.Column(db.Integer,
                   primary_key=True,
                   server_default=text(
                       "nextval('nibrs_victim_offense_id_seq'::regclass)"))
    offense_id = db.Column(db.Integer,
                           db.ForeignKey('nibrs_offense.offense_id',
                                         deferrable=True,
                                         initially='DEFERRED'),
                           nullable=False,
                           index=True)
    victim_id = db.Column(db.Integer,
                          db.ForeignKey('nibrs_victim.victim_id',
                                        deferrable=True,
                                        initially='DEFERRED'),
                          nullable=False,
                          index=True)

    offense = db.relationship('NibrsOffense')
    victim = db.relationship('NibrsVictim')


class NibrsVictimType(db.Model):
    __tablename__ = 'nibrs_victim_type'

    victim_type_id = db.Column(db.SmallInteger, primary_key=True)
    victim_type_code = db.Column(db.String(1))
    victim_type_name = db.Column(db.String(100))


class NibrsWeapon(db.Model):
    __tablename__ = 'nibrs_weapon'

    nibrs_weapon_id = db.Column(db.BigInteger, primary_key=True)
    offense_id = db.Column(db.Integer,
                           db.ForeignKey('nibrs_offense.offense_id',
                                         deferrable=True,
                                         initially='DEFERRED'),
                           nullable=False,
                           index=True)
    weapon_id = db.Column(db.Integer,
                          db.ForeignKey('nibrs_weapon_type.weapon_id',
                                        deferrable=True,
                                        initially='DEFERRED'),
                          nullable=False,
                          index=True)

    weapon = db.relationship('NibrsWeaponType', backref='weapons')
    offense = db.relationship('NibrsOffense', backref='weapons')


class NibrsWeaponType(db.Model):
    __tablename__ = 'nibrs_weapon_type'

    weapon_id = db.Column(db.SmallInteger, primary_key=True)
    weapon_code = db.Column(db.String(3))
    weapon_name = db.Column(db.String(100))
    shr_flag = db.Column(db.String(1))


class OffenseClassification(db.Model):
    __tablename__ = 'offense_classification'

    classification_id = db.Column(db.SmallInteger, primary_key=True)
    classification_name = db.Column(db.String(50))
    class_sort_order = db.Column(db.SmallInteger)


class PeEmployeeData(db.Model):
    __tablename__ = 'pe_employee_data'
    __table_args__ = (UniqueConstraint('agency_id', 'data_year'), )

    agency_id = db.Column(db.Integer,
                          db.ForeignKey('ref_agency.agency_id',
                                        deferrable=True,
                                        initially='DEFERRED'),
                          nullable=False,
                          index=True,
                          primary_key=True)
    data_year = db.Column(db.SmallInteger, nullable=False, primary_key=True)
    reported_flag = db.Column(db.String(1))
    male_officer = db.Column(db.Integer)
    male_civilian = db.Column(db.Integer)
    male_total = db.Column(db.Integer)
    female_officer = db.Column(db.Integer)
    female_civilian = db.Column(db.Integer)
    female_total = db.Column(db.Integer)
    officer_rate = db.Column(db.Integer)
    civilian_rate = db.Column(db.Integer)


class RefUniversity(db.Model):
    __tablename__ = 'ref_university'

    university_id = db.Column(db.BigInteger, primary_key=True)
    university_abbr = db.Column(db.String(20))
    university_name = db.Column(db.String(100), unique=True)


class RefUniversityCampus(db.Model):
    __tablename__ = 'ref_university_campus'

    campus_id = db.Column(db.BigInteger, primary_key=True)
    campus_name = db.Column(db.String(100))
    university_id = db.Column(db.Integer,
                              db.ForeignKey('ref_university.university_id',
                                            deferrable=True,
                                            initially='DEFERRED'),
                              nullable=False,
                              index=True)

    university = db.relationship('RefUniversity')


class RefAgencyCounty(db.Model):
    __tablename__ = 'ref_agency_county'
    __table_args__ = (UniqueConstraint('agency_id', 'county_id',
                                       'metro_div_id', 'data_year'), )

    core_city_flag = db.Column(db.String(1))
    data_year = db.Column(db.SmallInteger, nullable=False, primary_key=True)
    population = db.Column(db.BigInteger)
    census = db.Column(db.BigInteger)
    legacy_county_code = db.Column(db.String(20))
    legacy_msa_code = db.Column(db.String(20))
    source_flag = db.Column(db.String(1))
    change_timestamp = db.Column(db.DateTime(True))
    change_user = db.Column(db.String(100))
    agency_id = db.Column(db.Integer,
                          db.ForeignKey('ref_agency.agency_id',
                                        deferrable=True,
                                        initially='DEFERRED'),
                          nullable=False,
                          index=True,
                          primary_key=True)
    county_id = db.Column(db.Integer,
                          db.ForeignKey('ref_county.county_id',
                                        deferrable=True,
                                        initially='DEFERRED'),
                          nullable=False,
                          index=True,
                          primary_key=True)
    metro_div_id = db.Column(db.Integer,
                             db.ForeignKey('ref_metro_division.metro_div_id',
                                           deferrable=True,
                                           initially='DEFERRED'),
                             nullable=False,
                             index=True,
                             primary_key=True)

    agency = db.relationship('RefAgency', backref='county_associations')
    county = db.relationship('RefCounty', backref='agency_associations')
    metro_div = db.relationship('RefMetroDivision')


class RefAgency(db.Model):
    __tablename__ = 'ref_agency'

    agency_id = db.Column(db.BigInteger, primary_key=True)
    ori = db.Column(db.String(9), nullable=False, unique=True)
    legacy_ori = db.Column(db.String(9), nullable=False)
    ucr_agency_name = db.Column(db.String(100))
    ncic_agency_name = db.Column(db.String(100))
    pub_agency_name = db.Column(db.String(100))
    special_mailing_group = db.Column(db.String(1))
    special_mailing_address = db.Column(db.String(1))
    agency_status = db.Column(db.String(1), nullable=False)
    judicial_dist_code = db.Column(db.String(4))
    fid_code = db.Column(db.String(2))
    added_date = db.Column(db.DateTime(True))
    change_timestamp = db.Column(db.DateTime(True))
    change_user = db.Column(db.String(100))
    legacy_notify_agency = db.Column(db.String(1))
    dormant_year = db.Column(db.SmallInteger)
    agency_type_id = db.Column(db.Integer,
                               db.ForeignKey('ref_agency_type.agency_type_id',
                                             deferrable=True,
                                             initially='DEFERRED'),
                               nullable=False,
                               index=True)
    campus_id = db.Column(db.Integer,
                          db.ForeignKey('ref_university_campus.campus_id',
                                        deferrable=True,
                                        initially='DEFERRED'),
                          index=True)
    city_id = db.Column(db.Integer,
                        db.ForeignKey('ref_city.city_id',
                                      deferrable=True,
                                      initially='DEFERRED'),
                        index=True)
    department_id = db.Column(db.Integer,
                              db.ForeignKey('ref_department.department_id',
                                            deferrable=True,
                                            initially='DEFERRED'),
                              index=True)
    field_office_id = db.Column(
        db.Integer,
        db.ForeignKey('ref_field_office.field_office_id',
                      deferrable=True,
                      initially='DEFERRED'),
        index=True)
    population_family_id = db.Column(
        db.Integer,
        db.ForeignKey('ref_population_family.population_family_id',
                      deferrable=True,
                      initially='DEFERRED'),
        nullable=False,
        index=True)
    state_id = db.Column(db.Integer,
                         db.ForeignKey('ref_state.state_id',
                                       deferrable=True,
                                       initially='DEFERRED'),
                         nullable=False,
                         index=True)
    submitting_agency_id = db.Column(
        db.Integer,
        db.ForeignKey('ref_submitting_agency.agency_id',
                      deferrable=True,
                      initially='DEFERRED'),
        index=True)
    tribe_id = db.Column(db.Integer,
                         db.ForeignKey('ref_tribe.tribe_id',
                                       deferrable=True,
                                       initially='DEFERRED'),
                         index=True)

    agency_type = db.relationship('RefAgencyType', lazy=False)
    campus = db.relationship('RefUniversityCampus')
    city = db.relationship('RefCity', lazy=False)
    department = db.relationship('RefDepartment', lazy=False)
    field_office = db.relationship('RefFieldOffice', lazy=False)
    population_family = db.relationship('RefPopulationFamily', lazy=False)
    state = db.relationship('RefState', lazy=False)
    submitting_agency = db.relationship('RefSubmittingAgency', lazy=False)
    tribe = db.relationship('RefTribe')
    counties = db.relationship('RefCounty',
                               secondary=RefAgencyCounty.__table__,

                               collection_class=set)


class RefAgencyCoveredBy(db.Model):
    __tablename__ = 'ref_agency_covered_by'
    __table_args__ = (UniqueConstraint('agency_id', 'data_year'), )

    id = db.Column(db.Integer,
                   primary_key=True,
                   server_default=text(
                       "nextval('ref_agency_covered_by_id_seq'::regclass)"))
    data_year = db.Column(db.SmallInteger, nullable=False)
    agency_id = db.Column(db.Integer,
                          db.ForeignKey('ref_agency.agency_id',
                                        deferrable=True,
                                        initially='DEFERRED'),
                          nullable=False,
                          index=True)
    covered_by_agency_id = db.Column(db.Integer,
                                     db.ForeignKey('ref_agency.agency_id',
                                                   deferrable=True,
                                                   initially='DEFERRED'),
                                     nullable=False,
                                     index=True)

    agency = db.relationship(
        'RefAgency',
        primaryjoin='RefAgencyCoveredBy.agency_id == RefAgency.agency_id')
    covered_by_agency = db.relationship(
        'RefAgency',
        primaryjoin=
        'RefAgencyCoveredBy.covered_by_agency_id == RefAgency.agency_id')


class RefAgencyDataContent(db.Model):
    __tablename__ = 'ref_agency_data_content'
    __table_args__ = (UniqueConstraint('agency_id', 'data_year'), )

    id = db.Column(db.Integer,
                   primary_key=True,
                   server_default=text(
                       "nextval('ref_agency_data_content_id_seq'::regclass)"))
    data_year = db.Column(db.SmallInteger, nullable=False)
    reporting_type = db.Column(db.String(1))
    nibrs_ct_flag = db.Column(db.String(1))
    nibrs_hc_flag = db.Column(db.String(1))
    nibrs_leoka_flag = db.Column(db.String(1))
    nibrs_arson_flag = db.Column(db.String(1))
    summary_rape_def = db.Column(db.String(1))
    nibrs_ht_flag = db.Column(db.String(1))
    agency_id = db.Column(db.Integer,
                          db.ForeignKey('ref_agency.agency_id',
                                        deferrable=True,
                                        initially='DEFERRED'),
                          nullable=False,
                          index=True)

    agency = db.relationship('RefAgency')


class RefAgencyPoc(db.Model):
    __tablename__ = 'ref_agency_poc'
    __table_args__ = (UniqueConstraint('agency_id', 'poc_id'), )

    id = db.Column(
        db.Integer,
        primary_key=True,
        server_default=text("nextval('ref_agency_poc_id_seq'::regclass)"))
    agency_id = db.Column(db.BigInteger, nullable=False)
    primary_poc_flag = db.Column(db.String(1))
    poc_id = db.Column(db.Integer,
                       db.ForeignKey('ref_poc.poc_id',
                                     deferrable=True,
                                     initially='DEFERRED'),
                       nullable=False,
                       index=True)

    poc = db.relationship('RefPoc')


class RefAgencyType(db.Model):
    __tablename__ = 'ref_agency_type'

    agency_type_id = db.Column(db.SmallInteger, primary_key=True)
    agency_type_name = db.Column(db.String(100))
    default_pop_family_id = db.Column(
        db.Integer,
        db.ForeignKey('ref_population_family.population_family_id',
                      deferrable=True,
                      initially='DEFERRED'),
        nullable=False,
        index=True)

    default_pop_family = db.relationship('RefPopulationFamily')


class RefCampusPopulation(db.Model):
    __tablename__ = 'ref_campus_population'
    __table_args__ = (UniqueConstraint('campus_id', 'data_year'), )

    id = db.Column(db.Integer,
                   primary_key=True,
                   server_default=text(
                       "nextval('ref_campus_population_id_seq'::regclass)"))
    data_year = db.Column(db.SmallInteger, nullable=False)
    population = db.Column(db.BigInteger)
    source_flag = db.Column(db.String(1), nullable=False)
    census = db.Column(db.BigInteger)
    change_timestamp = db.Column(db.DateTime(True))
    change_user = db.Column(db.String(100))
    reporting_population = db.Column(db.BigInteger)
    campus_id = db.Column(db.Integer,
                          db.ForeignKey('ref_university_campus.campus_id',
                                        deferrable=True,
                                        initially='DEFERRED'),
                          nullable=False,
                          index=True)

    campus = db.relationship('RefUniversityCampus')


class RefCity(db.Model):
    __tablename__ = 'ref_city'
    __table_args__ = (UniqueConstraint('city_name', 'state_id'), )

    city_id = db.Column(db.BigInteger, primary_key=True)
    city_name = db.Column(db.String(100))
    state_id = db.Column(db.Integer,
                         db.ForeignKey('ref_state.state_id',
                                       deferrable=True,
                                       initially='DEFERRED'),
                         nullable=False,
                         index=True)

    state = db.relationship('RefState')


class RefContinent(db.Model):
    __tablename__ = 'ref_continent'

    continent_id = db.Column(db.SmallInteger, primary_key=True)
    continent_desc = db.Column(db.String(50))


class RefCountry(db.Model):
    __tablename__ = 'ref_country'

    country_id = db.Column(db.SmallInteger, primary_key=True)
    country_desc = db.Column(db.String(50))
    continent_id = db.Column(db.Integer,
                             db.ForeignKey('ref_continent.continent_id',
                                           deferrable=True,
                                           initially='DEFERRED'),
                             nullable=False,
                             index=True)

    continent = db.relationship('RefContinent')


class RefCounty(db.Model):
    __tablename__ = 'ref_county'

    county_id = db.Column(db.BigInteger, primary_key=True)
    county_name = db.Column(db.String(100))
    county_ansi_code = db.Column(db.String(5))
    county_fips_code = db.Column(db.String(5))
    legacy_county_code = db.Column(db.String(5))
    comments = db.Column(db.String(1000))
    state_id = db.Column(db.Integer,
                         db.ForeignKey('ref_state.state_id',
                                       deferrable=True,
                                       initially='DEFERRED'),
                         nullable=False,
                         index=True)

    state = db.relationship('RefState', back_populates='counties')


class RefCountyPopulation(db.Model):
    __tablename__ = 'ref_county_population'
    __table_args__ = (UniqueConstraint('county_id', 'data_year'), )

    data_year = db.Column(db.SmallInteger, nullable=False, primary_key=True)
    population = db.Column(db.BigInteger)
    source_flag = db.Column(db.String(1), nullable=False)
    change_timestamp = db.Column(db.DateTime(True))
    change_user = db.Column(db.String(100))
    reporting_population = db.Column(db.BigInteger)
    county_id = db.Column(db.Integer,
                          db.ForeignKey('ref_county.county_id',
                                        deferrable=True,
                                        initially='DEFERRED'),
                          nullable=False,
                          index=True,
                          primary_key=True)

    county = db.relationship('RefCounty')


class RefStatePopulation(db.Model):
    __tablename__ = 'ref_state_population'
    __tableargs__ = (UniqueConstraint('state_id', 'data_year'), )

    state_id = db.Column(db.Integer,
                         db.ForeignKey('ref_state.state_id',
                                       deferrable=True,
                                       initially='DEFERRED'),
                         nullable=False,
                         index=True,
                         primary_key=True)
    data_year = db.Column(db.SmallInteger, nullable=False, primary_key=True)
    population = db.Column(db.BigInteger)
    source_flag = db.Column(db.String(1), nullable=False)
    census = db.Column(db.BigInteger)
    change_timestamp = db.Column(db.DateTime(True))
    change_user = db.Column(db.String(100))
    reporting_population = db.Column(db.BigInteger)


class RefDepartment(db.Model):
    __tablename__ = 'ref_department'

    department_id = db.Column(db.SmallInteger, primary_key=True)
    department_name = db.Column(db.String(100), nullable=False)
    active_flag = db.Column(db.String(1), nullable=False)
    sort_order = db.Column(db.SmallInteger)


class RefDivision(db.Model):
    __tablename__ = 'ref_division'

    division_id = db.Column(db.SmallInteger, primary_key=True)
    division_code = db.Column(db.String(2))
    division_name = db.Column(db.String(100))
    division_desc = db.Column(db.String(100))
    region_id = db.Column(db.Integer,
                          db.ForeignKey('ref_region.region_id',
                                        deferrable=True,
                                        initially='DEFERRED'),
                          nullable=False,
                          index=True)

    region = db.relationship('RefRegion', lazy=False)


class RefFieldOffice(db.Model):
    __tablename__ = 'ref_field_office'

    field_office_id = db.Column(db.BigInteger, primary_key=True)
    field_office_code = db.Column(db.String(10))
    field_office_name = db.Column(db.String(100))
    field_office_alpha_code = db.Column(db.String(2))
    field_office_numeric_code = db.Column(db.String(10))


class RefGlobalLocation(db.Model):
    __tablename__ = 'ref_global_location'

    global_location_id = db.Column(db.BigInteger, primary_key=True)
    global_location_desc = db.Column(db.String(50))
    country_id = db.Column(db.Integer,
                           db.ForeignKey('ref_country.country_id',
                                         deferrable=True,
                                         initially='DEFERRED'),
                           nullable=False,
                           index=True)

    country = db.relationship('RefCountry')


class RefMetroDivPopulation(db.Model):
    __tablename__ = 'ref_metro_div_population'
    __table_args__ = (UniqueConstraint('metro_div_id', 'data_year'), )

    id = db.Column(db.Integer,
                   primary_key=True,
                   server_default=text(
                       "nextval('ref_metro_div_population_id_seq'::regclass)"))
    data_year = db.Column(db.SmallInteger, nullable=False)
    population = db.Column(db.BigInteger)
    source_flag = db.Column(db.String(1), nullable=False)
    census = db.Column(db.BigInteger)
    change_timestamp = db.Column(db.DateTime(True))
    change_user = db.Column(db.String(100))
    reporting_population = db.Column(db.BigInteger)
    metro_div_id = db.Column(db.Integer,
                             db.ForeignKey('ref_metro_division.metro_div_id',
                                           deferrable=True,
                                           initially='DEFERRED'),
                             nullable=False,
                             index=True)

    metro_div = db.relationship('RefMetroDivision')


class RefMetroDivision(db.Model):
    __tablename__ = 'ref_metro_division'

    metro_div_id = db.Column(db.BigInteger, primary_key=True)
    metro_div_name = db.Column(db.String(100))
    msa_flag = db.Column(db.String(1))
    metro_div_omb_code = db.Column(db.String(5))
    legacy_msa_code = db.Column(db.String(5))
    msa_id = db.Column(db.Integer,
                       db.ForeignKey('ref_msa.msa_id',
                                     deferrable=True,
                                     initially='DEFERRED'),
                       nullable=False,
                       index=True)

    msa = db.relationship('RefMsa')


class RefMsa(db.Model):
    __tablename__ = 'ref_msa'
    __table_args__ = (UniqueConstraint('msa_name', 'msa_omb_code'), )

    msa_id = db.Column(db.BigInteger, primary_key=True)
    msa_name = db.Column(db.String(100))
    msa_omb_code = db.Column(db.String(5))


class RefParentPopulationGroup(db.Model):
    __tablename__ = 'ref_parent_population_group'

    parent_pop_group_id = db.Column(db.BigInteger, primary_key=True)
    parent_pop_group_code = db.Column(db.String(2))
    parent_pop_group_desc = db.Column(db.String(100))
    publication_name = db.Column(db.String(100))
    population_family_id = db.Column(
        db.Integer,
        db.ForeignKey('ref_population_family.population_family_id',
                      deferrable=True,
                      initially='DEFERRED'),
        nullable=False,
        index=True)

    population_family = db.relationship('RefPopulationFamily')


class RefPoc(db.Model):
    __tablename__ = 'ref_poc'

    poc_id = db.Column(db.BigInteger, primary_key=True)
    poc_name = db.Column(db.String(200))
    poc_title = db.Column(db.String(200))
    poc_email = db.Column(db.String(200))
    poc_phone1 = db.Column(db.String(50))
    poc_phone2 = db.Column(db.String(50))
    mailing_address_1 = db.Column(db.String(150))
    mailing_address_2 = db.Column(db.String(150))
    mailing_address_3 = db.Column(db.String(150))
    mailing_address_4 = db.Column(db.String(150))
    zip_code = db.Column(db.String(10))
    city_name = db.Column(db.String(100))
    poc_fax1 = db.Column(db.String(20))
    poc_fax2 = db.Column(db.String(20))
    state_id = db.Column(db.Integer,
                         db.ForeignKey('ref_state.state_id',
                                       deferrable=True,
                                       initially='DEFERRED'),
                         index=True)

    state = db.relationship('RefState')


class RefPocRole(db.Model):
    __tablename__ = 'ref_poc_role'

    poc_role_id = db.Column(db.SmallInteger, primary_key=True)
    poc_role_name = db.Column(db.String(100))


class RefPocRoleAssign(db.Model):
    __tablename__ = 'ref_poc_role_assign'
    __table_args__ = (UniqueConstraint('poc_id', 'poc_role_id'), )

    id = db.Column(
        db.Integer,
        primary_key=True,
        server_default=text("nextval('ref_poc_role_assign_id_seq'::regclass)"))
    poc_id = db.Column(db.Integer,
                       db.ForeignKey('ref_poc.poc_id',
                                     deferrable=True,
                                     initially='DEFERRED'),
                       nullable=False,
                       index=True)
    poc_role_id = db.Column(db.Integer,
                            db.ForeignKey('ref_poc_role.poc_role_id',
                                          deferrable=True,
                                          initially='DEFERRED'),
                            nullable=False,
                            index=True)

    poc = db.relationship('RefPoc')
    poc_role = db.relationship('RefPocRole')


class RefPopulationFamily(db.Model):
    __tablename__ = 'ref_population_family'

    population_family_id = db.Column(db.SmallInteger, primary_key=True)
    population_family_name = db.Column(db.String(100))
    population_family_desc = db.Column(db.String(200))
    sort_order = db.Column(db.SmallInteger)


class RefPopulationGroup(db.Model):
    __tablename__ = 'ref_population_group'

    population_group_id = db.Column(db.BigInteger, primary_key=True)
    population_group_code = db.Column(db.String(2))
    population_group_desc = db.Column(db.String(150))
    publication_name = db.Column(db.String(100))
    parent_pop_group_id = db.Column(
        db.Integer,
        db.ForeignKey('ref_parent_population_group.parent_pop_group_id',
                      deferrable=True,
                      initially='DEFERRED'),
        nullable=False,
        index=True)

    parent_pop_group = db.relationship('RefParentPopulationGroup')


class RefState(db.Model):
    __tablename__ = 'ref_state'

    state_id = db.Column(db.SmallInteger, primary_key=True)
    state_name = db.Column(db.String(100))
    state_code = db.Column(db.String(2))
    state_abbr = db.Column(db.String(2))
    state_postal_abbr = db.Column(db.String(2))
    state_fips_code = db.Column(db.String(2))
    state_pub_freq_months = db.Column(db.SmallInteger)
    division_id = db.Column(db.Integer,
                            db.ForeignKey('ref_division.division_id',
                                          deferrable=True,
                                          initially='DEFERRED'),
                            nullable=False,
                            index=True)

    division = db.relationship('RefDivision', lazy=False)
    counties = db.relationship('RefCounty',
                               lazy='dynamic',
                               back_populates='state')


class RefSubmittingAgency(db.Model):
    __tablename__ = 'ref_submitting_agency'

    agency_id = db.Column(db.BigInteger, primary_key=True)
    sai = db.Column(db.String(9))
    agency_name = db.Column(db.String(150))
    notify_agency = db.Column(db.String(1))
    agency_email = db.Column(db.String(200))
    agency_website = db.Column(db.String(2000))
    comments = db.Column(db.String(2000))
    state_id = db.Column(db.Integer,
                         db.ForeignKey('ref_state.state_id',
                                       deferrable=True,
                                       initially='DEFERRED'),
                         index=True)

    state = db.relationship('RefState')


class RefTribe(db.Model):
    __tablename__ = 'ref_tribe'

    tribe_id = db.Column(db.BigInteger, primary_key=True)
    tribe_name = db.Column(db.String(100), unique=True)


class RefTribePopulation(db.Model):
    __tablename__ = 'ref_tribe_population'
    __table_args__ = (UniqueConstraint('tribe_id', 'data_year'), )

    id = db.Column(db.Integer,
                   primary_key=True,
                   server_default=text(
                       "nextval('ref_tribe_population_id_seq'::regclass)"))
    data_year = db.Column(db.SmallInteger, nullable=False)
    population = db.Column(db.BigInteger)
    source_flag = db.Column(db.String(1), nullable=False)
    census = db.Column(db.BigInteger)
    change_timestamp = db.Column(db.DateTime(True))
    change_user = db.Column(db.String(100))
    reporting_population = db.Column(db.BigInteger)
    tribe_id = db.Column(db.Integer,
                         db.ForeignKey('ref_tribe.tribe_id',
                                       deferrable=True,
                                       initially='DEFERRED'),
                         nullable=False,
                         index=True)

    tribe = db.relationship('RefTribe')


class RetaMonth(db.Model):
    __tablename__ = 'reta_month'
    __table_args__ = (UniqueConstraint('agency_id', 'data_year', 'month_num',
                                       'data_home', 'source_flag'), )

    reta_month_id = db.Column(db.BigInteger, primary_key=True)
    data_year = db.Column(db.SmallInteger, nullable=False)
    month_num = db.Column(db.SmallInteger, nullable=False)
    data_home = db.Column(db.String(1), nullable=False)
    source_flag = db.Column(db.String(1), nullable=False)
    reported_flag = db.Column(db.String(1), nullable=False)
    ddocname = db.Column(db.String(100))
    month_included_in = db.Column(db.SmallInteger)
    report_date = db.Column(db.DateTime(True))
    prepared_date = db.Column(db.DateTime(True))
    prepared_by_user = db.Column(db.String(100))
    prepared_by_email = db.Column(db.String(200))
    orig_format = db.Column(db.String(1), nullable=False)
    total_reported_count = db.Column(db.Integer)
    total_unfounded_count = db.Column(db.Integer)
    total_actual_count = db.Column(db.Integer)
    total_cleared_count = db.Column(db.Integer)
    total_juvenile_cleared_count = db.Column(db.Integer)
    leoka_felony = db.Column(db.SmallInteger)
    leoka_accident = db.Column(db.SmallInteger)
    leoka_assault = db.Column(db.Integer)
    leoka_status = db.Column(db.SmallInteger)
    update_flag = db.Column(db.String(1))
    did = db.Column(db.BigInteger)
    ff_line_number = db.Column(db.BigInteger)
    agency_id = db.Column(db.Integer,
                          db.ForeignKey('ref_agency.agency_id',
                                        deferrable=True,
                                        initially='DEFERRED'),
                          nullable=False,
                          index=True)

    agency = db.relationship('RefAgency')


class RetaMonthOffenseSubcat(db.Model):
    __tablename__ = 'reta_month_offense_subcat'
    __table_args__ = (UniqueConstraint('offense_subcat_id', 'reta_month_id'), )

    id = db.Column(
        db.Integer,
        primary_key=True,
        server_default=text(
            "nextval('reta_month_offense_subcat_id_seq'::regclass)"))
    reported_count = db.Column(db.Integer)
    reported_status = db.Column(db.SmallInteger)
    unfounded_count = db.Column(db.Integer)
    unfounded_status = db.Column(db.SmallInteger)
    actual_count = db.Column(db.Integer)
    actual_status = db.Column(db.SmallInteger)
    cleared_count = db.Column(db.Integer)
    cleared_status = db.Column(db.SmallInteger)
    juvenile_cleared_count = db.Column(db.Integer)
    juvenile_cleared_status = db.Column(db.SmallInteger)
    offense_subcat_id = db.Column(db.Integer,
                                  db.ForeignKey(
                                      'reta_offense_subcat.offense_subcat_id',
                                      deferrable=True,
                                      initially='DEFERRED'),
                                  nullable=False,
                                  index=True)
    reta_month_id = db.Column(db.Integer,
                              db.ForeignKey('reta_month.reta_month_id',
                                            deferrable=True,
                                            initially='DEFERRED'),
                              nullable=False,
                              index=True)

    offense_subcat = db.relationship('RetaOffenseSubcat')
    reta_month = db.relationship('RetaMonth')


class RetaOffense(db.Model):
    __tablename__ = 'reta_offense'

    offense_id = db.Column(db.BigInteger, primary_key=True)
    offense_name = db.Column(db.String(100), nullable=False)
    offense_code = db.Column(db.String(20), nullable=False, unique=True)
    offense_xml_path = db.Column(db.String(1000))
    offense_sort_order = db.Column(db.BigInteger)
    classification_id = db.Column(
        db.Integer,
        db.ForeignKey('offense_classification.classification_id',
                      deferrable=True,
                      initially='DEFERRED'),
        index=True)
    offense_category_id = db.Column(
        db.Integer,
        db.ForeignKey('reta_offense_category.offense_category_id',
                      deferrable=True,
                      initially='DEFERRED'),
        nullable=False,
        index=True)

    classification = db.relationship('OffenseClassification')
    offense_category = db.relationship('RetaOffenseCategory')


class RetaOffenseCategory(db.Model):
    __tablename__ = 'reta_offense_category'

    offense_category_id = db.Column(db.SmallInteger, primary_key=True)
    offense_category_name = db.Column(db.String(50))
    offense_category_sort_order = db.Column(db.SmallInteger, nullable=False)
    crime_type_id = db.Column(db.Integer,
                              db.ForeignKey('crime_type.crime_type_id',
                                            deferrable=True,
                                            initially='DEFERRED'),
                              nullable=False,
                              index=True)

    crime_type = db.relationship('CrimeType', backref='categories')


class RetaOffenseSubcat(db.Model):
    __tablename__ = 'reta_offense_subcat'

    offense_subcat_id = db.Column(db.BigInteger, primary_key=True)
    offense_subcat_name = db.Column(db.String(100), nullable=False)
    offense_subcat_code = db.Column(db.String(20), nullable=False, unique=True)
    offense_subcat_xml_path = db.Column(db.String(1000))
    offense_subcat_sort_order = db.Column(db.BigInteger)
    part = db.Column(db.String(1))
    crime_index_flag = db.Column(db.String(1))
    offense_id = db.Column(db.Integer,
                           db.ForeignKey('reta_offense.offense_id',
                                         deferrable=True,
                                         initially='DEFERRED'),
                           nullable=False,
                           index=True)

    offense = db.relationship('RetaOffense', backref='subcategories')


class ShrCircumstance(db.Model):
    __tablename__ = 'shr_circumstances'

    circumstances_id = db.Column(db.SmallInteger, primary_key=True)
    circumstances_code = db.Column(db.String(2), nullable=False)
    sub_code = db.Column(db.String(1))
    circumstances_name = db.Column(db.String(100), nullable=False)
    sub_name = db.Column(db.String(100))
    current_flag = db.Column(db.String(1))


class ShrIncident(db.Model):
    __tablename__ = 'shr_incident'
    __table_args__ = (
        UniqueConstraint('shr_month_id', 'incident_num', 'data_home'), )

    incident_id = db.Column(db.BigInteger, primary_key=True)
    homicide_code = db.Column(db.String(1))
    incident_num = db.Column(db.String(3))
    incident_status = db.Column(db.SmallInteger)
    update_flag = db.Column(db.String(1))
    data_home = db.Column(db.String(1))
    prepared_date = db.Column(db.DateTime(True))
    report_date = db.Column(db.DateTime(True))
    ddocname = db.Column(db.String(100))
    ff_line_number = db.Column(db.BigInteger)
    orig_format = db.Column(db.String(1))
    did = db.Column(db.BigInteger)
    nibrs_incident_id = db.Column(db.BigInteger)
    shr_month_id = db.Column(db.Integer,
                             db.ForeignKey('shr_month.shr_month_id',
                                           deferrable=True,
                                           initially='DEFERRED'),
                             nullable=False,
                             index=True)
    situation_id = db.Column(db.Integer,
                             db.ForeignKey('shr_situation.situation_id',
                                           deferrable=True,
                                           initially='DEFERRED'),
                             nullable=False,
                             index=True)

    shr_month = db.relationship('ShrMonth')
    situation = db.relationship('ShrSituation')


class ShrMonth(db.Model):
    __tablename__ = 'shr_month'
    __table_args__ = (
        UniqueConstraint('agency_id', 'data_year', 'month_num', 'data_home'), )

    shr_month_id = db.Column(db.BigInteger, primary_key=True)
    data_year = db.Column(db.SmallInteger, nullable=False)
    month_num = db.Column(db.SmallInteger, nullable=False)
    data_home = db.Column(db.String(1), nullable=False)
    source_flag = db.Column(db.String(1))
    reported_flag = db.Column(db.String(1))
    orig_format = db.Column(db.String(1))
    update_flag = db.Column(db.String(1))
    ff_line_number = db.Column(db.BigInteger)
    ddocname = db.Column(db.String(100))
    did = db.Column(db.BigInteger)
    agency_id = db.Column(db.Integer,
                          db.ForeignKey('ref_agency.agency_id',
                                        deferrable=True,
                                        initially='DEFERRED'),
                          nullable=False,
                          index=True)

    agency = db.relationship('RefAgency')


class ShrOffender(db.Model):
    __tablename__ = 'shr_offender'

    offender_id = db.Column(db.BigInteger, primary_key=True)
    offender_num = db.Column(db.String(20))
    age_num = db.Column(db.SmallInteger)
    sex_code = db.Column(db.String(1))
    nibrs_offense_id = db.Column(db.BigInteger)
    nibrs_offender_id = db.Column(db.BigInteger)
    age_id = db.Column(db.Integer,
                       db.ForeignKey('nibrs_age.age_id',
                                     deferrable=True,
                                     initially='DEFERRED'),
                       index=True)
    ethnicity_id = db.Column(db.Integer,
                             db.ForeignKey('nibrs_ethnicity.ethnicity_id',
                                           deferrable=True,
                                           initially='DEFERRED'),
                             index=True)
    race_id = db.Column(db.Integer,
                        db.ForeignKey('ref_race.race_id',
                                      deferrable=True,
                                      initially='DEFERRED'),
                        index=True)

    age = db.relationship('NibrsAge')
    ethnicity = db.relationship('NibrsEthnicity')
    race = db.relationship('RefRace')


class ShrOffense(db.Model):
    __tablename__ = 'shr_offense'

    offense_id = db.Column(db.BigInteger, primary_key=True)
    nibrs_offense_id = db.Column(db.BigInteger)
    circumstances_id = db.Column(
        db.Integer,
        db.ForeignKey('shr_circumstances.circumstances_id',
                      deferrable=True,
                      initially='DEFERRED'),
        index=True)
    incident_id = db.Column(db.Integer,
                            db.ForeignKey('shr_incident.incident_id',
                                          deferrable=True,
                                          initially='DEFERRED'),
                            nullable=False,
                            index=True)
    offender_id = db.Column(db.Integer,
                            db.ForeignKey('shr_offender.offender_id',
                                          deferrable=True,
                                          initially='DEFERRED'),
                            nullable=False,
                            index=True)
    relationship_id = db.Column(
        db.Integer,
        db.ForeignKey('shr_relationship.relationship_id',
                      deferrable=True,
                      initially='DEFERRED'),
        index=True)
    victim_id = db.Column(db.Integer,
                          db.ForeignKey('shr_victim.victim_id',
                                        deferrable=True,
                                        initially='DEFERRED'),
                          nullable=False,
                          index=True)
    weapon_id = db.Column(db.Integer,
                          db.ForeignKey('nibrs_weapon_type.weapon_id',
                                        deferrable=True,
                                        initially='DEFERRED'),
                          index=True)

    circumstances = db.relationship('ShrCircumstance')
    incident = db.relationship('ShrIncident')
    offender = db.relationship('ShrOffender')
    relationship_ = db.relationship('ShrRelationship')
    victim = db.relationship('ShrVictim')
    weapon = db.relationship('NibrsWeaponType')


class ShrRelationship(db.Model):
    __tablename__ = 'shr_relationship'

    relationship_id = db.Column(db.SmallInteger, primary_key=True)
    relationship_code = db.Column(db.String(2))
    relationship_name = db.Column(db.String(100))


class ShrSituation(db.Model):
    __tablename__ = 'shr_situation'

    situation_id = db.Column(db.SmallInteger, primary_key=True)
    situation_code = db.Column(db.String(1))
    situation_name = db.Column(db.String(100))


class ShrVictim(db.Model):
    __tablename__ = 'shr_victim'

    victim_id = db.Column(db.BigInteger, primary_key=True)
    victim_num = db.Column(db.String(20))
    age_num = db.Column(db.SmallInteger)
    sex_code = db.Column(db.String(1))
    nibrs_victim_id = db.Column(db.BigInteger)
    nibrs_offense_id = db.Column(db.BigInteger)
    age_id = db.Column(db.Integer,
                       db.ForeignKey('nibrs_age.age_id',
                                     deferrable=True,
                                     initially='DEFERRED'),
                       index=True)
    ethnicity_id = db.Column(db.Integer,
                             db.ForeignKey('nibrs_ethnicity.ethnicity_id',
                                           deferrable=True,
                                           initially='DEFERRED'),
                             index=True)
    race_id = db.Column(db.Integer,
                        db.ForeignKey('ref_race.race_id',
                                      deferrable=True,
                                      initially='DEFERRED'),
                        index=True)

    age = db.relationship('NibrsAge')
    ethnicity = db.relationship('NibrsEthnicity')
    race = db.relationship('RefRace')


class SuppLarcenyType(db.Model):
    __tablename__ = 'supp_larceny_type'

    larceny_type_id = db.Column(db.BigInteger, primary_key=True)
    larceny_type_name = db.Column(db.String(100), nullable=False)
    larceny_type_code = db.Column(db.String(20), nullable=False)
    larceny_xml_name = db.Column(db.String(100))


class SuppMonth(db.Model):
    __tablename__ = 'supp_month'
    __table_args__ = (
        UniqueConstraint('agency_id', 'data_year', 'month_num', 'data_home'), )

    supp_month_id = db.Column(db.BigInteger, primary_key=True)
    data_year = db.Column(db.SmallInteger, nullable=False)
    month_num = db.Column(db.SmallInteger, nullable=False)
    data_home = db.Column(db.String(1), nullable=False)
    source_flag = db.Column(db.String(1))
    reported_flag = db.Column(db.String(1), nullable=False)
    report_date = db.Column(db.DateTime(True))
    prepared_date = db.Column(db.DateTime(True))
    ddocname = db.Column(db.String(100))
    orig_format = db.Column(db.String(1), nullable=False)
    mv_stolen_local_rec_local = db.Column(db.BigInteger)
    mv_stolen_local_rec_other = db.Column(db.BigInteger)
    mv_tot_local_stolen_rec = db.Column(db.BigInteger)
    mv_stolen_other_rec_local = db.Column(db.BigInteger)
    mv_stolen_status = db.Column(db.SmallInteger)
    update_flag = db.Column(db.String(1))
    did = db.Column(db.BigInteger)
    ff_line_number = db.Column(db.BigInteger)
    agency_id = db.Column(db.Integer,
                          db.ForeignKey('ref_agency.agency_id',
                                        deferrable=True,
                                        initially='DEFERRED'),
                          nullable=False,
                          index=True)

    agency = db.relationship('RefAgency')


class SuppOffense(db.Model):
    __tablename__ = 'supp_offense'

    offense_id = db.Column(db.BigInteger, primary_key=True)
    offense_name = db.Column(db.String(100), nullable=False)
    offense_code = db.Column(db.String(20), nullable=False)


class SuppOffenseSubcat(db.Model):
    __tablename__ = 'supp_offense_subcat'

    offense_subcat_id = db.Column(db.BigInteger, primary_key=True)
    offense_subcat_name = db.Column(db.String(100), nullable=False)
    offense_subcat_code = db.Column(db.String(20), nullable=False)
    offense_subcat_xml_name = db.Column(db.String(100))
    offense_id = db.Column(db.Integer,
                           db.ForeignKey('supp_offense.offense_id',
                                         deferrable=True,
                                         initially='DEFERRED'),
                           nullable=False,
                           index=True)

    offense = db.relationship('SuppOffense')


class SuppPropByOffenseSubcat(db.Model):
    __tablename__ = 'supp_prop_by_offense_subcat'
    __table_args__ = (UniqueConstraint('supp_month_id', 'offense_subcat_id'), )

    id = db.Column(
        db.Integer,
        primary_key=True,
        server_default=text(
            "nextval('supp_prop_by_offense_subcat_id_seq'::regclass)"))
    actual_count = db.Column(db.Integer)
    actual_status = db.Column(db.SmallInteger)
    stolen_value = db.Column(db.BigInteger)
    stolen_value_status = db.Column(db.SmallInteger)
    offense_subcat_id = db.Column(db.Integer,
                                  db.ForeignKey(
                                      'supp_offense_subcat.offense_subcat_id',
                                      deferrable=True,
                                      initially='DEFERRED'),
                                  nullable=False,
                                  index=True)
    supp_month_id = db.Column(db.Integer,
                              db.ForeignKey('supp_month.supp_month_id',
                                            deferrable=True,
                                            initially='DEFERRED'),
                              nullable=False,
                              index=True)

    offense_subcat = db.relationship('SuppOffenseSubcat')
    supp_month = db.relationship('SuppMonth')


class SuppPropertyByTypeValue(db.Model):
    __tablename__ = 'supp_property_by_type_value'
    __table_args__ = (UniqueConstraint('prop_type_id', 'supp_month_id'), )

    id = db.Column(
        db.Integer,
        primary_key=True,
        server_default=text(
            "nextval('supp_property_by_type_value_id_seq'::regclass)"))
    stolen_value = db.Column(db.BigInteger)
    stolen_value_status = db.Column(db.SmallInteger)
    recovered_value = db.Column(db.BigInteger)
    recovered_value_status = db.Column(db.SmallInteger)
    prop_type_id = db.Column(db.Integer,
                             db.ForeignKey('supp_property_type.prop_type_id',
                                           deferrable=True,
                                           initially='DEFERRED'),
                             nullable=False,
                             index=True)
    supp_month_id = db.Column(db.Integer,
                              db.ForeignKey('supp_month.supp_month_id',
                                            deferrable=True,
                                            initially='DEFERRED'),
                              nullable=False,
                              index=True)

    prop_type = db.relationship('SuppPropertyType')
    supp_month = db.relationship('SuppMonth')


class SuppPropertyType(db.Model):
    __tablename__ = 'supp_property_type'

    prop_type_id = db.Column(db.BigInteger, primary_key=True)
    prop_type_name = db.Column(db.String(100), nullable=False)
    prop_type_code = db.Column(db.String(20), nullable=False)
    prop_type_code_num = db.Column(db.SmallInteger, nullable=False)