Re: Architecture question
mario ruggier <[email protected]>
| Newsgroups | gmane.comp.web.quixote.user |
|---|---|
| Message-ID | <[email protected]> |
On Dec 25, 2005, at 8:47 AM, Jeroen van Dongen wrote:
> Dear list,
>
> I've a question as to how to approach a particular (architectual)
> problem best and would like your advise. I'm using Quixote 2.3, in case
> that matters.
>
> For the sake of argument say I'm building a to-do list (of course the
> real problem is with something a bit more complex - I've choosen this
> example for its simplicity).
>
> I have two model-classes:
> - TodoItem -> has_many: Notes
> - Note
>
> Furthermore I have four ui classes:
> - TodoListUI -> list items, add item
> - TodoItemUI -> display item, edit item
> - NotesListUI -> list notes, add notes
> - NoteUI -> display note, edit note
>
> The Notes part is something I want to keep generic, so that I can
> easily
> associate notes with any type of object - not just with TodoItems.
>
> The user can access the following urls:
> - /todo/ -> TodoListUI -> lists all to do items
> - /todo/12/ -> TodoItemUI(12) -> shows todo item 12
> - /todo/12/update -> TodoItemUI.update(12, ...) -> updates item 12,
> redirects to /todo/12/
> - /todo/12/notes/ -> NotesListUI -> displays all notes related to item
> 12
> - /todo/12/notes/3/ -> NoteUI -> displays note 3 (which apperently
> related to item 12)
> - /todo/12/notes/3/update -> ...
>
> This is quite a 'restfull' layout I'd think. Now comes the issue. In
> this scenario the user gets a 'todo item view' with a link to 'notes'.
> So to view the related notes and work with them, he has to go to
> another
> page. In order to enhance the user interface, I want to offer a way to
> show, add, edit and delete notes from the 'todo item view' (i.e.
> inline). And there are various ways one could do that.
>
> I could refactor NotesListUI so that I can do something like (all given
> code is pseudo code - it's to illustrate, I don't expect it to run):
> """
> class TodoItemUI:
> def index():
> form = Form()
> form.add(TextField, 'todoitemlabel')
> form.add(TextField, 'todoitemdescription')
> form.render()
> NotesListUI.show_notes()
> """
>
> This gives scenario A. Now 'show_notes' could Inline a list of notes in
> the TodoItem page, showing part of each note, with 'add', 'edit',
> 'delete' etc. links linking directly to /todo/#/notes/#/edit, etc. This
> seems very clean to me, but makes that the user has to go to another
> page to edit a note - I'd rather make is so that the user can edit the
> notes inline as well.
>
> Meet scenario B: inline a list of forms, one for each note. Now the
> user
> can edit each note and save it. But what if he edits two notes? Or a
> note and the description of the item? That doesn't work, because he can
> only submit one form at at time.
>
> So lets do some more refactoring to get to scenario C:
> """
> class TodoItemUI:
> def create_form()
> form = Form()
> form.add(TextField, 'todoitemlabel')
> form.add(TextField, 'todoitemdescription')
> NotesListUI.add_notes(form)
> return form
>
> def index():
> self.create_form().render()
>
> def update():
> f = self.create_form()
> NotesListUI.update(f)
> TodoItem.update()
> redirect('to the note')
> """
> Now the NotesListUI is refactored so that it exposes a method that will
> add a set of HTML form fields for each note (probably delegating the
> generation of each individual note-entry to NoteUI). TodoItemUI tunnels
> the submitted form values to the NotesListUI, which for each note will
> call the NoteUI.
>
> The above approach (scenario C) seems best to me - but perhaps you
> folks
> have better ideas.
>
> Also it has at least one issue. What if I want to have a paragraph of
> text between the Todo-fields and the Notes in the 'todoitem' view?
> Should I add a 'rawhtml' widget to the forms library and insert that in
> between?
>
> Best regards,
> Jeroen van Dongen
It seems that in most cases you would want to read all the notes
together, but you would probably only want to modify 1 note at a time.
My feeling would be to just offer a link that will load the
corresponding edit view for the 1 note, whether separate or embedded
within the others notes, but rendered as a form instead.
Note that the quixote form handling seems to assume that you have only
one form per page. For form/widget rendering, you will have to either
provide the rendering yourself (i.e. do not call form.render()) or
override the various methods called by each widget's render().
mario