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})