Commit f8a100b8dcb9d27e7ed63f37c1a496df6e723302
1 parent
b702b81911
Exists in
master
Undid the last change. It was converting the list to a python-readable format so it wasn't wrong.
Showing 1 changed file with 1 additions and 1 deletions Inline Diff
flashcards/fields.py
View file @
f8a100b
from django.db import models | 1 | 1 | from django.db import models | |
from validators import FlashcardMask, OverlapIntervalException | 2 | 2 | from validators import FlashcardMask, OverlapIntervalException | |
3 | 3 | |||
4 | 4 | |||
class MaskField(models.Field): | 5 | 5 | class MaskField(models.Field): | |
def __init__(self, blank_sep=',', range_sep='-', *args, **kwargs): | 6 | 6 | def __init__(self, blank_sep=',', range_sep='-', *args, **kwargs): | |
self.blank_sep = blank_sep | 7 | 7 | self.blank_sep = blank_sep | |
self.range_sep = range_sep | 8 | 8 | self.range_sep = range_sep | |
super(MaskField, self).__init__(*args, **kwargs) | 9 | 9 | super(MaskField, self).__init__(*args, **kwargs) | |
10 | 10 | |||
@staticmethod | 11 | 11 | @staticmethod | |
def _using_array(connection): | 12 | 12 | def _using_array(connection): | |
return connection.settings_dict['ENGINE'] == 'django.db.backends.postgresql_psycopg2' | 13 | 13 | return connection.settings_dict['ENGINE'] == 'django.db.backends.postgresql_psycopg2' | |
14 | 14 | |||
def deconstruct(self): | 15 | 15 | def deconstruct(self): | |
name, path, args, kwargs = super(MaskField, self).deconstruct() | 16 | 16 | name, path, args, kwargs = super(MaskField, self).deconstruct() | |
kwargs['blank_sep'] = self.blank_sep | 17 | 17 | kwargs['blank_sep'] = self.blank_sep | |
kwargs['range_sep'] = self.range_sep | 18 | 18 | kwargs['range_sep'] = self.range_sep | |
return name, path, args, kwargs | 19 | 19 | return name, path, args, kwargs | |
20 | 20 | |||
def db_type(self, connection): | 21 | 21 | def db_type(self, connection): | |
return 'integer[2][]' if self._using_array(connection) else 'varchar' | 22 | 22 | return 'integer[2][]' if self._using_array(connection) else 'varchar' | |
23 | 23 | |||
def from_db_value(self, value, expression, connection, context): | 24 | 24 | def from_db_value(self, value, expression, connection, context): | |
if value is None: | 25 | 25 | if value is None: | |
return value | 26 | 26 | return value | |
if self._using_array(connection): | 27 | 27 | if self._using_array(connection): | |
return MaskField._psql_parse_mask(value) | 28 | 28 | return MaskField._psql_parse_mask(value) | |
return MaskField._varchar_parse_mask(value) | 29 | 29 | return MaskField._varchar_parse_mask(value) | |
30 | 30 | |||
def get_db_prep_value(self, value, connection, prepared=False): | 31 | 31 | def get_db_prep_value(self, value, connection, prepared=False): | |
if not prepared: | 32 | 32 | if not prepared: | |
value = self.get_prep_value(value) | 33 | 33 | value = self.get_prep_value(value) | |
if value is None: | 34 | 34 | if value is None: | |
return value | 35 | 35 | return value | |
if self._using_array(connection): | 36 | 36 | if self._using_array(connection): | |
return value | 37 | 37 | return value | |
return ','.join(['-'.join(map(str, i)) for i in value]) | 38 | 38 | return ','.join(['-'.join(map(str, i)) for i in value]) | |
39 | 39 | |||
def to_python(self, value): | 40 | 40 | def to_python(self, value): | |
if value is None: | 41 | 41 | if value is None: | |
return value | 42 | 42 | return value | |
return sorted(map(list, FlashcardMask(value))) | 43 | 43 | return sorted(list(FlashcardMask(value))) | |
44 | 44 | |||
def get_prep_value(self, value): | 45 | 45 | def get_prep_value(self, value): | |
if value is None: | 46 | 46 | if value is None: | |
return value | 47 | 47 | return value | |
return sorted(map(list, FlashcardMask(value))) | 48 | 48 | return sorted(map(list, FlashcardMask(value))) | |
49 | 49 | |||
def get_prep_lookup(self, lookup_type, value): | 50 | 50 | def get_prep_lookup(self, lookup_type, value): | |
raise TypeError("Lookup not supported for MaskField") | 51 | 51 | raise TypeError("Lookup not supported for MaskField") | |
52 | 52 | |||
@staticmethod | 53 | 53 | @staticmethod | |
def _parse_mask(intervals): | 54 | 54 | def _parse_mask(intervals): | |
p_beg, p_end = -1, -1 | 55 | 55 | p_beg, p_end = -1, -1 | |
mask_list = [] | 56 | 56 | mask_list = [] | |
for interval in intervals: | 57 | 57 | for interval in intervals: | |
beg, end = map(int, interval) | 58 | 58 | beg, end = map(int, interval) | |
if not (0 <= beg <= 255) or not (0 <= end <= 255) or not (beg <= end) or not (beg > p_end): | 59 | 59 | if not (0 <= beg <= 255) or not (0 <= end <= 255) or not (beg <= end) or not (beg > p_end): | |
raise ValueError("Invalid range offsets in the mask") | 60 | 60 | raise ValueError("Invalid range offsets in the mask") | |
mask_list.append([beg, end]) | 61 | 61 | mask_list.append([beg, end]) | |
p_beg, p_end = beg, end | 62 | 62 | p_beg, p_end = beg, end |