Commit 4466d365 authored by Serge S. Koval's avatar Serge S. Koval

Fixed #424. Fixed automatic class name generation

parent 19ca645c
from functools import wraps
from re import sub
from flask import Blueprint, render_template, url_for, abort, g
from flask.ext.admin import babel
......@@ -211,7 +210,7 @@ class BaseView(with_metaclass(AdminViewMeta, BaseViewClass)):
# If name is not povided, use capitalized endpoint name
if self.name is None:
self.name = self._prettify_name(self.__class__.__name__)
self.name = self._prettify_class_name(self.__class__.__name__)
# Create blueprint and register rules
self.blueprint = Blueprint(self.endpoint, __name__,
......@@ -253,14 +252,14 @@ class BaseView(with_metaclass(AdminViewMeta, BaseViewClass)):
return render_template(template, **kwargs)
def _prettify_name(self, name):
def _prettify_class_name(self, name):
"""
Prettify a class name by splitting the name on capitalized characters. So, 'MySuperClass' becomes 'My Super Class'
Split words in PascalCase string into separate words.
:param name:
String to prettify
"""
return sub(r'(?<=.)([A-Z])', r' \1', name)
return h.prettify_class_name(name)
def is_visible(self):
"""
......
......@@ -32,6 +32,7 @@ def get_primary_key(model):
pks.append(get_column_for_current_model(p).key)
else:
pks.append(p.key)
if len(pks) == 1:
return pks[0]
elif len(pks) > 1:
......
from re import sub
from jinja2 import contextfunction
from flask import g, request
from wtforms.validators import DataRequired, InputRequired
......@@ -85,3 +86,13 @@ def get_render_ctx():
Get view template context.
"""
return getattr(g, '_admin_render_ctx', None)
def prettify_class_name(name):
"""
Split words in PascalCase string into separate words.
:param name:
String to split
"""
return sub(r'(?<=.)([A-Z])', r' \1', name)
......@@ -483,7 +483,7 @@ class BaseModelView(BaseView, ActionsMixin):
# If name not provided, it is model name
if name is None:
name = '%s' % self.prettify_name(model.__name__)
name = '%s' % self._prettify_class_name(model.__name__)
# If endpoint not provided, it is model name + 'view'
if endpoint is None:
......@@ -614,7 +614,7 @@ class BaseModelView(BaseView, ActionsMixin):
if self.column_labels and field in self.column_labels:
return self.column_labels[field]
else:
return self.prettify_name(field)
return self._prettify_name(field)
def get_list_columns(self):
"""
......@@ -934,7 +934,7 @@ class BaseModelView(BaseView, ActionsMixin):
raise NotImplemented()
# Various helpers
def prettify_name(self, name):
def _prettify_name(self, name):
"""
Prettify pythonic variable name.
......
......@@ -354,3 +354,8 @@ def test_menu_links():
data = rv.data.decode('utf-8')
ok_('TestMenuLink1' in data)
ok_('TestMenuLink2' in data)
def check_class_name():
view = MockView()
eq_(view.name, 'Mock View')
......@@ -329,3 +329,11 @@ def test_custom_form():
eq_(view._edit_form_class, TestForm)
ok_(not hasattr(view._create_form_class, 'col1'))
def check_class_name():
class DummyView(MockModelView):
pass
view = DummyView(Model)
eq_(view.name, 'Dummy View')
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