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 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())
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')