def render(self, data, *args, **kwargs): charset = 'utf-8' root_node = 'xforms' xmlns = "http://openrosa.org/xforms/xformsList" if 'detail' in data.keys(): stream = StringIO() xml = SimplerXMLGenerator(stream, charset) xml.startDocument() xml.startElement(root_node, {'xmlns': xmlns}) for key, value in six.iteritems(data): xml.startElement(key, {}) xml.characters(smart_text(value)) xml.endElement(key) xml.endElement(root_node) xml.endDocument() return stream.getvalue() else: json = self.transform_to_xform_json(data) survey = create_survey_element_from_dict(json) xml = survey.xml() fix_languages(xml) xml = xml.toxml() xml = self.insert_version_attribute(xml, data.get('id_string'), data.get('version')) xml = self.insert_uuid_bind(xml, data.get('id_string')) return xml
def reprocess_multilingual_forms(apps, schema_editor): Questionnaire = apps.get_model('questionnaires', 'Questionnaire') for quest in Questionnaire.objects.all(): # Parse XLS form and check multilingual settings. try: json = parse_file_to_json(quest.xls_form.file.name) except: # Skip bad forms. continue has_default_language = ( 'default_language' in json and json['default_language'] != 'default' ) if (has_default_language and not check_for_language(json['default_language'])): raise InvalidQuestionnaire( ["Default language code '{}' unknown".format( json['default_language'] )] ) is_multilingual = multilingual_label_check(json['children']) if is_multilingual and not has_default_language: raise InvalidQuestionnaire(["Multilingual XLS forms must have " "a default_language setting"]) # Skip monolingual forms. No changes needed here. if not is_multilingual: continue # Skip "left over" questionnaires. if quest.project.current_questionnaire != quest.pk: continue # Set up default language: fix "default" where it crops up. quest.default_language = json['default_language'] if quest.default_language == 'default': quest.default_language = '' # Recreate XML form with correct language labels. survey = create_survey_element_from_dict(json) xml_form = survey.xml() fix_languages(xml_form) xml_form = xml_form.toxml() # insert version attr into the xform instance root node xml = insert_version_attribute( xml_form, quest.filename, quest.version ) name = os.path.join(quest.xml_form.field.upload_to, os.path.basename(quest.filename)) url = quest.xml_form.storage.save('{}.xml'.format(name), xml) quest.xml_form = url # Store updated default language and XML form information. quest.save() # Update from the top. errors = [] update_children( apps, children=json.get('children'), errors=errors, project=quest.project, default_language=quest.default_language, kwargs={'questionnaire': quest} )
def reprocess_multilingual_forms(apps, schema_editor): Questionnaire = apps.get_model('questionnaires', 'Questionnaire') for quest in Questionnaire.objects.all(): # Parse XLS form and check multilingual settings. try: json = parse_file_to_json(quest.xls_form.file.name) except: # Skip bad forms. continue has_default_language = ( 'default_language' in json and json['default_language'] != 'default' ) if (has_default_language and not check_for_language(json['default_language'])): raise InvalidXLSForm( ["Default language code '{}' unknown".format( json['default_language'] )] ) is_multilingual = multilingual_label_check(json['children']) if is_multilingual and not has_default_language: raise InvalidXLSForm(["Multilingual XLS forms must have " "a default_language setting"]) # Skip monolingual forms. No changes needed here. if not is_multilingual: continue # Skip "left over" questionnaires. if quest.project.current_questionnaire != quest.pk: continue # Set up default language: fix "default" where it crops up. quest.default_language = json['default_language'] if quest.default_language == 'default': quest.default_language = '' # Recreate XML form with correct language labels. survey = create_survey_element_from_dict(json) xml_form = survey.xml() fix_languages(xml_form) xml_form = xml_form.toxml() # insert version attr into the xform instance root node xml = insert_version_attribute( xml_form, quest.filename, quest.version ) name = os.path.join(quest.xml_form.field.upload_to, os.path.basename(quest.filename)) url = quest.xml_form.storage.save('{}.xml'.format(name), xml) quest.xml_form = url # Store updated default language and XML form information. quest.save() # Update from the top. errors = [] update_children( apps, children=json.get('children'), errors=errors, project=quest.project, default_language=quest.default_language, kwargs={'questionnaire': quest} )