Skip to content

Commit 44ca4f8

Browse files
bram2wpaljortjrmi
authored
Advanced formulas + new formula functions (baserow#4082)
* Changes to allow testing literal formula in table field mappings * Add formula function: upper() * Use ensure*() in the test/parse methods. Add more functions. * Add operators, description, and examples. * Add addable and subtractable types * Add random generator functions * Add tests. * Working formula input * Simplify * Further simplify * Still working - simplified further * Lint * Undo changes in FieldMappingForm * Use advanced mode, not raw * Temp fix to align the checkbox and button * Lint fix backend * Lint fix frontend * Lint fix * Add translations * Add advanced formulas to application builder --------- Co-authored-by: Tsering Paljor <tsering@baserow.io> Co-authored-by: Jeremie Pardou <571533+jrmi@users.noreply.github.com>
1 parent a63f2db commit 44ca4f8

File tree

19 files changed

+1810
-22
lines changed

19 files changed

+1810
-22
lines changed

backend/src/baserow/core/apps.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,69 @@ def ready(self):
3737
from baserow.core.formula.registries import formula_runtime_function_registry
3838
from baserow.core.formula.runtime_formula_types import (
3939
RuntimeAdd,
40+
RuntimeCapitalize,
4041
RuntimeConcat,
42+
RuntimeDateTimeFormat,
43+
RuntimeDay,
44+
RuntimeDivide,
45+
RuntimeEqual,
46+
RuntimeGenerateUUID,
4147
RuntimeGet,
48+
RuntimeGetProperty,
49+
RuntimeGreaterThan,
50+
RuntimeGreaterThanOrEqual,
51+
RuntimeHour,
52+
RuntimeIsEven,
53+
RuntimeIsOdd,
54+
RuntimeLessThan,
55+
RuntimeLower,
56+
RuntimeMinus,
57+
RuntimeMinute,
58+
RuntimeMonth,
59+
RuntimeMultiply,
60+
RuntimeNotEqual,
61+
RuntimeNow,
62+
RuntimeRandomBool,
63+
RuntimeRandomFloat,
64+
RuntimeRandomInt,
65+
RuntimeRound,
66+
RuntimeSecond,
67+
RuntimeToday,
68+
RuntimeUpper,
69+
RuntimeYear,
4270
)
4371

4472
formula_runtime_function_registry.register(RuntimeConcat())
4573
formula_runtime_function_registry.register(RuntimeGet())
4674
formula_runtime_function_registry.register(RuntimeAdd())
75+
formula_runtime_function_registry.register(RuntimeMinus())
76+
formula_runtime_function_registry.register(RuntimeMultiply())
77+
formula_runtime_function_registry.register(RuntimeDivide())
78+
formula_runtime_function_registry.register(RuntimeEqual())
79+
formula_runtime_function_registry.register(RuntimeNotEqual())
80+
formula_runtime_function_registry.register(RuntimeGreaterThan())
81+
formula_runtime_function_registry.register(RuntimeLessThan())
82+
formula_runtime_function_registry.register(RuntimeGreaterThanOrEqual())
83+
formula_runtime_function_registry.register(RuntimeUpper())
84+
formula_runtime_function_registry.register(RuntimeLower())
85+
formula_runtime_function_registry.register(RuntimeCapitalize())
86+
formula_runtime_function_registry.register(RuntimeRound())
87+
formula_runtime_function_registry.register(RuntimeIsEven())
88+
formula_runtime_function_registry.register(RuntimeIsOdd())
89+
formula_runtime_function_registry.register(RuntimeDateTimeFormat())
90+
formula_runtime_function_registry.register(RuntimeDay())
91+
formula_runtime_function_registry.register(RuntimeMonth())
92+
formula_runtime_function_registry.register(RuntimeYear())
93+
formula_runtime_function_registry.register(RuntimeHour())
94+
formula_runtime_function_registry.register(RuntimeMinute())
95+
formula_runtime_function_registry.register(RuntimeSecond())
96+
formula_runtime_function_registry.register(RuntimeNow())
97+
formula_runtime_function_registry.register(RuntimeToday())
98+
formula_runtime_function_registry.register(RuntimeGetProperty())
99+
formula_runtime_function_registry.register(RuntimeRandomInt())
100+
formula_runtime_function_registry.register(RuntimeRandomFloat())
101+
formula_runtime_function_registry.register(RuntimeRandomBool())
102+
formula_runtime_function_registry.register(RuntimeGenerateUUID())
47103

48104
from baserow.core.permission_manager import (
49105
AllowIfTemplatePermissionManagerType,
Lines changed: 56 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1+
from django.core.exceptions import ValidationError
2+
3+
from baserow.core.formula.validator import (
4+
ensure_datetime,
5+
ensure_numeric,
6+
ensure_object,
7+
ensure_string,
8+
)
9+
10+
111
class BaserowRuntimeFormulaArgumentType:
212
def test(self, value):
313
return True
@@ -9,22 +19,62 @@ def parse(self, value):
919
class NumberBaserowRuntimeFormulaArgumentType(BaserowRuntimeFormulaArgumentType):
1020
def test(self, value):
1121
try:
12-
float(value)
22+
ensure_numeric(value)
1323
return True
14-
except ValueError:
24+
except ValidationError:
1525
return False
1626

1727
def parse(self, value):
18-
return float(value)
28+
return ensure_numeric(value)
1929

2030

2131
class TextBaserowRuntimeFormulaArgumentType(BaserowRuntimeFormulaArgumentType):
2232
def test(self, value):
2333
try:
24-
str(value)
34+
ensure_string(value)
35+
return True
36+
except ValidationError:
37+
return False
38+
39+
def parse(self, value):
40+
return ensure_string(value)
41+
42+
43+
class AddableBaserowRuntimeFormulaArgumentType(BaserowRuntimeFormulaArgumentType):
44+
def test(self, value):
45+
return hasattr(value, "__add__")
46+
47+
def parse(self, value):
48+
return value
49+
50+
51+
class SubtractableBaserowRuntimeFormulaArgumentType(BaserowRuntimeFormulaArgumentType):
52+
def test(self, value):
53+
return hasattr(value, "__sub__")
54+
55+
def parse(self, value):
56+
return value
57+
58+
59+
class DateTimeBaserowRuntimeFormulaArgumentType(BaserowRuntimeFormulaArgumentType):
60+
def test(self, value):
61+
try:
62+
ensure_datetime(value)
63+
return True
64+
except ValidationError:
65+
return False
66+
67+
def parse(self, value):
68+
return ensure_datetime(value)
69+
70+
71+
class DictBaserowRuntimeFormulaArgumentType(BaserowRuntimeFormulaArgumentType):
72+
def test(self, value):
73+
try:
74+
ensure_object(value)
2575
return True
26-
except TypeError:
76+
except ValidationError:
2777
return False
2878

2979
def parse(self, value):
30-
return str(value)
80+
return ensure_object(value)

0 commit comments

Comments
 (0)