Skip to content

Commit 24c1642

Browse files
committed
Add $model special argument.
1 parent 38f5860 commit 24c1642

File tree

4 files changed

+73
-1
lines changed

4 files changed

+73
-1
lines changed

django_unicorn/decorators.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,42 @@
66
import wrapt
77

88

9+
@wrapt.decorator()
10+
def db_model(wrapped, instance, args, kwargs):
11+
"""
12+
Converts a JSON representation of a Django model into an actual model.
13+
14+
For example:
15+
@db_model
16+
def delete(self, model):
17+
...
18+
19+
Will get converted to:
20+
`component.delete({ 'name': 'modelName', pk: 1})` -> `component.delete(modelInstance)`
21+
"""
22+
23+
if hasattr(instance, "Meta") and hasattr(instance.Meta, "db_models"):
24+
db_model_name = args[0].get("name")
25+
db_model_pk = args[0].get("pk")
26+
db_model_found = False
27+
28+
for db_model in instance.Meta.db_models:
29+
if db_model.name == db_model_name:
30+
model = db_model.model_class.objects.get(pk=db_model_pk)
31+
args = (model,) + args[1:]
32+
db_model_found = True
33+
break
34+
35+
if not db_model_found:
36+
raise Exception(f"No db_model found that matches '{db_model_name}'")
37+
else:
38+
raise Exception("No db_models defined")
39+
40+
result = wrapped(*args, **kwargs)
41+
42+
return result
43+
44+
945
def _timed_enabled():
1046
return settings.DEBUG
1147

django_unicorn/static/js/eventListeners.js

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,6 @@ export function addActionEventListener(component, eventType) {
129129
args(action.name).forEach((eventArg) => {
130130
if (eventArg.startsWith("$event")) {
131131
// Remove any extra whitespace, everything before and including "$event", and the ending paren
132-
// let eventArg = action.name.trim();
133132
eventArg = eventArg
134133
.trim()
135134
.slice(eventArg.indexOf("$event") + 6)
@@ -172,6 +171,35 @@ export function addActionEventListener(component, eventType) {
172171
data
173172
);
174173
}
174+
} else if (eventArg === "$model") {
175+
const db = {};
176+
let elToCheck = targetElement;
177+
178+
while (elToCheck.parent && (isEmpty(db.name) || isEmpty(db.pk))) {
179+
if (elToCheck.el.getAttribute("unicorn:checksum")) {
180+
break;
181+
}
182+
183+
if (elToCheck.db.name) {
184+
db.name = elToCheck.db.name;
185+
}
186+
187+
if (elToCheck.db.pk) {
188+
db.pk = elToCheck.db.pk;
189+
}
190+
191+
elToCheck = elToCheck.parent;
192+
}
193+
194+
if (db.name && db.pk) {
195+
action.name = action.name.replace(
196+
"$model",
197+
JSON.stringify({
198+
pk: db.pk,
199+
name: db.name,
200+
})
201+
);
202+
}
175203
}
176204
});
177205

example/unicorn/components/models.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from django_unicorn.components import UnicornView
66
from django_unicorn.db import DbModel
7+
from django_unicorn.decorators import db_model
78

89

910
class ModelsView(UnicornView):
@@ -34,6 +35,10 @@ def add_class_flavor(self):
3435
self.class_flavor.save()
3536
self.reset()
3637

38+
@db_model
39+
def delete(self, model):
40+
model.delete()
41+
3742
@cached_property
3843
def available_flavors(self):
3944
flavors = Flavor.objects.all()

example/unicorn/templates/unicorn/models.html

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,9 @@ <h4>PK: {{ flavor.pk }}</h4>
8888
<strong>Decimal value</strong> {{ flavor.decimal_value }}
8989
</div>
9090

91+
<button unicorn:click="delete($model)">delete($model)</button>
92+
<br/>
93+
9194
<!-- todo: get updating parent working correctly -->
9295
<label>Parent</label>
9396
<select>

0 commit comments

Comments
 (0)