Data Model¶
In the typical scenario, the master view’s
model_class is set to a
data model which maps to a table in the app database.
For instance:
from wuttjamaican.db.model import Person
from wuttaweb.views import MasterView
class MyPersonView(MasterView):
model_class = Person
With a mapped model class, the view can inspect the class to derive
the model name, title, etc. In particular it can determine the model
“key” automatically, which is used in the URL to identify a given
record. This is just uuid for normal mapped models.
But the “model” can really be any tabular data set; for instance you
could have a master view which showed the file contents of a folder on
disk. In such “ad-hoc” scenarios the model data can just be a list of
dicts. In that case instead of setting model_class you would just
set model_name, but you also
must set the model_key since
that cannot be determined from introspection:
from wuttaweb.views import MasterView
class SpecialFileView(MasterView):
model_name = "special_file"
model_key = "filename"
In any case you may also want to set/override the
model_title and
model_title_plural:
from wuttaweb.views import MasterView
class SpecialFileView(MasterView):
model_name = "special_file"
model_key = "filename"
model_title = "Special File"
model_title_plural = "Special Files"
If the view has a mapped model_class then it should already have
logic needed to fetch data for the grid and CRUD interfaces. But in
the ad-hoc scenario you must define methods to handle that:
import os
from wuttaweb.views import MasterView
class SpecialFileView(MasterView):
model_name = "special_file"
model_key = "filename"
SPECIAL_DIR = "/tmp"
def get_grid_data(self, **kwargs):
"""
Override parent method to define how the full data set can
be fetched.
"""
data = []
for fname in os.listdir(self.SPECIAL_DIR):
fpath = os.path.join(self.SPECIAL_DIR, fname)
if os.path.isfile(fpath):
data.append(self.normalize_file(fname))
return data
def get_instance(self, **kwargs):
"""
Override parent method to define how a single "instance"
(record) can be fetched.
"""
# nb. the 'filename' (key) is embedded in current page URL
fname = self.request.matchdict["filename"]
fpath = os.path.join(self.SPECIAL_DIR, fname)
if not os.path.isfile(fpath):
raise self.notfound()
return self.normalize_file(fname)
def normalize_file(self, fname):
"""
Helper method to ensure grid/instance use the same logic to
construct data records.
"""
fpath = os.path.join(self.SPECIAL_DIR, fname)
return {
"filename": fname,
"filepath": fpath,
"filesize": os.path.getsize(fpath),
}
A master view can also define a row model which would represent a “secondary” data set associated with a single primary instance/record. But we’ll get into more detail on that later.
Here are most of the relevant docs for customizing the primary data model:
Model Proper
Fetching Data