コード例 #1
0
def put_sqltype_decimal(buf_view, no_null_value, param_values, desc,
                        param_count, short_length):
    scale = desc.scale
    max_len = desc.max_len
    if not isinstance(param_values, (int, str, Decimal)):
        raise errors.DataError(
            "invalid_parameter_value, data should be either int or str or decimal for column: {0}"
            .format(param_count))

    try:
        param_values = Decimal(param_values)
    except:
        raise errors.DataError("decimal.ConversionSyntax")
    if scale > 0:
        param_values = param_values.fma(10**scale, 0)

    sign = 1 if param_values.is_signed() else 0
    param_values = param_values.__abs__()
    param_values = param_values.to_integral_exact(
        rounding='ROUND_DOWN').to_eng_string()

    num_zeros = max_len - len(param_values)
    if num_zeros < 0:
        raise errors.DataError(
            "data_truncation_exceed {0}".format(param_count))

    padding = bytes('0'.encode() * num_zeros)
    _ = Convert.put_bytes(padding, buf_view[no_null_value:], nolen=True)

    if sign:
        _ = Convert.put_bytes(param_values.encode(),
                              buf_view[no_null_value + num_zeros:],
                              nolen=True,
                              is_data=True)

        # byte -80 : 0xFFFFFFB0
        num, _ = Convert.get_bytes(buf_view[no_null_value:], length=1)

        _ = Convert.put_bytes(bytes([int(num) | 0xB0]),
                              buf_view[no_null_value:],
                              nolen=True,
                              is_data=True)
        # _ = Convert.put_bytes(num | 0xB0, buf_view[no_null_value:], nolen=True, is_data=True)
    else:
        _ = Convert.put_bytes(param_values.encode(),
                              buf_view[no_null_value + num_zeros:],
                              nolen=True,
                              is_data=True)

    return buf_view
コード例 #2
0
    def __init__(self, data, output_name='sensor_data', headers=None,
                 force_csv=False, encoding='utf8'):

        # Make sure we've got the right type of data to work with
        valid_data = False
        #if isinstance(data, ValuesQuerySet):
        #    data = list(data)
        #if isinstance(data, QuerySet):
        #    data = list(data.values())
        if hasattr(data, '__getitem__'):
            if isinstance(data[0], dict):
                if headers is None:
                    headers = data[0].keys()
                data = [[row[col] for col in headers] for row in data]
                data.insert(0, headers)
            if hasattr(data[0], '__getitem__'):
                valid_data = True
        assert valid_data is True, "ExcelResponse requires a sequence of sequences"

        import StringIO
        output = StringIO.StringIO()
        # Excel has a limit on number of rows; if we have more than that, make a csv
        use_xls = False
        if len(data) <= 65536 and force_csv is not True:
            try:
                import xlwt
            except ImportError:
                # xlwt doesn't exist; fall back to csv
                pass
            else:
                use_xls = True
        if use_xls:
            book = xlwt.Workbook(encoding=encoding)
            sheet = book.add_sheet('Sheet 1')
            styles = {'datetime': xlwt.easyxf(num_format_str='yyyy-mm-dd hh:mm:ss'),
                      'date': xlwt.easyxf(num_format_str='yyyy-mm-dd'),
                      'time': xlwt.easyxf(num_format_str='hh:mm:ss'),
                      'default': xlwt.Style.default_style}

            for rowx, row in enumerate(data):
                for colx, value in enumerate(row):
                    if isinstance(value, datetime.datetime):
                        cell_style = styles['datetime']
                    elif isinstance(value, datetime.date):
                        cell_style = styles['date']
                    elif isinstance(value, datetime.time):
                        cell_style = styles['time']
                    else:
                        # turning non dates, datetimes and times to decimal
                        try:
                            value = Decimal(value)
                        except:
                            pass
                        cell_style = styles['default']
                    sheet.write(rowx, colx, value, style=cell_style)
            book.save(output)
            content_type = 'application/vnd.ms-excel'
            file_ext = 'xls'
        else:
            for row in data:
                out_row = []
                for value in row:
                    if not isinstance(value, basestring):
                        value = unicode(value)
                    value = value.encode(encoding)
                    out_row.append(value.replace('"', '""'))
                output.write('"%s"\n' %
                             '","'.join(out_row))
            content_type = 'text/csv'
            file_ext = 'csv'
        output.seek(0)
        super(ExcelResponse, self).__init__(content=output.getvalue(),
                                            content_type=content_type)
        self['Content-Disposition'] = 'attachment;filename="%s.%s"' % \
            (output_name.replace('"', '\"'), file_ext)
コード例 #3
0
	def clean(self,value):
		if self.value != None: 
			"""
			Value was explicitly set for this field importer.Field('x',value='FOO') 
			"""
			return self.value
	
		if self.map:
			"""
			Map was given, a la importer.Field('x',map={'0': False,'1': True}) 
			"""
			if str(value) in self.map:
				value = self.map[str(value)]

		if hasattr(self,'custom_clean_function'):
			"""
			Route through custom function like imporer.Field('x',custom_function=clean_dates)
			"""
			value = self.custom_clean_function(value)

		if isinstance(self.master,ForeignKey) or isinstance(self.master,OneToOneField):
			"""
			Some core prep work for FKs. Use the variant already provided by user.
			"""
			try:
				return self._get_variants_for_model(self.master.rel.to)[value]
			except KeyError:
				pass
				
		elif isinstance(self.master,DecimalField):
			"""
			Respect max_value if field was decimal. TODO: Expand to INT
			"""
			if value != None:
				value = Decimal('%s' % value)
				if self.max_value and self.max_value < value:
					return self.max_value

		elif isinstance(self.master,CharField) or isinstance(self.master,TextField):
			"""
			Do some quick and dirty char encoding to make sure source data wasn't junky
			"""
			if value:
				try:
					value = value.encode('ascii','ignore')
				except:
					return value

				if self.prompt:
					prompted_value = False
					while prompted_value == False:
						raw_value = raw_input("Prompting for %s ('%s'):" % \
								(self.master_field_name,value)).rstrip()
						if raw_value == '':
							prompted_value = None

						else:
							prompted_value = raw_value

					return prompted_value

				if getattr(self.master,'max_length',False) and len(value) > self.master.max_length:
					return '%s' % value[:self.master.max_length]

		if value is None:
			return self.if_null

		return value