From 6c8704f228c3b4b5d0e8177afda4393140bbbcc4 Mon Sep 17 00:00:00 2001 From: Adrian-at-CrimsonAuzre Date: Thu, 12 Mar 2020 10:26:28 -0400 Subject: [PATCH 1/9] Removed imports from future and django.utils.six --- djfractions/forms.py | 6 ++---- djfractions/models/__init__.py | 2 -- djfractions/models/fields.py | 5 +---- setup.py | 2 -- 4 files changed, 3 insertions(+), 12 deletions(-) diff --git a/djfractions/forms.py b/djfractions/forms.py index 10dfb82..ab1abfb 100644 --- a/djfractions/forms.py +++ b/djfractions/forms.py @@ -1,9 +1,7 @@ -from __future__ import unicode_literals, absolute_import, division, print_function from django import forms from django.core.exceptions import ValidationError from django.core import validators -from django.utils import six from django.utils.translation import ugettext_lazy as _, ungettext_lazy from decimal import Decimal, InvalidOperation @@ -95,7 +93,7 @@ def to_python(self, value): if value in validators.EMPTY_VALUES: return None - if isinstance(value, six.string_types): + if isinstance(value, str): # some really lame validation that we do not have a string like "1 1 1/4" because that # is not a valid number. # these regexes should match fractions such as 1 1/4 and 1/4, with any number @@ -207,7 +205,7 @@ def to_python(self, value): # these regexes should match fractions such as 1 1/4 and 1/4, with any number # of spaces between digits and / and any length of actual digits such as # 100 1/4 or 1 100/400, etc - if isinstance(value, six.string_types): + if isinstance(value, str): if not is_number(value) and not self.FRACTION_MATCH.match(value) \ and not self.MIXED_NUMBER_MATCH.match(value): # this second matches optional whitespace, then a digit, then diff --git a/djfractions/models/__init__.py b/djfractions/models/__init__.py index 14f11a1..9675290 100644 --- a/djfractions/models/__init__.py +++ b/djfractions/models/__init__.py @@ -1,5 +1,3 @@ # -*- coding: utf-8 -*- -from __future__ import unicode_literals, division, absolute_import, print_function - from .fields import DecimalFractionField diff --git a/djfractions/models/fields.py b/djfractions/models/fields.py index 9fd2f41..01b8ff4 100644 --- a/djfractions/models/fields.py +++ b/djfractions/models/fields.py @@ -1,11 +1,8 @@ # -*- coding: utf-8 -*- -from __future__ import unicode_literals, division, absolute_import, print_function - from django.core import checks from django.db import connection from django.db.models import DecimalField, Field -from django.utils import six from django.utils.translation import ugettext_lazy as _ import decimal @@ -193,7 +190,7 @@ def get_internal_type(self): return "DecimalField" def _format(self, value): - if isinstance(value, six.string_types): + if isinstance(value, str): return value else: return self.format_number(value) diff --git a/setup.py b/setup.py index 5dcf02c..8aadfe2 100755 --- a/setup.py +++ b/setup.py @@ -51,8 +51,6 @@ 'Intended Audience :: Developers', 'License :: OSI Approved :: BSD License', 'Natural Language :: English', - 'Programming Language :: Python :: 2', - 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.5', From fe43360b73d5d91f09091b061cb9a569457831de Mon Sep 17 00:00:00 2001 From: Adrian-at-CrimsonAuzre Date: Thu, 12 Mar 2020 10:57:19 -0400 Subject: [PATCH 2/9] from_db_value context=None --- djfractions/models/fields.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/djfractions/models/fields.py b/djfractions/models/fields.py index 01b8ff4..db7a2ea 100644 --- a/djfractions/models/fields.py +++ b/djfractions/models/fields.py @@ -110,7 +110,7 @@ def _check_decimal_places_and_max_digits(self, **kwargs): ] return [] - def from_db_value(self, value, expression, connection, context): + def from_db_value(self, value, expression, connection, context=None): if value is None: return value From b1ce0f17059c6e9863ef7b1b63feeb0f6bedcffb Mon Sep 17 00:00:00 2001 From: Adrian-at-CrimsonAuzre Date: Thu, 12 Mar 2020 11:11:18 -0400 Subject: [PATCH 3/9] Added blank and null options to DecimalFractionField --- djfractions/models/fields.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/djfractions/models/fields.py b/djfractions/models/fields.py index db7a2ea..0054cc7 100644 --- a/djfractions/models/fields.py +++ b/djfractions/models/fields.py @@ -27,14 +27,14 @@ class DecimalFractionField(Field): } description = _("Fraction number stored in the database as a Decimal") - def __init__(self, verbose_name=None, name=None, max_digits=None, + def __init__(self, verbose_name=None, name=None, max_digits=None, blank=False, null=False, decimal_places=None, limit_denominator=None, coerce_thirds=True, **kwargs): self.limit_denominator = limit_denominator self.coerce_thirds = coerce_thirds # for decimal stuff - self.max_digits, self.decimal_places = max_digits, decimal_places + self.max_digits, self.decimal_places, self.blank, self.null = max_digits, decimal_places, blank, null super(DecimalFractionField, self).__init__(verbose_name=verbose_name, name=name, From 6317b11927592ae490fa07094c519cad2922f5b6 Mon Sep 17 00:00:00 2001 From: Adrian-at-CrimsonAuzre Date: Thu, 12 Mar 2020 11:27:41 -0400 Subject: [PATCH 4/9] Added ability to make field option (blank and null) --- djfractions/models/fields.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/djfractions/models/fields.py b/djfractions/models/fields.py index 0054cc7..cbbf581 100644 --- a/djfractions/models/fields.py +++ b/djfractions/models/fields.py @@ -38,6 +38,8 @@ def __init__(self, verbose_name=None, name=None, max_digits=None, blank=False, n super(DecimalFractionField, self).__init__(verbose_name=verbose_name, name=name, + blank=blank, + null=null, **kwargs) def check(self, **kwargs): From c7113a07020de547f91d5f0d77a73306a0ee6fbf Mon Sep 17 00:00:00 2001 From: Adrian-at-CrimsonAuzre Date: Thu, 12 Mar 2020 13:18:20 -0400 Subject: [PATCH 5/9] Added support back for Pre-Django 3.0 --- djfractions/__init__.py | 6 ++---- djfractions/forms.py | 9 ++++++++- djfractions/models/__init__.py | 2 +- djfractions/models/fields.py | 9 ++++++++- setup.py | 2 ++ 5 files changed, 21 insertions(+), 7 deletions(-) diff --git a/djfractions/__init__.py b/djfractions/__init__.py index 5382c30..532ef71 100644 --- a/djfractions/__init__.py +++ b/djfractions/__init__.py @@ -1,7 +1,5 @@ -from __future__ import unicode_literals, absolute_import, division - -__version__ = '1.1.0' - +from __future__ import unicode_literals, division, absolute_import +__version__ = '1.2.0' from decimal import Decimal import fractions import re diff --git a/djfractions/forms.py b/djfractions/forms.py index ab1abfb..9872346 100644 --- a/djfractions/forms.py +++ b/djfractions/forms.py @@ -1,3 +1,10 @@ +from __future__ import unicode_literals, division, absolute_import, print_function +import django +if django.VERSION[0] < 3: + from django.utils import six + SIX_OR_STR = six.string_types +else: + SIX_OR_STR = str from django import forms from django.core.exceptions import ValidationError @@ -93,7 +100,7 @@ def to_python(self, value): if value in validators.EMPTY_VALUES: return None - if isinstance(value, str): + if isinstance(value, SIX_OR_STR): # some really lame validation that we do not have a string like "1 1 1/4" because that # is not a valid number. # these regexes should match fractions such as 1 1/4 and 1/4, with any number diff --git a/djfractions/models/__init__.py b/djfractions/models/__init__.py index 9675290..d377ab3 100644 --- a/djfractions/models/__init__.py +++ b/djfractions/models/__init__.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- - +from __future__ import unicode_literals, division, absolute_import from .fields import DecimalFractionField diff --git a/djfractions/models/fields.py b/djfractions/models/fields.py index cbbf581..2fcc397 100644 --- a/djfractions/models/fields.py +++ b/djfractions/models/fields.py @@ -1,4 +1,11 @@ # -*- coding: utf-8 -*- +from __future__ import unicode_literals, division, absolute_import, print_function +import django +if django.VERSION[0] < 3: + from django.utils import six + SIX_OR_STR = six.string_types +else: + SIX_OR_STR = str from django.core import checks from django.db import connection @@ -192,7 +199,7 @@ def get_internal_type(self): return "DecimalField" def _format(self, value): - if isinstance(value, str): + if isinstance(value, SIX_OR_STR): return value else: return self.format_number(value) diff --git a/setup.py b/setup.py index 8aadfe2..5dcf02c 100755 --- a/setup.py +++ b/setup.py @@ -51,6 +51,8 @@ 'Intended Audience :: Developers', 'License :: OSI Approved :: BSD License', 'Natural Language :: English', + 'Programming Language :: Python :: 2', + 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.5', From 48a2ca451e8935b7417c43a3ece2e456c745055d Mon Sep 17 00:00:00 2001 From: Adrian-at-CrimsonAuzre Date: Thu, 12 Mar 2020 13:37:08 -0400 Subject: [PATCH 6/9] Missed an str --- djfractions/forms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/djfractions/forms.py b/djfractions/forms.py index 9872346..a1b9251 100644 --- a/djfractions/forms.py +++ b/djfractions/forms.py @@ -212,7 +212,7 @@ def to_python(self, value): # these regexes should match fractions such as 1 1/4 and 1/4, with any number # of spaces between digits and / and any length of actual digits such as # 100 1/4 or 1 100/400, etc - if isinstance(value, str): + if isinstance(value, SIX_OR_STR): if not is_number(value) and not self.FRACTION_MATCH.match(value) \ and not self.MIXED_NUMBER_MATCH.match(value): # this second matches optional whitespace, then a digit, then From 8845f6f8a1ab609561b6cf72fff959c8374270d1 Mon Sep 17 00:00:00 2001 From: Adrian-at-CrimsonAuzre Date: Thu, 12 Mar 2020 13:46:51 -0400 Subject: [PATCH 7/9] Added tests for Django 3 --- .travis.yml | 8 +++++++- tox.ini | 2 ++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 9f97f66..78b7f71 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,7 +28,13 @@ matrix: - python: 3.5 env: TOX_ENV=py35-django-2 - python: 3.6 - env: TOX_ENV=py36-django-2 + env: TOX_ENV=py36-django-2 + - python: 3.4 + env: TOX_ENV=py34-django-3 + - python: 3.5 + env: TOX_ENV=py35-django-3 + - python: 3.6 + env: TOX_ENV=py36-django-3 #env: # - TOX_ENV=py36-django-18 # - TOX_ENV=py35-django-18 diff --git a/tox.ini b/tox.ini index 59ee4a4..ef6b41d 100644 --- a/tox.ini +++ b/tox.ini @@ -3,6 +3,7 @@ envlist = {py27,py34,py35,py36}-django-18 {py27,py34,py35,py36}-django-111 {py34,py35,py36}-django-2 + {py34,py35,py36}-django-3 stats [testenv] @@ -13,6 +14,7 @@ deps = django-18: Django>=1.8,<1.9 django-111: Django>=1.11,<2.0 django-2: Django>=2.0,<2.1 + django-3: Django==3.0 -r{toxinidir}/requirements-test.txt basepython = py36: python3.6 From a202802df5e0c6286d00036a64ad030ad426a03c Mon Sep 17 00:00:00 2001 From: Adrian-at-CrimsonAuzre Date: Thu, 12 Mar 2020 14:13:20 -0400 Subject: [PATCH 8/9] Only test Django 3.0 on Python 3.6 --- .travis.yml | 6 +----- tox.ini | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 78b7f71..23275e8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,11 +28,7 @@ matrix: - python: 3.5 env: TOX_ENV=py35-django-2 - python: 3.6 - env: TOX_ENV=py36-django-2 - - python: 3.4 - env: TOX_ENV=py34-django-3 - - python: 3.5 - env: TOX_ENV=py35-django-3 + env: TOX_ENV=py36-django-2 - python: 3.6 env: TOX_ENV=py36-django-3 #env: diff --git a/tox.ini b/tox.ini index ef6b41d..ba964c8 100644 --- a/tox.ini +++ b/tox.ini @@ -3,7 +3,7 @@ envlist = {py27,py34,py35,py36}-django-18 {py27,py34,py35,py36}-django-111 {py34,py35,py36}-django-2 - {py34,py35,py36}-django-3 + {py36}-django-3 stats [testenv] From 8a4fc122e30a0fe9ddc20ef86bdb96c099080bdb Mon Sep 17 00:00:00 2001 From: Adrian-at-CrimsonAuzre Date: Thu, 12 Mar 2020 14:17:47 -0400 Subject: [PATCH 9/9] Maybe fixed crashing related to context? --- .vs/ProjectSettings.json | 3 +++ .vs/django-fractions/v15/.suo | Bin 0 -> 29696 bytes .vs/slnx.sqlite | Bin 0 -> 90112 bytes djfractions/models/fields.py | 27 +++++++++++++++++++-------- 4 files changed, 22 insertions(+), 8 deletions(-) create mode 100644 .vs/ProjectSettings.json create mode 100644 .vs/django-fractions/v15/.suo create mode 100644 .vs/slnx.sqlite diff --git a/.vs/ProjectSettings.json b/.vs/ProjectSettings.json new file mode 100644 index 0000000..f8b4888 --- /dev/null +++ b/.vs/ProjectSettings.json @@ -0,0 +1,3 @@ +{ + "CurrentProjectSetting": null +} \ No newline at end of file diff --git a/.vs/django-fractions/v15/.suo b/.vs/django-fractions/v15/.suo new file mode 100644 index 0000000000000000000000000000000000000000..487ed755c2b6840f8b88a4fafbad3cb05d47ff9d GIT binary patch literal 29696 zcmeHQ3vg7`8NLZY1RpIR5vkgUhzM-lS9TLbO30&FOi>D12n08t#rajLX4)s8w&Yo~Um)%5%By(fG3X7Ap+Nj4#I zPv*Pl+;h*K|D6B4{_~&z-W)$R{KI{R$DERMZkjYm`nr9nbcQBA2jN_C|7}S+TfP6f zy}g~$g8&4xt{-t=j?{?1W~o4`kQ(4er4?*S%PwCU+|lOwCckRSZ@PZ>e@^Cn3+Z06 zDT%KG#YSndbPcG75UP+`OmazloR1!HTWLv*3TFWuO}7m?n?T z0nP-@2S|tW0iUt0M*`nb?}x&_0uWgZLwLC6p79sreuOSgq)+8f#BU}6lL2;{Lf}fk z4v;@=BNyNXiU1Gb1&V=lfmC^a)1UR``2TQnOUL-XgN+E+7vul8pqm~4GW$EmhL{J$ zxYv&hj{m_x9>8bX@z48Fi0Am{??=Pu_#XqDr^a0XKRf=(sng5diFR27tOf1@)&c8* z4Zud=Zr~o^USJcj8Q21B1=@i7fNcQRlLr8{{|@*&)iBq&-D-Fb{D;->Uid#z!~5Ys zs)m0G|9~2P9R3q(_-F7Bso|f)|AiVp4F6YZ_z3)`)$niNKcj|OrmRcOff=&=w?wLk z%oCNCXrv!7&w{%U@(1??Vy(CE6UbJQG(k-`4|HRodo84|7@o|P7NJB@gaWc;7Bk6^ z@{hJ=CduW;%#$(=T{WoAlX(!47Q$~q34)-%4CM(RWah@I^tqm}9A@eHJPL3grK7w{ zSu+aR(+@ec5_BWDk9Dk!L6oCeDnr>Qp9ke@oGVkhAb-|_?sPU9+&~@w*)gvj6~^K0 z`2S{)f3y9kQ{GW2b49Z2_%6&pk0B$g`(Ky5!%Ie4i39zdixC_FSe<_lA}!?)IcnOKkDSh0aok(6w*?bqBEoKly}xj+GN+R zwEr$-L>Z3GoW5I0XmBO}zl&!DfYtgxgtXS{Pi=y+BmIl;_%gsM{YQ}YsG6mD{heyc zpomU25CWs9&ZTg0GOX@d6e6~~dCBM&xt+6IT$OkDQ67nq7UYh6V0 zL2@d?HBu%`fj1ul3x${%!hR^xC`<;Bu^;zyk^NHnK8U+HNY{iIrmThH&o3+88ll(; zA&ozwKt2?XB3U7FqIz!9%BL@w|IXO$lk(pka?=~Dxlid-G{&XjnloGeLezk@qBuzg zuYjN(k*1#e)jjtOD}1Hki3?j_9C633EU%Wm3~SoOm!dwmo0mV9!2f6>|IPYe>fXJHEq3~Z)!$SW=IlKu?!@UPPa$F0nCN%I^ zf9kVG0#@l?hqRQz=~C6d9G!-Hg;b98scRu^x>RY!v!w|9lgeB;ZUeY}P+lev2diN| z<{pXh%%A!phPB|Hhxc52S^x6@>VfhB>WiocqTYvkATdXAuHs5-Q&|1Ck#ia1tUPk| z@8@q`UwuwNH%hM5VN*_KD`3>y#Rx3NxTL04bgdiYaaoJl<$rVuujty9n7; z`HyS8X=hV^R1Lq4f(BeF`eIX2j#ZLp^2uBw=%0%Rls&A{=UOT9;^riR`inX$dRC79 zI>b_R7f-}568*`bPg#ew=@OqNznhEb1L~vMSp64ERiGB_q~ooYPq35cA!4b2rkqB0 zTBSb+X>-*KcJxvIOI!~+&$cxe9VmahaL3iLhrj&%@T6RdMjbqs8I8+&#I4V8`KfVN zrY>$qm2eG4OMEp`cFnh}opqvm(c?$k3eG=O`oTjlCo3=J5M}@O`uMZnt^arK$d7Jb zbUeuh~t%gmQGJ!p+t@=JF!xfqY2}Kryrb&7^`)jF3>**8RV&%Xlqu5 z(auvCg%gFC|5*P9@TC@e0?q}TC1YChur^JRxp!(g5)W(le`fV}$yR3Z-|9nM8GlES$v%BX-MH8G>2$L(tAAGi?@7s0wm)@R zq770eRv$hBpM8MNoc~TGp}`gOyQTl%nBn=`Xaj4*x}!)_Vk`UUtB2P*o;!HOyKn4X zFeK;jDOOl;RrsBmkZJkPxct;+EQ3g=Y{WmPxqoZJ$3s`F`{R^~z?+3HBrAQRyrZC1 zN&Fb3EyMg5T&A8!glizr2rZ2)^3*}BN`C%Q2w{jK0uFkRrVhf74{Fg0s7=eIzwWvI z#1~hVRF1iPiFe5Diz!ugYB1CDp9d_|Kji^N7b?Iu4arqmgpgm>@%SLy(GrO~ic0&I z&3S*$;Fe>TfBMCHr`B!0I9b)e39vEK{V(29+LJmT%1=qS9wk=x9}CvJ`Nf8r8}dpX z+Vg7lwYlD;C1#|~na@8(x?d#Tc4hs03|Ty=W@AR*%K86g$ZG_^SwhV=rFRfd_o^w( z>6_2LVs^4h|4Gn()-ruHp@GNqAIf^;0IT$$LfS)WetB=Tp7`i*AAXYi$e7RMl}=k3 zIm6WLuiw9_*{1Y*y8Ssk#{yRC-^1;nFzKbNxccyPYX7YM$IJjBv-+Rb%&LFIlFxNp zyJc1ujg$Y_SB8b1>s}1@96a$@-bo9Yx<~W;T{~r@POUuE>R&tSf2eT{;OtYcX-S@Q zK^N%HMpo1p)9L9a*MBK#lU*l(KIa}vKUU|TDx{65nd#~C%#{*i6S!ckbyt53kMck5 z8AbtC>0gVqM*25lkK6#^hI%iv@=*Up9m<$A=<~eCh(7I~Nn2|)gye>f^-s6|(N?{h zN=P_8|Ks$js-;D^XelMV{!031Ao3ExD*sdU|0-~u1C{S#YIT!|TE}=PaQ=|?_@lkb zJT;5#{NK0pzg~Xo=*yb%PrDH#*IoOsJCX4kU@dSLunyq4$_8K~a5r!da4)b4*bHm| zwgPPc?FhF4_X7_A)GhA-b^^Nq%K5@JrK4`yz-hw)v42!f1ovC8y--eM#F?xQZ|?8} zneVRnFspF(YLY{hn8V}u%aEp7e&&Ehv0eVFL8urZ4{Xf6*vBTG0tRvNQG^scpK>Cs zh%Cy}{#80loyCeO}bUkB}Hg zlp32XjCZXh7S~&HLqXkC>eW+kKBJtqZOJfIBb}MBc}YC;RK97jr;o~{-IN)fWA;b8 zICL&cPA~sh`cXDfk8vOeIZ=N|87&V!?T8rWY|E8_VXkDH)r1@;{H*GfazRsWZdx>&7$ z59|NZ*1vK6l$oD||GlmM)3<+e{kK*VDN3&RS^LlK*?%T-vuk(k_rj%{L*icOz@=OF zzjjseEv+B_{l?cPlzqwEM9#ubq;NXhf8H=Nl(&7&@U@ZqKFOP~-}gbX+VJdxGBDjY z(f(7c0}2Pae&w9{CqOyQRNkuPI}Nm%F3^0{rT}kswm@6v!JC~v*md(OJNyD9ZG1w| z5EjVikTF3PPBVsdqoFWTg7nd z#~wS7`d>57@|AY#zw-mI)B`unUd`kj~oX(`PU-+|O(Jfr3)i=t*> zoawT5?+=*%$l8h5@xz!M6*;&6&X2ScjG!JN)GNL+i+f2LXf;#n%RV_!YSwwzh03Mr zayoYJY5q`6&NHv>IO+~=1u|>KYg|Io?~bGXgZ6-QT3yI|+%xZ)im6WgYQv^k`AZ!V zsf14g8F17)RAJv9!E6wgwFQ*@luveuZ+r2pPlM#Igk1$mm)}Av#lF81wyj>=S3nvq{3j&i%Lw8Bwpv)fDUWhM5?%E~g=s@ADh z;aH$D90|szwU$ls&5s46F`vKA9}R^4zPXJ{qk*7rPOzyl=Br)oZ>Vdug`)mIbGWgA z5%F++V{I@J^M%5}NNudJX+>-6%3|4-xos{_Wr@x0E^^sQ?4_kPXGvwLyWCk(5suaz8x1e{pz_G~>#-^QJgl4t5HM!&B>YmN;!em$%mDb_8l| ze!JIe3oi5r`~i2MI1q5JD(_!49NN+AX7ykX?#a9+`-4ue-?PvTw!4dLZf9|^t;ACs zvK0mWAy8-@5gVIO_g_@{8-pDyqPjA!_tXSDfRED>PwXl zpN-Pqc#PIbU3cTK^7B7n#s33BOyU^?SA5#g@|w!=HIj{|34fJdyez||5qn7SUYxKe zGt literal 0 HcmV?d00001 diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..d69b2c36b2808f3e7a88eac3a88c8d42921fb6ad GIT binary patch literal 90112 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