Example #1
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 #2
0
 def characters(self, content):
     # TODO: figure out how to do this explicitly rather than implicitly
     if any(c in content for c in CDATA_CHARS):
         self._write('<![CDATA[' + content + ']]>')
     else:
         # can't use super, XMLGenerator is an old style class
         SimplerXMLGenerator.characters(self, content)
    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 #4
0
    def render(self, data, prettyprint=False):
        """
            parameters:
              data = dictionary of the things to be shown
              prettyprint = flag for pretty printing the xml output (including whitespace and linebreaks)
            """

        stream = StringIO()
        xml = SimplerXMLGenerator(stream, self.charset)

        xml.startDocument()

        # add a comment
        xml._write(self.comment)

        # add namespace definitions
        nsattrs = {}
        nsattrs['version'] = self.version
        #nsattrs['encoding'] = charser
        nsattrs['xmlns:vosi'] = self.ns_vosiavail
        #nsattrs['xmlns:xsi'] = self.ns_xsi
        #nsattrs['xmlns:vs'] = self.ns_vs

        # add root node
        xml.startElement('vosi:availability', nsattrs)

        # add mandatory node:
        xml.startElement('vosi:available', {})
        xml.characters(smart_unicode(data['available']))
        xml.endElement('vosi:available')

        # remove available from data dict
        data.pop('available', None)

        # add possible optional nodes:
        for key in data.keys():
            xml.startElement('vosi:' + key, {})
            xml.characters(smart_unicode(data[key]))
            xml.endElement('vosi:' + key)

        xml.endElement('vosi:availability')

        xml.endDocument()

        xml_string = stream.getvalue()

        # make the xml pretty, i.e. use linebreaks and indentation
        # the sax XMLGenerator behind SimpleXMLGenerator does not seem to support this,
        # thus need a library that can do it.
        # TODO: since we use lxml anyway, maybe build the whole xml-tree with lxml.etree!
        # NOTE: This removes any possibly existing comments from the xml output!
        if prettyprint is True:
            parsed = etree.fromstring(xml_string)
            pretty_xml = etree.tostring(parsed, pretty_print=True)
            xml_string = pretty_xml

        return xml_string
Example #5
0
class Serializer(NonrelationalSerializer):        
    def indent(self, level):
        if self.options.get('indent') is not None:
            self.xml.ignorableWhitespace('\n' + ' ' * self.options.get('indent') * level)

    def start_serialization(self):
        self.xml = SimplerXMLGenerator(self.stream, self.options.get("encoding", settings.DEFAULT_CHARSET))
        self.xml.startDocument()
        self.xml.startElement("django-objects", {"version": "1.0"})
        
    def end_serialization(self):
        self.indent(0)
        self.xml.endElement("django-objects")
        self.xml.endDocument()
                
    def start_object(self, obj):
        self.verify_object_is_model(obj)
        
        self.indent(1)
        attrs = {'model': self.model_path(obj)}
        obj_pk = obj.pk
        if obj_pk is not None:
            attrs['pk'] = str(obj_pk)
        self.xml.startElement("object", attrs)
          
    def end_object(self, obj):
        self.indent(1)
        self.xml.endElement("object")
                         
    def handle_field(self, obj, field):
        self.indent(2)
        self.xml.startElement('field', {
            'name': field.name,
            'type': self.field_type(field),
        })
        
        if getattr(obj, field.name) is not None:
            try:
                self.xml.characters(field.value_to_string(obj))
            except UnserializableContentError:
                raise ValueError("%s.%s (pk:%s) contains unserializable characters" % (
                    obj.__class__.__name__, field.name, obj.pk))
        else:
            self.xml.addQuickElement("None")
        self.xml.endElement("field")
Example #6
0
    def render(self, data, accepted_media_type=None, renderer_context=None):
        """
        Renders `data` into serialized XML.
        """
        if data is None:
            return ''
        print(data)

        stream = StringIO()

        xml = SimplerXMLGenerator(stream, self.charset)
        xml.startDocument()
        reactor_model=ReactorModel.objects.get(pk=data['reactor_model'])
        
        xml.startElement("basecore ", {'ID':reactor_model.name,'core_type':reactor_model.reactor_type})
        reactor_positions=reactor_model.positions.all()
        num_side_asms=0
        for reactor_position in reactor_positions:
            if reactor_position.row>num_side_asms:
                num_side_asms=reactor_position.row
        #core_geo
        xml.startElement('core_geo',{'num_side_asms':str(num_side_asms)})
        
        
        xml.startElement('fuel_pitch',{})
        xml.characters(smart_text(reactor_model.fuel_pitch))
        xml.endElement('fuel_pitch')
        
        xml.startElement('std_fuel_len',{})
        xml.characters(smart_text(reactor_model.active_height))
        xml.endElement('std_fuel_len')   
        
        xml.startElement('fuel_map',{})
        fuel_map_lst=[]
        for i in range(1,num_side_asms+1):
            for j in range(1,num_side_asms+1):
                fuel_position=reactor_model.positions.filter(row=i,column=j)
                if fuel_position:
                    fuel_map_lst.append('1')
                else:
                    fuel_map_lst.append('0')
        
        xml.characters(smart_text(' '.join(fuel_map_lst)))
        xml.endElement('fuel_map')
        
        xml.endElement('core_geo')   
        
        #control rod map
        xml.startElement('rcca',{})
        control_rod_assembly_lst=[]
        bank_id_lst=[]
        
        for position in reactor_positions:
            try:
                cralp=ControlRodAssemblyLoadingPattern.objects.get(reactor_position=position)
                control_rod_assembly_lst.append(cralp.control_rod_assembly.cluster_name)
                if cralp.control_rod_assembly.cluster_name not in bank_id_lst:
                    bank_id_lst.append(cralp.control_rod_assembly.cluster_name)
            except Exception:
                control_rod_assembly_lst.append('0')
         
        index=1       
        for name in bank_id_lst:
            xml.startElement('bank_id',{'basez':"9.5875",'index':str(index)})
            index+=1
            xml.characters(smart_text(name))
            xml.endElement('bank_id') 
            
        xml.startElement('map',{})    
        xml.characters(smart_text(' '.join(control_rod_assembly_lst)))
        xml.endElement('map') 
        
        xml.startElement('step_size',{})    
        xml.characters(smart_text(1.5832))
        xml.endElement('step_size') 

        xml.endElement('rcca') 
        
        #reflector
        xml.startElement('reflector',{})    
        
        xml.startElement('bot_br',{})
        xml.characters(smart_text('BR_BOT'))    
        xml.endElement('bot_br') 
        
        xml.startElement('top_br',{})
        xml.characters(smart_text('''
        BR_TOP
        BR_TOP BR_TOP
        BR_TOP BR_TOP BR_TOP
        BR_TOP BR_TOP BR_TOP BR_TOP
        BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP
        BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP
        BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP
        BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP
        BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP
        BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP
        BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP
        BR_TOP BR_TOP BR_TOP
        BR_TOP BR_TOP BR_TOP'''))    
        xml.endElement('top_br')
        
        xml.startElement('radial_br',{'index':'1'})
        xml.characters(smart_text('BR3  BR3  BR3  BR9  BR6  BR5  BR7  BR3  BR3  BR9  BR6  BR5  BR7  BR9 '))    
        xml.endElement('radial_br') 
        
        xml.startElement('radial_br',{'index':'2'})
        xml.characters(smart_text('BR4  BR4  BR4 BR10 BR12 BR11  BR8  BR4  BR4 BR10 BR12 BR11  BR8 BR10 BR12'))    
        xml.endElement('radial_br') 
        
        xml.endElement('reflector') 
        

        

        xml.endElement("basecore ")
        xml.endDocument()
        return stream.getvalue()
Example #7
0
class Serializer(base.Serializer):
    """
    Serializes a QuerySet to XML.
    """
    
    def indent(self, level):
        if self.options.get('indent', None) is not None:
            self.xml.ignorableWhitespace('\n' + ' ' * self.options.get('indent', None) * level)

    def start_serialization(self):
        """
        Start serialization -- open the XML document and the root element.
        """
        self.xml = SimplerXMLGenerator(self.stream, self.options.get("encoding", settings.DEFAULT_CHARSET))
        self.xml.startDocument()
        self.xml.startElement("django-objects", {"version" : "1.0"})
        
    def end_serialization(self):
        """
        End serialization -- end the document.
        """
        self.indent(0)
        self.xml.endElement("django-objects")
        self.xml.endDocument()
        
    def start_object(self, obj):
        """
        Called as each object is handled.
        """
        if not hasattr(obj, "_meta"):
            raise base.SerializationError("Non-model object (%s) encountered during serialization" % type(obj))
            
        self.indent(1)
        self.xml.startElement("object", {
            "pk"    : str(obj._get_pk_val()),
            "model" : str(obj._meta),
        })
        
    def end_object(self, obj):
        """
        Called after handling all fields for an object.
        """
        self.indent(1)
        self.xml.endElement("object")
        
    def handle_field(self, obj, field):
        """
        Called to handle each field on an object (except for ForeignKeys and
        ManyToManyFields)
        """
        self.indent(2)
        self.xml.startElement("field", {
            "name" : field.name,
            "type" : field.get_internal_type()
        })
        
        # Get a "string version" of the object's data (this is handled by the
        # serializer base class). 
        if getattr(obj, field.name) is not None:
            value = self.get_string_value(obj, field)
            self.xml.characters(str(value))
        else:
            self.xml.addQuickElement("None")

        self.xml.endElement("field")
        
    def handle_fk_field(self, obj, field):
        """
        Called to handle a ForeignKey (we need to treat them slightly
        differently from regular fields).
        """
        self._start_relational_field(field)
        related = getattr(obj, field.name)
        if related is not None:
            if field.rel.field_name == related._meta.pk.name:
                # Related to remote object via primary key
                related = related._get_pk_val()
            else:
                # Related to remote object via other field
                related = getattr(related, field.rel.field_name)
            self.xml.characters(str(related))
        else:
            self.xml.addQuickElement("None")
        self.xml.endElement("field")
    
    def handle_m2m_field(self, obj, field):
        """
        Called to handle a ManyToManyField. Related objects are only
        serialized as references to the object's PK (i.e. the related *data*
        is not dumped, just the relation).
        """
        self._start_relational_field(field)
        for relobj in getattr(obj, field.name).iterator():
            self.xml.addQuickElement("object", attrs={"pk" : str(relobj._get_pk_val())})
        self.xml.endElement("field")
        
    def _start_relational_field(self, field):
        """
        Helper to output the <field> element for relational fields
        """
        self.indent(2)
        self.xml.startElement("field", {
            "name" : field.name,
            "rel"  : field.rel.__class__.__name__,
            "to"   : str(field.rel.to._meta),
        })
Example #8
0
class Serializer(base.Serializer):
    """
    Serializes a QuerySet to XML.
    """
    
    def indent(self, level):
        if self.options.get('indent', None) is not None:
            self.xml.ignorableWhitespace('\n' + ' ' * self.options.get('indent', None) * level)

    def start_serialization(self):
        """
        Start serialization -- open the XML document and the root element.
        """
        self.xml = SimplerXMLGenerator(self.stream, self.options.get("encoding", settings.DEFAULT_CHARSET))
        self.xml.startDocument()
        self.xml.startElement("django-objects", {"version" : "1.0"})
        
    def end_serialization(self):
        """
        End serialization -- end the document.
        """
        self.indent(0)
        self.xml.endElement("django-objects")
        self.xml.endDocument()
        
    def start_object(self, obj):
        """
        Called as each object is handled.
        """
        if not hasattr(obj, "_meta"):
            raise base.SerializationError("Non-model object (%s) encountered during serialization" % type(obj))
            
        self.indent(1)
        self.xml.startElement("object", {
            "pk"    : str(obj._get_pk_val()),
            "model" : str(obj._meta),
        })
        
    def end_object(self, obj):
        """
        Called after handling all fields for an object.
        """
        self.indent(1)
        self.xml.endElement("object")
        
    def handle_field(self, obj, field):
        """
        Called to handle each field on an object (except for ForeignKeys and
        ManyToManyFields)
        """
        self.indent(2)
        self.xml.startElement("field", {
            "name" : field.name,
            "type" : field.get_internal_type()
        })
        
        # Get a "string version" of the object's data (this is handled by the
        # serializer base class). 
        if getattr(obj, field.name) is not None:
            value = self.get_string_value(obj, field)
            self.xml.characters(str(value))
        else:
            self.xml.addQuickElement("None")

        self.xml.endElement("field")
        
    def handle_fk_field(self, obj, field):
        """
        Called to handle a ForeignKey (we need to treat them slightly
        differently from regular fields).
        """
        self._start_relational_field(field)
        related = getattr(obj, field.name)
        if related is not None:
            self.xml.characters(str(related._get_pk_val()))
        else:
            self.xml.addQuickElement("None")
        self.xml.endElement("field")
    
    def handle_m2m_field(self, obj, field):
        """
        Called to handle a ManyToManyField. Related objects are only
        serialized as references to the object's PK (i.e. the related *data*
        is not dumped, just the relation).
        """
        self._start_relational_field(field)
        for relobj in getattr(obj, field.name).iterator():
            self.xml.addQuickElement("object", attrs={"pk" : str(relobj._get_pk_val())})
        self.xml.endElement("field")
        
    def _start_relational_field(self, field):
        """
        Helper to output the <field> element for relational fields
        """
        self.indent(2)
        self.xml.startElement("field", {
            "name" : field.name,
            "rel"  : field.rel.__class__.__name__,
            "to"   : str(field.rel.to._meta),
        })
Example #9
0
class BackupRequest(models.Model):
    user = models.OneToOneField(User)
    state = models.IntegerField(choices=BACKUP_RESTORE_STATE,
                                default=BACKUP_RESTORE_STATE_PENDING)
    creation_datetime = models.DateTimeField()
    last_state_datetime = models.DateTimeField()
    error_message = models.CharField(max_length=255, null=True, blank=True)

    def is_done(self):
        return self.state == BACKUP_RESTORE_STATE_DONE

    def get_backup_filename(self):
        return 'backup_%s.tar.gz' % (
            self.creation_datetime.strftime('%Y%m%d%H%M'))

    def backup(self):
        class BackupTarInfo(tarfile.TarInfo):
            def setNothing(self, value):
                pass

            def getUid(self):
                return 10000

            def getGid(self):
                return 1000

            def getUname(self):
                return 'aemanager'

            def getGname(self):
                return 'aemanager'

            uid = property(getUid, setNothing)
            gid = property(getGid, setNothing)
            uname = property(getUname, setNothing)
            gname = property(getGname, setNothing)

        self.state = BACKUP_RESTORE_STATE_IN_PROGRESS
        self.last_state_datetime = datetime.datetime.now()
        self.save()

        self.backup_dir = '%s%s/backup/backup_%s' % (
            settings.FILE_UPLOAD_DIR, self.user.get_profile().uuid,
            self.creation_datetime.strftime('%Y%m%d%H%M'))
        try:
            # delete previous export dir
            shutil.rmtree(
                '%s%s/backup' %
                (settings.FILE_UPLOAD_DIR, self.user.get_profile().uuid), True)

            # create export dir
            mkdir_p(self.backup_dir)

            # backup objects
            self.stream = open("%s/data.xml" % (self.backup_dir), 'w')
            self.backup_objects()
            self.stream.close()

            # backup files
            self.backup_files()

            # create the archive
            file = gzip.GzipFile('%s.tar.gz' % (self.backup_dir), 'w')
            tar = tarfile.TarFile(mode='w',
                                  fileobj=file,
                                  tarinfo=BackupTarInfo)
            tar.add(self.backup_dir, 'backup')
            tar.close()
            file.close()

            self.state = BACKUP_RESTORE_STATE_DONE
        except Exception as e:
            self.state = BACKUP_RESTORE_STATE_ERROR
            self.error_message = unicode(e)
            mail_subject = _('Backup failed')
            mail_message = _(
                'Backup for %(user)s failed with message : %(message)s') % {
                    'user': self.user,
                    'message': e
                }
            mail_admins(mail_subject,
                        mail_message,
                        fail_silently=(not settings.DEBUG))

        shutil.rmtree(self.backup_dir, True)
        self.last_state_datetime = datetime.datetime.now()
        self.save()

    def indent(self, level):
        self.xml.ignorableWhitespace('\n' + ' ' * 4 * level)

    def backup_objects(self):
        models = [
            Address, Contact, Contract, PhoneNumber, Project, Proposal,
            ProposalRow, Invoice, InvoiceRow, Expense
        ]

        self.xml = SimplerXMLGenerator(self.stream, settings.DEFAULT_CHARSET)
        self.xml.startDocument()
        self.xml.startElement("aemanager", {"version": common()['version']})

        for model in models:
            for object in model.objects.filter(owner=self.user):
                # do not export address of user profile
                if not (type(object) == Address
                        and object.userprofile_set.count()):
                    self.indent(1)
                    self.xml.startElement(object._meta.object_name,
                                          {'uuid': object.uuid})
                    for field in object._meta.local_fields:
                        if field.name not in ['ownedobject_ptr']:
                            self.indent(2)
                            self.xml.startElement(field.name, {})
                            if getattr(object, field.name) is not None:
                                if type(field) == ForeignKey:
                                    related = getattr(object, field.name)
                                    if type(related) == Country:
                                        self.xml.addQuickElement(
                                            "object",
                                            attrs={
                                                'country_code':
                                                smart_unicode(
                                                    related.country_code2)
                                            })
                                    else:
                                        self.xml.addQuickElement(
                                            "object",
                                            attrs={
                                                'uuid':
                                                smart_unicode(related.uuid)
                                            })
                                elif type(field) == OneToOneField:
                                    related = getattr(object, field.name)
                                    self.xml.addQuickElement(
                                        "object",
                                        attrs={
                                            'uuid': smart_unicode(related.uuid)
                                        })
                                else:
                                    self.xml.characters(
                                        field.value_to_string(object))
                            else:
                                self.xml.addQuickElement("None")
                            self.xml.endElement(field.name)

                    for field in object._meta.many_to_many:
                        self.indent(2)
                        self.xml.startElement(field.name, {})
                        for relobj in getattr(object, field.name).iterator():
                            self.indent(3)
                            self.xml.addQuickElement(
                                "object",
                                attrs={'uuid': smart_unicode(relobj.uuid)})
                        self.indent(2)
                        self.xml.endElement(field.name)

                    self.indent(1)
                    self.xml.endElement(smart_unicode(
                        object._meta.object_name))

        self.indent(0)
        self.xml.endElement("aemanager")
        self.xml.endDocument()

    def backup_files(self):
        dirs = ['contract', 'logo', 'proposal']
        for dir in dirs:
            from_path = '%s%s/%s' % (settings.FILE_UPLOAD_DIR,
                                     self.user.get_profile().uuid, dir)
            to_path = '%s/%s' % (self.backup_dir, dir)
            if os.path.exists(from_path):
                shutil.copytree(from_path, to_path)
class CirkwiPOISerializer(object):
    def __init__(self, request, stream):
        self.xml = SimplerXMLGenerator(stream, 'utf8')
        self.request = request
        self.stream = stream

    def serialize_field(self, name, value, attrs={}):
        if not value and not attrs:
            return
        value = unicode(value)
        self.xml.startElement(name, attrs)
        if u'<' in value or u'>' in value or u'&' in value:
            self.stream.write('<![CDATA[%s]]>' % value)
        else:
            self.xml.characters(value)
        self.xml.endElement(name)

    def serialize_medias(self, request, pictures):
        if not pictures:
            return
        self.xml.startElement('medias', {})
        self.xml.startElement('images', {})
        for picture in pictures[:10]:
            self.xml.startElement('image', {})
            if picture['legend']:
                self.serialize_field('legende', picture['legend'])
            self.serialize_field('url',
                                 request.build_absolute_uri(picture['url']))
            if picture['author']:
                self.serialize_field('credit', picture['author'])
            self.xml.endElement('image')
        self.xml.endElement('images')
        self.xml.endElement('medias')

    def serialize_pois(self, pois):
        if not pois:
            return
        for poi in pois:
            self.xml.startElement(
                'poi', {
                    'date_creation': timestamp(poi.date_insert),
                    'date_modification': timestamp(poi.date_update),
                    'id_poi': str(poi.pk),
                })
            if poi.type.cirkwi:
                self.xml.startElement('categories', {})
                self.serialize_field('categorie', str(poi.type.cirkwi.eid),
                                     {'nom': poi.type.cirkwi.name})
                self.xml.endElement('categories')
            orig_lang = translation.get_language()
            self.xml.startElement('informations', {})
            for lang in poi.published_langs:
                translation.activate(lang)
                self.xml.startElement('information', {'langue': lang})
                self.serialize_field('titre', poi.name)
                self.serialize_field('description',
                                     plain_text(poi.description))
                self.serialize_medias(self.request, poi.serializable_pictures)
                self.xml.endElement('information')
            translation.activate(orig_lang)
            self.xml.endElement('informations')
            self.xml.startElement('adresse', {})
            self.xml.startElement('position', {})
            coords = poi.geom.transform(4326, clone=True).coords
            self.serialize_field('lat', coords[1])
            self.serialize_field('lng', coords[0])
            self.xml.endElement('position')
            self.xml.endElement('adresse')
            self.xml.endElement('poi')

    def serialize(self, pois):
        self.xml.startDocument()
        self.xml.startElement('pois', {'version': '2'})
        self.serialize_pois(pois)
        self.xml.endElement('pois')
        self.xml.endDocument()
Example #11
0
    def render(self, data, accepted_media_type=None, renderer_context=None):
        """
        Renders `data` into serialized XML.
        """
        if data is None:
            return ''
        print(data)

        stream = StringIO()

        xml = SimplerXMLGenerator(stream, self.charset)
        xml.startDocument()
        reactor_model = ReactorModel.objects.get(pk=data['reactor_model'])

        xml.startElement("basecore ", {
            'ID': reactor_model.name,
            'core_type': reactor_model.reactor_type
        })
        reactor_positions = reactor_model.positions.all()
        num_side_asms = 0
        for reactor_position in reactor_positions:
            if reactor_position.row > num_side_asms:
                num_side_asms = reactor_position.row
        #core_geo
        xml.startElement('core_geo', {'num_side_asms': str(num_side_asms)})

        xml.startElement('fuel_pitch', {})
        xml.characters(smart_text(reactor_model.fuel_pitch))
        xml.endElement('fuel_pitch')

        xml.startElement('std_fuel_len', {})
        xml.characters(smart_text(reactor_model.active_height))
        xml.endElement('std_fuel_len')

        xml.startElement('fuel_map', {})
        fuel_map_lst = []
        for i in range(1, num_side_asms + 1):
            for j in range(1, num_side_asms + 1):
                fuel_position = reactor_model.positions.filter(row=i, column=j)
                if fuel_position:
                    fuel_map_lst.append('1')
                else:
                    fuel_map_lst.append('0')

        xml.characters(smart_text(' '.join(fuel_map_lst)))
        xml.endElement('fuel_map')

        xml.endElement('core_geo')

        #control rod map
        xml.startElement('rcca', {})
        control_rod_assembly_lst = []
        bank_id_lst = []

        for position in reactor_positions:
            try:
                cralp = ControlRodAssemblyLoadingPattern.objects.get(
                    reactor_position=position)
                control_rod_assembly_lst.append(
                    cralp.control_rod_assembly.cluster_name)
                if cralp.control_rod_assembly.cluster_name not in bank_id_lst:
                    bank_id_lst.append(cralp.control_rod_assembly.cluster_name)
            except Exception:
                control_rod_assembly_lst.append('0')

        index = 1
        for name in bank_id_lst:
            xml.startElement('bank_id', {
                'basez': "9.5875",
                'index': str(index)
            })
            index += 1
            xml.characters(smart_text(name))
            xml.endElement('bank_id')

        xml.startElement('map', {})
        xml.characters(smart_text(' '.join(control_rod_assembly_lst)))
        xml.endElement('map')

        xml.startElement('step_size', {})
        xml.characters(smart_text(1.5832))
        xml.endElement('step_size')

        xml.endElement('rcca')

        #reflector
        xml.startElement('reflector', {})

        xml.startElement('bot_br', {})
        xml.characters(smart_text('BR_BOT'))
        xml.endElement('bot_br')

        xml.startElement('top_br', {})
        xml.characters(
            smart_text('''
        BR_TOP
        BR_TOP BR_TOP
        BR_TOP BR_TOP BR_TOP
        BR_TOP BR_TOP BR_TOP BR_TOP
        BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP
        BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP
        BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP
        BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP
        BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP
        BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP
        BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP BR_TOP
        BR_TOP BR_TOP BR_TOP
        BR_TOP BR_TOP BR_TOP'''))
        xml.endElement('top_br')

        xml.startElement('radial_br', {'index': '1'})
        xml.characters(
            smart_text(
                'BR3  BR3  BR3  BR9  BR6  BR5  BR7  BR3  BR3  BR9  BR6  BR5  BR7  BR9 '
            ))
        xml.endElement('radial_br')

        xml.startElement('radial_br', {'index': '2'})
        xml.characters(
            smart_text(
                'BR4  BR4  BR4 BR10 BR12 BR11  BR8  BR4  BR4 BR10 BR12 BR11  BR8 BR10 BR12'
            ))
        xml.endElement('radial_br')

        xml.endElement('reflector')

        xml.endElement("basecore ")
        xml.endDocument()
        return stream.getvalue()
Example #12
0
class Serializer(base.Serializer):
    """
    Serializes a QuerySet to XML.
    """
    def indent(self, level):
        if self.options.get('indent', None) is not None:
            self.xml.ignorableWhitespace(
                '\n' + ' ' * self.options.get('indent', None) * level)

    def start_serialization(self):
        """
        Start serialization -- open the XML document and the root element.
        """
        self.xml = SimplerXMLGenerator(
            self.stream, self.options.get("encoding",
                                          settings.DEFAULT_CHARSET))
        self.xml.startDocument()
        self.xml.startElement("django-objects", {"version": "1.0"})

    def end_serialization(self):
        """
        End serialization -- end the document.
        """
        self.indent(0)
        self.xml.endElement("django-objects")
        self.xml.endDocument()

    def start_object(self, obj):
        """
        Called as each object is handled.
        """
        if not hasattr(obj, "_meta"):
            raise base.SerializationError(
                "Non-model object (%s) encountered during serialization" %
                type(obj))

        self.indent(1)
        obj_pk = obj._get_pk_val()
        if obj_pk is None:
            attrs = {
                "model": smart_unicode(obj._meta),
            }
        else:
            attrs = {
                "pk": smart_unicode(obj._get_pk_val()),
                "model": smart_unicode(obj._meta),
            }

        self.xml.startElement("object", attrs)

    def end_object(self, obj):
        """
        Called after handling all fields for an object.
        """
        self.indent(1)
        self.xml.endElement("object")

    def handle_field(self, obj, field):
        """
        Called to handle each field on an object (except for ForeignKeys and
        ManyToManyFields)
        """
        self.indent(2)
        self.xml.startElement("field", {
            "name": field.name,
            "type": field.get_internal_type()
        })

        # Get a "string version" of the object's data.
        if getattr(obj, field.name) is not None:
            self.xml.characters(field.value_to_string(obj))
        else:
            self.xml.addQuickElement("None")

        self.xml.endElement("field")

    def handle_fk_field(self, obj, field):
        """
        Called to handle a ForeignKey (we need to treat them slightly
        differently from regular fields).
        """
        self._start_relational_field(field)
        related_att = getattr(obj, field.get_attname())
        if related_att is not None:
            if self.use_natural_keys and hasattr(field.rel.to, 'natural_key'):
                related = getattr(obj, field.name)
                # If related object has a natural key, use it
                related = related.natural_key()
                # Iterable natural keys are rolled out as subelements
                for key_value in related:
                    self.xml.startElement("natural", {})
                    self.xml.characters(smart_unicode(key_value))
                    self.xml.endElement("natural")
            else:
                self.xml.characters(smart_unicode(related_att))
        else:
            self.xml.addQuickElement("None")
        self.xml.endElement("field")

    def handle_m2m_field(self, obj, field):
        """
        Called to handle a ManyToManyField. Related objects are only
        serialized as references to the object's PK (i.e. the related *data*
        is not dumped, just the relation).
        """
        if field.rel.through._meta.auto_created:
            self._start_relational_field(field)
            if self.use_natural_keys and hasattr(field.rel.to, 'natural_key'):
                # If the objects in the m2m have a natural key, use it
                def handle_m2m(value):
                    natural = value.natural_key()
                    # Iterable natural keys are rolled out as subelements
                    self.xml.startElement("object", {})
                    for key_value in natural:
                        self.xml.startElement("natural", {})
                        self.xml.characters(smart_unicode(key_value))
                        self.xml.endElement("natural")
                    self.xml.endElement("object")
            else:

                def handle_m2m(value):
                    self.xml.addQuickElement(
                        "object",
                        attrs={'pk': smart_unicode(value._get_pk_val())})

            for relobj in getattr(obj, field.name).iterator():
                handle_m2m(relobj)

            self.xml.endElement("field")

    def _start_relational_field(self, field):
        """
        Helper to output the <field> element for relational fields
        """
        self.indent(2)
        self.xml.startElement(
            "field", {
                "name": field.name,
                "rel": field.rel.__class__.__name__,
                "to": smart_unicode(field.rel.to._meta),
            })
Example #13
0
    def render(self, data, accepted_media_type=None, renderer_context=None):
        """
        Renders `data` into serialized XML.
        """
        if data is None:
            return ''
        print(data)

        stream = StringIO()

        xml = SimplerXMLGenerator(stream, self.charset)
        xml.startDocument()

        unit = UnitParameter.objects.get(pk=data[0]['unit'])
        plant = unit.plant
        reactor_model = unit.reactor_model
        reactor_positions = reactor_model.positions.all()
        cycles = unit.cycles.all()
        #fuel_assembly_model=FuelAssemblyLoadingPattern.objects.get(pk=data[0]['fuel_assembly_loading_patterns'][0]).fuel_assembly.type.model

        xml.startElement(
            "loading_pattern ", {
                'basecore_ID': reactor_model.name,
                'core_id': reactor_model.name + '_U' + str(unit.unit)
            })

        for cycle in cycles:

            control_rod_assembly_loading_patterns = cycle.control_rod_assembly_loading_patterns.all(
            )
            if control_rod_assembly_loading_patterns:
                xml.startElement('control_rod', {'cycle': str(cycle.cycle)})

                xml.startElement('map', {})
                cra_position_lst = []
                for reactor_position in reactor_positions:
                    cra_pattern = control_rod_assembly_loading_patterns.filter(
                        reactor_position=reactor_position)
                    if cra_pattern:
                        cra = cra_pattern.get().control_rod_assembly
                        cra_position_lst.append('CR1')
                    else:
                        cra_position_lst.append('0')
                xml.characters(smart_text(' '.join(cra_position_lst)))

                xml.endElement('map')

                xml.endElement('control_rod')

        for cycle in cycles:
            #fuel_assembly_loading_patterns=cycle.fuel_assembly_loading_patterns.all()
            #burnable_posison_assembly_positions=cycle.burnable_posison_assembly_positions.all()

            fuel_lst = []
            previous_cycle_lst = []
            '''
            for fuel_assembly_loading_pattern in fuel_assembly_loading_patterns:
                fuel_assembly_type=fuel_assembly_loading_pattern.fuel_assembly.type
                burnable_poison_assembly_position=burnable_posison_assembly_positions.filter(reactor_position=fuel_assembly_loading_pattern.reactor_position)
                
                if burnable_poison_assembly_position:
                    ibis=Ibis.objects.filter(fuel_assembly_type=fuel_assembly_type,burnable_poison_assembly=burnable_poison_assembly_position.get().burnable_poison_assembly).get()
                    base_fuel=ibis.base_fuels.get()
                    print(base_fuel)
                    fuel_lst.append(base_fuel.base_fuel.fuel_identity)
                else:
                    ibis=Ibis.objects.filter(fuel_assembly_type=fuel_assembly_type,burnable_poison_assembly=None).get()
                    base_fuels=ibis.base_fuels.all()
                    for base_fuel in base_fuels:
                        if not base_fuel.base_fuel.if_insert_burnable_fuel:
                            fuel_lst.append(base_fuel.base_fuel.fuel_identity)
            '''
            for reactor_position in reactor_positions:
                fuel_assembly_loading_pattern = cycle.fuel_assembly_loading_patterns.filter(
                    reactor_position=reactor_position).get()
                burnable_poison_assembly_position = cycle.burnable_posison_assembly_positions.filter(
                    reactor_position=reactor_position)
                fuel_assembly_type = fuel_assembly_loading_pattern.fuel_assembly.type
                if fuel_assembly_loading_pattern.get_previous():
                    [
                        previous_cycle, previous_position_row,
                        previous_position_column
                    ] = fuel_assembly_loading_pattern.get_previous().split('-')
                    position = '{}{}'.format(previous_position_row.zfill(2),
                                             previous_position_column.zfill(2))
                    fuel_lst.append(position)
                    if previous_cycle != cycle.cycle - 1:

                        previous_cycle_lst.append([
                            previous_cycle, reactor_position.row,
                            reactor_position.column
                        ])

                else:
                    if burnable_poison_assembly_position:
                        ibis = Ibis.objects.filter(
                            fuel_assembly_type=fuel_assembly_type,
                            burnable_poison_assembly=
                            burnable_poison_assembly_position.get(
                            ).burnable_poison_assembly).get()
                        base_fuel = ibis.base_fuels.get()
                        fuel_lst.append(base_fuel.base_fuel.fuel_identity)
                    else:
                        ibis = Ibis.objects.filter(
                            fuel_assembly_type=fuel_assembly_type,
                            burnable_poison_assembly=None).get()
                        base_fuels = ibis.base_fuels.all()
                        for base_fuel in base_fuels:
                            if not base_fuel.base_fuel.if_insert_burnable_fuel(
                            ):
                                fuel_lst.append(
                                    base_fuel.base_fuel.fuel_identity)

            print(len(fuel_lst))

            xml.startElement('fuel', {'cycle': str(cycle.cycle)})

            xml.startElement('map', {})
            xml.characters(smart_text(' '.join(fuel_lst)))
            xml.endElement('map')

            for previous_cycle_info in previous_cycle_lst:
                if int(previous_cycle_info[0]) != cycle.cycle - 1:
                    xml.startElement(
                        'cycle', {
                            'row': str(previous_cycle_info[1]),
                            'col': str(previous_cycle_info[2])
                        })
                    xml.characters(smart_text(previous_cycle_info[0]))
                    xml.endElement('cycle')

            xml.endElement('fuel')

        xml.endElement("loading_pattern ")
        xml.endDocument()
        return stream.getvalue()
Example #14
0
class Serializer(base.Serializer):
    """
    Serializes a QuerySet to XML.
    """
    def _get_obj_pk(self, obj):
        """
        returns the objects pk or the natural key, joined
        """
        if self.use_natural_keys and hasattr(obj, 'natural_key'):
            raw_nat_key = obj.natural_key()
            obj_pk = smart_text(NATURAL_KEY_JOINER.join(raw_nat_key))
            keytype = 'natural'
        else:
            obj_pk = obj._get_pk_val()
            keytype = 'pk'

        return obj_pk, keytype

    def indent(self, level):
        if self.options.get('indent', None) is not None:
            self.xml.ignorableWhitespace(
                '\n' + ' ' * self.options.get('indent', None) * level)

    def start_serialization(self):
        """
        Start serialization -- open the XML document and the root element.
        """
        self.xml = SimplerXMLGenerator(
            self.stream, self.options.get("encoding",
                                          settings.DEFAULT_CHARSET))
        self.xml.startDocument()
        self.xml.startElement(
            "xliff", {
                "version": "1.2",
                "xmlns": "urn:oasis:names:tc:xliff:document:1.2",
                "xmlns:d": "https://docs.djangoproject.com/"
            })

    def start_fileblock(self, obj):
        """
        Start the <file><body> block
        """
        self.indent(1)
        obj_key, keytype = self._get_obj_pk(obj)
        self.xml.startElement(
            "file", {
                "original": "%s.%s" % (smart_text(obj._meta), obj_key),
                "datatype": "database",
                "source-language": settings.LANGUAGE_CODE,
                "d:keytype": keytype,
            })
        self.xml.startElement("body", {})

    def end_fileblock(self):
        """
        End the <file><body> block
        """
        self.indent(1)
        self.xml.endElement("body")
        self.xml.endElement("file")

    def end_serialization(self):
        """
        End serialization -- end the document.
        """
        self.indent(0)
        self.xml.endElement("xliff")
        self.xml.endDocument()

    def start_object(self, obj):
        """
        Called as each object is handled.
        """
        if not hasattr(obj, "_meta"):
            raise base.SerializationError(
                "Non-model object (%s) encountered during serialization" %
                type(obj))

        self.start_fileblock(obj)

        self.indent(2)

        obj_pk, keytype = self._get_obj_pk(obj)
        attrs = {"restype": "row", "d:keytype": keytype}
        if obj_pk is not None:
            attrs["resname"] = "%s.%s" % (smart_text(obj._meta), obj_pk)
        else:
            attrs["resname"] = smart_text(obj._meta)

        self.xml.startElement("group", attrs)

        if obj._meta.pk.__class__.__name__ != "AutoField":
            self.handle_field(obj, obj._meta.pk)

    def end_object(self, obj):
        """
        Called after handling all fields for an object.
        """
        self.indent(2)
        self.xml.endElement("group")
        self.indent(1)
        self.end_fileblock()

    def handle_field(self, obj, field):
        """
        Called to handle each field on an object (except for ForeignKeys and
        ManyToManyFields)
        """
        self.indent(3)
        internal_type = field.get_internal_type()
        attrs = {
            "id": field.name,
            "resname": field.name,
            "restype": "x-%s" % internal_type,
            "translate": "no",
        }
        if internal_type in ("CharField", "TextField"):
            attrs["translate"] = "yes"

        if internal_type == "CharField":
            attrs["size-unit"] = "char"
            attrs["maxwidth"] = str(field.max_length)

        self.xml.startElement("trans-unit", attrs)
        self.indent(4)
        self.xml.startElement("source", {})
        # Get a "string version" of the object's data.
        if getattr(obj, field.name) is not None:
            self.xml.characters(field.value_to_string(obj))
        else:
            self.xml.addQuickElement("None")

        self.xml.endElement("source")
        self.indent(3)
        self.xml.endElement("trans-unit")

    def handle_fk_field(self, obj, field):
        """
        Called to handle a ForeignKey (we need to treat them slightly
        differently from regular fields).
        """
        related_att = getattr(obj, field.get_attname())
        if related_att is not None:
            if self.use_natural_keys and hasattr(field.rel.to, 'natural_key'):
                self._start_relational_field(field, keytype="natural")
                related = getattr(obj, field.name)
                # If related object has a natural key, use it
                related = related.natural_key()
                nat_key = NATURAL_KEY_JOINER.join(related)
                self.xml.characters(smart_text(nat_key))
                # Iterable natural keys are rolled out as subelements
                # for key_value in related:
                #     self.xml.startElement("natural", {})
                #     self.xml.characters(smart_text(key_value))
                #     self.xml.endElement("natural")
            else:
                self._start_relational_field(field)
                self.xml.characters(smart_text(related_att))
        else:
            self._start_relational_field(field)
            self.xml.addQuickElement("None")
        self.xml.endElement("source")
        self.indent(3)
        self.xml.endElement("trans-unit")

    def handle_m2m_field(self, obj, field):
        """
        Called to handle a ManyToManyField. Related objects are only
        serialized as references to the object's PK (i.e. the related *data*
        is not dumped, just the relation).
        """
        if field.rel.through._meta.auto_created:
            # self._start_relational_field(field)
            if self.use_natural_keys and hasattr(field.rel.to, 'natural_key'):
                # If the objects in the m2m have a natural key, use it
                def handle_m2m(value):
                    natural = value.natural_key()
                    nat_key = NATURAL_KEY_JOINER.join(natural)
                    field_id = "%s.%s" % (obj.pk, nat_key)
                    self._start_relational_field(field,
                                                 field_id=field_id,
                                                 keytype="natural")
                    self.xml.characters(smart_text(nat_key))
                    self.xml.endElement("source")
                    self.indent(3)
                    self.xml.endElement("trans-unit")
                    # Iterable natural keys are rolled out as subelements
                    # self.xml.startElement("object", {})
                    # for key_value in natural:
                    # self.xml.startElement("natural", {})
                    # self.xml.characters(smart_text(key_value))
                    # self.xml.endElement("natural")
                    # self.xml.endElement("object")
            else:

                def handle_m2m(value):
                    field_id = "%s.%s" % (obj.pk, value._get_pk_val())
                    self._start_relational_field(field, field_id)
                    self.xml.characters(smart_text(value._get_pk_val()))
                    self.xml.endElement("source")
                    self.indent(3)
                    self.xml.endElement("trans-unit")
                    # self.xml.addQuickElement("object", attrs={
                    #     'pk' : smart_text(value._get_pk_val())
                    # })

            for relobj in getattr(obj, field.name).iterator():
                handle_m2m(relobj)

    def handle_gfk_field(self, obj, field):
        """
        Handle the GenericForeignKey
        <trans-unit id=<gfk.name>
        """
        obj_pk, keytype = self._get_obj_pk(getattr(obj, field.ct_field))
        attrs = {
            "id": field.name,
            "resname": field.name,
            "restype": "x-%s" % field.__class__.__name__,
            "translate": "no",
            "d:keytype": keytype,
            "d:rel": "GenericManyToOneRel",
            "d:to": obj_pk,
        }
        self.xml.startElement("trans-unit", attrs)
        self.indent(4)
        self.xml.startElement("source", {})
        # Get a "string version" of the object's data.
        gfk_obj = getattr(obj, field.name)
        if gfk_obj is not None:
            gfk_pk, keytype = self._get_obj_pk(gfk_obj)
            if keytype == 'natural':
                self.xml.characters(gfk_pk)
        else:
            self.xml.addQuickElement("None")

        self.xml.endElement("source")
        self.indent(3)
        self.xml.endElement("trans-unit")

    def _start_relational_field(self, field, field_id="", keytype="pk"):
        """
        Helper to output the <trans-unit> element for relational fields
        """
        self.indent(3)
        internal_type = field.get_internal_type()
        attrs = {
            "id": field_id or field.name,
            "resname": field.name,
            "restype": "x-%s" % internal_type,
            "translate": "no",
            "d:rel": field.rel.__class__.__name__,
            "d:to": smart_text(field.rel.to._meta),
            "d:keytype": keytype,
        }
        self.xml.startElement("trans-unit", attrs)
        self.indent(4)
        self.xml.startElement("source", {})
"""
Example #16
0
class CirkwiPOISerializer:
    def __init__(self, request, stream):
        self.xml = SimplerXMLGenerator(stream, "utf8")
        self.request = request
        self.stream = stream

    def serialize_field(self, name, value, attrs={}):
        if not value and not attrs:
            return
        value = unicode(value)
        self.xml.startElement(name, attrs)
        if u"<" in value or u">" in value or u"&" in value:
            self.stream.write("<![CDATA[%s]]>" % value)
        else:
            self.xml.characters(value)
        self.xml.endElement(name)

    def serialize_medias(self, request, pictures):
        if not pictures:
            return
        self.xml.startElement("medias", {})
        self.xml.startElement("images", {})
        for picture in pictures:
            self.xml.startElement("image", {})
            self.serialize_field("legende", picture["legend"])
            self.serialize_field("url", request.build_absolute_uri(picture["url"]))
            self.serialize_field("credit", picture["author"])
            self.xml.endElement("image")
        self.xml.endElement("images")
        self.xml.endElement("medias")

    def serialize_pois(self, pois):
        for poi in pois:
            self.xml.startElement(
                "poi",
                {
                    "date_creation": timestamp(poi.date_insert),
                    "date_modification": timestamp(poi.date_update),
                    "id_poi": str(poi.pk),
                },
            )
            if poi.type.cirkwi:
                self.xml.startElement("categories", {})
                self.serialize_field("categorie", str(poi.type.cirkwi.eid), {"nom": poi.type.cirkwi.name})
                self.xml.endElement("categories")
            orig_lang = translation.get_language()
            self.xml.startElement("informations", {})
            for lang in poi.published_langs:
                translation.activate(lang)
                self.xml.startElement("information", {"langue": lang})
                self.serialize_field("titre", poi.name)
                self.serialize_field("description", plain_text(poi.description))
                self.serialize_medias(self.request, poi.serializable_pictures)
                self.xml.endElement("information")
            translation.activate(orig_lang)
            self.xml.endElement("informations")
            self.xml.startElement("adresse", {})
            self.xml.startElement("position", {})
            coords = poi.geom.transform(4326, clone=True).coords
            self.serialize_field("lat", coords[1])
            self.serialize_field("lng", coords[0])
            self.xml.endElement("position")
            self.xml.endElement("adresse")
            self.xml.endElement("poi")

    def serialize(self, pois):
        self.xml.startDocument()
        self.xml.startElement("pois", {"version": "2"})
        self.serialize_pois(pois)
        self.xml.endElement("pois")
        self.xml.endDocument()
Example #17
0
class Serializer(base.Serializer):
    key_map = {}

    def __init__(self):
        #self.xml = SimplerXMLGenerator(self.stream, self.options.get("encoding", settings.DEFAULT_CHARSET))
        pass
        #if (self.key_map):
        #    _validate_keymap(self.__class__.__name__, self.model_class, self.key_map)


    #? Dry
    def model_name(self, obj):
        if not hasattr(obj, "_meta"):
            raise base.SerializationError("Non-model object (%s) encountered during serialization" % type(obj))
        return str(obj._meta)
        
    def indent(self, level):
        if self.options.get('indent') is not None:
            self.xml.ignorableWhitespace('\n' + ' ' * self.options.get('indent') * level)

    def start_serialization(self):
        """
        Start serialization -- open the XML document and the root element.
        """
        #self.stream.write('<?xml version = "1.0" encoding = "UTF-8"?>\n')
        #self.stream.write('<queryset>\n')
        self.xml = SimplerXMLGenerator(self.stream, self.options.get("encoding", settings.DEFAULT_CHARSET))
        self.xml.startDocument()
        self.xml.startElement("django-objects", {"version": "1.0"})

    def end_serialization(self):
        #self.stream.write('</queryset>\n')
        self.indent(0)
        self.xml.endElement("django-objects")
        self.xml.endDocument()
        
    def start_object(self, obj):
        if not hasattr(obj, "_meta"):
            raise base.SerializationError("Non-model object (%s) encountered during serialization" % type(obj))
        self.indent(1)
        self.xml.startElement("object", {'model': self.model_name(obj) })
        #self.stream.write('<object model="{}">\n'.format(self.model_name(obj)))
        obj_pk = obj.pk
        if obj_pk is not None:
            #self.stream.write('<field name="pk">{}</field>\n'.format(obj_pk))
            #self.xml.addQuickElement("field", contents=, attrs={'name': 'pk'})
            self.xml.startElement('field', {
                'name': 'pk'
            })
            self.xml.characters(str(obj_pk))
            self.xml.endElement("field")

    def end_object(self, obj):
        #self.stream.write('</object>\n')
        self.indent(1)
        self.xml.endElement("object")
        
    def handle_field(self, obj, field):
        #? DRY
        field_name = field.name
        k = self.key_map[fn] if (field_name in self.key_map) else field_name
        self.indent(2)
        self.xml.startElement('field', {
            'name': field_name
        })
        if getattr(obj, field_name) is not None:
            try:
                #? investigate this parser function
                #? does what?
                self.xml.characters(field.value_to_string(obj))
                #v = field.value_from_object(obj)
                #self.stream.write('<field name="{0}">{1}</field>\n'.format(k, v))
            except UnserializableContentError:
                raise ValueError("%s.%s (pk:%s) contains unserializable characters" % (
                    obj.__class__.__name__, fn, obj.pk))
        else:
            #self.stream.write('<field name="{0}">None</field>\n'.format(k))
            self.xml.addQuickElement("None")
        self.xml.endElement("field")
Example #18
0
class BackupRequest(models.Model):
    user = models.OneToOneField(User)
    state = models.IntegerField(choices=BACKUP_RESTORE_STATE, default=BACKUP_RESTORE_STATE_PENDING)
    creation_datetime = models.DateTimeField()
    last_state_datetime = models.DateTimeField()
    error_message = models.CharField(max_length=255, null=True, blank=True)

    def is_done(self):
        return self.state == BACKUP_RESTORE_STATE_DONE

    def get_backup_filename(self):
        return 'backup_%s.tar.gz' % (self.creation_datetime.strftime('%Y%m%d%H%M'))

    def backup(self):

        class BackupTarInfo(tarfile.TarInfo):
            def setNothing(self, value):
                pass

            def getUid(self):
                return 10000

            def getGid(self):
                return 1000

            def getUname(self):
                return 'aemanager'

            def getGname(self):
                return 'aemanager'

            uid = property(getUid, setNothing)
            gid = property(getGid, setNothing)
            uname = property(getUname, setNothing)
            gname = property(getGname, setNothing)

        self.state = BACKUP_RESTORE_STATE_IN_PROGRESS
        self.last_state_datetime = datetime.datetime.now()
        self.save()

        self.backup_dir = '%s%s/backup/backup_%s' % (settings.FILE_UPLOAD_DIR,
                                                     self.user.get_profile().uuid,
                                                     self.creation_datetime.strftime('%Y%m%d%H%M'))
        try:
            # delete previous export dir
            shutil.rmtree('%s%s/backup' % (settings.FILE_UPLOAD_DIR,
                                           self.user.get_profile().uuid),
                                           True)

            # create export dir
            mkdir_p(self.backup_dir)

            # backup objects
            self.stream = open("%s/data.xml" % (self.backup_dir), 'w')
            self.backup_objects()
            self.stream.close()

            # backup files
            self.backup_files()

            # create the archive
            file = gzip.GzipFile('%s.tar.gz' % (self.backup_dir), 'w')
            tar = tarfile.TarFile(mode='w', fileobj=file, tarinfo=BackupTarInfo)
            tar.add(self.backup_dir, 'backup')
            tar.close()
            file.close()

            self.state = BACKUP_RESTORE_STATE_DONE
        except Exception as e:
            self.state = BACKUP_RESTORE_STATE_ERROR
            self.error_message = unicode(e)
            mail_subject = _('Backup failed')
            mail_message = _('Backup for %(user)s failed with message : %(message)s') % {'user': self.user,
                                                                                         'message': e}
            mail_admins(mail_subject, mail_message, fail_silently=(not settings.DEBUG))

        shutil.rmtree(self.backup_dir, True)
        self.last_state_datetime = datetime.datetime.now()
        self.save()

    def indent(self, level):
        self.xml.ignorableWhitespace('\n' + ' ' * 4 * level)

    def backup_objects(self):
        models = [Address, Contact, Contract, PhoneNumber, Project, Proposal, ProposalRow, Invoice, InvoiceRow, Expense]

        self.xml = SimplerXMLGenerator(self.stream, settings.DEFAULT_CHARSET)
        self.xml.startDocument()
        self.xml.startElement("aemanager", {"version" : common()['version']})

        for model in models:
            for object in model.objects.filter(owner=self.user):
                # do not export address of user profile
                if not(type(object) == Address and object.userprofile_set.count()):
                    self.indent(1)
                    self.xml.startElement(object._meta.object_name, {'uuid': object.uuid})
                    for field in object._meta.local_fields:
                        if field.name not in ['ownedobject_ptr']:
                            self.indent(2)
                            self.xml.startElement(field.name, {})
                            if getattr(object, field.name) is not None:
                                if type(field) == ForeignKey:
                                    related = getattr(object, field.name)
                                    if type(related) == Country:
                                        self.xml.addQuickElement("object", attrs={
                                          'country_code' : smart_unicode(related.country_code2)
                                        })
                                    else:
                                        self.xml.addQuickElement("object", attrs={
                                          'uuid' : smart_unicode(related.uuid)
                                        })
                                elif type(field) == OneToOneField:
                                    related = getattr(object, field.name)
                                    self.xml.addQuickElement("object", attrs={
                                      'uuid' : smart_unicode(related.uuid)
                                    })
                                else:
                                    self.xml.characters(field.value_to_string(object))
                            else:
                                self.xml.addQuickElement("None")
                            self.xml.endElement(field.name)

                    for field in object._meta.many_to_many:
                        self.indent(2)
                        self.xml.startElement(field.name, {})
                        for relobj in getattr(object, field.name).iterator():
                            self.indent(3)
                            self.xml.addQuickElement("object", attrs={
                              'uuid' : smart_unicode(relobj.uuid)
                            })
                        self.indent(2)
                        self.xml.endElement(field.name)

                    self.indent(1)
                    self.xml.endElement(smart_unicode(object._meta.object_name))

        self.indent(0)
        self.xml.endElement("aemanager")
        self.xml.endDocument()

    def backup_files(self):
        dirs = ['contract', 'logo', 'proposal']
        for dir in dirs:
            from_path = '%s%s/%s' % (settings.FILE_UPLOAD_DIR,
                                      self.user.get_profile().uuid,
                                      dir)
            to_path = '%s/%s' % (self.backup_dir, dir)
            if os.path.exists(from_path):
                shutil.copytree(from_path, to_path)
Example #19
0
    def render(self, data, accepted_media_type=None, renderer_context=None):
        """
        Renders `data` into serialized XML.
        """
        if data is None:
            return ''
        print(data)

        stream = StringIO()

        xml = SimplerXMLGenerator(stream, self.charset)
        xml.startDocument()
        
        unit=UnitParameter.objects.get(pk=data[0]['unit'])
        plant=unit.plant
        reactor_model=unit.reactor_model
        reactor_positions=reactor_model.positions.all()
        cycles=unit.cycles.all()
        #fuel_assembly_model=FuelAssemblyLoadingPattern.objects.get(pk=data[0]['fuel_assembly_loading_patterns'][0]).fuel_assembly.type.model
        
        xml.startElement("loading_pattern ", {'basecore_ID':reactor_model.name,'core_id':reactor_model.name+'_U'+str(unit.unit)})
        
        
        for cycle in cycles:
            
            control_rod_assembly_loading_patterns=cycle.control_rod_assembly_loading_patterns.all()
            if control_rod_assembly_loading_patterns:
                xml.startElement('control_rod', {'cycle':str(cycle.cycle)})
                
                xml.startElement('map', {})
                cra_position_lst=[]
                for reactor_position in reactor_positions:
                    cra_pattern=control_rod_assembly_loading_patterns.filter(reactor_position=reactor_position)
                    if cra_pattern:
                        cra=cra_pattern.get().control_rod_assembly
                        cra_position_lst.append('CR1')
                    else:
                        cra_position_lst.append('0')
                xml.characters(smart_text(' '.join(cra_position_lst)))    
                        
                xml.endElement('map')
                
                xml.endElement('control_rod')
        
        for cycle in cycles: 
            #fuel_assembly_loading_patterns=cycle.fuel_assembly_loading_patterns.all()
            #burnable_posison_assembly_positions=cycle.burnable_posison_assembly_positions.all()
           
            fuel_lst=[]
            previous_cycle_lst=[]
            '''
            for fuel_assembly_loading_pattern in fuel_assembly_loading_patterns:
                fuel_assembly_type=fuel_assembly_loading_pattern.fuel_assembly.type
                burnable_poison_assembly_position=burnable_posison_assembly_positions.filter(reactor_position=fuel_assembly_loading_pattern.reactor_position)
                
                if burnable_poison_assembly_position:
                    ibis=Ibis.objects.filter(fuel_assembly_type=fuel_assembly_type,burnable_poison_assembly=burnable_poison_assembly_position.get().burnable_poison_assembly).get()
                    base_fuel=ibis.base_fuels.get()
                    print(base_fuel)
                    fuel_lst.append(base_fuel.base_fuel.fuel_identity)
                else:
                    ibis=Ibis.objects.filter(fuel_assembly_type=fuel_assembly_type,burnable_poison_assembly=None).get()
                    base_fuels=ibis.base_fuels.all()
                    for base_fuel in base_fuels:
                        if not base_fuel.base_fuel.if_insert_burnable_fuel:
                            fuel_lst.append(base_fuel.base_fuel.fuel_identity)
            '''               
            for reactor_position in reactor_positions:
                fuel_assembly_loading_pattern=cycle.fuel_assembly_loading_patterns.filter(reactor_position=reactor_position).get()
                burnable_poison_assembly_position=cycle.burnable_posison_assembly_positions.filter(reactor_position=reactor_position)
                fuel_assembly_type=fuel_assembly_loading_pattern.fuel_assembly.type
                if fuel_assembly_loading_pattern.get_previous():
                    [previous_cycle,previous_position_row,previous_position_column]=fuel_assembly_loading_pattern.get_previous().split('-')
                    position='{}{}'.format(previous_position_row.zfill(2), previous_position_column.zfill(2))
                    fuel_lst.append(position)
                    if previous_cycle!=cycle.cycle-1:
                        
                        previous_cycle_lst.append([previous_cycle,reactor_position.row,reactor_position.column])
                       
                        
                else:
                    if burnable_poison_assembly_position:
                        ibis=Ibis.objects.filter(fuel_assembly_type=fuel_assembly_type,burnable_poison_assembly=burnable_poison_assembly_position.get().burnable_poison_assembly).get()
                        base_fuel=ibis.base_fuels.get()
                        fuel_lst.append(base_fuel.base_fuel.fuel_identity)
                    else:
                        ibis=Ibis.objects.filter(fuel_assembly_type=fuel_assembly_type,burnable_poison_assembly=None).get()
                        base_fuels=ibis.base_fuels.all()     
                        for base_fuel in base_fuels:
                            if not base_fuel.base_fuel.if_insert_burnable_fuel():
                                fuel_lst.append(base_fuel.base_fuel.fuel_identity)
                            
            print(len(fuel_lst))    
                           
            xml.startElement('fuel', {'cycle':str(cycle.cycle)})
                
            
            xml.startElement('map', {})
            xml.characters(smart_text(' '.join(fuel_lst)))      
            xml.endElement('map')
            
            for previous_cycle_info in previous_cycle_lst:
                if int(previous_cycle_info[0])!=cycle.cycle-1:
                    xml.startElement('cycle', {'row':str(previous_cycle_info[1]),'col':str(previous_cycle_info[2])})
                    xml.characters(smart_text(previous_cycle_info[0]))      
                    xml.endElement('cycle')
                            
            xml.endElement('fuel')
            
        xml.endElement("loading_pattern ")
        xml.endDocument()
        return stream.getvalue() 
class Serializer(base.Serializer):
    """
    Serializes a QuerySet to XML.
    """

    def _get_obj_pk(self, obj):
        """
        returns the objects pk or the natural key, joined
        """
        if self.use_natural_keys and hasattr(obj, 'natural_key'):
            raw_nat_key = obj.natural_key()
            obj_pk = smart_text(NATURAL_KEY_JOINER.join(raw_nat_key))
            keytype = 'natural'
        else:
            obj_pk = obj._get_pk_val()
            keytype = 'pk'

        return obj_pk, keytype

    def indent(self, level):
        if self.options.get('indent', None) is not None:
            self.xml.ignorableWhitespace('\n' + ' ' * self.options.get('indent', None) * level)

    def start_serialization(self):
        """
        Start serialization -- open the XML document and the root element.
        """
        self.xml = SimplerXMLGenerator(self.stream, self.options.get("encoding", settings.DEFAULT_CHARSET))
        self.xml.startDocument()
        self.xml.startElement("xliff", {
            "version": "1.2",
            "xmlns": "urn:oasis:names:tc:xliff:document:1.2",
            "xmlns:d": "https://docs.djangoproject.com/"
        })

    def start_fileblock(self, obj):
        """
        Start the <file><body> block
        """
        self.indent(1)
        obj_key, keytype = self._get_obj_pk(obj)
        self.xml.startElement("file", {
            "original": "%s.%s" % (smart_text(obj._meta), obj_key),
            "datatype": "database",
            "source-language": settings.LANGUAGE_CODE,
            "d:keytype": keytype,
        })
        self.xml.startElement("body", {})

    def end_fileblock(self):
        """
        End the <file><body> block
        """
        self.indent(1)
        self.xml.endElement("body")
        self.xml.endElement("file")

    def end_serialization(self):
        """
        End serialization -- end the document.
        """
        self.indent(0)
        self.xml.endElement("xliff")
        self.xml.endDocument()

    def start_object(self, obj):
        """
        Called as each object is handled.
        """
        if not hasattr(obj, "_meta"):
            raise base.SerializationError("Non-model object (%s) encountered during serialization" % type(obj))

        self.start_fileblock(obj)

        self.indent(2)

        obj_pk, keytype = self._get_obj_pk(obj)
        attrs = {
            "restype": "row",
            "d:keytype": keytype
        }
        if obj_pk is not None:
            attrs["resname"] = "%s.%s" % (smart_text(obj._meta), obj_pk)
        else:
            attrs["resname"] = smart_text(obj._meta)

        self.xml.startElement("group", attrs)

        if obj._meta.pk.__class__.__name__ != "AutoField":
            self.handle_field(obj, obj._meta.pk)

    def end_object(self, obj):
        """
        Called after handling all fields for an object.
        """
        self.indent(2)
        self.xml.endElement("group")
        self.indent(1)
        self.end_fileblock()

    def handle_field(self, obj, field):
        """
        Called to handle each field on an object (except for ForeignKeys and
        ManyToManyFields)
        """
        self.indent(3)
        internal_type = field.get_internal_type()
        attrs = {
            "id": field.name,
            "resname": field.name,
            "restype": "x-%s" % internal_type,
            "translate": "no",
        }
        if internal_type in ("CharField", "TextField"):
            attrs["translate"] = "yes"

        if internal_type == "CharField":
            attrs["size-unit"] = "char"
            attrs["maxwidth"] = str(field.max_length)

        self.xml.startElement("trans-unit", attrs)
        self.indent(4)
        self.xml.startElement("source", {})
        # Get a "string version" of the object's data.
        if getattr(obj, field.name) is not None:
            self.xml.characters(field.value_to_string(obj))
        else:
            self.xml.addQuickElement("None")

        self.xml.endElement("source")
        self.indent(3)
        self.xml.endElement("trans-unit")

    def handle_fk_field(self, obj, field):
        """
        Called to handle a ForeignKey (we need to treat them slightly
        differently from regular fields).
        """
        related_att = getattr(obj, field.get_attname())
        if related_att is not None:
            if self.use_natural_keys and hasattr(field.rel.to, 'natural_key'):
                self._start_relational_field(field, keytype="natural")
                related = getattr(obj, field.name)
                # If related object has a natural key, use it
                related = related.natural_key()
                nat_key = NATURAL_KEY_JOINER.join(related)
                self.xml.characters(smart_text(nat_key))
                # Iterable natural keys are rolled out as subelements
                # for key_value in related:
                #     self.xml.startElement("natural", {})
                #     self.xml.characters(smart_text(key_value))
                #     self.xml.endElement("natural")
            else:
                self._start_relational_field(field)
                self.xml.characters(smart_text(related_att))
        else:
            self._start_relational_field(field)
            self.xml.addQuickElement("None")
        self.xml.endElement("source")
        self.indent(3)
        self.xml.endElement("trans-unit")

    def handle_m2m_field(self, obj, field):
        """
        Called to handle a ManyToManyField. Related objects are only
        serialized as references to the object's PK (i.e. the related *data*
        is not dumped, just the relation).
        """
        if field.rel.through._meta.auto_created:
            # self._start_relational_field(field)
            if self.use_natural_keys and hasattr(field.rel.to, 'natural_key'):
                # If the objects in the m2m have a natural key, use it
                def handle_m2m(value):
                    natural = value.natural_key()
                    nat_key = NATURAL_KEY_JOINER.join(natural)
                    field_id = "%s.%s" % (obj.pk, nat_key)
                    self._start_relational_field(field, field_id=field_id, keytype="natural")
                    self.xml.characters(smart_text(nat_key))
                    self.xml.endElement("source")
                    self.indent(3)
                    self.xml.endElement("trans-unit")
                    # Iterable natural keys are rolled out as subelements
                    # self.xml.startElement("object", {})
                    # for key_value in natural:
                        # self.xml.startElement("natural", {})
                        # self.xml.characters(smart_text(key_value))
                        # self.xml.endElement("natural")
                    # self.xml.endElement("object")
            else:
                def handle_m2m(value):
                    field_id = "%s.%s" % (obj.pk, value._get_pk_val())
                    self._start_relational_field(field, field_id)
                    self.xml.characters(smart_text(value._get_pk_val()))
                    self.xml.endElement("source")
                    self.indent(3)
                    self.xml.endElement("trans-unit")
                    # self.xml.addQuickElement("object", attrs={
                    #     'pk' : smart_text(value._get_pk_val())
                    # })
            for relobj in getattr(obj, field.name).iterator():
                handle_m2m(relobj)

    def handle_gfk_field(self, obj, field):
        """
        Handle the GenericForeignKey
        <trans-unit id=<gfk.name>
        """
        obj_pk, keytype = self._get_obj_pk(getattr(obj, field.ct_field))
        attrs = {
            "id": field.name,
            "resname": field.name,
            "restype": "x-%s" % field.__class__.__name__,
            "translate": "no",
            "d:keytype": keytype,
            "d:rel": "GenericManyToOneRel",
            "d:to": obj_pk,
        }
        self.xml.startElement("trans-unit", attrs)
        self.indent(4)
        self.xml.startElement("source", {})
        # Get a "string version" of the object's data.
        gfk_obj = getattr(obj, field.name)
        if gfk_obj is not None:
            gfk_pk, keytype = self._get_obj_pk(gfk_obj)
            if keytype == 'natural':
                self.xml.characters(gfk_pk)
        else:
            self.xml.addQuickElement("None")

        self.xml.endElement("source")
        self.indent(3)
        self.xml.endElement("trans-unit")

    def _start_relational_field(self, field, field_id="", keytype="pk"):
        """
        Helper to output the <trans-unit> element for relational fields
        """
        self.indent(3)
        internal_type = field.get_internal_type()
        attrs = {
            "id": field_id or field.name,
            "resname": field.name,
            "restype": "x-%s" % internal_type,
            "translate": "no",
            "d:rel": field.rel.__class__.__name__,
            "d:to": smart_text(field.rel.to._meta),
            "d:keytype": keytype,
        }
        self.xml.startElement("trans-unit", attrs)
        self.indent(4)
        self.xml.startElement("source", {})
Example #21
0
class XML(object):
    """
    Serializes a QuerySet to XML.
    """

    def __init__(self, stream, **kwargs):
        self.options = kwargs
        self.stream = stream
        self.xml = SimplerXMLGenerator(self.stream, self.options.get("encoding", settings.DEFAULT_CHARSET))

    def dumps(self, data, indent=0):
        #print indent
        #self.indent(indent)
        #self.xml.startElement("object", {})
        if isinstance(data, (list, tuple)):
            for item in data:
                #self.indent(indent)
                #self.xml.startElement("list-item", {})
                self.dumps(item, indent)
                #self.xml.endElement("list-item")

        elif isinstance(data, dict):
            for key, value in data.iteritems():
                self.indent(indent + 1)
                self.xml.startElement(key, {})
                self.dumps(value, indent + 1)
                self.xml.endElement(key)
            self.indent(indent)

        else:
            self.xml.characters(smart_unicode(data))
        #self.xml.endElement("object")


    def indent(self, level):
        if self.options.get('indent', None) is not None:
            self.xml.ignorableWhitespace('\n' + ' ' * self.options.get('indent', None) * level)

    def start_serialization(self):
        """
        Start serialization -- open the XML document and the root element.
        """
        self.xml.startDocument()
        self.xml.startElement("django-objects", {"version" : "1.0"})

    def end_serialization(self):
        """
        End serialization -- end the document.
        """
        self.indent(0)
        self.xml.endElement("django-objects")
        self.xml.endDocument()

#     def start_object(self, obj):
#         """
#         Called as each object is handled.
#         """
#         if not hasattr(obj, "_meta"):
#             raise base.SerializationError("Non-model object (%s) encountered during serialization" % type(obj))
# 
#         self.indent(1)
#         obj_pk = obj._get_pk_val()
#         if obj_pk is None:
#             attrs = {"model": smart_unicode(obj._meta),}
#         else:
#             attrs = {
#                 "pk": smart_unicode(obj._get_pk_val()),
#                 "model": smart_unicode(obj._meta),
#             }
# 
#         self.xml.startElement("object", attrs)
# 
#     def end_object(self, obj):
#         """
#         Called after handling all fields for an object.
#         """
#         self.indent(1)
#         self.xml.endElement("object")
# 
#     def handle_field(self, obj, field):
#         """
#         Called to handle each field on an object (except for ForeignKeys and
#         ManyToManyFields)
#         """
#         self.indent(2)
#         self.xml.startElement("field", {
#             "name" : field.name,
#             "type" : field.get_internal_type()
#         })
# 
#         # Get a "string version" of the object's data.
#         if getattr(obj, field.name) is not None:
#             self.xml.characters(field.value_to_string(obj))
#         else:
#             self.xml.addQuickElement("None")
# 
#         self.xml.endElement("field")
Example #22
0
class Serializer(base.Serializer):
    """
    Serializes a QuerySet to XML.
    """
    single_object = False
    objects_started = False
    list_elem_name = None
    ns = None

    def serialize(self, queryset, **options):
        self.single_object = options.get("single_object", False)
        return base.Serializer.serialize(self, queryset, **options)

    def indent(self, level):
        if self.options.get('indent', None) is not None:
            self.xml.ignorableWhitespace(
                '\n' + ' ' * self.options.get('indent', None) * level)

    def start_serialization(self):
        """
        Start serialization -- open the XML document and the root element.
        """
        self.xml = SimplerXMLGenerator(
            self.stream, self.options.get("encoding",
                                          settings.DEFAULT_CHARSET))
        self.xml.startDocument()

    def end_serialization(self):
        """
        End serialization -- end the document.
        """
        if self.objects_started:
            self.indent(0)
            if not self.single_object:
                elem = ""
                if self.ns:
                    elem += self.ns + ":"
                elem += self.list_elem_name
                self.xml.endElement(elem)
                self.indent(0)
        else:
            self.xml.startElement("empty", {})
            self.xml.endElement("empty")
        self.xml.endDocument()

    def start_object(self, obj):
        """
        Called as each object is handled.
        """
        if not hasattr(obj, "_meta"):
            raise base.SerializationError(
                "Non-model object (%s) encountered during serialization" %
                type(obj))

        model_name = smart_unicode(obj._meta)
        elem_name = model_name.split(".")[-1]
        if not hasattr(obj._meta, 'ns'):
            setattr(obj._meta, 'ns', "_".join(model_name.split(".")[:-1]))
        if not self.ns:
            self.ns = obj._meta.ns
        if not hasattr(obj._meta, 'ns_uri'):
            setattr(obj._meta, 'ns_uri',
                    "urn:x-ns:hotjazz:" + ".".join(model_name.split(".")[:-1]))

        xmlnstag = "xmlns:" + obj._meta.ns
        attrs = {
            "xmlns:hotjazz": "urn:x-ns:hotjazz",
            xmlnstag: obj._meta.ns_uri,
            "xmlns": obj._meta.ns_uri
        }

        if not self.objects_started:
            self.objects_started = True

            if not self.single_object:
                self.list_elem_name = elem_name + "_list"
                attrs["hotjazz:type"] = "model_list"
                self.xml.startElement(obj._meta.ns + ":" + self.list_elem_name,
                                      attrs)
                self.indent(1)
        else:
            if self.single_object:
                raise base.SerializationError(
                    "Expecting one model object but got another one (%s) during serialization"
                    % type(obj))

        obj_pk = obj._get_pk_val()
        attrs["hotjazz:type"] = "model"
        if obj_pk is not None:
            attrs["hotjazz:pk"] = smart_unicode(obj._get_pk_val())

        self.xml.startElement(obj._meta.ns + ":" + elem_name, attrs)

    def end_object(self, obj):
        """
        Called after handling all fields for an object.
        """
        if self.single_object:
            self.indent(0)
        else:
            self.indent(1)

        model_name = smart_unicode(obj._meta)
        elem_name = model_name.split(".")[-1]
        self.xml.endElement(obj._meta.ns + ":" + elem_name)

    def handle_field(self, obj, field):
        """
        Called to handle each field on an object (except for ForeignKeys and
        ManyToManyFields)
        """
        self.indent(2)

        self.xml.startElement(obj._meta.ns + ":" + field.name,
                              {"hotjazz:type": field.get_internal_type()})

        # Get a "string version" of the object's data.
        if getattr(obj, field.name) is not None:
            self.xml.characters(
                escape_xml_illegal_chars(field.value_to_string(obj)))
        else:
            pass
            #self.xml.addQuickElement("None")

        self.xml.endElement(obj._meta.ns + ":" + field.name)

    def handle_fk_field(self, obj, field):
        """
        Called to handle a ForeignKey (we need to treat them slightly
        differently from regular fields).
        """
        self._start_relational_field(obj, field, "ForeignKeyRelation")
        related = getattr(obj, field.name)
        if related is not None:
            elem_name = field.name + "_natural_ref"
            self.xml.startElement(obj._meta.ns + ":" + elem_name, {})

            if self.use_natural_keys and hasattr(related, 'natural_key'):
                # If related object has a natural key, use it
                related = related.natural_key()
                # Iterable natural keys are rolled out as subelements
                for key_value in related:
                    self.xml.startElement("hotjazz:natural_ref", {})
                    self.xml.characters(
                        escape_xml_illegal_chars(smart_unicode(key_value)))
                    self.xml.endElement("hotjazz:natural_ref")
            else:
                if field.rel.field_name == related._meta.pk.name:
                    # Related to remote object via primary key
                    related = related._get_pk_val()
                else:
                    # Related to remote object via other field
                    related = getattr(related, field.rel.field_name)
                self.xml.startElement("hotjazz:pk_ref", {})
                self.xml.characters(
                    escape_xml_illegal_chars(smart_unicode(related)))
                self.xml.endElement("hotjazz:pk_ref")

            self.xml.endElement(obj._meta.ns + ":" + elem_name)
        else:
            pass
            #self.xml.addQuickElement("None")
        self.xml.endElement(obj._meta.ns + ":" + field.name)

    def handle_m2m_field(self, obj, field):
        """
        Called to handle a ManyToManyField. Related objects are only
        serialized as references to the object's PK (i.e. the related *data*
        is not dumped, just the relation).
        """
        item_name = smart_unicode(field.rel.to._meta)
        item_elem_name = item_name.split(".")[-1]

        if field.rel.through._meta.auto_created:
            self._start_relational_field(obj, field, "ManyToManyRelation")
            if self.use_natural_keys and hasattr(field.rel.to, 'natural_key') and \
                    hasattr(field.rel.to._default_manager, 'get_by_natural_key'): # to match deserialize
                # If the objects in the m2m have a natural key, use it
                def handle_m2m(value):
                    natural = value.natural_key()
                    # Iterable natural keys are rolled out as subelements
                    self.xml.startElement(obj._meta.ns + ":" + item_elem_name,
                                          {})
                    for key_value in natural:
                        self.xml.startElement("hotjazz:natural_ref", {})
                        self.xml.characters(
                            escape_xml_illegal_chars(smart_unicode(key_value)))
                        self.xml.endElement("hotjazz:natural_ref")
                    self.xml.endElement(obj._meta.ns + ":" + item_elem_name)
            else:

                def handle_m2m(value):
                    self.xml.addQuickElement(
                        obj._meta.ns + ":" + item_elem_name,
                        attrs={
                            'hotjazz:pk_ref':
                            smart_unicode(value._get_pk_val())
                        })

            at_least_one = False
            for relobj in getattr(obj, field.name).iterator():
                at_least_one = True
                self.indent(3)
                handle_m2m(relobj)

            if at_least_one:
                self.indent(2)
            self.xml.endElement(obj._meta.ns + ":" + field.name)

    def _start_relational_field(self, obj, field, reltype):
        """
        Helper to output the <field> element for relational fields
        """
        self.indent(2)
        self.xml.startElement(obj._meta.ns + ":" + field.name, {
            "hotjazz:type": reltype + "Field",
        })
Example #23
0
class Serializer(base.Serializer):
    internal_use_only = False

    ROOT_ELEMENT = "objects"

    def get_loader(self):
        return Loader

    def serialize(self, queryset, **options):
        self.finalize = options.pop("finalize", True)
        self.indent_level = options.pop("indent", None)
        self.encoding = options.pop("encoding", settings.DEFAULT_CHARSET)
        return super(Serializer, self).serialize(queryset, **options)

    def indent(self, level):
        if self.indent_level is not None:
            self.xml.ignoreWhitespace("\n" + " " * self.indent_level * level)

    def start_object(self, obj):
        super(Serializer, self).start_object(obj)
        self._current["xml_verbose_name"] = smart_str(obj._meta.verbose_name)

    def handle_m2m_field(self, obj, field):
        super(Serializer, self).handle_m2m_field(obj, field)
        self._current[field.name].insert(0, smart_str(getattr(obj, field.name).model._meta.verbose_name))

    def serialize_reverse_fields(self, obj):
        super(Serializer, self).serialize_reverse_fields(obj)
        for fieldname in self.reverse_fields:
            related = getattr(obj, fieldname)
            if isinstance(self._current[fieldname], list):
                self._current[fieldname].insert(0, smart_str(related.model._meta.verbose_name))

    def end_serialization(self):
        super(Serializer, self).end_serialization()
        if not self.finalize:
            return
        self.xml = SimplerXMLGenerator(self.stream, self.encoding)
        self.xml.startDocument()
        self.xml.startElement(self.ROOT_ELEMENT, {})

        if not isinstance(self.objects, list):
            self.objects = [self.objects]

        for object in self.objects:
            self.indent(1)
            name = self._get_xml_name(object)
            self.xml.startElement(name, {})
            self.handle_dict(object)
            self.xml.endElement(name)

        self.indent(0)
        self.xml.endElement(self.ROOT_ELEMENT)
        self.xml.endDocument()

    def handle_dict(self, d):
        # Make sure this key is removed.
        if d.has_key("xml_verbose_name"):
            del d["xml_verbose_name"]
        for k, v in d.items():
            self.indent(2)
            if self.render_only and isinstance(v, list):
                self.handle_list(v, name=k)
            else:
                self.xml.startElement(k, {})
                if isinstance(v, list):
                    self.handle_list(v)
                elif isinstance(v, dict):
                    self.handle_dict(v)
                else:
                    self.xml.characters(smart_str(v))
                self.xml.endElement(k)

    def handle_list(self, l, name=None):
        if l and not name:
            name = smart_str(l.pop(0))
        else:
            if not name:
                name = "object"
        for object in l:
            self.xml.startElement(name, {})
            if isinstance(object, dict):
                self.handle_dict(object)
            else:
                self.xml.characters(smart_str(object))
            self.xml.endElement(name)

    def getvalue(self):
        if callable(getattr(self.stream, "getvalue", None)):
            return self.stream.getvalue()

    def _get_xml_name(self, obj):
        if isinstance(obj, dict) and obj.has_key("xml_verbose_name"):
            return obj.pop("xml_verbose_name")
        return "object"
Example #24
0
class CirkwiPOISerializer:
    def __init__(self, request, stream):
        self.xml = SimplerXMLGenerator(stream, 'utf8')
        self.request = request
        self.stream = stream

    def serialize_field(self, name, value, attrs={}):
        if not value and not attrs:
            return
        value = unicode(value)
        self.xml.startElement(name, attrs)
        if u'<' in value or u'>' in value or u'&' in value:
            self.stream.write('<![CDATA[%s]]>' % value)
        else:
            self.xml.characters(value)
        self.xml.endElement(name)

    def serialize_medias(self, request, pictures):
        if not pictures:
            return
        self.xml.startElement('medias', {})
        self.xml.startElement('images', {})
        for picture in pictures:
            self.xml.startElement('image', {})
            self.serialize_field('legende', picture['legend'])
            self.serialize_field('url', request.build_absolute_uri(picture['url']))
            self.serialize_field('credit', picture['author'])
            self.xml.endElement('image')
        self.xml.endElement('images')
        self.xml.endElement('medias')

    def serialize_pois(self, pois):
        for poi in pois:
            self.xml.startElement('poi', {
                'date_creation': timestamp(poi.date_insert),
                'date_modification': timestamp(poi.date_update),
                'id_poi': str(poi.pk),
            })
            if poi.type.cirkwi:
                self.xml.startElement('categories', {})
                self.serialize_field('categorie', str(poi.type.cirkwi.eid), {'nom': poi.type.cirkwi.name})
                self.xml.endElement('categories')
            orig_lang = translation.get_language()
            self.xml.startElement('informations', {})
            for lang in poi.published_langs:
                translation.activate(lang)
                self.xml.startElement('information', {'langue': lang})
                self.serialize_field('titre', poi.name)
                self.serialize_field('description', plain_text(poi.description))
                self.serialize_medias(self.request, poi.serializable_pictures)
                self.xml.endElement('information')
            translation.activate(orig_lang)
            self.xml.endElement('informations')
            self.xml.startElement('adresse', {})
            self.xml.startElement('position', {})
            coords = poi.geom.transform(4326, clone=True).coords
            self.serialize_field('lat', coords[1])
            self.serialize_field('lng', coords[0])
            self.xml.endElement('position')
            self.xml.endElement('adresse')
            self.xml.endElement('poi')

    def serialize(self, pois):
        self.xml.startDocument()
        self.xml.startElement('pois', {'version': '2'})
        self.serialize_pois(pois)
        self.xml.endElement('pois')
        self.xml.endDocument()
Example #25
0
    def render(self, capabilities, prettyprint=False):
        """
            parameters:
              capabilities = queryset of voresource_capabilities
              prettyprint = flag for pretty printing the xml output (including whitespace and linebreaks)
            """

        stream = StringIO()
        xml = SimplerXMLGenerator(stream, self.charset)

        xml.startDocument()

        # add a comment
        xml._write(self.comment)

        # add namespace definitions
        nsattrs = {}
        nsattrs['version'] = self.version
        #nsattrs['encoding'] = charser
        nsattrs['xmlns:vosi'] = self.ns_vosicap
        nsattrs['xmlns:xsi'] = self.ns_xsi
        nsattrs['xmlns:vs'] = self.ns_vs
        nsattrs['xmlns:vr'] = self.ns_vr

        # add root node
        xml.startElement('vosi:capabilities', nsattrs)

        # Add all the capabilities, including those for VOSI endpoint,
        # extract them from the database using the provided queryset.
        # The following lookup is not efficient, since there is a database
        # call for each object, it would be more efficient to get a list of
        # all capabilities, interfaces and accessurls and then match them here.
        for capability in capabilities:
            attrs = {}
            if capability.standardID:
                attrs['standardID'] = str(capability.standardID)
            xml.startElement('capability', attrs)

            interfaces = capability.voresource_interface_set.all()
            for interface in interfaces:
                attrs = {}
                if interface.type:
                    attrs['xsi:type'] = interface.type
                xml.startElement('interface', attrs)

                accessurls = interface.voresource_accessurl_set.all()
                for accessurl in accessurls:
                    attrs = {}
                    attrs[
                        'use'] = accessurl.use  # throw error, if its not there?
                    xml.startElement('accessURL', attrs)
                    xml.characters(smart_unicode(accessurl.url))
                    xml.endElement('accessURL')

                xml.endElement('interface')

            xml.endElement('capability')

        xml.endElement('vosi:capabilities')

        xml.endDocument()

        xml_string = stream.getvalue()

        # make the xml pretty, i.e. use linebreaks and indentation
        # the sax XMLGenerator behind SimpleXMLGenerator does not seem to support this,
        # thus need a library that can do it.
        # TODO: since we use lxml anyway, maybe build the whole xml-tree with lxml.etree!
        # NOTE: This removes any possibly existing comments from the xml output!
        if prettyprint is True:
            parsed = etree.fromstring(xml_string)
            pretty_xml = etree.tostring(parsed, pretty_print=True)
            xml_string = pretty_xml

        return xml_string
Example #26
0
class Serializer(base.Serializer):
    """Serialize a QuerySet to XML."""

    def indent(self, level):
        if self.options.get('indent') is not None:
            self.xml.ignorableWhitespace('\n' + ' ' * self.options.get('indent') * level)

    def start_serialization(self):
        """
        Start serialization -- open the XML document and the root element.
        """
        self.xml = SimplerXMLGenerator(self.stream, self.options.get("encoding", settings.DEFAULT_CHARSET))
        self.xml.startDocument()
        self.xml.startElement("django-objects", {"version": "1.0"})

    def end_serialization(self):
        """
        End serialization -- end the document.
        """
        self.indent(0)
        self.xml.endElement("django-objects")
        self.xml.endDocument()

    def start_object(self, obj):
        """
        Called as each object is handled.
        """
        if not hasattr(obj, "_meta"):
            raise base.SerializationError("Non-model object (%s) encountered during serialization" % type(obj))

        self.indent(1)
        attrs = {'model': str(obj._meta)}
        if not self.use_natural_primary_keys or not hasattr(obj, 'natural_key'):
            obj_pk = obj.pk
            if obj_pk is not None:
                attrs['pk'] = str(obj_pk)

        self.xml.startElement("object", attrs)

    def end_object(self, obj):
        """
        Called after handling all fields for an object.
        """
        self.indent(1)
        self.xml.endElement("object")

    def handle_field(self, obj, field):
        """
        Handle each field on an object (except for ForeignKeys and
        ManyToManyFields).
        """
        self.indent(2)
        self.xml.startElement('field', {
            'name': field.name,
            'type': field.get_internal_type(),
        })

        # Get a "string version" of the object's data.
        if getattr(obj, field.name) is not None:
            value = field.value_to_string(obj)
            if field.get_internal_type() == 'JSONField':
                # Dump value since JSONField.value_to_string() doesn't output
                # strings.
                value = json.dumps(value, cls=field.encoder)
            try:
                self.xml.characters(value)
            except UnserializableContentError:
                raise ValueError("%s.%s (pk:%s) contains unserializable characters" % (
                    obj.__class__.__name__, field.name, obj.pk))
        else:
            self.xml.addQuickElement("None")

        self.xml.endElement("field")

    def handle_fk_field(self, obj, field):
        """
        Handle a ForeignKey (they need to be treated slightly
        differently from regular fields).
        """
        self._start_relational_field(field)
        related_att = getattr(obj, field.get_attname())
        if related_att is not None:
            if self.use_natural_foreign_keys and hasattr(field.remote_field.model, 'natural_key'):
                related = getattr(obj, field.name)
                # If related object has a natural key, use it
                related = related.natural_key()
                # Iterable natural keys are rolled out as subelements
                for key_value in related:
                    self.xml.startElement("natural", {})
                    self.xml.characters(str(key_value))
                    self.xml.endElement("natural")
            else:
                self.xml.characters(str(related_att))
        else:
            self.xml.addQuickElement("None")
        self.xml.endElement("field")

    def handle_m2m_field(self, obj, field):
        """
        Handle a ManyToManyField. Related objects are only serialized as
        references to the object's PK (i.e. the related *data* is not dumped,
        just the relation).
        """
        if field.remote_field.through._meta.auto_created:
            self._start_relational_field(field)
            if self.use_natural_foreign_keys and hasattr(field.remote_field.model, 'natural_key'):
                # If the objects in the m2m have a natural key, use it
                def handle_m2m(value):
                    natural = value.natural_key()
                    # Iterable natural keys are rolled out as subelements
                    self.xml.startElement("object", {})
                    for key_value in natural:
                        self.xml.startElement("natural", {})
                        self.xml.characters(str(key_value))
                        self.xml.endElement("natural")
                    self.xml.endElement("object")
            else:
                def handle_m2m(value):
                    self.xml.addQuickElement("object", attrs={
                        'pk': str(value.pk)
                    })
            m2m_iter = getattr(obj, '_prefetched_objects_cache', {}).get(
                field.name,
                getattr(obj, field.name).iterator(),
            )
            for relobj in m2m_iter:
                handle_m2m(relobj)

            self.xml.endElement("field")

    def _start_relational_field(self, field):
        """Output the <field> element for relational fields."""
        self.indent(2)
        self.xml.startElement('field', {
            'name': field.name,
            'rel': field.remote_field.__class__.__name__,
            'to': str(field.remote_field.model._meta),
        })
Example #27
0
class Serializer(base.Serializer):
    """Serialize a QuerySet to XML."""

    def indent(self, level):
        if self.options.get('indent') is not None:
            self.xml.ignorableWhitespace('\n' + ' ' * self.options.get('indent') * level)

    def start_serialization(self):
        """
        Start serialization -- open the XML document and the root element.
        """
        self.xml = SimplerXMLGenerator(self.stream, self.options.get("encoding", settings.DEFAULT_CHARSET))
        self.xml.startDocument()
        self.xml.startElement("django-objects", {"version": "1.0"})

    def end_serialization(self):
        """
        End serialization -- end the document.
        """
        self.indent(0)
        self.xml.endElement("django-objects")
        self.xml.endDocument()

    def start_object(self, obj):
        """
        Called as each object is handled.
        """
        if not hasattr(obj, "_meta"):
            raise base.SerializationError("Non-model object (%s) encountered during serialization" % type(obj))

        self.indent(1)
        attrs = {'model': str(obj._meta)}
        if not self.use_natural_primary_keys or not hasattr(obj, 'natural_key'):
            obj_pk = obj.pk
            if obj_pk is not None:
                attrs['pk'] = str(obj_pk)

        self.xml.startElement("object", attrs)

    def end_object(self, obj):
        """
        Called after handling all fields for an object.
        """
        self.indent(1)
        self.xml.endElement("object")

    def handle_field(self, obj, field):
        """
        Handle each field on an object (except for ForeignKeys and
        ManyToManyFields).
        """
        self.indent(2)
        self.xml.startElement('field', {
            'name': field.name,
            'type': field.get_internal_type(),
        })

        # Get a "string version" of the object's data.
        if getattr(obj, field.name) is not None:
            try:
                self.xml.characters(field.value_to_string(obj))
            except UnserializableContentError:
                raise ValueError("%s.%s (pk:%s) contains unserializable characters" % (
                    obj.__class__.__name__, field.name, obj.pk))
        else:
            self.xml.addQuickElement("None")

        self.xml.endElement("field")

    def handle_fk_field(self, obj, field):
        """
Example #28
0
class Serializer(base.Serializer):
    """
    Serializes a QuerySet to XML.
    """

    def indent(self, level):
        if self.options.get('indent', None) is not None:
            self.xml.ignorableWhitespace('\n' + ' ' * self.options.get('indent', None) * level)

    def start_serialization(self):
        """
        Start serialization -- open the XML document and the root element.
        """
        self.xml = SimplerXMLGenerator(self.stream, self.options.get("encoding", settings.DEFAULT_CHARSET))
        self.xml.startDocument()
        self.xml.startElement("django-objects", {"version": "1.0"})

    def end_serialization(self):
        """
        End serialization -- end the document.
        """
        self.indent(0)
        self.xml.endElement("django-objects")
        self.xml.endDocument()

    def start_object(self, obj):
        """
        Called as each object is handled.
        """
        if not hasattr(obj, "_meta"):
            raise base.SerializationError("Non-model object (%s) encountered during serialization" % type(obj))

        self.indent(1)
        attrs = {"model": smart_text(obj._meta)}
        if not self.use_natural_primary_keys or not hasattr(obj, 'natural_key'):
            obj_pk = obj._get_pk_val()
            if obj_pk is not None:
                attrs['pk'] = smart_text(obj_pk)

        self.xml.startElement("object", attrs)

    def end_object(self, obj):
        """
        Called after handling all fields for an object.
        """
        self.indent(1)
        self.xml.endElement("object")

    def handle_field(self, obj, field):
        """
        Called to handle each field on an object (except for ForeignKeys and
        ManyToManyFields)
        """
        self.indent(2)
        self.xml.startElement("field", {
            "name": field.name,
            "type": field.get_internal_type()
        })

        # Get a "string version" of the object's data.
        if getattr(obj, field.name) is not None:
            self.xml.characters(field.value_to_string(obj))
        else:
            self.xml.addQuickElement("None")

        self.xml.endElement("field")

    def handle_fk_field(self, obj, field):
        """
        Called to handle a ForeignKey (we need to treat them slightly
        differently from regular fields).
        """
        self._start_relational_field(field)
        related_att = getattr(obj, field.get_attname())
        if related_att is not None:
            if self.use_natural_foreign_keys and hasattr(field.rel.to, 'natural_key'):
                related = getattr(obj, field.name)
                # If related object has a natural key, use it
                related = related.natural_key()
                # Iterable natural keys are rolled out as subelements
                for key_value in related:
                    self.xml.startElement("natural", {})
                    self.xml.characters(smart_text(key_value))
                    self.xml.endElement("natural")
            else:
                self.xml.characters(smart_text(related_att))
        else:
            self.xml.addQuickElement("None")
        self.xml.endElement("field")

    def handle_m2m_field(self, obj, field):
        """
        Called to handle a ManyToManyField. Related objects are only
        serialized as references to the object's PK (i.e. the related *data*
        is not dumped, just the relation).
        """
        if field.rel.through._meta.auto_created:
            self._start_relational_field(field)
            if self.use_natural_foreign_keys and hasattr(field.rel.to, 'natural_key'):
                # If the objects in the m2m have a natural key, use it
                def handle_m2m(value):
                    natural = value.natural_key()
                    # Iterable natural keys are rolled out as subelements
                    self.xml.startElement("object", {})
                    for key_value in natural:
                        self.xml.startElement("natural", {})
                        self.xml.characters(smart_text(key_value))
                        self.xml.endElement("natural")
                    self.xml.endElement("object")
            else:
                def handle_m2m(value):
                    self.xml.addQuickElement("object", attrs={
                        'pk': smart_text(value._get_pk_val())
                    })
            for relobj in getattr(obj, field.name).iterator():
                handle_m2m(relobj)

            self.xml.endElement("field")

    def _start_relational_field(self, field):
        """
        Helper to output the <field> element for relational fields
        """
        self.indent(2)
        self.xml.startElement("field", {
            "name": field.name,
            "rel": field.rel.__class__.__name__,
            "to": smart_text(field.rel.to._meta),
        })
Example #29
0
 def characters(self, contents):
     try:
         cdata = '<![CDATA[{}]]>'.format(contents) # noqa
         self.ignorableWhitespace(contents)
     except ValueError:
         SimplerXMLGenerator.characters(self, contents[start:]) # noqa