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