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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.