Пример #1
0
 def end_object(self, obj):
     self.objects.append({
         "model"  : smart_unicode(obj._meta),
         "pk"     : smart_unicode(obj._get_pk_val(), strings_only=True),
         "fields" : self._current
     })
     self._current = None
Пример #2
0
 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 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("natural", {})
                 self.xml.characters(smart_unicode(key_value))
                 self.xml.endElement("natural")
         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.characters(smart_unicode(related))
     else:
         self.xml.addQuickElement("None")
     self.xml.endElement("field")
Пример #3
0
 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 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("natural", {})
                 self.xml.characters(smart_unicode(key_value))
                 self.xml.endElement("natural")
         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.characters(smart_unicode(related))
     else:
         self.xml.addQuickElement("None")
     self.xml.endElement("field")
Пример #4
0
def Deserializer(object_list, **options):
    """
    Deserialize simple Python objects back into Django ORM instances.

    It's expected that you pass the Python objects themselves (instead of a
    stream or a string) to the constructor
    """
    db = options.pop('using', DEFAULT_DB_ALIAS)
    models.get_apps()
    for d in object_list:
        # Look up the model and starting build a dict of data for it.
        Model = _get_model(d["model"])
        data = {Model._meta.pk.attname : Model._meta.pk.to_python(d["pk"])}
        m2m_data = {}

        # Handle each field
        for (field_name, field_value) in d["fields"].items():
            if isinstance(field_value, str):
                field_value = smart_unicode(field_value, options.get("encoding", settings.DEFAULT_CHARSET), strings_only=True)

            field = Model._meta.get_field(field_name)

            # Handle M2M relations
            if field.rel and isinstance(field.rel, models.ManyToManyRel):
                if hasattr(field.rel.to._default_manager, 'get_by_natural_key'):
                    def m2m_convert(value):
                        if hasattr(value, '__iter__'):
                            return field.rel.to._default_manager.db_manager(db).get_by_natural_key(*value).pk
                        else:
                            return smart_unicode(field.rel.to._meta.pk.to_python(value))
                else:
                    m2m_convert = lambda v: smart_unicode(field.rel.to._meta.pk.to_python(v))
                m2m_data[field.name] = [m2m_convert(pk) for pk in field_value]

            # Handle FK fields
            elif field.rel and isinstance(field.rel, models.ManyToOneRel):
                if field_value is not None:
                    if hasattr(field.rel.to._default_manager, 'get_by_natural_key'):
                        if hasattr(field_value, '__iter__'):
                            obj = field.rel.to._default_manager.db_manager(db).get_by_natural_key(*field_value)
                            value = getattr(obj, field.rel.field_name)
                            # If this is a natural foreign key to an object that
                            # has a FK/O2O as the foreign key, use the FK value
                            if field.rel.to._meta.pk.rel:
                                value = value.pk
                        else:
                            value = field.rel.to._meta.get_field(field.rel.field_name).to_python(field_value)
                        data[field.attname] = value
                    else:
                        data[field.attname] = field.rel.to._meta.get_field(field.rel.field_name).to_python(field_value)
                else:
                    data[field.attname] = None

            # Handle all other fields
            else:
                data[field.name] = field.to_python(field_value)

        yield base.DeserializedObject(Model(**data), m2m_data)
Пример #5
0
 def end_object(self, obj):
     self.objects.append({
         "model":
         smart_unicode(obj._meta),
         "pk":
         smart_unicode(obj._get_pk_val(), strings_only=True),
         "fields":
         self._current
     })
     self._current = None
Пример #6
0
    def __call__(self, value):
        try:
            super(URLValidator, self).__call__(value)
        except ValidationError as e:
            # Trivial case failed. Try for possible IDN domain
            if value:
                value = smart_unicode(value)
                scheme, netloc, path, query, fragment = six.moves.urllib.parse.urlsplit(value)
                try:
                    netloc = netloc.encode('idna') # IDN -> ACE
                except UnicodeError: # invalid domain part
                    raise e
                url = six.moves.urllib.parse.urlunsplit((scheme, netloc, path, query, fragment))
                super(URLValidator, self).__call__(url)
            else:
                raise
        else:
            url = value

        if self.verify_exists:
            import six.moves.urllib.request, six.moves.urllib.error, six.moves.urllib.parse
            headers = {
                "Accept": "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5",
                "Accept-Language": "en-us,en;q=0.5",
                "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7",
                "Connection": "close",
                "User-Agent": self.user_agent,
            }
            try:
                req = six.moves.urllib.request.Request(url, None, headers)
                u = six.moves.urllib.request.urlopen(req)
            except ValueError:
                raise ValidationError(_('Enter a valid URL.'), code='invalid')
            except: # urllib2.URLError, httplib.InvalidURL, etc.
                raise ValidationError(_('This URL appears to be a broken link.'), code='invalid_link')
Пример #7
0
    def __call__(self, value):
        try:
            super(URLValidator, self).__call__(value)
        except ValidationError as e:
            # Trivial case failed. Try for possible IDN domain
            if value:
                value = smart_unicode(value)
                scheme, netloc, path, query, fragment = urllib.parse.urlsplit(value)
                try:
                    netloc = netloc.encode('idna') # IDN -> ACE
                except UnicodeError: # invalid domain part
                    raise e
                url = urllib.parse.urlunsplit((scheme, netloc, path, query, fragment))
                super(URLValidator, self).__call__(url)
            else:
                raise
        else:
            url = value

        if self.verify_exists:
            import urllib.request, urllib.error, urllib.parse
            headers = {
                "Accept": "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5",
                "Accept-Language": "en-us,en;q=0.5",
                "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7",
                "Connection": "close",
                "User-Agent": self.user_agent,
            }
            try:
                req = urllib.request.Request(url, None, headers)
                u = urllib.request.urlopen(req)
            except ValueError:
                raise ValidationError(_('Enter a valid URL.'), code='invalid')
            except: # urllib2.URLError, httplib.InvalidURL, etc.
                raise ValidationError(_('This URL appears to be a broken link.'), code='invalid_link')
Пример #8
0
 def m2m_convert(value):
     if hasattr(value, '__iter__'):
         return field.rel.to._default_manager.db_manager(
             db).get_by_natural_key(*value).pk
     else:
         return smart_unicode(
             field.rel.to._meta.pk.to_python(value))
Пример #9
0
 def handle_m2m_field(self, obj, field):
     if field.rel.through._meta.auto_created:
         if self.use_natural_keys and hasattr(field.rel.to, 'natural_key'):
             m2m_value = lambda value: value.natural_key()
         else:
             m2m_value = lambda value: smart_unicode(value._get_pk_val(), strings_only=True)
         self._current[field.name] = [m2m_value(related)
                            for related in getattr(obj, field.name).iterator()]
Пример #10
0
 def __init__(self, template_string, origin=None, name='<Unknown Template>'):
     try:
         template_string = smart_unicode(template_string)
     except UnicodeDecodeError:
         raise TemplateEncodingError("Templates can only be constructed from unicode or UTF-8 strings.")
     if settings.TEMPLATE_DEBUG and origin is None:
         origin = StringOrigin(template_string)
     self.nodelist = compile_string(template_string, origin)
     self.name = name
Пример #11
0
 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")
Пример #12
0
 def __init__(self, template_string, origin=None, name='<Unknown Template>'):
     try:
         template_string = smart_unicode(template_string)
     except UnicodeDecodeError:
         raise TemplateEncodingError("Templates can only be constructed from unicode or UTF-8 strings.")
     if settings.TEMPLATE_DEBUG and origin is None:
         origin = StringOrigin(template_string)
     self.nodelist = compile_string(template_string, origin)
     self.name = name
Пример #13
0
    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)
Пример #14
0
 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")
Пример #15
0
 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),
     })
Пример #16
0
 def handle_m2m_field(self, obj, field):
     if field.rel.through._meta.auto_created:
         if self.use_natural_keys and hasattr(field.rel.to, 'natural_key'):
             m2m_value = lambda value: value.natural_key()
         else:
             m2m_value = lambda value: smart_unicode(value._get_pk_val(),
                                                     strings_only=True)
         self._current[field.name] = [
             m2m_value(related)
             for related in getattr(obj, field.name).iterator()
         ]
Пример #17
0
 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),
         })
Пример #18
0
    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)
Пример #19
0
 def handle_fk_field(self, obj, field):
     related = getattr(obj, field.name)
     if related is not None:
         if self.use_natural_keys and hasattr(related, 'natural_key'):
             related = related.natural_key()
         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 = smart_unicode(getattr(related, field.rel.field_name), strings_only=True)
     self._current[field.name] = related
Пример #20
0
 def handle_fk_field(self, obj, field):
     related = getattr(obj, field.name)
     if related is not None:
         if self.use_natural_keys and hasattr(related, 'natural_key'):
             related = related.natural_key()
         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 = smart_unicode(getattr(related,
                                                 field.rel.field_name),
                                         strings_only=True)
     self._current[field.name] = related
Пример #21
0
 def __call__(self, value):
     try:
         super(URLValidator, self).__call__(value)
     except ValidationError, e:
         # Trivial case failed. Try for possible IDN domain
         if value:
             value = smart_unicode(value)
             scheme, netloc, path, query, fragment = urlparse.urlsplit(value)
             try:
                 netloc = netloc.encode('idna') # IDN -> ACE
             except UnicodeError: # invalid domain part
                 raise e
             url = urlparse.urlunsplit((scheme, netloc, path, query, fragment))
             super(URLValidator, self).__call__(url)
         else:
             raise
Пример #22
0
 def tzname(self, dt):
     try:
         return smart_unicode(time.tzname[self._isdst(dt)],
                              DEFAULT_LOCALE_ENCODING)
     except UnicodeDecodeError:
         return None
Пример #23
0
 def handle_m2m(value):
     self.xml.addQuickElement("object", attrs={
         'pk' : smart_unicode(value._get_pk_val())
     })
Пример #24
0
 def tzname(self, dt):
     try:
         return smart_unicode(time.tzname[self._isdst(dt)],
                              DEFAULT_LOCALE_ENCODING)
     except UnicodeDecodeError:
         return None
Пример #25
0
 def render(self, context):
     for var in self.vars:
         value = var.resolve(context, True)
         if value:
             return smart_unicode(value)
     return u''
Пример #26
0
 def render(self, context):
     for var in self.vars:
         value = var.resolve(context, True)
         if value:
             return smart_unicode(value)
     return ''
Пример #27
0
 def __unicode__(self):
     return smart_unicode(self.name or u'')
Пример #28
0
def Deserializer(object_list, **options):
    """
    Deserialize simple Python objects back into Django ORM instances.

    It's expected that you pass the Python objects themselves (instead of a
    stream or a string) to the constructor
    """
    db = options.pop('using', DEFAULT_DB_ALIAS)
    models.get_apps()
    for d in object_list:
        # Look up the model and starting build a dict of data for it.
        Model = _get_model(d["model"])
        data = {Model._meta.pk.attname: Model._meta.pk.to_python(d["pk"])}
        m2m_data = {}

        # Handle each field
        for (field_name, field_value) in d["fields"].items():
            if isinstance(field_value, str):
                field_value = smart_unicode(field_value,
                                            options.get(
                                                "encoding",
                                                settings.DEFAULT_CHARSET),
                                            strings_only=True)

            field = Model._meta.get_field(field_name)

            # Handle M2M relations
            if field.rel and isinstance(field.rel, models.ManyToManyRel):
                if hasattr(field.rel.to._default_manager,
                           'get_by_natural_key'):

                    def m2m_convert(value):
                        if hasattr(value, '__iter__'):
                            return field.rel.to._default_manager.db_manager(
                                db).get_by_natural_key(*value).pk
                        else:
                            return smart_unicode(
                                field.rel.to._meta.pk.to_python(value))
                else:
                    m2m_convert = lambda v: smart_unicode(
                        field.rel.to._meta.pk.to_python(v))
                m2m_data[field.name] = [m2m_convert(pk) for pk in field_value]

            # Handle FK fields
            elif field.rel and isinstance(field.rel, models.ManyToOneRel):
                if field_value is not None:
                    if hasattr(field.rel.to._default_manager,
                               'get_by_natural_key'):
                        if hasattr(field_value, '__iter__'):
                            obj = field.rel.to._default_manager.db_manager(
                                db).get_by_natural_key(*field_value)
                            value = getattr(obj, field.rel.field_name)
                            # If this is a natural foreign key to an object that
                            # has a FK/O2O as the foreign key, use the FK value
                            if field.rel.to._meta.pk.rel:
                                value = value.pk
                        else:
                            value = field.rel.to._meta.get_field(
                                field.rel.field_name).to_python(field_value)
                        data[field.attname] = value
                    else:
                        data[field.attname] = field.rel.to._meta.get_field(
                            field.rel.field_name).to_python(field_value)
                else:
                    data[field.attname] = None

            # Handle all other fields
            else:
                data[field.name] = field.to_python(field_value)

        yield base.DeserializedObject(Model(**data), m2m_data)
Пример #29
0
 def __call__(self, value):
     """
     Validates that the input matches the regular expression.
     """
     if not self.regex.search(smart_unicode(value)):
         raise ValidationError(self.message, code=self.code)
Пример #30
0
 def get_string_value(self, obj, field):
     """
     Convert a field's value to a string.
     """
     return smart_unicode(field.value_to_string(obj))
Пример #31
0
 def get_string_value(self, obj, field):
     """
     Convert a field's value to a string.
     """
     return smart_unicode(field.value_to_string(obj))
Пример #32
0
 def handle_m2m(value):
     self.xml.addQuickElement(
         "object",
         attrs={'pk': smart_unicode(value._get_pk_val())})
Пример #33
0
 def m2m_convert(value):
     if hasattr(value, '__iter__'):
         return field.rel.to._default_manager.db_manager(db).get_by_natural_key(*value).pk
     else:
         return smart_unicode(field.rel.to._meta.pk.to_python(value))
Пример #34
0
 def __call__(self, value):
     """
     Validates that the input matches the regular expression.
     """
     if not self.regex.search(smart_unicode(value)):
         raise ValidationError(self.message, code=self.code)
Пример #35
0
 def __unicode__(self):
     return smart_unicode(self.name or u'')