40 lines
1.2 KiB
Python
40 lines
1.2 KiB
Python
from django.shortcuts import render
|
|
from ..accounts.models import User
|
|
from .models import Thing, View
|
|
|
|
|
|
def attr_then_dict(thing, field):
|
|
try:
|
|
return getattr(thing, field)
|
|
except AttributeError:
|
|
return thing.data.get(field, "")
|
|
|
|
|
|
def thing_to_row(view, thing):
|
|
"""convert one thing to corresponding row dict"""
|
|
return [attr_then_dict(thing, col["field_name"]) for col in view.columns.values()]
|
|
|
|
|
|
def table(request):
|
|
token = request.GET.get("token")
|
|
view_name = request.GET.get("view")
|
|
user = User.objects.get(username=token)
|
|
view = View.objects.get(name=view_name)
|
|
things = Thing.objects.filter(user=user, deleted=False)
|
|
for field, val in view.filters.items():
|
|
if field == "type":
|
|
things = things.filter(type=val)
|
|
else:
|
|
val = val.split(",")
|
|
if len(val) == 1:
|
|
things = things.filter(**{f"data__{field}": val})
|
|
else:
|
|
things = things.filter(**{f"data__{field}__in": val})
|
|
|
|
things = things.order_by(*[f"data__{sort}" for sort in view.sort.split(",")])
|
|
|
|
# execute query
|
|
rows = (thing_to_row(view, thing) for thing in things)
|
|
|
|
return render(request, "thingtable.html", {"rows": rows, "view": view})
|