Skip to content

Commit f8557b8

Browse files
authored
Merge pull request #44 from octabytes/feature
fix update field with default value issue #43
2 parents b1dd251 + d6cc93c commit f8557b8

File tree

5 files changed

+35
-8
lines changed

5 files changed

+35
-8
lines changed

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
# Versions should comply with PEP440. For a discussion on single-sourcing
1717
# the version across setup.py and the project code, see
1818
# https://packaging.python.org/en/latest/single_source_version.html
19-
version='1.2.2',
19+
version='1.2.3',
2020

2121
description="FireO ORM is specifically designed for the Google's Firestore",
2222
long_description=long_description,

src/fireo/fields/base_field.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ def db_column_name(self):
9696
"""
9797
return self.raw_attributes.get("column_name") or self.name
9898

99-
def get_value(self, val, ignore_required=False):
99+
def get_value(self, val, ignore_required=False, ignore_default=False):
100100
"""Get field value after validation
101101
102102
Make validation and applying attribute function on it.
@@ -110,11 +110,14 @@ def get_value(self, val, ignore_required=False):
110110
ignore_required : Bool
111111
Ignore required fields or not mostly ignore when updating the document
112112
113+
ignore_default : Bool
114+
Ignore default fields or not mostly ignore when updating the document
115+
113116
Returns
114117
-------
115118
DB value
116119
"""
117-
v = self.field_attribute.parse(val, ignore_required)
120+
v = self.field_attribute.parse(val, ignore_required, ignore_default)
118121
return self.db_value(v)
119122

120123
def db_value(self, val):

src/fireo/fields/field_attribute.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ def __init__(self, field, attributes):
6060
self.attributes = attributes or {}
6161

6262
# validate each field and it's attributes
63-
def parse(self, value, ignore_required=False, run_only=None):
63+
def parse(self, value, ignore_required=False, ignore_default=False, run_only=None):
6464
"""validate the value and perform action according to attribute"""
6565
for attr in self.attributes:
6666
if attr not in self.field.allowed_attributes + FieldAttribute.allowed_attributes:
@@ -75,7 +75,7 @@ def parse(self, value, ignore_required=False, run_only=None):
7575
return value
7676

7777
# check default value if set for field
78-
if self.default is not None and value is None:
78+
if self.default is not None and value is None and not ignore_default:
7979
value = self.default
8080

8181
# check this field is required or not

src/fireo/queries/update_query.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ class User(Model):
5454
# Get nested model field
5555
self._nested_field_list(f, field_dict, f.name)
5656
else:
57-
v = f.get_value(self.query.get(f.name), ignore_required=True)
57+
v = f.get_value(self.query.get(f.name), ignore_required=True, ignore_default=True)
5858
if v or type(v) is bool:
5959
field_dict[f.db_column_name] = v
6060
return field_dict
@@ -79,8 +79,10 @@ def _raw_exec(self, transaction_or_batch=None):
7979
if transaction_or_batch:
8080
transaction_or_batch.update(ref, self._parse_field())
8181
return None
82-
ref.update(self._parse_field())
83-
return ref.get()
82+
83+
if self._parse_field():
84+
ref.update(self._parse_field())
85+
return ref.get()
8486

8587
def exec(self, transaction_or_batch=None):
8688
"""return modified instance of model"""
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from fireo.fields import NumberField
2+
from fireo.models import Model
3+
4+
5+
def test_update_fields_with_default_values():
6+
class UpdateModelWithDefault(Model):
7+
amount = NumberField(default=15)
8+
9+
10+
m = UpdateModelWithDefault(amount=11)
11+
m.save()
12+
13+
assert m.amount == 11
14+
15+
m.update()
16+
17+
assert m.amount == 11
18+
19+
m.amount = 13
20+
m.update()
21+
22+
assert m.amount == 13

0 commit comments

Comments
 (0)