def test_cron_validate_answers(request):
    requestProcessor = HttpRequestProcessor(request)
    user = request.user
    field_validation_cycle_util = FieldValidationCycleUtil()      
    field_validation_cycle_util.cron_validate_answers()           
    data = {}
    return requestProcessor.render_to_response(request,'website/test/test_cron_validate_answers.html', data, '')   
     
   def get_updates(self, jurisdictions, num, type="days"):
       if type == "days":
           obj3monthsbefore = self.objDateTimeNow - timedelta(days = num)
       else:
           obj3monthsbefore = self.objDateTimeNow - timedelta(seconds = num)
       
       print str(obj3monthsbefore.replace(tzinfo=utc))
       updates = []
       jurisdiction_list = []
       for jurisdiction in jurisdictions:
           jurisdiction_list.append(jurisdiction.id)
           
           jups = jurisdiction.getLatestUpdates()
           
           jups = jups.filter(modify_datetime__gt = obj3monthsbefore.replace(tzinfo=utc))
           
           jups = jups.filter(Q(approval_status = 'P')| Q(approval_status = 'A'))
           
           aaa = []
           old_jurisdiction_id = 0
           for up in jups:
               update_map = {}
               if old_jurisdiction_id != up.jurisdiction.id:
                   update_map['title_flag'] = True 
                   old_jurisdiction_id = up.jurisdiction.id
               else:
                    update_map['title_flag'] = False
               if up.approval_status == 'P':
                   time_obj = TimeShow(up.create_datetime)
                   creator= up.creator.get_profile().get_display_name()
               else:
                   time_obj = TimeShow(up.status_datetime)
                   creator = ''
               update_map['time'] = time_obj.get_show_time()
               update_map['creator'] = creator
               update_map['question'] = up.question.question
               validation_util_obj = FieldValidationCycleUtil()
               answer = validation_util_obj.get_formatted_value(up.value, up.question)
               update_map['answer'] = answer
               update_map['question_type'] = up.question.form_type
               update_map['jurisdiction'] = up.jurisdiction
               update_map['jurisdiction_name'] = up.jurisdiction.show_jurisdiction('short')
               if up.question.form_type  == 'CF':
                   if up.approval_status == 'P':
                       update_map['type'] = 'Custom field suggested by ' + creator + ' '+ update_map['time']
                   else:
                       update_map['type'] = 'Custom field suggested verified '+ update_map['time']
               else:
                   if up.approval_status == 'P':
                       update_map['type'] = 'New suggestion for ' + up.question.question + ' by '+ creator + ' '+ update_map['time']
                   else:
                       update_map['type'] = up.question.question +' verified '+ update_map['time']
               
               updates.append(update_map)
           #updates[jurisdiction.id] = aaa
           #updates[jurisdiction.id] = jurisdiction.getLatestUpdates().filter(modify_datetime__lt = obj3monthsbefore)
 
       return updates, jurisdiction_list
    def handle(self, *args, **options):
        print 'correct fee summation started.'
        fieldValidationCycleUtil_obj = FieldValidationCycleUtil()
        question_obj = Question.objects.get(id=16)

        if question_obj != None:
            AnswerReference_objs = AnswerReference.objects.filter(
                question=question_obj)
            if len(AnswerReference_objs) > 0:
                print str(len(AnswerReference_objs)) + " to be processed."

                for AnswerReference_obj in AnswerReference_objs:
                    answer = fieldValidationCycleUtil_obj.process_answer(
                        question_obj, AnswerReference_obj.value)
                    encoded_txt = answer.encode('utf-8')
                    AnswerReference_obj.value = encoded_txt
                    AnswerReference_obj.save()

        print 'correct fee summation completed.'
 def handle(self, *args, **options):
     print 'correct fee summation started.'        
     fieldValidationCycleUtil_obj = FieldValidationCycleUtil()
     question_obj = Question.objects.get(id=16)
 
     if question_obj != None:
         AnswerReference_objs = AnswerReference.objects.filter(question = question_obj)
         if len(AnswerReference_objs) > 0:
             print str(len(AnswerReference_objs)) + " to be processed."
             
             for AnswerReference_obj in AnswerReference_objs:
                 answer = fieldValidationCycleUtil_obj.process_answer(question_obj, AnswerReference_obj.value)
                 encoded_txt = answer.encode('utf-8') 
                 AnswerReference_obj.value = encoded_txt
                 AnswerReference_obj.save()
             
     
     print 'correct fee summation completed.'
     
     
     
        
     
    def get_updates(self, jurisdictions, num, type="days"):
        if type == "days":
            obj3monthsbefore = self.objDateTimeNow - timedelta(days=num)
        else:
            obj3monthsbefore = self.objDateTimeNow - timedelta(seconds=num)

        print str(obj3monthsbefore.replace(tzinfo=utc))
        updates = []
        jurisdiction_list = []
        for jurisdiction in jurisdictions:
            jurisdiction_list.append(jurisdiction.id)

            jups = jurisdiction.getLatestUpdates()

            jups = jups.filter(modify_datetime__gt=obj3monthsbefore.replace(
                tzinfo=utc))

            jups = jups.filter(Q(approval_status='P') | Q(approval_status='A'))

            aaa = []
            old_jurisdiction_id = 0
            for up in jups:
                update_map = {}
                if old_jurisdiction_id != up.jurisdiction.id:
                    update_map['title_flag'] = True
                    old_jurisdiction_id = up.jurisdiction.id
                else:
                    update_map['title_flag'] = False
                if up.approval_status == 'P':
                    time_obj = TimeShow(up.create_datetime)
                    creator = up.creator.get_profile().get_display_name()
                else:
                    time_obj = TimeShow(up.status_datetime)
                    creator = ''
                update_map['time'] = time_obj.get_show_time()
                update_map['creator'] = creator
                update_map['question'] = up.question.question
                validation_util_obj = FieldValidationCycleUtil()
                answer = validation_util_obj.get_formatted_value(
                    up.value, up.question)
                update_map['answer'] = answer
                update_map['question_type'] = up.question.form_type
                update_map['jurisdiction'] = up.jurisdiction
                update_map[
                    'jurisdiction_name'] = up.jurisdiction.show_jurisdiction(
                        'short')
                if up.question.form_type == 'CF':
                    if up.approval_status == 'P':
                        update_map[
                            'type'] = 'Custom field suggested by ' + creator + ' ' + update_map[
                                'time']
                    else:
                        update_map[
                            'type'] = 'Custom field suggested verified ' + update_map[
                                'time']
                else:
                    if up.approval_status == 'P':
                        update_map[
                            'type'] = 'New suggestion for ' + up.question.question + ' by ' + creator + ' ' + update_map[
                                'time']
                    else:
                        update_map[
                            'type'] = up.question.question + ' verified ' + update_map[
                                'time']

                updates.append(update_map)
            #updates[jurisdiction.id] = aaa
            #updates[jurisdiction.id] = jurisdiction.getLatestUpdates().filter(modify_datetime__lt = obj3monthsbefore)

        return updates, jurisdiction_list
def custom_field(request):
    data = {}
    requestProcessor = HttpRequestProcessor(request)  
    dajax = Dajax()
    
    ajax = requestProcessor.getParameter('ajax')
    if (ajax != None):
        if (ajax == 'create_custom_field'):
            data['form_id'] = 'create_custom_field'      

            data['field_title'] = requestProcessor.getParameter('field_title') 
            data['field_value'] = requestProcessor.getParameter('field_value') 
            data['jurisdiction_id'] = requestProcessor.getParameter('jurisdiction_id') 
            data['category_id'] = requestProcessor.getParameter('category_id')   
            data['current_category'] = requestProcessor.getParameter('current_category')      
            data['current_questions'] = requestProcessor.getParameter('current_questions')                                            
            
            if data['field_title'] == None:
                data['field_title'] = ''   
            if data['field_value'] == None:
                data['field_value'] = ''                      
                
            data['jurisdiction'] = Jurisdiction.objects.get(id=data['jurisdiction_id'])

            body = requestProcessor.decode_jinga_template(request,'website/blocks/create_custom_field.html', data, '') 
            dajax.assign('#fancyboxformDiv','innerHTML', body)
            script = requestProcessor.decode_jinga_template(request, 'website/blocks/create_custom_field.js', data, '')
            dajax.script(script)        
            dajax.script('controller.showModalDialog("#fancyboxformDiv");')

            return HttpResponse(dajax.json())  
        
        if (ajax == 'create_custom_field_submit'):  
            data = {}       
            data['form_id'] = 'create_custom_field'     
            data['field_title'] = requestProcessor.getParameter('field_title') 
            data['field_value'] = requestProcessor.getParameter('field_value') 
            data['jurisdiction_id'] = requestProcessor.getParameter('jurisdiction_id') 
            data['category_id'] = requestProcessor.getParameter('category_id')     
            current_category = requestProcessor.getParameter('current_category')   
            current_questions = requestProcessor.getParameter('current_questions') 
                                                               
            error_message = {}        
            error_message = validate_create_custom_field_form_data(data, data['form_id'])

            if len(error_message) == 0:
                msg_key = data['form_id']+ '_fail_reason'               
                try:
                    jurisdiction = Jurisdiction.objects.get(id=data['jurisdiction_id'])
                    
                    # look up template CF for this jurisdiction
                    templates = Template.objects.filter(jurisdiction=jurisdiction, template_type__iexact='CF')
                    if len(templates) > 0:
                        template = templates[0]
                    else:
                        template = Template()
                        template.template_type = 'CF'
                        template.name = 'Jurisdiction Custom Field Template'
                        template.jurisdiction_id = data['jurisdiction_id']
                        #template.create_datetime = datetime.datetime.now()
                        template.save()
                    # create the question

                    category_obj = QuestionCategory.objects.get(id=data['category_id'])
                    '''
                    questions = Question.objects.filter(category=category_obj, accepted=1).order_by('-display_order')
                    last_question = questions[0]
                    if last_question.display_order == None or last_question.display_order == '':
                        display_order = 0
                    else:
                        display_order = last_question.display_order
                    '''    
                    highest_display_order_obj = Question.objects.filter(category=category_obj, accepted=1).aggregate(Max('display_order'))
                    #print highest_display_order_obj
                    if highest_display_order_obj == None:
                        highest_display_order = 0
                    else:
                        highest_display_order = highest_display_order_obj['display_order__max']
                        
                    question_obj = Question();
                    question_obj.category_id = data['category_id']
                    question_obj.question = data['field_title']
                    question_obj.label = data['field_title']
                    question_obj.form_type = 'CF'
                    question_obj.qtemplate_id = template.id
                    question_obj.accepted = 1
                    question_obj.display_order = int(highest_display_order) + 5
                    #question_obj.create_datetime = datetime.datetime.now()
                    question_obj.creator_id = request.user.id
                    question_obj.save()
                    
                    template_question = TemplateQuestion()
                    template_question.template_id = template.id
                    template_question.question_id = question_obj.id
                    #template_question.create_datetime = datetime.datetime.now()
                    template_question.save()
                    # save the answer
                    data_answer = {}
                    data_answer['value'] = data['field_value']
                    answer = json.dumps(data_answer)   # to convert to json                    
                    is_callout=0           
                    answer_reference_class_obj = AnswerReference()
                    
                    #action_category_objs = ActionCategory.objects.filter(name__iexact='AddRequirement')
                    #action_category_obj = action_category_objs[0]   
                    validation_util_obj = FieldValidationCycleUtil()                    
                    arcf = validation_util_obj.save_answer(question_obj, answer, jurisdiction, 'AddRequirement', request.user, is_callout)
                    
                except Exception, e:
                    data[msg_key] = e.message
                    print e.message
        
            #else:
            if len(error_message) > 0:
                for msg_key in error_message.keys():
                    data[msg_key] = error_message.get(msg_key)  
                    
                    body = requestProcessor.decode_jinga_template(request,'website/blocks/create_custom_fields.html', data, '')     
                    dajax.assign('#fancyboxformDiv','innerHTML', body)
                    script = requestProcessor.decode_jinga_template(request, 'website/blocks/create_custom_fields.js', data, '')
                    dajax.script(script)
            else:
                data_cf = {}
                jurisdiction = Jurisdiction.objects.get(id=data['jurisdiction_id'])
                data_cf['jurisdiction'] = jurisdiction
                '''
                question_category_obj = QuestionCategory.objects.get(id=data['category_id'])  
                data['question_categories'] = QuestionCategory.objects.filter(id=data['category_id'])
                
                question_class_obj = Question()
                custom_questions = question_class_obj.get_custom_fields_by_jurisdiction_by_category(jurisdiction, data['category_id'])
                print custom_questions
                validation_util_obj = FieldValidationCycleUtil()
                data['action'] = 'refresh_ahj_qa'               

                if custom_questions != None and len(custom_questions) > 0:
                    for question in custom_questions:
                        data['question_content'][question_category_obj.id][question.id] = validation_util_obj.get_AHJ_question_data(request, jurisdiction, question, data)                
                '''
                
                '''
                validation_util_obj = FieldValidationCycleUtil()                        
                data_cf['this_question'] = question_obj               
                question_content = validation_util_obj.get_AHJ_question_data(request, jurisdiction, question_obj, data_cf)            
                for key in question_content.keys():
                    data_cf[key] = question_content.get(key)               
                                        
                body = requestProcessor.decode_jinga_template(request,'website/jurisdictions/AHJ_question_content_authenticated.html', data_cf, '')

                dajax.assign('#div_custom_question_content_'+str(category_obj.id),'innerHTML', body)
                script = requestProcessor.decode_jinga_template(request,'website/jurisdictions/AHJ_question_content.js', data, '')
                dajax.script(script)                        
                '''
                template_obj = Template()
                jurisdiction_templates = template_obj.get_jurisdiction_question_templates(jurisdiction)
               
                    
                data_cf['action'] = '/jurisdiction_id/'+str(jurisdiction.id)+'/'+current_category+'/'
                current_questions = current_questions.split(',')
                data_cf['custom_questions'] = Question.objects.filter(category=category_obj, accepted=1, qtemplate__in=jurisdiction_templates).exclude(id__in=(current_questions))
                body = requestProcessor.decode_jinga_template(request,'website/jurisdictions/AHJ_question_content_ajax_call.html', data_cf, '')                        
                dajax.assign('#div_custom_question_content_'+str(category_obj.id),'innerHTML', body)
                script = requestProcessor.decode_jinga_template(request, 'website/jurisdictions/AHJ_question_content_ajax_call.js', data_cf, '')
                dajax.script(script)                                             
                        ######################################################               
                      
                #data['custom_questions'] = custom_questions
                #data['custom_questions'] = {}
                #data['custom_questions'][question_category_obj.id] = custom_questions
                
                #body = requestProcessor.decode_jinga_template(request,'website/blocks/custom_fields.html', data, '')                                   
                #dajax.assign('#custom_fields_'+str(question_category_obj.id),'innerHTML', body)
                dajax.script('jQuery.fancybox.close();')  
                dajax.script("controller.showMessage('Custom field created.', 'success')") 
                dajax.script('controller.updateUrlAnchor("#create_custom_field");')
                
                if current_category == 'all_info':
                    question_categories = QuestionCategory.objects.filter(accepted=1)
                    data['category'] = 'All categories'
                else:
                    question_categories = QuestionCategory.objects.filter(name__iexact=category_obj.name)
                    data['category'] = category_obj.name

                #data['category'] = question_obj.category.name
                data['jurisdiction'] = jurisdiction
                validation_util_obj = FieldValidationCycleUtil()   
                data['top_contributors'] = validation_util_obj.get_top_contributors(jurisdiction, question_categories)  
                body = requestProcessor.decode_jinga_template(request,'website/blocks/top_contributors.html', data, '')   
                dajax.assign('#top_contributors','innerHTML', body)                
                
            return HttpResponse(dajax.json())  
Example #7
0
def custom_field(request):
    data = {}
    requestProcessor = HttpRequestProcessor(request)  
    dajax = Dajax()
    
    ajax = requestProcessor.getParameter('ajax')
    if (ajax != None):
        if (ajax == 'create_custom_field'):
            data['form_id'] = 'create_custom_field'      

            data['field_title'] = requestProcessor.getParameter('field_title') 
            data['field_value'] = requestProcessor.getParameter('field_value') 
            data['jurisdiction_id'] = requestProcessor.getParameter('jurisdiction_id') 
            data['category_id'] = requestProcessor.getParameter('category_id')   
            data['current_category'] = requestProcessor.getParameter('current_category')      
            
            if data['field_title'] == None:
                data['field_title'] = ''   
            if data['field_value'] == None:
                data['field_value'] = ''                      
                
            data['jurisdiction'] = Jurisdiction.objects.get(id=data['jurisdiction_id'])

            body = requestProcessor.decode_jinga_template(request,'website/blocks/create_custom_field.html', data, '') 
            dajax.assign('#fancyboxformDiv','innerHTML', body)
            script = requestProcessor.decode_jinga_template(request, 'website/blocks/create_custom_field.js', data, '')
            dajax.script(script)        
            dajax.script('controller.showModalDialog("#fancyboxformDiv");')

            return HttpResponse(dajax.json())  
        
        if (ajax == 'create_custom_field_submit'):  
            data = {}       
            data['form_id'] = 'create_custom_field'     
            data['field_title'] = requestProcessor.getParameter('field_title') 
            data['field_value'] = requestProcessor.getParameter('field_value') 
            data['jurisdiction_id'] = requestProcessor.getParameter('jurisdiction_id') 
            data['category_id'] = requestProcessor.getParameter('category_id')     
            current_category = requestProcessor.getParameter('current_category')   
            current_questions = requestProcessor.getParameter('current_questions') 
                                                               
            error_message = {}        
            error_message = validate_create_custom_field_form_data(data, data['form_id'])

            if len(error_message) == 0:
                msg_key = data['form_id']+ '_fail_reason'               
                try:
                    jurisdiction = Jurisdiction.objects.get(id=data['jurisdiction_id'])
                    
                    # look up template CF for this jurisdiction
                    templates = Template.objects.filter(jurisdiction=jurisdiction, template_type__iexact='CF', accepted = 1)
                    if len(templates) > 0:
                        template = templates[0]
                    else:
                        template = Template()
                        template.template_type = 'CF'
                        template.name = 'Jurisdiction Custom Field Template'
                        template.jurisdiction_id = data['jurisdiction_id']
                        #template.create_datetime = datetime.datetime.now()
                        template.accepted = 1
                        template.save()
                    # create the question

                    category_obj = QuestionCategory.objects.get(id=data['category_id'])
                    '''
                    questions = Question.objects.filter(category=category_obj, accepted=1).order_by('-display_order')
                    last_question = questions[0]
                    if last_question.display_order == None or last_question.display_order == '':
                        display_order = 0
                    else:
                        display_order = last_question.display_order
                    '''    
                    highest_display_order_obj = Question.objects.filter(category=category_obj, accepted=1).aggregate(Max('display_order'))
                    if highest_display_order_obj == None:
                        highest_display_order = 0
                    else:
                        highest_display_order = highest_display_order_obj['display_order__max']
                        
                    question_obj = Question();
                    question_obj.category_id = data['category_id']
                    question_obj.question = data['field_title']
                    question_obj.label = data['field_title']
                    question_obj.form_type = 'CF'
                    question_obj.qtemplate_id = template.id
                    question_obj.accepted = 1
                    question_obj.display_order = int(highest_display_order) + 5
                    #question_obj.create_datetime = datetime.datetime.now()
                    question_obj.creator_id = request.user.id
                    question_obj.save()
                    
                    template_question = TemplateQuestion()
                    template_question.template_id = template.id
                    template_question.question_id = question_obj.id
                    #template_question.create_datetime = datetime.datetime.now()
                    template_question.save()
                    # save the answer
                    data_answer = {}
                    data_answer['value'] = data['field_value']
                    answer = json.dumps(data_answer)   # to convert to json                    
                    is_callout=0           
                    answer_reference_class_obj = AnswerReference()
                    
                    #action_category_objs = ActionCategory.objects.filter(name__iexact='AddRequirement')
                    #action_category_obj = action_category_objs[0]   
                    validation_util_obj = FieldValidationCycleUtil()                    
                    arcf = validation_util_obj.save_answer(question_obj, answer, jurisdiction, 'AddRequirement', request.user, is_callout)
                    
                except Exception, e:
                    data[msg_key] = e.message
        
            #else:
            if len(error_message) > 0:
                for msg_key in error_message.keys():
                    data[msg_key] = error_message.get(msg_key)  
                    
                    body = requestProcessor.decode_jinga_template(request,'website/blocks/create_custom_field.html', data, '')
                    dajax.assign('#fancyboxformDiv','innerHTML', body)
                    script = requestProcessor.decode_jinga_template(request, 'website/blocks/create_custom_field.js', data, '')
                    dajax.script(script)
            else:
                data_cf = {}
                jurisdiction = Jurisdiction.objects.get(id=data['jurisdiction_id'])
                data_cf['jurisdiction'] = jurisdiction
                template_obj = Template()
                jurisdiction_templates = template_obj.get_jurisdiction_question_templates(jurisdiction)
               
                    
                data_cf['action'] = '/jurisdiction_id/'+str(jurisdiction.id)+'/'+current_category+'/'
                  
                data_cf = get_question_data(request, jurisdiction, question_obj, data)
                body = requestProcessor.decode_jinga_template(request,'website/jurisdictions/AHJ_cqa_qa.html', data_cf, '')
                script = requestProcessor.decode_jinga_template(request,'website/jurisdictions/AHJ_cqa_qa.js' , data, '')
                dajax.script(script)                                                   
            
                dajax.assign('#div_custom_question_content_'+str(data['category_id']),'innerHTML', body)    
                        
                        ######################################################               
                      
                #data['custom_questions'] = custom_questions
                #data['custom_questions'] = {}
                #data['custom_questions'][question_category_obj.id] = custom_questions
                
                #body = requestProcessor.decode_jinga_template(request,'website/blocks/custom_fields.html', data, '')                                   
                #dajax.assign('#custom_fields_'+str(question_category_obj.id),'innerHTML', body)
                dajax.script('jQuery.fancybox.close();')  
                dajax.script("controller.showMessage('Custom field created.', 'success')") 
                dajax.script('controller.updateUrlAnchor("#create_custom_field");')
                
                data = {}
                if current_category == 'all_info':
                    question_categories = QuestionCategory.objects.filter(accepted=1)
                    data['category'] = 'All categories'
                else:
                    question_categories = QuestionCategory.objects.filter(name__iexact=category_obj.name)
                    data['category'] = category_obj.name

                #data['category'] = question_obj.category.name
                data['jurisdiction'] = jurisdiction
                
                data['top_contributors'] = get_ahj_top_contributors(jurisdiction, current_category)  
                body = requestProcessor.decode_jinga_template(request,'website/jurisdictions/AHJ_top_contributors.html', data, '')   
                dajax.assign('#top-contributor','innerHTML', body)                           
                
            return HttpResponse(dajax.json())  
def runValidateAnswersCron(objCronHelper):
    objCronHelper.WriteHTML('Validate Answers<br/>')
    aaa = FieldValidationCycleUtil()
    aaa.cron_validate_answers()
    objCronHelper.WriteHTML('<br/>Validate Answers Done!<br/>')
Example #9
0
def runValidateAnswersCron(objCronHelper):
    objCronHelper.WriteHTML("Validate Answers<br/>")
    aaa = FieldValidationCycleUtil()
    aaa.cron_validate_answers()
    objCronHelper.WriteHTML("<br/>Validate Answers Done!<br/>")
Example #10
0
 def handle(self, *args, **options):
     fvcu = FieldValidationCycleUtil()
     fvcu.cron_validate_answers()
Example #11
0
def submit_suggestion(request):
    validation_util_obj = FieldValidationCycleUtil()
    from website.models.questionAnswer import Question
    from website.models import Jurisdiction
    data = {}
    errors = []

    # convert POST to a string for parsing xml
    post_string = request.raw_post_data

    # strip extra whitespace
    while post_string != re.sub("\s<", "<", post_string):
        post_string = re.sub("\s<", "<", post_string)
    while post_string != re.sub("\s>", ">", post_string):
        post_string = re.sub("\s>", ">", post_string)
    while post_string != re.sub(">\s", ">", post_string):
        post_string = re.sub(">\s", ">", post_string)
    while post_string != re.sub("<\s", "<", post_string):
        post_string = re.sub("<\s", "<", post_string)

    try:
        xmlDoc = minidom.parseString(post_string)
    except Exception:
        errors.append("Could not Parse XML")

    del post_string

    if len(errors) > 0:
        output = '<errors>\n'
        for this_error in errors:
            output += "\t<error>" + this_error + "</error>\n"
        output += '</errors>'
    else:

        # define directives
        directives = dict()
        directive_names = [
            'api_username',
            'api_key',
            'question_id',
            'jurisdiction_id',
            'answer_value',
        ]
        try:
            temp = xmlDoc.getElementsByTagName('request')[0]
        except Exception:
            errors.append(
                "Could not find 'request' node - please see documentation at https://github.com/solarpermit/solarpermit/wiki"
            )
        else:
            temp = None
            for node in xmlDoc.getElementsByTagName('request')[0].childNodes:
                if node.nodeType == 1:  #element type
                    if node.localName in directive_names and node.firstChild is not None:
                        directives[
                            node.localName] = node.firstChild.data.strip()
                    else:
                        if node.firstChild is None:
                            errors.append(
                                node.localName +
                                ' is empty.  Please declare a value for ' +
                                node.localName + '.')
                        else:
                            errors.append(' is an unknown directive')

        # error testing
        if int(len(directives)) != 5:
            errors.append(
                'Incorrect number of Directive values - either something is empty, or something is missing ('
                + str(len(directives)) + ' != 5).')
        if 'api_username' not in directives:
            errors.append('Your api_username must be provided in the request.')
        if 'api_key' not in directives:
            errors.append('Your api_key must be provided in the request.')
        if 'question_id' not in directives:
            errors.append('You must declare a question_id.')
        if 'question_id' in directives and (
                not is_numeric(directives['question_id'])
                or int(directives['question_id']) < 1):
            errors.append(
                'QuestinID must be a positive integer greater than zero.')
        if 'jurisdiction_id' not in directives:
            errors.append('You must declare a jurisdiction_id')
        if 'jurisdiction_id' in directives and (
                not is_numeric(directives['jurisdiction_id'])
                or int(directives['jurisdiction_id']) < 1):
            errors.append(
                'jurisdiction_id must be a positive integer greater than zero.'
            )
        if 'answer_value' not in directives:
            errors.append(
                'You can not suggest an answer without the data for that answer declared as an answer_value.'
            )

        # user validation pre-work
        try:
            # get the user id of this user
            thisUserId = int(
                User.objects.get(username=directives['api_username']).pk)
            # get the api key for this user
            apiKeys = API_Keys.objects.filter(user_id=thisUserId)
            for row in apiKeys:
                thisApiKey = row.key
        except Exception:
            errors.append('Failed to look up your username.')

        if len(errors) > 0:
            output = '<errors>\n'
            for this_error in errors:
                output += '\t<error>' + this_error + '</error>\n'
            output += '</errors>'
        else:
            # validate user
            if directives['api_key'] != thisApiKey:
                output = '<errors>\n\t<error>User validation failure - check api_key for accuracy</error>\n</errors>'
            else:
                ## validate jurisdiction_id
                try:
                    jurisdiction = Jurisdiction.objects.get(
                        id=directives['jurisdiction_id'])
                except Exception:
                    errors.append(
                        'The jurisdiction_id you have declared does not exist, or is invalid.'
                    )
                if len(errors) > 0:
                    output = '<errors>\n'
                    for this_error in errors:
                        output += '\t<error>' + this_error + '</error>\n'
                    output += '</errors>'
                else:
                    ### validate question_id
                    try:
                        question = Question.objects.get(
                            id=directives['question_id'])
                    except Exception:
                        errors.append(
                            'The question_id you have declared does not exist, or is invalid.'
                        )
                    if len(errors) > 0:
                        output = '<errors>\n'
                        for this_error in errors:
                            output += '\t<error>' + this_error + '</error>\n'
                        output += '</errors>'
                    else:
                        #### validate answer format can be parsed as json
                        if question.default_value is None or len(
                                question.default_value) < 1:
                            default_format = json.loads('{"value":""}')
                        else:
                            default_format = json.loads(question.default_value)
                        try:
                            this_format = json.loads(
                                directives['answer_value'])
                        except Exception:
                            errors.append('Cannot parse answer_value as JSON')
                        if len(errors) > 0:
                            output = '<errors>\n'
                            for this_error in errors:
                                output += '\t<error>' + this_error + '</error>\n'
                            output += '</errors>'
                        else:
                            output = ''
                            #### validate answer format has matching keys
                            if not ((all(key in this_format
                                         for key in default_format)) and
                                    (all(key in default_format
                                         for key in this_format))):
                                if int(directives['question_id']) != 16:
                                    errors.append(
                                        'answer_value (JSON) does not match format of default_value for this question.'
                                    )
                                else:
                                    # for pricing formula
                                    # check to make sure each key is a direct, or regex match to an incremented key name.
                                    suspect_keys = []
                                    valid_keys = [
                                        'percentage_of_total_system_cost_cap_amt',
                                        'percentage_of_total_system_cost',
                                        'flat_rate_amt',
                                    ]
                                    for key in this_format:
                                        # strip trailing underscores and digits
                                        new_item = re.sub(
                                            '[_]\d*[_]\d*$', '', key)
                                        if new_item not in suspect_keys:
                                            suspect_keys.append(new_item)
                                    for key in default_format:
                                        # strip trailing underscores and digits
                                        new_item = re.sub(
                                            '[_]\d*[_]\d*$', '', key)
                                        if new_item not in valid_keys:
                                            valid_keys.append(new_item)
                                    if not ((all(item in suspect_keys
                                                 for item in valid_keys)) and
                                            (all(item in valid_keys
                                                 for item in suspect_keys))):
                                        error_string = 'answer_value (JSON) has unrecognized keys for this question.'
                                        error_string += ' ... invalid keys (does not include incremented portion key names): '
                                        for item in suspect_keys:
                                            if item not in valid_keys:
                                                error_string += ' ' + item + ', '
                                        error_string += ' ... missingkeys (does not include incremented portion of key names): '
                                        for item in valid_keys:
                                            if item not in suspect_keys:
                                                error_string += item + ', '

                                        errors.append(error_string)

                            if len(errors) > 0:
                                output = '<errors>\n'
                                for this_error in errors:
                                    output += '\t<error>' + this_error + '</error>\n'
                                output += '</errors>'
                            else:
                                user = User.objects.get(id=thisUserId)
                                is_callout = 0
                                try:
                                    arcf = validation_util_obj.save_answer(
                                        question, directives['answer_value'],
                                        jurisdiction, 'AddRequirement', user,
                                        is_callout)
                                    output = '<Result>' + str(
                                        arcf) + '</Result>'
                                except Exception as inst:
                                    output = '<errors>\n\t<error>Failed to save answer suggestion.</error><detail>\n'
                                    output += str(
                                        type(inst))  # the exception instance
                                    output += str(inst.args)
                                    output += '</detail></errors>'
                                '''
                                question_id = 93
                                question = Question.objects.get(id=question_id)
                                
                                answer = '{"value":"Written Via API x?"}'
                            
                                jurisdiction_id = 1
                                jurisdiction = Jurisdiction.objects.get(id=jurisdiction_id)
                                
                                user_id = 3
                                user = User.objects.get(id=user_id)
                                
                                is_callout = 0
                                
                                answer_id = None
                                
                                #arcf = validation_util_obj.save_answer(question, answer, jurisdiction, 'AddRequirement', user, is_callout, answer_id)
                                arcf = 'foo'
                                
                                output = '<testing>\n\n'
                                
                                output += str(arcf)
                                
                                output += '\n\n</testing>'
                                '''

    #finish up
    data['xml'] = mark_safe(output)
    requestProcessor = HttpRequestProcessor(request)
    return requestProcessor.render_to_response(request, 'website/api.xml',
                                               data, 'application/xml')