In [20]:
import datetime
from itertools import chain

In [21]:
from pprint import pprint

In [22]:
from mongoengine import (
    Document,
    DateTimeField, 
    ObjectIdField, 
    IntField, 
    StringField,
    FloatField,
)
import bson

In [23]:
from flpd_helper import valid_accidents, valid_citations

In [24]:
collections = (
    valid_accidents, 
    valid_citations, 
)

In [25]:
data_samples = tuple([getattr(collection, 'find_one')() 
                      for collection in collections])

In [27]:
collection_keys = tuple([sorted(data_sample.keys()) 
                         for data_sample in data_samples])

In [28]:
collection_data_types = tuple([tuple([(type(sample[key]), key) for key in keys])
                                      for keys, sample 
                                      in zip(collection_keys, samples)])

In [29]:
field_lookup = {
    int: IntField,
    str: StringField,
    bson.objectid.ObjectId: ObjectIdField,
    bson.int64.Int64: IntField,
    datetime.datetime: DateTimeField,
    float: FloatField,
}

In [36]:
namespaces = tuple(chain(*[[dict([
    (
        key.lower().replace(' ', '_'), 
        field_lookup[type(sample[key])]
    ) 
    for key in keys
])] for keys, sample 
    in zip(collection_keys, samples)]))

In [35]:
pprint(namespaces)


({'1st_harmful_event_code': <class 'mongoengine.fields.StringField'>,
  '1st_harmful_event_description': <class 'mongoengine.fields.StringField'>,
  '_id': <class 'mongoengine.base.fields.ObjectIdField'>,
  'access_control_code': <class 'mongoengine.fields.IntField'>,
  'accident_description': <class 'mongoengine.fields.StringField'>,
  'agency_code': <class 'mongoengine.fields.StringField'>,
  'ambulance_request_description': <class 'mongoengine.fields.StringField'>,
  'at_intersection_road_type_code': <class 'mongoengine.fields.StringField'>,
  'at_intersection_road_type_desc': <class 'mongoengine.fields.StringField'>,
  'case_number': <class 'mongoengine.fields.IntField'>,
  'city': <class 'mongoengine.fields.StringField'>,
  'corrected_report': <class 'mongoengine.fields.StringField'>,
  'county': <class 'mongoengine.fields.StringField'>,
  'date/time_occurred': <class 'mongoengine.fields.DateTimeField'>,
  'day_of_week': <class 'mongoengine.fields.StringField'>,
  'development_type_code': <class 'mongoengine.fields.StringField'>,
  'development_type_description': <class 'mongoengine.fields.StringField'>,
  'direction_from': <class 'mongoengine.fields.StringField'>,
  'direction_toward': <class 'mongoengine.fields.StringField'>,
  'district_code': <class 'mongoengine.fields.StringField'>,
  'district_description': <class 'mongoengine.fields.StringField'>,
  'dnr': <class 'mongoengine.fields.StringField'>,
  'employee_division': <class 'mongoengine.fields.StringField'>,
  'employee_section': <class 'mongoengine.fields.StringField'>,
  'employee_shift': <class 'mongoengine.fields.StringField'>,
  'employee_unit': <class 'mongoengine.fields.StringField'>,
  'fatality': <class 'mongoengine.fields.IntField'>,
  'feet_from': <class 'mongoengine.fields.StringField'>,
  'geoother': <class 'mongoengine.fields.StringField'>,
  'geox': <class 'mongoengine.fields.StringField'>,
  'geoy': <class 'mongoengine.fields.StringField'>,
  'harmful_event_code': <class 'mongoengine.fields.IntField'>,
  'hazmat_involved': <class 'mongoengine.fields.StringField'>,
  'in/near': <class 'mongoengine.fields.StringField'>,
  'injured_taken_to_code': <class 'mongoengine.fields.StringField'>,
  'injured_taken_to_description': <class 'mongoengine.fields.StringField'>,
  'interramp': <class 'mongoengine.fields.StringField'>,
  'intersection': <class 'mongoengine.fields.StringField'>,
  'light_condition_code': <class 'mongoengine.fields.IntField'>,
  'light_condition_description': <class 'mongoengine.fields.StringField'>,
  'locality_code': <class 'mongoengine.fields.StringField'>,
  'locality_description': <class 'mongoengine.fields.StringField'>,
  'location': <class 'mongoengine.fields.StringField'>,
  'location_of_impact_code': <class 'mongoengine.fields.StringField'>,
  'location_of_impact_description': <class 'mongoengine.fields.StringField'>,
  'manner_of_collision_code': <class 'mongoengine.fields.IntField'>,
  'manner_of_collision_or_impact': <class 'mongoengine.fields.StringField'>,
  'neighborhood_code': <class 'mongoengine.fields.StringField'>,
  'neighborhood_description': <class 'mongoengine.fields.StringField'>,
  'next_reference_point_code': <class 'mongoengine.fields.StringField'>,
  'next_reference_point_descript': <class 'mongoengine.fields.StringField'>,
  'non_intersection_road_type_descript': <class 'mongoengine.fields.StringField'>,
  'notified_by_driver_or_law_enforcement': <class 'mongoengine.fields.IntField'>,
  'notn_intersection_road_type_code': <class 'mongoengine.fields.StringField'>,
  'number_of_lanes': <class 'mongoengine.fields.IntField'>,
  'number_of_units_involved': <class 'mongoengine.fields.IntField'>,
  'officer_dept_id': <class 'mongoengine.fields.IntField'>,
  'other': <class 'mongoengine.fields.StringField'>,
  'pedestrian_control': <class 'mongoengine.fields.StringField'>,
  'private_property': <class 'mongoengine.fields.StringField'>,
  'reccount': <class 'mongoengine.fields.IntField'>,
  'relation_to_junction': <class 'mongoengine.fields.StringField'>,
  'report_area_code': <class 'mongoengine.fields.StringField'>,
  'report_area_description': <class 'mongoengine.fields.StringField'>,
  'road_character': <class 'mongoengine.fields.StringField'>,
  'road_character_description': <class 'mongoengine.fields.StringField'>,
  'road_class': <class 'mongoengine.fields.IntField'>,
  'road_class_description': <class 'mongoengine.fields.StringField'>,
  'road_construction': <class 'mongoengine.fields.StringField'>,
  'road_defects_code': <class 'mongoengine.fields.IntField'>,
  'road_defects_description': <class 'mongoengine.fields.StringField'>,
  'road_feature_code': <class 'mongoengine.fields.IntField'>,
  'road_surface_codes': <class 'mongoengine.fields.StringField'>,
  'road_surface_conditions': <class 'mongoengine.fields.StringField'>,
  'road_surface_description': <class 'mongoengine.fields.StringField'>,
  'road_type_code': <class 'mongoengine.fields.IntField'>,
  'school_bus_related': <class 'mongoengine.fields.StringField'>,
  'street': <class 'mongoengine.fields.StringField'>,
  'subdivision': <class 'mongoengine.fields.StringField'>,
  'subdivision_description': <class 'mongoengine.fields.StringField'>,
  'supplement_report': <class 'mongoengine.fields.StringField'>,
  'taken_by_code': <class 'mongoengine.fields.IntField'>,
  'time_cleared_scene': <class 'mongoengine.fields.IntField'>,
  'time_occured': <class 'mongoengine.fields.IntField'>,
  'time_reported': <class 'mongoengine.fields.IntField'>,
  'township_code': <class 'mongoengine.fields.StringField'>,
  'township_description': <class 'mongoengine.fields.StringField'>,
  'tract_code': <class 'mongoengine.fields.StringField'>,
  'tract_description': <class 'mongoengine.fields.StringField'>,
  'trafficway_flow_code': <class 'mongoengine.fields.StringField'>,
  'trafficway_flow_description': <class 'mongoengine.fields.StringField'>,
  'visible_code': <class 'mongoengine.fields.StringField'>,
  'visible_description': <class 'mongoengine.fields.StringField'>,
  'weather_code': <class 'mongoengine.fields.IntField'>,
  'weather_description': <class 'mongoengine.fields.StringField'>,
  'within_interchange': <class 'mongoengine.fields.StringField'>,
  'zone_code': <class 'mongoengine.fields.StringField'>,
  'zone_description': <class 'mongoengine.fields.StringField'>,
  '\ufeffaccident_number': <class 'mongoengine.fields.IntField'>},
 {'_id': <class 'mongoengine.base.fields.ObjectIdField'>,
  'age': <class 'mongoengine.fields.IntField'>,
  'apartment/floor': <class 'mongoengine.fields.StringField'>,
  'case_number': <class 'mongoengine.fields.StringField'>,
  'citation_charge': <class 'mongoengine.fields.StringField'>,
  'citation_delivered_to_person': <class 'mongoengine.fields.IntField'>,
  'city': <class 'mongoengine.fields.StringField'>,
  'court_address': <class 'mongoengine.fields.StringField'>,
  'court_code': <class 'mongoengine.fields.StringField'>,
  'court_date/time': <class 'mongoengine.fields.StringField'>,
  'court_name': <class 'mongoengine.fields.StringField'>,
  'crash': <class 'mongoengine.fields.StringField'>,
  'date_occurred': <class 'mongoengine.fields.DateTimeField'>,
  'detection_device': <class 'mongoengine.fields.StringField'>,
  'district_code': <class 'mongoengine.fields.IntField'>,
  'district_description': <class 'mongoengine.fields.StringField'>,
  'driving_with_unlawful_blood_alcohol_level': <class 'mongoengine.fields.StringField'>,
  'employee_division_code': <class 'mongoengine.fields.StringField'>,
  'employee_section_code': <class 'mongoengine.fields.StringField'>,
  'employee_shift_code': <class 'mongoengine.fields.StringField'>,
  'employee_unit_code': <class 'mongoengine.fields.StringField'>,
  'ethnicity_code': <class 'mongoengine.fields.StringField'>,
  'geox': <class 'mongoengine.fields.FloatField'>,
  'geoy': <class 'mongoengine.fields.FloatField'>,
  'location': <class 'mongoengine.fields.StringField'>,
  'neighborhood_code': <class 'mongoengine.fields.StringField'>,
  'neighborhood_description': <class 'mongoengine.fields.StringField'>,
  'police_agency_code': <class 'mongoengine.fields.StringField'>,
  'police_agency_name': <class 'mongoengine.fields.StringField'>,
  'race_code': <class 'mongoengine.fields.StringField'>,
  'reporting_area_code': <class 'mongoengine.fields.StringField'>,
  'reporting_area_desc': <class 'mongoengine.fields.IntField'>,
  'residence_code': <class 'mongoengine.fields.StringField'>,
  'sex_code': <class 'mongoengine.fields.StringField'>,
  'speed': <class 'mongoengine.fields.IntField'>,
  'street_direction': <class 'mongoengine.fields.StringField'>,
  'street_name': <class 'mongoengine.fields.StringField'>,
  'street_number': <class 'mongoengine.fields.IntField'>,
  'subdivision_code': <class 'mongoengine.fields.StringField'>,
  'subdivision_description': <class 'mongoengine.fields.StringField'>,
  'time_entered': <class 'mongoengine.fields.IntField'>,
  'tract': <class 'mongoengine.fields.StringField'>,
  'tract_description': <class 'mongoengine.fields.StringField'>,
  'zone_code': <class 'mongoengine.fields.IntField'>,
  'zone_description': <class 'mongoengine.fields.StringField'>,
  '\ufeffcitation_number': <class 'mongoengine.fields.StringField'>})

In [32]:
documents = Accident, Citation = [type(class_name, (Document, ), namespace)
                                  for class_name, namespace 
                                  in zip(('Accident', 'Citation',), namespaces)]

In [33]:
for document in documents:
    print(document)


<class 'mongoengine.base.metaclasses.Accident'>
<class 'mongoengine.base.metaclasses.Citation'>