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.attributes import InstrumentedAttribute
from sqlalchemy.orm import subqueryload from sqlalchemy.orm import subqueryload
from sqlalchemy.sql.expression import desc from sqlalchemy.sql.expression import desc
...@@ -141,6 +140,12 @@ class ModelView(BaseModelView): ...@@ -141,6 +140,12 @@ class ModelView(BaseModelView):
super(ModelView, self).__init__(model, name, category, endpoint, url) 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 # Configuration
if not self.list_select_related: if not self.list_select_related:
self._auto_joins = self.scaffold_auto_joins() self._auto_joins = self.scaffold_auto_joins()
...@@ -159,6 +164,9 @@ class ModelView(BaseModelView): ...@@ -159,6 +164,9 @@ class ModelView(BaseModelView):
# Scaffolding # Scaffolding
def scaffold_pk(self): def scaffold_pk(self):
"""
Return primary key name from a model
"""
for p in self._get_model_iterator(): for p in self._get_model_iterator():
if hasattr(p, 'columns'): if hasattr(p, 'columns'):
for c in p.columns: for c in p.columns:
...@@ -167,6 +175,12 @@ class ModelView(BaseModelView): ...@@ -167,6 +175,12 @@ class ModelView(BaseModelView):
return None 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): def scaffold_list_columns(self):
""" """
Return list of columns from the model. Return list of columns from the model.
......
...@@ -226,12 +226,6 @@ class BaseModelView(BaseView): ...@@ -226,12 +226,6 @@ class BaseModelView(BaseView):
""" """
Refresh various cached variables. 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 # List view
self._list_columns = self.get_list_columns() self._list_columns = self.get_list_columns()
self._sortable_columns = self.get_sortable_columns() self._sortable_columns = self.get_sortable_columns()
...@@ -268,15 +262,12 @@ class BaseModelView(BaseView): ...@@ -268,15 +262,12 @@ class BaseModelView(BaseView):
self._filter_types = None self._filter_types = None
# Primary key # 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() raise NotImplemented()
def get_pk_value(self, model):
return getattr(model, self._primary_key)
# List view # List view
def scaffold_list_columns(self): def scaffold_list_columns(self):
""" """
......
...@@ -52,8 +52,8 @@ class MockModelView(base.BaseModelView): ...@@ -52,8 +52,8 @@ class MockModelView(base.BaseModelView):
self.last_id = 3 self.last_id = 3
# Scaffolding # Scaffolding
def scaffold_pk(self): def get_pk_value(self, model):
return 'id' return model.id
def scaffold_list_columns(self): def scaffold_list_columns(self):
columns = ['col1', 'col2', 'col3'] columns = ['col1', 'col2', 'col3']
...@@ -124,7 +124,6 @@ def test_mockview(): ...@@ -124,7 +124,6 @@ def test_mockview():
eq_(view.endpoint, 'modelview') eq_(view.endpoint, 'modelview')
# Verify scaffolding # Verify scaffolding
eq_(view._primary_key, 'id')
eq_(view._sortable_columns, ['col1', 'col2', 'col3']) eq_(view._sortable_columns, ['col1', 'col2', 'col3'])
eq_(view._create_form_class, Form) eq_(view._create_form_class, Form)
eq_(view._edit_form_class, Form) eq_(view._edit_form_class, Form)
...@@ -197,14 +196,6 @@ def test_permissions(): ...@@ -197,14 +196,6 @@ def test_permissions():
eq_(rv.status_code, 302) 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(): def test_templates():
app, admin = setup() 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