Skip to content

Commit

Permalink
Improve primary keys management in forms with basic support for compo…
Browse files Browse the repository at this point in the history
…und primary keys forms
  • Loading branch information
amol- committed Jul 14, 2015
1 parent a3070ba commit 9c6b99c
Show file tree
Hide file tree
Showing 4 changed files with 106 additions and 14 deletions.
33 changes: 20 additions & 13 deletions sprox/formbase.py
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@ def _do_init_attrs(self):
else:
self.__possible_field_names__ = self.__possible_field_name_defaults__

#bring in custom declared validators
# bring in custom declared validators
for attr in dir(self):
if not attr.startswith('__'):
value = getattr(self, attr)
Expand Down Expand Up @@ -340,17 +340,19 @@ class EditableForm(FormBase):
"""
def _do_get_disabled_fields(self):
fields = self.__disable_fields__[:]
fields.append(self.__provider__.get_primary_field(self.__entity__))
fields.extend(self.__provider__.get_primary_fields(self.__entity__))
return fields

def _do_get_fields(self):
"""Override this function to define what fields are available to the widget.
"""
fields = super(EditableForm, self)._do_get_fields()
primary_field = self.__provider__.get_primary_field(self.__entity__)
if primary_field not in fields:
fields.append(primary_field)

primary_fields = self.__provider__.get_primary_fields(self.__entity__)
for primary_field in primary_fields:
if primary_field not in fields:
fields.append(primary_field)

if '_method' not in fields:
fields.append('_method')
Expand Down Expand Up @@ -469,14 +471,19 @@ class AddRecordForm(FormBase):
def _do_init_attrs(self):
super(AddRecordForm, self)._do_init_attrs()

pkey = self.__provider__.get_primary_field(self.__entity__)
if pkey not in self.__omit_fields__:
self.__omit_fields__.append(pkey)

def _do_get_disabled_fields(self):
fields = self.__disable_fields__[:]
fields.append(self.__provider__.get_primary_field(self.__entity__))
return fields
primary_keys = self.__provider__.get_primary_fields(self.__entity__)
if len(primary_keys) > 1:
# compound primary key, in this case we assume all must be provided by user
self.__require_fields__.extend(primary_keys)
else:
# Single primary key, in this case we assume it's autoincrement unless explicitly required.
pkey = primary_keys[0]
field_order = self.__field_order__ or []
if pkey in self.__require_fields__ and pkey not in field_order:
self.__field_order__ = field_order = [pkey] + field_order

if pkey not in self.__omit_fields__ and pkey not in field_order:
self.__omit_fields__.append(pkey)


class DisabledForm(FormBase):
Expand Down
6 changes: 6 additions & 0 deletions sprox/test/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -247,5 +247,11 @@ def setup(self):
def teardown(self):
self.session.rollback()

def get_line_in_text(self, line_content, text):
for line in text.split('\n'):
if line_content in line:
return line.strip()
return ''

if __name__ == '__main__':
setupDatabase()
7 changes: 7 additions & 0 deletions sprox/test/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,13 @@ class __sprox__(object):
owner_id = Column(Integer, ForeignKey(WithoutNameOwner.uid))
owner = relation('WithoutNameOwner', backref=backref('owned'))

class CompoundPrimaryKey(DeclarativeBase):
__tablename__ = 'withoutname_compound'

name = Column(String(100), primary_key=True)
surname = Column(String(100), primary_key=True)
age = Column(Integer)

#not supporting enums for now.
#ModelWithEnum=None
#if sa.__version__ >='0.6':
Expand Down
74 changes: 73 additions & 1 deletion tests/test_formbase.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from sprox.viewbase import ViewBaseError
from sprox.test.base import setup_database, sorted_user_columns, SproxTest, setup_records, \
Example, Document, assert_in_xml, widget_children, widget_is_type, form_error_message
from sprox.test.model import User, Group, WithoutName, WithoutNameOwner
from sprox.test.model import User, Group, WithoutName, WithoutNameOwner, CompoundPrimaryKey
from sprox.sa.widgetselector import SAWidgetSelector
from sprox.metadata import FieldsMetadata
from nose.tools import raises, eq_
Expand Down Expand Up @@ -317,6 +317,41 @@ class AddGroupForm(AddRecordForm):
rendered = example_form()
assert 'default group name' in rendered

def test_autoincrement_single_primary_key(self):
class AddUserForm(AddRecordForm):
__entity__ = User

test_form = AddUserForm()
html = test_form.display()

uid_input = self.get_line_in_text('name="user_id"', html)
assert not uid_input, uid_input

def test_required_single_primary_key(self):
class AddUserForm(AddRecordForm):
__entity__ = User
__require_fields__ = ['user_id']

test_form = AddUserForm()
html = test_form.display()

uid_input = self.get_line_in_text('name="user_id"', html)
assert 'type="text"' in uid_input, html
assert 'disabled' not in uid_input, html

def test_compound_primary_key(self):
class AddCompoundPrimaryKey(AddRecordForm):
__entity__ = CompoundPrimaryKey

test_form = AddCompoundPrimaryKey()
html = test_form.display()

name_input = self.get_line_in_text('name="name"', html)
surname_input = self.get_line_in_text('name="surname"', html)
assert 'type="text"' in name_input, name_input
assert 'disabled' not in name_input, name_input
assert 'type="text"' in surname_input, surname_input
assert 'disabled' not in surname_input, surname_input

class TestEditableForm(SproxTest):
def setup(self):
Expand Down Expand Up @@ -361,6 +396,43 @@ class OwnerForm(EditableForm):
for entry in value['owned']:
assert str(entry) in selected_html, (entry, selected_html)

def test_autoincrement_single_primary_key(self):
class EditUserForm(EditableForm):
__entity__ = User

test_form = EditUserForm()
html = test_form.display()

uid_input = self.get_line_in_text('name="user_id"', html)
assert 'type="text"' in uid_input, html
assert 'disabled' in uid_input, html

def test_required_single_primary_key(self):
class EditUserForm(EditableForm):
__entity__ = User
__require_fields__ = ['user_id']

test_form = EditUserForm()
html = test_form.display()

uid_input = self.get_line_in_text('name="user_id"', html)
assert 'type="text"' in uid_input, html
assert 'disabled' in uid_input, html

def test_compound_primary_key(self):
class EditCompoundPrimaryKey(EditableForm):
__entity__ = CompoundPrimaryKey

test_form = EditCompoundPrimaryKey()
html = test_form.display()

name_input = self.get_line_in_text('name="name"', html)
surname_input = self.get_line_in_text('name="surname"', html)
assert 'type="text"' in name_input, name_input
assert 'disabled' in name_input, name_input
assert 'type="text"' in surname_input, surname_input
assert 'disabled' in surname_input, surname_input


class TestDisabledForm(SproxTest):
def setup(self):
Expand Down

0 comments on commit 9c6b99c

Please sign in to comment.