diff --git a/.gitignore b/.gitignore index 894a44c..aa2cb2a 100644 --- a/.gitignore +++ b/.gitignore @@ -102,3 +102,6 @@ venv.bak/ # mypy .mypy_cache/ + +# Vagrant stuff +.vagrant diff --git a/001-simple-tr/reahl/simple-tr/simple_tr.py b/001-simple-tr/reahl/simple-tr/simple_tr.py index 62fc53c..f30d6d9 100644 --- a/001-simple-tr/reahl/simple-tr/simple_tr.py +++ b/001-simple-tr/reahl/simple-tr/simple_tr.py @@ -10,11 +10,12 @@ from reahl.web.bootstrap.grid import Container from reahl.web.bootstrap.forms import TextInput, Form, FormLayout, Button, ButtonLayout from reahl.component.modelinterface import exposed, Field, EmailField, Action, Event -from reahl.sqlalchemysupport import Session, Base +from reahl.sqlalchemysupport import Session, Base, session_scoped from sqlalchemy import Column, Integer, UnicodeText from sqlalchemy.orm import relationship +@session_scoped class TR(Base): __tablename__ = 'simple_tr_tr' @@ -29,24 +30,30 @@ def fields(self, fields): fields.separator = Field(label='Separated by (Regular Expression)', required=True) fields.joiner = Field(label='Join with (Character String)', required=True) - def save(self): - Session.add(self) - - @classmethod - def has_session_data(cls): - record = Session.query(__class__).order_by(TR.id.desc()).first() - return record + @property + def has_data(self): + return self.input_text and self.separator and self.joiner - @exposed('save') + @exposed('save', 'clear_inputs') def events(self, events): - events.save = Event(label='Perform Tr', action=Action(self.save)) + events.save = Event(label='Perform Tr') + events.clear_inputs = Event(label='Clear Inputs', action=Action(self.clear_inputs)) + + @property + def translated_string(self): + import re + return re.sub(self.separator, self.joiner, self.input_text) + + def clear_inputs(self): + self.input_text = '' + self.separator = '' + self.joiner = '' class MyPage(HTML5Page): def __init__(self, view): super(__class__, self).__init__(view) - self.body.use_layout(Container()) layout = ResponsiveLayout('md', colour_theme='dark', bg_scheme='primary') @@ -59,17 +66,15 @@ def __init__(self, view): class InputForm(Form): - def __init__(self, view): - super(__class__, self).__init__(view, 'address_form') + def __init__(self, view, tr): + super(__class__, self).__init__(view, 'tr_input_form') inputs = self.add_child(FieldSet(view, legend_text='Enter data then click button')) inputs.use_layout(FormLayout()) - tr = TR(separator='\\s+', joiner='-') inputs.layout.add_input(TextInput(self, tr.fields.input_text)) inputs.layout.add_input(TextInput(self, tr.fields.separator)) inputs.layout.add_input(TextInput(self, tr.fields.joiner)) - self.tr = tr button = inputs.add_child(Button(self, tr.events.save)) button.use_layout(ButtonLayout(style='primary')) @@ -79,23 +84,37 @@ class MyPanel(Div): def __init__(self, view): super(__class__, self).__init__(view) - my_form = InputForm(view) + tr = TR.for_current_session() + my_form = InputForm(view, tr) self.add_child(my_form) - self.add_child(OutputBox(view, my_form)) + if tr.has_data: + self.add_child(P(view, text=tr.translated_string)) -class OutputBox(Widget): - def __init__(self, view, form): - super(__class__, self).__init__(view) - tr = TR.has_session_data() - if tr is not None: - import re - new_str = re.sub(tr.separator, tr.joiner, tr.input_text) - self.add_child(P(view, text=new_str)) +class ClearInputsPage(HTML5Page): + def __init__(self, view): + super(ClearInputsPage, self).__init__(view) + self.body.add_child(ClearInputsForm(view)) + + +class ClearInputsForm(Form): + def __init__(self, view): + super(ClearInputsForm, self).__init__(view, 'clear_inputs_form') + + inputs = self.add_child(FieldSet(view, legend_text='Clear all inputs')) + inputs.use_layout(FormLayout()) + + tr = TR.for_current_session() + button = inputs.add_child(Button(self, tr.events.clear_inputs)) + button.use_layout(ButtonLayout(style='primary')) + class MyUI(UserInterface): def assemble(self): + clear_inputs_view = self.define_view('/clear', title='Clear Inputs', page=ClearInputsPage.factory()) home = self.define_view('/', title='x marksthe spot', page=MyPage.factory()) self.define_transition(TR.events.save, home, home) + self.define_transition(TR.events.clear_inputs, clear_inputs_view, home) + diff --git a/Vagrantfile b/Vagrantfile new file mode 100644 index 0000000..2bfc2ce --- /dev/null +++ b/Vagrantfile @@ -0,0 +1,22 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : + +# To use vagrant on ubuntu: +# apt-get install vagrant vagrant-lxc vagrant-cachier +# cd +# vagrant up +# vagrant ssh + +Vagrant.require_version ">= 1.8.1" + +Vagrant.configure(2) do |config| + config.vm.box = "reahl/bionic64" + + config.vm.network "forwarded_port", guest: 8000, host: 8000, auto_correct: true + config.vm.network "forwarded_port", guest: 8363, host: 8363, auto_correct: true + + config.vm.provision "shell", privileged: false, inline: <<-SHELL + pip install reahl[all] + SHELL +end +