Пример #1
0
 def effective_default(self, field):
     """
     Returns a field's effective database default value
     """
     if field.has_default():
         default = field.get_default()
     elif not field.null and field.blank and field.empty_strings_allowed:
         if field.get_internal_type() == "BinaryField":
             default = six.binary_type()
         else:
             default = six.text_type()
     elif getattr(field, 'auto_now', False) or getattr(
             field, 'auto_now_add', False):
         default = datetime.now()
         internal_type = field.get_internal_type()
         if internal_type == 'DateField':
             default = default.date
         elif internal_type == 'TimeField':
             default = default.time
         elif internal_type == 'DateTimeField':
             default = timezone.now
     else:
         default = None
     # If it's a callable, call it
     if callable(default):
         default = default()
     # Run it through the field's get_db_prep_save method so we can send it
     # to the database.
     default = field.get_db_prep_save(default, self.connection)
     return default
Пример #2
0
 def default(self, o):
     # See "Date Time String Format" in the ECMA-262 specification.
     if isinstance(o, datetime.datetime):
         r = o.isoformat()
         if o.microsecond:
             r = r[:23] + r[26:]
         if r.endswith('+00:00'):
             r = r[:-6] + 'Z'
         return r
     elif isinstance(o, datetime.date):
         return o.isoformat()
     elif isinstance(o, datetime.time):
         if is_aware(o):
             raise ValueError("JSON can't represent timezone-aware times.")
         r = o.isoformat()
         if o.microsecond:
             r = r[:12]
         return r
     elif isinstance(o, decimal.Decimal):
         return str(o)
     elif isinstance(o, uuid.UUID):
         return str(o)
     elif isinstance(o, Promise):
         return six.text_type(o)
     else:
         return super(DjangoJSONEncoder, self).default(o)
Пример #3
0
 def get_prep_value(self, value):
     "Returns field's value prepared for saving into a database."
     value = super(FileField, self).get_prep_value(value)
     # Need to convert File objects provided via a form to unicode for database insertion
     if value is None:
         return None
     return six.text_type(value)
Пример #4
0
    def last_executed_query(self, cursor, sql, params):
        """
        Returns a string of the query last executed by the given cursor, with
        placeholders replaced with actual values.

        `sql` is the raw query containing placeholders, and `params` is the
        sequence of parameters. These are used by default, but this method
        exists for database backends to provide a better implementation
        according to their own quoting schemes.
        """

        # Convert params to contain Unicode values.
        def to_unicode(s):
            return force_text(s, strings_only=True, errors='replace')

        if isinstance(params, (list, tuple)):
            u_params = tuple(to_unicode(val) for val in params)
        elif params is None:
            u_params = ()
        else:
            u_params = {
                to_unicode(k): to_unicode(v)
                for k, v in params.items()
            }

        return six.text_type("QUERY = %r - PARAMS = %r") % (sql, u_params)
Пример #5
0
 def quote_value(self, value):
     # The backend "mostly works" without this function and there are use
     # cases for compiling Python without the sqlite3 libraries (e.g.
     # security hardening).
     try:
         import sqlite3
         value = sqlite3.adapt(value)
     except ImportError:
         pass
     except sqlite3.ProgrammingError:
         pass
     # Manual emulation of SQLite parameter quoting
     if isinstance(value, type(True)):
         return str(int(value))
     elif isinstance(value, (Decimal, float)):
         return str(value)
     elif isinstance(value, six.integer_types):
         return str(value)
     elif isinstance(value, six.string_types):
         return "'%s'" % six.text_type(value).replace("\'", "\'\'")
     elif value is None:
         return "NULL"
     elif isinstance(value, (bytes, bytearray, six.memoryview)):
         # Bytes are only allowed for BLOB fields, encoded as string
         # literals containing hexadecimal data and preceded by a single "X"
         # character:
         # value = b'\x01\x02' => value_hex = b'0102' => return X'0102'
         value = bytes(value)
         hex_encoder = codecs.getencoder('hex_codec')
         value_hex, _length = hex_encoder(value)
         # Use 'ascii' encoding for b'01' => '01', no need to use force_text here.
         return "X'%s'" % value_hex.decode('ascii')
     else:
         raise ValueError("Cannot quote parameter value %r of type %s" %
                          (value, type(value)))
Пример #6
0
 def adapt_datetimefield_value(self, value):
     """
     Transforms a datetime value to an object compatible with what is expected
     by the backend driver for datetime columns.
     """
     if value is None:
         return None
     return six.text_type(value)
Пример #7
0
    def adapt_timefield_value(self, value):
        if value is None:
            return None

        # SQLite doesn't support tz-aware datetimes
        if timezone.is_aware(value):
            raise ValueError("SQLite backend does not support timezone-aware times.")

        return six.text_type(value)
Пример #8
0
 def adapt_timefield_value(self, value):
     """
     Transforms a time value to an object compatible with what is expected
     by the backend driver for time columns.
     """
     if value is None:
         return None
     if timezone.is_aware(value):
         raise ValueError("Django does not support timezone-aware times.")
     return six.text_type(value)
Пример #9
0
    def adapt_datetimefield_value(self, value):
        if value is None:
            return None

        # SQLite doesn't support tz-aware datetimes
        if timezone.is_aware(value):
            if settings.USE_TZ:
                value = timezone.make_naive(value, self.connection.timezone)
            else:
                raise ValueError("SQLite backend does not support timezone-aware datetimes when USE_TZ is False.")

        return six.text_type(value)
Пример #10
0
 def quote_value(self, value):
     if isinstance(value,
                   (datetime.date, datetime.time, datetime.datetime)):
         return "'%s'" % value
     elif isinstance(value, six.string_types):
         return "'%s'" % six.text_type(value).replace("\'", "\'\'")
     elif isinstance(value, six.buffer_types):
         return "'%s'" % force_text(binascii.hexlify(value))
     elif isinstance(value, bool):
         return "1" if value else "0"
     else:
         return str(value)
Пример #11
0
    def adapt_datetimefield_value(self, value):
        if value is None:
            return None

        # MySQL doesn't support tz-aware datetimes
        if timezone.is_aware(value):
            if settings.USE_TZ:
                value = timezone.make_naive(value, self.connection.timezone)
            else:
                raise ValueError(
                    "MySQL backend does not support timezone-aware datetimes when USE_TZ is False."
                )

        if not self.connection.features.supports_microsecond_precision:
            value = value.replace(microsecond=0)

        return six.text_type(value)
Пример #12
0
    def T(self):
        """
        Time zone of this machine; e.g. 'EST' or 'MDT'.

        If timezone information is not available, this method returns
        an empty string.
        """
        if not self.timezone:
            return ""

        name = None
        try:
            name = self.timezone.tzname(self.data)
        except Exception:
            # pytz raises AmbiguousTimeError during the autumn DST change.
            # This happens mainly when __init__ receives a naive datetime
            # and sets self.timezone = get_default_timezone().
            pass
        if name is None:
            name = self.format('O')
        return six.text_type(name)
Пример #13
0
 def y(self):
     "Year, 2 digits; e.g. '99'"
     return six.text_type(self.data.year)[2:]