You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

62 lines
1.6 KiB

from django.db.models.base import ModelBase
from django.db import connection
from django.db import models
from django.db.models.fields.files import ImageFieldFile
class SafeImageFieldFile(ImageFieldFile):
@property
def width(self):
try:
return self.width
except:
return None
@property
def height(self):
try:
return self.height
except:
return None
class SafeImageField(models.ImageField):
attr_class = SafeImageFieldFile
class ModelFieldsNames(object):
def __init__(self, model):
self.alias = None
self._meta = model._meta
def __getattr__(self, name):
alias = '__as__'
if name.startswith(alias):
self.alias = name[len(alias):]
return '%s as %s' % (self._meta.db_table, self.alias)
field = self._meta.get_field(name).get_attname_column()[1]
if self.alias:
return u"%s.%s" % (self.alias, field)
else:
return u"%s.%s" % (self._meta.db_table, field)
def __str__(self):
return '%s' % self._meta.db_table
def format_sql(sql, **kwargs):
for name, value in kwargs.items():
if issubclass(type(value), ModelBase):
kwargs[name] = ModelFieldsNames(value)
elif isinstance(value, (tuple, list)):
kwargs[name] = ','.join(map(lambda x: repr(x) if isinstance(x, str) else str(x), value))
elif not isinstance(value, str):
kwargs[name] = value
return sql.format(**kwargs)
def execute_sql(sql, args=()):
cursor = connection.cursor()
cursor.execute(sql, args)
return cursor.fetchall()