Skip to content

Commit 597a6c9

Browse files
webit-mdowneycodingjoe
authored andcommitted
Fix #11 -- Add custom measurement class support (#76)
1 parent 25e7e7f commit 597a6c9

File tree

3 files changed

+42
-5
lines changed

3 files changed

+42
-5
lines changed

django_measurement/models.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import logging
2+
import warnings
23

34
from django.db.models import FloatField
45
from django.utils.translation import ugettext_lazy as _
@@ -29,6 +30,10 @@ def __init__(self, verbose_name=None, name=None, measurement=None,
2930
measurement_class=None, unit_choices=None, *args, **kwargs):
3031

3132
if not measurement and measurement_class is not None:
33+
warnings.warn(
34+
"\"measurement_class\" will be removed in version 4.0",
35+
DeprecationWarning
36+
)
3237
measurement = getattr(measures, measurement_class)
3338

3439
if not measurement:
@@ -42,7 +47,6 @@ def __init__(self, verbose_name=None, name=None, measurement=None,
4247
)
4348

4449
self.measurement = measurement
45-
self.measurement_class = str(measurement.__name__)
4650
self.widget_args = {
4751
'measurement': measurement,
4852
'unit_choices': unit_choices,
@@ -53,7 +57,7 @@ def __init__(self, verbose_name=None, name=None, measurement=None,
5357

5458
def deconstruct(self):
5559
name, path, args, kwargs = super(MeasurementField, self).deconstruct()
56-
kwargs['measurement_class'] = self.measurement_class
60+
kwargs['measurement'] = self.measurement
5761
return name, path, args, kwargs
5862

5963
def get_prep_value(self, value):
@@ -97,7 +101,7 @@ def to_python(self, value):
97101

98102
msg = "You assigned a %s instead of %s to %s.%s.%s, unit was guessed to be \"%s\"." % (
99103
type(value).__name__,
100-
self.measurement_class,
104+
str(self.measurement.__name__),
101105
self.model.__module__,
102106
self.model.__name__,
103107
self.name,

tests/models.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from measurement import measures
44

55
from django_measurement.models import MeasurementField
6+
from tests.custom_measure_base import DegreePerTime, Temperature, Time
67

78

89
class MeasurementTestModel(models.Model):
@@ -51,6 +52,15 @@ class MeasurementTestModel(models.Model):
5152
blank=True, null=True,
5253
)
5354

55+
measurement_temperature2 = MeasurementField(
56+
measurement_class='Temperature',
57+
validators=[
58+
MinValueValidator(measures.Temperature(1.0)),
59+
MaxValueValidator(measures.Temperature(3.0))
60+
],
61+
blank=True, null=True,
62+
)
63+
5464
measurement_speed_mph = MeasurementField(
5565
measurement=measures.Speed,
5666
unit_choices=(('mi__hr', 'mph'),),
@@ -61,5 +71,20 @@ class MeasurementTestModel(models.Model):
6171
blank=True, null=True,
6272
)
6373

74+
measurement_custom_degree_per_time = MeasurementField(
75+
measurement=DegreePerTime,
76+
blank=True, null=True,
77+
)
78+
79+
measurement_custom_temperature = MeasurementField(
80+
measurement=Temperature,
81+
blank=True, null=True,
82+
)
83+
84+
measurement_custom_time = MeasurementField(
85+
measurement=Time,
86+
blank=True, null=True,
87+
)
88+
6489
def __str__(self):
6590
return self.measurement

tests/test_fields.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
# -*- coding: utf-8 -*-
12
import pytest
23
from django.core.exceptions import ValidationError
34
from django.utils import module_loading
45
from measurement import measures
56
from measurement.measures import Distance
67

78
from django_measurement.forms import MeasurementField
9+
from tests.custom_measure_base import DegreePerTime, Temperature, Time
810
from tests.forms import (
911
BiDimensionalLabelTestForm, LabelTestForm, MeasurementTestForm, SITestForm
1012
)
@@ -133,6 +135,9 @@ def test_storage_and_retrieval_of_measurement_choice(self):
133135
('measurement_speed', measures.Speed),
134136
('measurement_temperature', measures.Temperature),
135137
('measurement_speed_mph', measures.Speed),
138+
('measurement_custom_degree_per_time', DegreePerTime),
139+
('measurement_custom_temperature', Temperature),
140+
('measurement_custom_time', Time),
136141
])
137142
class TestDeconstruct:
138143
def test_deconstruct(self, fieldname, measure_cls):
@@ -145,8 +150,11 @@ def test_deconstruct(self, fieldname, measure_cls):
145150
assert args == []
146151
assert kwargs['blank'] == field.blank
147152
assert kwargs['null'] == field.null
148-
assert kwargs['measurement_class'] == measure_cls.__name__
149-
assert kwargs['measurement_class'] == field.measurement_class
153+
if 'measurement_class' in kwargs:
154+
assert kwargs['measurement_class'] == measure_cls.__name__
155+
assert kwargs['measurement_class'] == field.measurement_class
156+
else:
157+
assert 'measurement' in kwargs
150158

151159
new_cls = module_loading.import_string(path)
152160
new_field = new_cls(name=name, *args, **kwargs)

0 commit comments

Comments
 (0)