mangroveorg/datawinners

View on GitHub
migration/from_previous_releases/couch_migration_for_mini_release_5_patch.py

Summary

Maintainability
D
1 day
Test Coverage
# vim: ai ts=4 sts=4 et sw=4 encoding=utf-8
from datetime import datetime
from mangrove.datastore.entity import _get_all_entities_of_type
from mangrove.form_model.field import DateField
from datawinners.main.initial_couch_fixtures import load_all_managers

map_fun_form_model_with_date_field_docs = """
function(doc) {
    if(doc.document_type=='FormModel'){
        for (field in doc.json_fields) {
            if (doc.json_fields[field].type == 'date') {
                emit(doc, null);
        break;
            }
        }
    }
}"""

map_fun_data_records_on_a_form_model = """
function (doc) {
    if (doc.document_type == 'DataRecord') {
        emit(doc.submission['form_code'], doc);
    }
}"""

managers = load_all_managers()

def migrate_01(managers, map_fun_form_model_with_date_field_docs):
    failed_managers = []
    for manager in managers:
        try:
            print manager.database
            print manager
            print "migrating date fields"
            try:
                form_model_rows = manager.database.query(map_fun_form_model_with_date_field_docs)
                for form_model_row in form_model_rows:
                    fields= form_model_row.key['json_fields']
                    for field in fields:
                        if field['type'] == 'date':
                            field_name = field['name']
                            date_format = field['date_format']
                            if form_model_row.key['is_registration_model']:
                                entities = _get_all_entities_of_type(manager, form_model_row.key['entity_type'])
                                for entity in entities :
                                    value = entity.value(field_name)
                                    if not isinstance(value, datetime):
                                        entity.data[field_name]['value'] = datetime.strptime(value, DateField.DATE_DICTIONARY.get(date_format))
                                        entity.save()
                            else :
                                form_code = form_model_row.key['form_code']
                                data_records = manager.database.query(map_fun_data_records_on_a_form_model, key=form_code)
                                for data in data_records :
                                    document = data.value
                                    value = document['data'][field_name]['value']
                                    if not isinstance(value, datetime):
                                        document['data'][field_name]['value'] = datetime.strptime(value, DateField.DATE_DICTIONARY.get(date_format))
                                        manager.database.save(document)
            except Exception as e:
                print e.message
        except Exception as e:
            failed_managers.append((manager, e.message))

    print 'failed managers if any'
    for manager, exception_message in failed_managers:
        print " %s failed. the reason :  %s" % (manager, exception_message)


migrate_01(managers, map_fun_form_model_with_date_field_docs)