Commit e221aacb authored by Serge S. Koval's avatar Serge S. Koval

PK for models is optional. Some model backends might not have PK and still...

PK for models is optional. Some model backends might not have PK and still will work with individuals records.
parent 108c7b79
from sqlalchemy.orm.attributes import InstrumentedAttribute
from sqlalchemy.orm import subqueryload
from sqlalchemy.sql.expression import desc
......@@ -141,6 +140,12 @@ class ModelView(BaseModelView):
super(ModelView, self).__init__(model, name, category, endpoint, url)
# Primary key
self._primary_key = self.scaffold_pk()
if self._primary_key is None:
raise Exception('Model %s does not have primary key.' % self.model.__name__)
# Configuration
if not self.list_select_related:
self._auto_joins = self.scaffold_auto_joins()
......@@ -159,6 +164,9 @@ class ModelView(BaseModelView):
# Scaffolding
def scaffold_pk(self):
"""
Return primary key name from a model
"""
for p in self._get_model_iterator():
if hasattr(p, 'columns'):
for c in p.columns:
......@@ -167,6 +175,12 @@ class ModelView(BaseModelView):
return None
def get_pk_value(self, model):
"""
Return PK value from a model object.
"""
return getattr(model, self._primary_key)
def scaffold_list_columns(self):
"""
Return list of columns from the model.
......
......@@ -226,12 +226,6 @@ class BaseModelView(BaseView):
"""
Refresh various cached variables.
"""
# Primary key
self._primary_key = self.scaffold_pk()
if self._primary_key is None:
raise Exception('Model %s does not have primary key.' % self.model.__name__)
# List view
self._list_columns = self.get_list_columns()
self._sortable_columns = self.get_sortable_columns()
......@@ -268,15 +262,12 @@ class BaseModelView(BaseView):
self._filter_types = None
# Primary key
def scaffold_pk(self):
def get_pk_value(self, model):
"""
Find model primary key name
Return PK value from a model object.
"""
raise NotImplemented()
def get_pk_value(self, model):
return getattr(model, self._primary_key)
# List view
def scaffold_list_columns(self):
"""
......
......@@ -52,8 +52,8 @@ class MockModelView(base.BaseModelView):
self.last_id = 3
# Scaffolding
def scaffold_pk(self):
return 'id'
def get_pk_value(self, model):
return model.id
def scaffold_list_columns(self):
columns = ['col1', 'col2', 'col3']
......@@ -124,7 +124,6 @@ def test_mockview():
eq_(view.endpoint, 'modelview')
# Verify scaffolding
eq_(view._primary_key, 'id')
eq_(view._sortable_columns, ['col1', 'col2', 'col3'])
eq_(view._create_form_class, Form)
eq_(view._edit_form_class, Form)
......@@ -197,14 +196,6 @@ def test_permissions():
eq_(rv.status_code, 302)
@raises(Exception)
def test_no_pk():
app, admin = setup()
view = MockModelView(Model, scaffold_pk=lambda: None)
admin.add_view(view)
def test_templates():
app, admin = setup()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment