def create_reporters():
    from apps.contacts.models import Contact, CommunicationChannel, ChannelConnection
    from apps.reporters.models import Reporter, PersistantBackend, PersistantConnection

    # add reporter_id, allowing null values for now
    cursor = connection.cursor()
    cursor.execute("ALTER TABLE `contacts_contact` ADD COLUMN `reporter_id` INT(11) DEFAULT NULL AFTER `node_ptr_id`;")
    cursor.execute("ALTER TABLE `contacts_contact` ADD CONSTRAINT `reporter_id_refs_id_32f59ca5` FOREIGN KEY (`reporter_id`) REFERENCES `reporters_reporter` (`id`);")
    cursor.execute("ALTER TABLE `contacts_contact` ADD CONSTRAINT UNIQUE `reporter_id_unique` (`reporter_id`);")

    all_contacts = Contact.objects.all()
    for contact in all_contacts:
        print "processing contact %s" % contact.get_signature()
        
        # NEW reporter models
        rep = Reporter()
        rep.alias = contact.unique_id
        rep.first_name = contact.given_name
        rep.last_name = contact.family_name
        rep.language = contact._locale
        rep.save()
        
        contact.reporter = rep
        contact.save()
        
        # check
        conns = contact.channel_connections.all()
        conns_count = conns.count()
        if conns_count==0:
            print "%s has no connections" % (contact.get_signature())
        elif conns_count>1:
            print "%s has more than one connections" % (contact.get_signature())

        # create various connection objects
        for conn in conns:
            new_conn = PersistantConnection()
            new_conn.identity = conn.user_identifier
            new_conn.backend = PersistantBackend.objects.get(slug=conn.communication_channel.backend_slug)
            new_conn.reporter = rep
            new_conn.save()
            conn.delete()
                   
    # check
    unassociated_contacts = Contact.objects.filter(reporter=None)
    if len(unassociated_contacts)>0:
        print "PROBLEMS WITH GENERATING REPORTERS!"
        print "UNASSOCIATED: "
        for con in unassociated_contacts:
            print " contact id: %s\n" % con.id 

    # check
    contact_count = all_contacts.count()
    reporter_count = Reporter.objects.all().count()
    if contact_count != reporter_count:
        raise Exception("Mismatch between contact and reporter count! %s %s" \
                        % (contact_count, reporter_count))