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
Example #2
0
    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
Example #3
0
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}
        )