66 lines
2.0 KiB
Python
66 lines
2.0 KiB
Python
|
from django import forms
|
||
|
from .models import Tag, is_valid_area
|
||
|
|
||
|
|
||
|
class TagForm(forms.ModelForm):
|
||
|
COORD_KEYS = ['topleft_x', 'topleft_y', 'bottomright_x', 'bottomright_y']
|
||
|
|
||
|
class Meta:
|
||
|
model = Tag
|
||
|
fields = ['text', 'topleft_x', 'topleft_y', 'bottomright_x', 'bottomright_y']
|
||
|
widgets = {
|
||
|
'topleft_x': forms.HiddenInput(),
|
||
|
'topleft_y': forms.HiddenInput(),
|
||
|
'bottomright_x': forms.HiddenInput(),
|
||
|
'bottomright_y': forms.HiddenInput(),
|
||
|
}
|
||
|
|
||
|
def __init__(self, *args, **kwargs):
|
||
|
self.factor_to_original = kwargs.pop('factor_to_original')
|
||
|
super(TagForm, self).__init__(*args, **kwargs)
|
||
|
|
||
|
def __get_area_value__(self, key):
|
||
|
if len(self.data):
|
||
|
rv = self.data.get(key)
|
||
|
else:
|
||
|
rv = self.get_initial_for_field(self.fields[key], key)
|
||
|
try:
|
||
|
return int(rv)
|
||
|
except TypeError:
|
||
|
return None
|
||
|
except ValueError:
|
||
|
return None
|
||
|
|
||
|
@property
|
||
|
def value_tl_x(self):
|
||
|
return self.__get_area_value__('topleft_x')
|
||
|
|
||
|
@property
|
||
|
def value_tl_y(self):
|
||
|
return self.__get_area_value__('topleft_y')
|
||
|
|
||
|
@property
|
||
|
def value_br_x(self):
|
||
|
return self.__get_area_value__('bottomright_x')
|
||
|
|
||
|
@property
|
||
|
def value_br_y(self):
|
||
|
return self.__get_area_value__('bottomright_y')
|
||
|
|
||
|
@property
|
||
|
def has_valid_coordinates(self):
|
||
|
return is_valid_area(self.value_br_x, self.value_br_y, self.value_tl_x, self.value_tl_y)
|
||
|
|
||
|
def save(self, commit=True):
|
||
|
if self.has_valid_coordinates:
|
||
|
self.instance.topleft_x = self.value_tl_x
|
||
|
self.instance.topleft_y = self.value_tl_y
|
||
|
self.instance.bottomright_x = self.value_br_x
|
||
|
self.instance.bottomright_y = self.value_br_y
|
||
|
else:
|
||
|
self.instance.topleft_x = None
|
||
|
self.instance.topleft_y = None
|
||
|
self.instance.bottomright_x = None
|
||
|
self.instance.bottomright_y = None
|
||
|
return forms.ModelForm.save(self, commit=commit)
|