[Seaside] Ideas worth stealing
Todd Blanchard
tblanchard at mac.com
Sun Jun 1 18:45:32 UTC 2008
That is an interesting question - I've taken a run with magritte once
or twice and did not make satisfactory progress and abandoned it.
I found the method of defining the meta model in magritte to be rather
ponderous and awkward.
Not that it isn't expressive, but I don't know all the parts/mappings/
kinds of things - I spent all this time looking at the docs or
examples. Also the documentation is non-existent. Really, if you
want to get people to use magritte - STOP CODING AND START DOCUMENTING
- I don't have time to figure it out from the examples or pier or any
running code. I want docs and code snippets I can steal and modify. I
want them in a nicely indexed web site so I can find a solution to my
exact problem using google in about sixty seconds.
Note website for activescaffold: http://activescaffold.com
Click on documentation. Wow, everything I need to know right there.
Brilliant. Where is the equivalent resource for Magritte? Google
couldn't find it.
Most of what you need to define the magritte model is already in the
database schema - so can magritte just infer the fields and let me
just customize it's behavior?
The missing part in the database is the mapping of widgets and the
order or presentation of fields.
In the system I am doing (sells tickets to a new museum) there is
Order->OrderTransactions (subclassed to Purchase,Exchange,Return)-
>Tickets (actually two relations - tickets added, tickets removed)
The code to get a fully functioning back office/admin UI to edit this
entire network is below - there's very little of it. Most of the code
is just to customize elements - change labels for columns, change
column order, suppress presentation of some columns or relationships.
Why I picked Rails:
1) I already had an existing mysql database I had to use.
2) Client wanted a technology with a large local pool of talent he
could hire - robotcoop is nearby (spinoff of amazon.com) - they are
all rails and it is easy to hire people from there
3) I had a lot of UI that is back office and can be kind of ugyly/auto-
generated and only a little public UI (ticket purchase flow)
4) Rails has a number of scalable deployment recipes available - I'm
using apache->mongrel cluster. I will add capistrano to automate
upgrade deployments
5) I'm replacing an equivalent system written in a nightmare
combination of Java/Hibernate/Cocoon-js/xml-xslt/tomcat that nobody
wants to maintain. I can't learn that many languages - but I most
certainly can steal/translate logic and templates - it was easy to
translate jsp to rhtml templates.
For your amusement - the entirety of the order/ordertransaction/ticket
code is below - it does a two level master-detail view with ajax
updates in a single page. It took me almost no time at all to get
this working and the majority of the code you see is just appearance
tweaks or action disabling.
:
#model - (all of it - really)
class Order < ActiveRecord::Base
set_table_name 'orders'
has_many :order_transactions, :class_name =>
'OrderTransaction', :foreign_key => 'order_id', :dependent => :destroy
belongs_to :purchaseTransaction, :class_name =>
'TicketPurchase', :foreign_key => 'purchaseTransaction'
end
class OrderTransaction < ActiveRecord::Base
has_many :ticketsReturned, :class_name => 'Ticket', :foreign_key
=> 'returnTransaction', :include => [:price, :product], :dependent
=> :destroy, :order => 'sequence_number'
has_many :ticketsAdded, :class_name => 'Ticket', :foreign_key =>
'originatingTransaction', :include => [:price, :product], :dependent
=> :destroy, :order => 'sequence_number'
class TicketPurchase < OrderTransaction
end
class TicketExchange < OrderTransaction
end
class TicketReturn < OrderTransaction
end
class Ticket < ActiveRecord::Base
end
#controllers - tops is most complicated - remove create update and
delete abilities - add some action links (all of it)
class Admin::OrderController < AdminController
layout "admin"
active_scaffold :orders do | config |
config.actions.exclude :delete
config.actions.exclude :update
config.actions.exclude :create
config.action_links.add :resend_email, :label => 'Resend
Email', :type => :record, :position => false, :confirm => 'Resend
purchase confirmation email?'
config.action_links.add :exchange_tickets, :label => 'Exchange
Tickets', :type => :record, :position => :after, :crud_type => :update
config.action_links.add :refund_tickets, :label => 'Refund
Tickets', :type => :record, :position => :after, :crud_type => :update
list.sorting = {:date => 'ASC'}
config.list.columns =
[:date
, :commissionAccount
, :nameFirst, :nameLast, :emailAddress, :order_transactions]
config.list.per_page = 100
config.columns =
[:date
, :commissionAccount
, :nameFirst
, :nameLast
, :emailAddress
, :address1
, :address2, :city, :state, :zip, :country, :order_transactions]
end
end
class Admin::OrderTransactionController < AdminController
layout "admin"
active_scaffold :order_transaction do | config |
config.list.columns =
[:date
, :type, :channel, :payment, :credit, :ticketsAdded, :ticketsReturned]
config.actions.exclude :delete
config.actions.exclude :update
config.actions.exclude :create
end
end
class Admin::TicketController < AdminController
layout "admin"
active_scaffold :ticket do | config |
config.list.columns =
[:forGto
, :validForDate
, :product, :price, :status, :purchasePrice, :serviceCharge, :order]
config.list.per_page = 100
list.sorting = {:validForDate => 'ASC'}
columns[:validForDate].label = "Date"
columns[:product].label = "Description"
columns[:price].label = "Ticket"
columns[:purchasePrice].label = "Price"
columns[:serviceCharge].label = "Service Charge"
config.actions.exclude :delete
config.actions.exclude :update
config.actions.exclude :create
end
#views - auto-generated - no code at all
On Jun 1, 2008, at 12:47 AM, stephane ducasse wrote:
> todd
> do you think that magritte could help there?
>
> Stef
>
> On May 31, 2008, at 1:04 AM, Todd Blanchard wrote:
>
>> I watched the screencast. It is not the same thing. I think you
>> guys are missing something key in that project of yours.
>>
>> Active scaffold simply lets me point the app at a db and ZAM total
>> admin UI that looks nice with AJAX master detail editing. I can
>> then filter out attributes that people ought not to edit, apply
>> permissions, and decorate the app with task links.
>>
>> The demo shows app development. I didn't develop a thing apart
>> from specify some mappings because the database used weird and
>> inconsistent naming conventions.
>>
>> I also found it interesting that the app being developed in the
>> screencast didn't look nearly as sophisticated as the tools being
>> used to build it. I don't find that a good selling point.
>>
>> -Todd Blanchard
>>
>> On May 30, 2008, at 4:28 AM, James Robertson wrote:
>>
>>> Cincom is doing exactly that - combining the ActiveRecord pattern
>>> with scaffolding. Have a look here:
>>>
>>> http://www.cincomsmalltalk.com/userblogs/mls/blogView?showComments=true&printTitle=WebVelocity_alpha_screencast&entry=3388846573
>>>
>>> James Robertson
>>> Cincom Smalltalk Product Evangelist
>>> http://www.cincomsmalltalk.com/blog/blogView
>>> Talk Small and Carry a Big Class Library
>>>
>>>
>>>
>>>
>>> On May 30, 2008, at 3:13 AM, Todd Blanchard wrote:
>>>
>>>> With the idea that no good idea should go un-stolen, allow me to
>>>> introduce seaside fans to active scaffold http://
>>>> activescaffold.com.
>>>>
>>>> I am wrapping up a ruby on rails engagement with a client and
>>>> discovered this framework. I ended up using ROR because the
>>>> client had an existing mysql database and Squeak's mysql support
>>>> isn't so hot where rails is all about mysql, and I had only a
>>>> couple "flows" but a whole lot of plain old admin-CRUD to do and
>>>> rails excels at plain crud on mysql. With activescaffold - I had
>>>> to write very little code for the admin UI - a major plus because
>>>> this project is on a very tight timeline.
>>>>
>>>> Anyhow, activescaffold works with activerecord and infers a
>>>> really slick AJAX UI that supports sensible CRUD more or less
>>>> instantly. Once installed, you can go through and customize
>>>> views by adding actions links, filtering columns, and generally
>>>> overriding bits of logic to make it more task focused.
>>>>
>>>> It would be really cool to have a similar facility in Seaside.
>>>>
>>>> Cheers,
>>>> -Todd Blanchard
>>>> _______________________________________________
>>>> seaside mailing list
>>>> seaside at lists.squeakfoundation.org
>>>> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
>>>>
>>>
>>> _______________________________________________
>>> seaside mailing list
>>> seaside at lists.squeakfoundation.org
>>> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
>>
>> _______________________________________________
>> seaside mailing list
>> seaside at lists.squeakfoundation.org
>> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
>>
>
> _______________________________________________
> seaside mailing list
> seaside at lists.squeakfoundation.org
> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/seaside/attachments/20080601/dfd259f1/attachment-0001.htm
More information about the seaside
mailing list