ZEXPu((U OFS.FolderqUFolderqtqNt.}q(U_dav_writelocksq(Uvq(U PersistenceqUPersistentMappingqtq tq QUToDosq (Uwq (UProducts.ZPatterns.Specialistsq U SpecialistqtqtqQUidqUZPatternsExampleqU__ac_local_roles__q}qUsteveq]qUOwnerqasU_objectsq(}q(U meta_typeqU Specialistqhh u}q(hhhUDoersqu}q(hhhU Deliverablesqu}q (U meta_typeq!U DTML Methodq"Uidq#U main_src.stxq$u}q%(h!UImageq&h#UToDo.gifq'u}q((U meta_typeq)UFileq*Uidq+U zpatt.cssq,u}q-(h)U DTML Methodq.h+Udoc_htmlq/u}q0(h)h.h+U index_htmlq1uth$(Uxq2(UOFS.DTMLMethodq3U DTMLMethodq4tq5tq6Qh(Uyq7(h U Specialistq8tq9tq:Qh/(Uzq;(h3U DTMLMethodqQU index_htmlq?(U{q@(h3U DTMLMethodqAtqBtqCQh'(U|qD(U OFS.ImageqEUImageqFtqGtqHQUtitleqIUU_ownerqJ(]qKU acl_usersqLaUsteveqMth(U}qN(h U SpecialistqOtqPtqQQh,(U~qR(hEUFileqStqTtqUQu.vB((U PersistenceqUPersistentMappingqtqNt.}qU _containerq}qs.w((UProducts.ZPatterns.SpecialistsqU SpecialistqtqNt.}q(UgetToDosForDeliverableq(Uq(U#Products.PythonScripts.PythonScriptqU PythonScriptqttQU__ac_local_roles__q }q Usteveq ]q UOwnerq asU_objectsq(}q(U meta_typeqURackqUidqU defaultRackqu}q(U meta_typeqU DTML MethodqUidqU index_htmlqu}q(U meta_typeqU DTML MethodqUidqUaddNewToDoForm_htmlqu}q(hhhUaddNewToDo_htmlqu}q (hhhUaddToDoSnippet_htmlq!u}q"(hhhUdeleteInstances_htmlq#u}q$(hhhUtoDoSelectionTag_htmlq%u}q&(U meta_typeq'UScript (Python)q(Uidq)U getAllToDoIDsq*u}q+(h'h(h)U numberOfToDosq,u}q-(h'h(h)UgetToDoIdsForDoerq.u}q/(h'h(h)UgetToDoIdsForDeliverableq0u}q1(h'h(h)UgetToDosForDoerq2u}q3(h'h(h)hu}q4(U meta_typeq5UScript (Python)q6Uidq7U addNewItemq8u}q9(h5h6h7UdeleteSelectedInstancesq:u}q;(h5h6h7UgetToDosWithNoDeliverablequ}q?(h5U DTML Methodq@h7U!associateToDoWithDeliverable_htmlqAuth!(UqB(UOFS.DTMLMethodqCU DTMLMethodqDttQUdeleteInstances_htmlqE(UqF(hCU DTMLMethodqGttQh.(UqH(hU PythonScriptqIttQU__provider_registry__qJ}qKU index_htmlqL(UqM(hCU DTMLMethodqNttQh2(UqO(hU PythonScriptqPttQh(UqQ(hCU DTMLMethodqRttQh%(UqS(hCU DTMLMethodqTttQh(UqU(UProducts.ZPatterns.RackqVURackqWttQh*(UqX(hU PythonScriptqYttQU_dav_writelocksqZ(Uq[(U Persistenceq\UPersistentMappingq]ttQU!associateToDoWithDeliverable_htmlq^(Uq_(hCU DTMLMethodq`ttQhUToDosqaUgetToDoIdsForDeliverableqb(Uqc(hU PythonScriptqdttQh8(Uqe(hU PythonScriptqfttQU__allProviders__qg]qhh,(Uqi(hU PythonScriptqjttQUassociateToDoWithDeliverableqk(Uql(hU PythonScriptqmttQh<(Uqn(hU PythonScriptqottQUrackListqp]qq(hU(hVURackqrttQaUtitleqsU To Do ManagerqtUdeleteSelectedInstancesqu(Uqv(hU PythonScriptqwttQh(Uqx(hCU DTMLMethodqyttQu.x(((UOFS.DTMLMethodqU DTMLMethodqtqNt.}q(UtitleqUU__name__qU main_src.stxqU__ac_local_roles__q}q Usteveq ]q UOwnerq asUglobalsq }qUrawqT'ZPatterns, an Advanced Zope Framework (C) Steve Spicklemire, 2000 [0] A simple Example: ToDos/Deliverables/Doers. Let's say we have some "Deliverables" that are concrete expectations that must be met by a certain time. They each have a well defined description, and associated tasks that must be completed in order to satisfy the requirements of the Deliverable. These tasks are "ToDos". Naturally, in order for a ToDo to be done, we need a Doer, an individual or organization that will actually do the thing specified in the ToDo. We want these objects to interact and behave 'correctly' no matter how they integrate into some visible application. They may be part of a defect tracking system, or a school scheduler, or a project management system. So far we've identified Deliverables, ToDos and Doers as roles in our system. Are we missing any? Probably. Who is responsible for each Deliverable? Is the Deliverable just a part of some larger project? What project? Who is responsible for that? Obviously when you're really solving a BIG problem, these are the sorts of questions that need to be asked at this stage, and the number of roles, classes and interactions that you may wind up with could be quite large. In order to keep this example manageable, we're going to resist the temptation to make it completely realistic, keeping in mind that our primary goal is to illustrated methods and concepts, and not to tell you how to solve *your* problem. Deliverables have: name, date, description, status and a list of ToDos. Deliverables also need to be able to display themselves (index_html), change their values (editInstance) and display forms for users to manage them (editInstance_html, editInstanceForm_html). ToDos have: name, description, status, a Doer, and a Deliverable. ToDos also need to be able to display themselves (index_html), display a brief summary (displayBriefInfo_html), change their values (editInstance), and display forms for users to modify their content (editInstanceForm_html, editInstance_html). Doers have: name, email and a list of ToDos. Doers must also be able to display themselves (index_html), change their values (editInstance), and display forms for users to modify their content (editInstanceForm_html, editInstance_html). Here is an object diagram using the notation and ideas from Coad [1] that displays the objects and relationships we've discovered so far:
How Does it Work? Each of our classes will be implemented as a ZClass [4]. This ZClass will have attributes and methods that match the attributes and methods from the object model. It's worthwhile to separate out methods and attributes that reflect different application domains. For example, attributes like 'description' and 'dueDate' are clearly problem domain (PD) attributes. On the other hand a method like 'index_html', the default display method, is a user interface (UI) domain method. It's good to keep in mind a separation between the UI domain and the PD, so that later we can freely modify the UI without concern for affecting the actual logic of the system. In order to clarify this distinction we will name all UI domain methods with a trailing '_html' so that it's clear that they belong to the UI domain. It's also good to group attributes by domain. (In this example all the attributes are really PD attributes). One easy way to accomplish such grouping is to put all related attributes into a single property sheet. This way those properties can be managed together. The connections between the classes are references. For example, the Deliverable has a list of ToDos. A ToDo has a Doer, and a Doer can have many ToDos. In the object model these references are drawn as a line, with a name, and some enumeration constraint (e.g., 1-n, or 1, or 0-n). In ZPatterns these lines are usually implemented 'under the covers', so that the application logic doesn't need to know about them, but the application integrator does. Let's see how we might implement these connections using the ZPatterns framework. There are some new terms that are introduced in ZPatterns. Before we begin it's worth taking a little time to introduce these ideas. * _DataSkin_: A DataSkin is a mixin Python class that allows objects that subclass from DataSkin to get their attributes from a DataManager. The ZClasses we use to build a ZPatterns based application will inherit from ZPatterns::DataSkin. * _PlugIn_: A PlugIn is a configurable DataManager that is used to handle some aspect of the data sources for DataSkins. (e.g., a SkinScript plugin can handle providing attributes to a DataSkin) * _Specialist_: A Specialist handles the interaction between the rest of the system in objects of a particular (possibly abstract/virtual) type. * _Rack_: A Rack is an object that manages DataSkins. It acts as their DataManager, and a keeper of data 'PlugIns' that are used to control objects of a particular class. * _SkinScript_: SkinScript is a simple language used to impliment several important classes of data management. It is "documented":http://www.zope.org/Members/pje/Wikis/ZPatterns/SkinScriptSyntax on the "ZPatterns Wiki":http://www.zope.org/Members/pje/Wikis/ZPatterns. Fitting the Pieces Together One way to implement this system with ZPatterns is to use the "Specialists" class. Each type of object will be managed by a Specialist. In order to keep things simple we can call each of the Specialists by the name of the objects they manage. (e.g., 'Doers' would be the name of the Specialist that manages objects of the 'Doer' class... etc.) Specialists usually have one or more "Racks" that are the real DataManagers for the DataSkins that the Specialist manages. Racks use PlugIns to implement data management (e.g., getting and setting of various attributes, and handling certain events for the DataSkins). In order to keep this concrete let's look at an example. Doers have names and email addresses. How are those names and email addresses actually stored? In "traditional" Zope development a developer would decide ahead of time how the attributes would be stored,then they would include the appropriate connections to carry out that plan. But what if someone else wanted to *reuse* their code, but had a different idea of where the data should be stored. (Joe likes SQL, Jim wants LDAP, Sue prefers ZODB). ZPatterns deliberately separates the application logic from the grungy details of data storage. When the application wants a Doer, it asks the 'Doers' Specialist for a Doer with a particular ID. The Doers Specialists then goes to it Rack(s) and tries to find a Doer that can satisfy the request. If it finds one, it returns it, otherwise it returns "None", and the application has to decide what to do about it. The Rack knows how the Doers are really stored, and has PlugIns to get data (e.g., email addresses, or names) for the Doers attributes. One of the principles of object oriented design is "Demeter's Law" [3] which basically says that each object/class should only touch other objects/classes that are 'nearby' in an object diagram sense. This means that as we're designing applications/classes it's important to keep in mind "who I know", "what I know" and "what I do" as guiding principles that determine what information is kept in various classes, and what methods various classes provide. Following this principle, it's easy to see that things that relate to the collection of all the Deliverables belong to the Deliverables Speciailist, while things that relate to a particular deliverable belong to the Deliverable object itself. For example, say I'm a ToDo and I need to show a list of the possible Doers in the form I use to display myself. I should call the Doers Specialist and ask it to give me a snippet of HTML that would display such a list. In his way, if the Doers implimentation changes I still have a hope of getting a reasonable widget to display a choice of Doers in the editing form of a Deliverable. But wait... the ToDo is also associated with a Doer. What if the programmer wants:: theEmail = aToDo.my_doer.email (1) if aToDo really only has a my_doer_id, then you might think they would need to code something like this:: theEmail = Doers.getItem(aToDo.my_doer_id).email (2) But this is a little ugly since it requires lots of getItem'ing and monkey business. Can we achieve (1) without needing to actually store objects as attributes of other objects? Yes! This is one of the cool things about ZPatterns. We can create a "generic attribute provider" in the form of what's called a SkinScript PlugIn. In the PlugIns tab of the Doers Rack we can set up the following SkinScript:: WITH Doers.getItem(self.my_doer_id) COMPUTE my_doer = RESULT or NOT_FOUND The form (1) works automatically whenever aToDo is used from the ToDos Rack. This same idea can be used to provide "myToDos" and "myDoers" etc. properties for each of these object types, so that the developer doesn't need to bother with exactly how these things are connected, but rather just worries about getting the problem domain logic, and web presentation working. [0] This document is being prepared as part of a larger effort. All rights reserved. [1] "Object Models: Strategies, Patterns, & Applications":http://www.amazon.com/exec/obidos/ASIN/0138401179/o/qid=976714938/sr=8-3/ref=aps_sr_b_1_5/106-1778017-9719665 , Coad, North and Mayfield, Yourdon Press [2] "The Art of Computer Programming":http://www.amazon.com/exec/obidos/ASIN/0201485419/o/qid=977584683/sr=8-1/ref=aps_sr_b_1_3/107-2426466-4196519, D.E. Knuth, Addison-Wesley Pub Co [3] "Demeter's Law":http://www.ccs.neu.edu/home/lieber/LoD.html [4] "ZClasses are described in the Zope Book":http://www.zope.org/Members/michel/ZB/CustomZopeObjects.html qU_varsq}qu.y/((UProducts.ZPatterns.SpecialistsqU SpecialistqtqNt.}q(U_dav_writelocksq(Uq(U PersistenceqUPersistentMappingqttQU getAllDoerIDsq (Uq (U#Products.PythonScripts.PythonScriptq U PythonScriptq ttQUidq UDoersqU__ac_local_roles__q}qUsteveq]qUOwnerqasU__provider_registry__q}qU addNewDoerq(Uq(h U PythonScriptqttQUaddNewDoerForm_htmlq(Uq(UOFS.DTMLMethodqU DTMLMethodqttQU__allProviders__q]qUdeleteInstances_htmlq(Uq (hU DTMLMethodq!ttQUgetDoersForDeliverableq"(Uq#(h U PythonScriptq$ttQUgetDoersForToDoq%(Uq&(h U PythonScriptq'ttQU_objectsq((}q)(U meta_typeq*U DTML Methodq+Uidq,U index_htmlq-u}q.(U meta_typeq/U DTML Methodq0Uidq1hu}q2(h/h0h1UaddNewDoer_htmlq3u}q4(h/h0h1UdeleteInstances_htmlq5u}q6(h/h0h1UdoerSelectionTag_htmlq7u}q8(U meta_typeq9UScript (Python)q:Uidq;U getAllDoerIDsq(h9h:h;UdeleteSelectedInstancesq?u}q@(h9h:h;h"u}qA(h9h:h;h%u}qB(U meta_typeqCURackqDUidqEU defaultRackqFuth3(UqG(hU DTMLMethodqHttQUrackListqI]qJ(UqK(UProducts.ZPatterns.RackqLURackqMttQaU index_htmlqN(UqO(hU DTMLMethodqPttQUtitleqQU Doer ManagerqRU defaultRackqS(hK(hLURackqTttQh7(UqU(hU DTMLMethodqVttQUdeleteSelectedInstancesqW(UqX(h U PythonScriptqYttQu.z((UOFS.DTMLMethodqU DTMLMethodqtqNt.}q(U_dav_writelocksq(Uq(U PersistenceqUPersistentMappingqtq tq QU__ac_local_roles__q }q Usteveq ]qUOwnerqasU__name__qUdoc_htmlqUtitleqUDumb ZPatterns Example.... DocsqUglobalsq}qUrawqU<!--#var title_or_id--> qU_varsq}qu.{((UOFS.DTMLMethodqU DTMLMethodqtqNt.}q(UtitleqUUrawqT

 

 

We have Doers, Deliverables and ToDos.

The object model here is really quite simple. For every Deliverable there can be zero or more ToDos. For each Doer there can be zero or more ToDos. There is more explaination here. It's clear that this example needs more work to make it truly helpful, but at least you can play with different data storage systems (RDBMS, ZODB etc.) and poke around to see how it can be done...

 

Good Luck!

Steve

qU__ac_local_roles__q}q Usteveq ]q UOwnerq asUglobalsq }qU__name__qU index_htmlqU_varsq}qu.|*((U OFS.ImageqUImageqtqNt.}q(UsizeqL10552L UdataqT8)GIF87avf3̙f3f3ffffff3f3333f333f3f3̙f3̙̙̙̙f̙3̙ffffff3f3333f333f3̙f3̙̙f3̙f3ff̙ffff3f33̙33f333̙f3ffffff3ffff̙fff3fffffff3ffffffffffff3fff3f3f3f3ff33f3ffffff3f3333f333333̙3f3333333f3333f3f3f3ff3f33f33333333f333333333f333f3̙f3f3ffffff3f3333f333f3wUD"wUD"wUD"ݻwwwUUUDDD""",vH*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝ U#7a_xO|1 ^l!c)22]gO󾁖=.~>腥O8TGpw\/=iG$n|brq;/@+ {/W;P6^~ Fvy˧o/|g~@y2kh]]xf'Dw ~ $^`I^"^s^n؃Wd7Va^.[>`?yv3K6V=hWm+WiPgT?MU@Y:#ve)#ֹhUFay"u^)&)*pi":ADky*Ю8faȖ)ji?J ʙ-ez*{PR'˭@ [/i&fAޛ_+J!&'/ij/o)h>*r\0N\2Zqfj2c!1$[vd /}kpm'V.FjRn[9KĢ;tIS\.=/'{Q 596=/ƀ{\H{k?9|TrMWZ֌;!9Foy!q~̶"q/fz؈#+6w?I7jLvkƁ`t 2Tz>Kډ9&ӻxyg ?2.q]ܵ8≢ރoaydyv#Ph|P7QA Z JAV|*dĩJ0( ><&V CrX: a,f6 L9H H"HL&:PH*ZX̢.z` H2hL6pH:x̣> IBL"F:򑐌$8JZ̤&7NzgT8PJ)MHERVT+'rZ-qY&їT.8`(409f:Ь$3dWQEIMps7ob,'9{sE\NOSt;z&g\I=Dr&B R9D'JъZ}c\O! 4/([!%KGDa[;]0TnѦ|M`j 6=KFԓD|PST<ͤBJT: ^im](@uGU~qYH/5oNW#4׋UlY׻敫z%,_JT+O2VĒʧlbqBųkcJNdL8J#JZA[m pkQ-]Ӛsr#2nt2zEv{J9yk׺V-[TMvB+3e/[>~x.D;Aoz7iWz dP,ƤO0m(<JmTKKZ8e!PT8f{QY>lcq/QQ^8{Y9k|vJsn|BN#]C%Bpd&KW5|EO6[yuik )evhsLIcbi;5qsPW:ZHfߵXAGd~-ʉ.x!wثw\w%3Sy8k>8g3`Z׽Nvw]Ѵ+ܿxsG0o +WZD~o4yӏsyY=(Oe&#iUȦlg$! {7rilueYoHaxwz t7x#G(h,;6{]u'fZlfw_'XW,fy*s yhsG=(x|c^H r$sK8w=ez/vsxs>ׁ\xi`W[wU*ys|gQq#JMw*uXjI&j5tjZ8_J]pmgYTu/҆lyUorgC{ 戰'qX->H3[rMN%JXz8"*gH׍hyW|{rT!VK숆I(i}J~R<⊾Wt~Ӈ6}4XV>؈u9x$qF{B$6[QƥrOeWh)A%PHΈ8T׏h]2K\y8:7&6It(#a#'a)uEf08)DƔiÃ搿`ȗpFoZnzͨIYBى4))rٖz)HUӇH"K@o %9 ٛٔGN9雱XٜIƙ@9p툝)yOɏ`G1& fHSц9}9FyB+vǟ֠州 i,@~dZ& Naى9JJSyYI~n9k(٢!)AמI^BɀNwP:DS*,Gʢ" aW:IP1**甋[ԈhQæOɣ ֥#>hNq+b#X%v~[`KY${JH9JZJ0xuYh1(@dg$(}yŲEw6 a$Ij8{+ɪxg"|(=;fƚ$ƇX:|9hIjc9Uc?)j'} !y4hiɒɃr1m0zQJ7(A3–ju j ȑ$%{, +l;Mjz 3)5X"SnZuZ[(9:3 S+v9Q%:WVd"3௕\0 rIRUZv MwQڗRy+i Z~KΙvQVOTJ^˫FH`5yQ9b\yz9's yd렖Ḡٱyiʂf77峑Xj{[MkvSᨉ9hZ*~}uyLVFxުz-KxEVה 'YȺzv*:愸 >h|kX%8Jij;C[ΫǼk»v;#۳0i/2(ַ蚴嫮W1| z/ǵ`rMՙ /J<-۝a"z\FYƨ.<۴)i4(n\ 8$&ϙ&?DpGm ݭԈ5)z 3!IlŲۜoَ|;MS؊7-cLl֢iͅMB lӘֽŀ 벩Ӯզ̂m*wMhh`.]o祋۴ݶ0=ّMyyh=] -͙+n[DDѡ07UT]Hlg]̌x̌"N|/~l<ͭԯ"gKykε3ZYΰEp@r<Q˜h)< mg%! l, ڕ&Ek?}~M0*J?s˽-+[f>̚׺NN\KٌX.$Z^\~s-1]p,ުα<>jn[<\׃LQDs>4(ފ؀|}Kֈ=A:⩺ > r ᳎TodR`].]ݧޠ]1ݢ>\Hnx/,^<(o;% ٌ Ɋ4'~~ ͜g.+^^m}eΥdN[&i׵׽&5kmi=?OhOseU k[ՙjXbO4)}{*~awoOuOˡpp= Ͽzgd==38_}zyY8K<٫ټe˜ߚ_} |NG߉_^wA @ D *t!B-^ĘQF;rRH%#fzc  lj&|xPE+)ť U҃C4*TF~eXe-VZBuUz?-,(Jm~LW`*F|gFܧO}X3hX7_Gik۩Qޣ[of͛9i|zj&KG>8O/o\sӭ|];uoOxx̙G_|G<~;`W/$+0ATP-k0@*d B1NC 9Bp5?q،sQB?k4jqtNTQѸ"iDG,r(%$H3L1$L3D3M5I8E,k9.SbO²4$ 7mPF{Կ;4+tLÛTJ7SSPwU,-UaeUϵL5b\G&YLZ?Fݔ]x[&ycWfwۛwyga__h6Zi:i}K:kǵk:HlA6;9Vm(v;妛nnPovY_pQqq''Pr/sc{s<䃙O(.« sTtwŸ ' |)^kF(> z+`">hP^$yCAy:Qr2e*%X) D4r2l Ksad&L#&̚d?AܣS2l XJCHD#3;OhtXSCt ,#@/Mњt Ґ ]*UM尣('={ފGIGِoo,u),[ӻ͔tMS=MOZ6F=dQj5.irԨz RU/wUT*WS.(T%kj;uemu*;5v*^WՕ_X^#aߕXŮc!;-Nn\e1;͂[lYC 9͎V1[CmjU-Ӯc0cZkSZV }mc["v]o(ܷ6Y;5,\&usNjŮNZW7UYw{5U;yMnzI*GBK_DڷE"~7{.v2x,̲9Z.L k-b]Ύ"s)ĝ}1lR2zJ񃏋c܆Kg9$Gw'TMtJ W+c*X?A'cO{nHC$<6tZѡS~hCGp-ٲa2BI~ $.a nn,e'Z?"hˬdO eʘ~֫_f73J|?#H?aZvucP'xRv]hwx q[{ۂ rk{sM v,ܮw{{w~ |n-4ׄ5 kOeǸ ֆw7֎>y~h:GG|OlQާHƀbOx‚0:K9 I3po0iGЈV4٤S}O=6;CD^Р9:ǫcR_̪rhlփ!N{3_9A􅌽a?ZxixQa+ɵ\볹͒/nr5H> 5+?M (D9 T[6;e{:Y? Y`ZA*404ACAAT$l7  A#<ءcth39J2!;>a>ދۑ 0Í)B˿8c z8c&tôSA=D[ F{79%<6,ܓ@H' :l:X @P!ĥB b ºC6C;BQDHřE E]EZE_EŠEb 8/e\c't)g h,ghK=.l> $5Fj\: Hö tTii˾퓥[y4;lQT b;?Pc},7sFB)z?z)xuM$C ޓHrC@yEV2 G*HiLɛZk FdfI|HjIzIIII|I,J Ȟ !M5ϴ';NܞGĿ:B3CŁ IƜ;?Cj: <\h'D z(N [TNL,ij6,őfHWdcB lPlTOprN,Qb Q"Q=RIhL'Ό8YF KAd9<Qu z'{Q5MDE:GړڄMoT#ڤٳ,l{ SB=29P̽ ݣΟ/N(;5a>Z3~(p"B=TGQ4LMѳlDNk4f+;{,7eϥ: <4@IeG"U%5R(QE[@O`M϶+iQ\Ϸ?JX P$P k@UZUxb]%~ 4U I ]U/mЦ$ըxE\B$Qyrm FX*XY\K^\{yTQf0}}Ls!u$XSXzA|>ՔGRRiP(ZS3Wg{":O w1|VDU4FZ:ZM;9æTz4։WN Qe@bUXTB{K$p?5幣x W;aT)\\-ZXSOTíV(dd@cBN]dDcl!X#.dzd&aGddedMedP>1Q>e[0ie|ne/eH {Կ;YZڱKfe^Ǜf]2R 1}3XF;qU__ac_local_roles__q}q Usteveq ]q UOwnerq asU__name__q UToDo.gifqU content_typeqU image/gifqUtitleqhU preconditionqUUwidthqU477qUheightqU630qu.}((UProducts.ZPatterns.SpecialistsqU SpecialistqtqNt.}q(U_dav_writelocksq(Uq(U PersistenceqUPersistentMappingqttQUidq U Deliverablesq U__ac_local_roles__q }q Usteveq ]qUOwnerqasUdeliverableSelectionTag_htmlq(Uq(UOFS.DTMLMethodqU DTMLMethodqttQU_objectsq(}q(U meta_typeqU DTML MethodqUidqU index_htmlqu}q(U meta_typeqU DTML MethodqUidqUaddNewDeliverableForm_htmlqu}q(hhhUaddNewDeliverable_htmlq u}q!(hhhUdeleteInstances_htmlq"u}q#(hhhhu}q$(U meta_typeq%UScript (Python)q&Uidq'U addNewItemq(u}q)(h%h&h'UdeleteSelectedInstancesq*u}q+(h%URackq,h'U defaultRackq-u}q.(U meta_typeq/UScript (Python)q0Uidq1UgetAllDeliverableIDsq2uth (Uq3(hU DTMLMethodq4ttQU__allProviders__q5]q6h((Uq7(U#Products.PythonScripts.PythonScriptq8U PythonScriptq9ttQU__provider_registry__q:}q;U index_htmlq<(Uq=(hU DTMLMethodq>ttQUrackListq?]q@(UqA(UProducts.ZPatterns.RackqBURackqCttQah"(UqD(hU DTMLMethodqEttQUtitleqFUDeliverable ManagerqGUgetAllDeliverableIDsqH(UqI(h8U PythonScriptqJttQU defaultRackqK(hA(hBURackqLttQUdeleteSelectedInstancesqM(UqN(h8U PythonScriptqOttQh(UqP(hU DTMLMethodqQttQu.~~((U OFS.ImageqUFileqtqNt.}q(UsizeqL3515L UdataqT body { background: #FFFFFF; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10pt; margin-left: 20px; margin-top: 20px; color: #000000;; } H1, H2, H3, H4, H5, H6 { font-family: Verdana, Arial, Helvetica, sans-serif; font-weight: bold; color: #000000; } H2 { font-size: 16pt; margin-top: 0px; margin-bottom: 0px;} CODE, PRE { font-family: monospace; font-size: 10pt } LI { font-size:10pt; font-family:Verdana, Arial, Helvetica, sans-serif } P { font-size: 10pt; font-family: Verdana, Arial, Helvetica, sans-serif; margin-left: 3pt; } DD { font-size: 10pt; font-family: Verdana, Arial, Helvetica, sans-serif; margin-left: 3pt; } .plain { font-size: 10pt; font-family: Verdana, Arial, Helvetica, sans-serif; font-weight: bold; } .copyright { font-size: 10pt; font-family: Verdana, Arial, Helvetica, sans-serif; text-align: center; } .globalmenu { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10pt; text-decoration: none; color: #FFFFFF; } .welcome { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10pt; font-weight: bold; margin-top: 4pt; text-decoration: none; color: #000066; } .path { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10pt; text-decoration: none; color: #000066; font-weight: bold; } .welcomelink { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10pt; color: #000000; font-weight: bold; } .lefttitle { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10pt; color: #000000; font-weight: bold; } .headline { font-size: 13pt; margin: 2pt; font-family: Verdana, Arial, Helvetica, sans-serif; color: #000000; background: #6699CC; font-weight: bold; font-style: italic; } .byline { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10pt; color: #000000; font-weight: bold; margin-left: 10pt; } .newsitem { font-size: 10pt; font-family: Verdana, Arial, Helvetica, sans-serif; color: #000000; margin-left: 10pt; } .extras{ font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10pt; color: #000000; font-weight: bold; margin-left: 10pt; } .righttitle { font-size: 13pt; font-family: Verdana, Arial, Helvetica, sans-serif; color: #FFFFFF; background: #6699CC; text-align: center; font-weight: bold; margin: 2pt; } A.righttitle { color: #FFFFFF; text-decoration: none; } .productheader { font-size: 13pt; font-family: Verdana, Arial, Helvetica, sans-serif; color: #FFFFFF; background: #6699CC; text-align: left; font-weight: bold; margin: 5pt; } .producttitle { font-size: 13pt; font-family: Verdana, Arial, Helvetica, sans-serif; color: #000000; background: #FFFFFF; text-align: left; font-weight: bold; margin: 2pt; } .right { font-size: 10pt; font-family: Verdana, Arial, Helvetica, sans-serif; margin-left: 3pt; } .listheader { color: #606060; font-weight: normal; text-align: left; font-size: 10pt; font-family: Verdana, Arial, Helvetica, sans-serif; margin-left: 0px; margin-top: 0px; } .listheader_selected { color: #000000; font-weight: bold; text-align: left; font-size: 10pt; font-family: Verdana, Arial, Helvetica, sans-serif; margin-left: 0px; margin-top: 0px; } .listheader_reverse { color: #606060; font-weight: bold; text-align: left; font-size: 10pt; font-family: Verdana, Arial, Helvetica, sans-serif; margin-left: 0px; margin-top: 0px; } .listitem { text-align: left; font-size: 10pt; font-family: Verdana, Arial, Helvetica, sans-serif; margin-left: 0px; margin-top: 0px; } qU__name__qU zpatt.cssq Utitleq UU content_typeq Utext/cssq U preconditionq UU__ac_local_roles__q}qUsteveq]qUOwnerqasu.((U#Products.PythonScripts.PythonScriptqU PythonScriptqtqNt.}q(U func_codeq(cShared.DC.Scripts.Signature FuncCode qoq}q(U co_varnamesq (Udeliverable_idq Uhitsq Uidq UtheToDoq U $loop_watcherqU $read_guardqU $write_guardqU$guardqtqU co_argcountqKubU_paramsqUdeliverable_idqh UgetToDosForDeliverableqU__ac_local_roles__q}qUsteveq]qUOwnerqasU_dav_writelocksq(Uq(U PersistenceqUPersistentMappingqtq tq!QU_bodyq"Uhits=[] for id in container.getAllToDoIDs(): theToDo=container.getItem(id) if theToDo: if theToDo.deliverableID == deliverable_id: hits.append(theToDo) return hitsq#U_tq$(hN(KKKKUt }|t }t }t }g}x|tidrf}|ti|}|o7||i|jo||i|nn|qCW |SdSq%(NKtq&(h U containerq'U getAllToDoIDsq(h UgetItemq)h U deliverableIDq*h Uappendq+hhhhtq,hUScript (Python)q-hKU   q.)tN}q/tq0U _bind_namesq1(cShared.DC.Scripts.Bindings NameAssignments q2oq3}q4U_asgnsq5}q6(Uname_containerq7h'U name_subpathq8Utraverse_subpathq9U name_contextq:Ucontextq;U name_m_selfqNU Python_magicq?UN q@u.((UOFS.DTMLMethodqU DTMLMethodqtqNt.}q(U_dav_writelocksq(Uq(U PersistenceqUPersistentMappingqtq tq QU__ac_local_roles__q }q Usteveq ]qUOwnerqasU__name__qUaddToDoSnippet_htmlqUtitleqUUglobalsq}qUrawqUToDo Name ToDo Description Doer qU_varsq}qu.((UOFS.DTMLMethodqU DTMLMethodqtqNt.}q(U_dav_writelocksq(Uq(U PersistenceqUPersistentMappingqtq tq QU__ac_local_roles__q }q Usteveq ]qUOwnerqasU__name__qUdeleteInstances_htmlqUtitleqUUglobalsq}qUrawqU

Deleting Instances

Your ToDos have been deleted.

qU_varsq}qu.((U#Products.PythonScripts.PythonScriptqU PythonScriptqtqNt.}q(U func_codeq(cShared.DC.Scripts.Signature FuncCode qoq}q(U co_varnamesq (Udoer_idq Uhitsq Uidq UtheToDoq U $loop_watcherqU $read_guardqU $write_guardqU$guardqtqU co_argcountqKubU_paramsqUdoer_idqh UgetToDoIdsForDoerqU__ac_local_roles__q}qUsteveq]qUOwnerqasU_dav_writelocksq(Uq(U PersistenceqUPersistentMappingqtq tq!QU_bodyq"Uhits=[] for id in container.getAllToDoIDs(): theToDo=container.getItem(id) if theToDo: if theToDo.doerID == doer_id: hits.append(id) return hitsq#U_tq$(hN(KKKKUt }|t }t }t }g}x|tidrf}|ti|}|o7||i|jo||i|nn|qCW |SdSq%(NKtq&(h U containerq'U getAllToDoIDsq(h UgetItemq)h UdoerIDq*h Uappendq+hhhhtq,hUScript (Python)q-hKU   q.)tN}q/tq0U _bind_namesq1(cShared.DC.Scripts.Bindings NameAssignments q2oq3}q4U_asgnsq5}q6(Uname_containerq7h'U name_subpathq8Utraverse_subpathq9U name_contextq:Ucontextq;U name_m_selfqNU Python_magicq?UN q@u. ((UOFS.DTMLMethodqU DTMLMethodqtqNt.}q(U_dav_writelocksq(Uq(U PersistenceqUPersistentMappingqttQU__ac_local_roles__q }q Usteveq ]q UOwnerq asU__name__qU index_htmlqUtitleqUToDo Management PageqUglobalsq}qUrawqT

ToDo List

 ToDoDescriptionDoerDeliverableDone?
  ">()   ">   Done!No
Sorry.. no "to do"s!

Back To Main App qU_varsq}qu.((U#Products.PythonScripts.PythonScriptqU PythonScriptqtqNt.}q(U func_codeq(cShared.DC.Scripts.Signature FuncCode qoq}q(U co_varnamesq (Udoer_idq Uhitsq Uidq UtheToDoq U $loop_watcherqU $read_guardqU $write_guardqU$guardqtqU co_argcountqKubU_paramsqUdoer_idqh UgetToDosForDoerqU__ac_local_roles__q}qUsteveq]qUOwnerqasU_dav_writelocksq(Uq(U PersistenceqUPersistentMappingqtq tq!QU_bodyq"Uhits=[] for id in container.getAllToDoIDs(): theToDo=container.getItem(id) if theToDo: if theToDo.doerID == doer_id: hits.append(theToDo) return hitsq#U_tq$(hN(KKKKUt }|t }t }t }g}x|tidrf}|ti|}|o7||i|jo||i|nn|qCW |SdSq%(NKtq&(h U containerq'U getAllToDoIDsq(h UgetItemq)h UdoerIDq*h Uappendq+hhhhtq,hUScript (Python)q-hKU   q.)tN}q/tq0U _bind_namesq1(cShared.DC.Scripts.Bindings NameAssignments q2oq3}q4U_asgnsq5}q6(Uname_containerq7h'U name_subpathq8Utraverse_subpathq9U name_contextq:Ucontextq;U name_m_selfqNU Python_magicq?UN q@u.((UOFS.DTMLMethodqU DTMLMethodqtqNt.}q(U_dav_writelocksq(Uq(U PersistenceqUPersistentMappingqtq tq QU__ac_local_roles__q }q Usteveq ]qUOwnerqasU__name__qUaddNewToDoForm_htmlqUtitleqUAdd New ToDo FormqUglobalsq}qUrawqT

Add New ToDo

ToDo Name
ToDo Description
Doer
Deliverable
qU_varsq}qu.((UOFS.DTMLMethodqU DTMLMethodqtqNt.}q(U_dav_writelocksq(Uq(U PersistenceqUPersistentMappingqtq tq QU__ac_local_roles__q }q Usteveq ]qUOwnerqasU__name__qUtoDoSelectionTag_htmlqUtitleqUGet a Select tag for ToDos... qUglobalsq}qUrawqUqU_varsq}qu.((UProducts.ZPatterns.RackqURackqtqNt.}q(U_dav_writelocksq(Uq(U PersistenceqUPersistentMappingqttQUidq U defaultRackq U__ac_local_roles__q }q Usteveq ]qUOwnerqasU_objectsq(}q(U meta_typeqULink to parent Data Plug-insqh USpecialistPlugInsqu}q(hUPersistent Sheet Providerqh UPersistentSheetsqu}q(hU&Persistent Internal Attribute Providerqh UPersistentAttributesqu}q(U meta_typeqUScript (Python)qUidqU getAllItemIDsqu}q (U meta_typeq!USkinScript Methodq"Uidq#UdynamicAttributesq$utq%U__allProviders__q&]q'((Uq((U!Products.ZPatterns.SheetProvidersq)U SheetProviderq*ttQ(Uq+(U%Products.ZPatterns.AttributeProvidersq,UAttributeProviderq-ttQcProducts.ZPatterns.SkinScript.Components Compute q.NRq/}q0(h#UdynamicAttributes, line 1q1U Attributesq2]q3(UmyDoerq4cProducts.ZPatterns.Expressions Expression q5NRq6}q7Uexprq8URESULT or NOT_FOUNDq9sbtaU_fromexq:h5NRq;}q)Utitleq?UU _proxy_rolesq@)UlinenoqAKUattrlistqB]qCh4aubh.NRqD}qE(h#UdynamicAttributes, line 3qFh2]qG(U myDeliverableqHh5NRqI}qJh8URESULT or NOT_FOUNDqKsbtah:h5NRqL}qMh8U1Deliverables . getItem ( self . deliverableID ) qNsbh>)h?Uh@)hAKhB]qOhHaubeh(UqP(UProducts.ZPatterns.ProvidersqQULinkToParentProvidersqRttQU getAllItemIDsqS(UqT(U#Products.PythonScripts.PythonScriptqUU PythonScriptqVttQU_Rack__readableStorageqW(UqX(UBTreeqYUBTreeqZttQU_Rack__writeableStorageq[(hX(hYUBTreeq\ttQU__provider_registry__q]}q^(Usetattrq_}q`U*]qa(h+(h,UAttributeProviderqbttQasU sheet_xmlnsqc}qdU*]qe(h((h)U SheetProviderqfttQasU sheet_namesqg}qhU*]qi(h((h)U SheetProviderqjttQasUprovidesqk}ql(Usheetsqm]qn(h((h)U SheetProviderqottQaU attributesqp]qq((h+(h,UAttributeProviderqrttQh/hDeuUgetattrqs}qt(h4]quh/ahH]qvhDauUdelattrqw}qxU*]qy(h+(h,UAttributeProviderqzttQasuh(h((h)U SheetProviderq{ttQU loadAttribq|Uh$(Uq}(U%Products.ZPatterns.SkinScript.Methodsq~USSMethodqttQh(h+(h,UAttributeProviderqttQUtitleqUU__dataProviders__q]q((hP(hQULinkToParentProvidersqttQ(h((h)U SheetProviderqttQ(h+(h,UAttributeProviderqttQ(h}(h~USSMethodqttQeU_zclassqUToDoProduct/ToDoClassqU _initializedqKu.((U#Products.PythonScripts.PythonScriptqU PythonScriptqtqNt.}q(U func_codeq(cShared.DC.Scripts.Signature FuncCode qoq}q(U co_varnamesq (U $loop_watcherq U $read_guardq U $write_guardq U$guardq tqU co_argcountqKubU_paramsqUUidqU getAllToDoIDsqU__ac_local_roles__q}qUsteveq]qUOwnerqasU_dav_writelocksq(Uq(U PersistenceqUPersistentMappingqtqtqQU_bodyqUY# # get all the Doer IDs from the rack... # return container.defaultRack.getAllItemIDs( )qU_tq (hN(KKKKUBt}|t}t}t}||tiiSdSq!(Ntq"(U containerq#U defaultRackq$U getAllItemIDsq%h h h h tq&(h h h h tq'UScript (Python)q(hKUq))tN}q*tq+U _bind_namesq,(cShared.DC.Scripts.Bindings NameAssignments q-oq.}q/U_asgnsq0}q1(Uname_containerq2h#U name_subpathq3Utraverse_subpathq4U name_contextq5Ucontextq6U name_m_selfq7Uscriptq8usbU func_defaultsq9NU Python_magicq:UN q;u.B((U PersistenceqUPersistentMappingqtqNt.}qU _containerq}qs.((UOFS.DTMLMethodqU DTMLMethodqtqNt.}q(UtitleqUU__name__qU!associateToDoWithDeliverable_htmlqU__ac_local_roles__q}q Usteveq ]q UOwnerq asUglobalsq }qUrawqT
Your instance has been associated!
qU_varsq}qu.((U#Products.PythonScripts.PythonScriptqU PythonScriptqtqNt.}q(U func_codeq(cShared.DC.Scripts.Signature FuncCode qoq}q(U co_varnamesq (Udeliverable_idq Uhitsq Uidq UtheToDoq U $loop_watcherqU $read_guardqU $write_guardqU$guardqtqU co_argcountqKubU_paramsqUdeliverable_idqh UgetToDoIdsForDeliverableqU__ac_local_roles__q}qUsteveq]qUOwnerqasU_dav_writelocksq(Uq(U PersistenceqUPersistentMappingqtq tq!QU_bodyq"Uhits=[] for id in container.getAllToDoIDs(): theToDo=container.getItem(id) if theToDo: if theToDo.deliverableID == deliverable_id: hits.append(id) return hitsq#U_tq$(hN(KKKKUt }|t }t }t }g}x|tidrf}|ti|}|o7||i|jo||i|nn|qCW |SdSq%(NKtq&(h U containerq'U getAllToDoIDsq(h UgetItemq)h U deliverableIDq*h Uappendq+hhhhtq,hUScript (Python)q-hKU   q.)tN}q/tq0U _bind_namesq1(cShared.DC.Scripts.Bindings NameAssignments q2oq3}q4U_asgnsq5}q6(Uname_containerq7h'U name_subpathq8Utraverse_subpathq9U name_contextq:Ucontextq;U name_m_selfqNU Python_magicq?UN q@u.D((U#Products.PythonScripts.PythonScriptqU PythonScriptqtqNt.}q(U func_codeq(cShared.DC.Scripts.Signature FuncCode qo}q(U co_varnamesq(Uniq U $loop_watcherq U $read_guardq U $write_guardq U$guardq tqU co_argcountqKubU_paramsqUUidqU addNewItemqU__ac_local_roles__q}qUsteveq]qUOwnerqasU_dav_writelocksq(Uq(U PersistenceqUPersistentMappingqtqtqQU_tq(hN(KKKKUt}|t }t }t }|ti||tid} ||||iii|tidSq(NUnameq t(U containerq!UnewItemq"Ucontextq#UREQUESTq$Uniq%Upropertysheetsq&UBasicq'Umanage_changePropertiesq(U $loop_watcherq)U $read_guardq*U $write_guardq+U$guardq,t(h%h)h*h+h,tUScript (Python)q-hKUq.)tN}q/tU _bind_namesq0(cShared.DC.Scripts.Bindings NameAssignments q1o}q2U_asgnsq3}q4(Uname_containerq5U containerq6U name_subpathq7Utraverse_subpathq8U name_contextq9Ucontextq:U name_m_selfq;UscriptqU_bodyq?T # # this method creates a new item with id=name and # set it properties if the 'Basic' propertysheet # according to the contents of the REQUEST object. # ni=container.newItem(context.REQUEST['name']) ni.propertysheets.Basic.manage_changeProperties(context.REQUEST)q@U Python_magicqAUN qBU func_defaultsqCNu.((U#Products.PythonScripts.PythonScriptqU PythonScriptqtqNt.}q(U func_codeq(cShared.DC.Scripts.Signature FuncCode qoq}q(U co_varnamesq (U $loop_watcherq U $read_guardq U $write_guardq U$guardq tqU co_argcountqKubU_paramsqUUidqU numberOfToDosqU__ac_local_roles__q}qUsteveq]qUOwnerqasU_dav_writelocksq(Uq(U PersistenceqUPersistentMappingqtqtqQU_bodyqU)return len(container.getAllToDoIDs(self))qU_tq (hN(KKKKUBt}|t}t}t}t|titSdSq!(Ntq"(Ulenq#U containerq$U getAllToDoIDsq%Uselfq&h h h h tq'(h h h h tq(UScript (Python)q)hKUq*)tN}q+tq,U _bind_namesq-(cShared.DC.Scripts.Bindings NameAssignments q.oq/}q0U_asgnsq1}q2(Uname_containerq3h$U name_subpathq4Utraverse_subpathq5U name_contextq6Ucontextq7U name_m_selfq8Uscriptq9usbUtitleq:UGet the Number of ToDosq;U func_defaultsqu.((U#Products.PythonScripts.PythonScriptqU PythonScriptqtqNt.}q(U func_codeq(cShared.DC.Scripts.Signature FuncCode qoq}q(U co_varnamesq (UtoDoIDsq U deliverableIDq U theToDoIDq UtheToDoq U $loop_watcherqU $read_guardqU $write_guardqU$guardqtqU co_argcountqKubU_paramsqUtoDoIDs, deliverableIDqUidqUassociateToDoWithDeliverableqU__ac_local_roles__q}qUsteveq]qUOwnerqasU_tq(hN(KKKKUt }|t }t }t }xk|dr^}|ti|}|o/||||iiid|n|q.WdSq(NKh tq(h h U containerq UgetItemq!h Upropertysheetsq"UBasicq#Umanage_changePropertiesq$h hhhhtq%hUScript (Python)q&hKU   q')tN}q(tq)U_bodyq*Ufor theToDoID in toDoIDs: theToDo = container.getItem(theToDoID) if theToDo: theToDo.propertysheets.Basic.manage_changeProperties(deliverableID=deliverableID)q+U _bind_namesq,(cShared.DC.Scripts.Bindings NameAssignments q-oq.}q/U_asgnsq0}q1(Uname_containerq2U containerq3U name_subpathq4Utraverse_subpathq5U name_contextq6Ucontextq7U name_m_selfq8Uscriptq9usbU func_defaultsq:NU Python_magicq;UN qU Python_magicq?UN q@U func_defaultsqANu.<((UOFS.DTMLMethodqU DTMLMethodqtqNt.}q(U_dav_writelocksq(Uq(U PersistenceqUPersistentMappingqtq tq QU__ac_local_roles__q }q Usteveq ]qUOwnerqasU__name__qUaddNewToDo_htmlqUtitleqUUglobalsq}qUrawqT@

Thanks for the new ToDo!

qU_varsq}qu.B((U PersistenceqUPersistentMappingqtqNt.}qU _containerq}qs.((U#Products.PythonScripts.PythonScriptqU PythonScriptqtqNt.}q(U func_codeq(cShared.DC.Scripts.Signature FuncCode qoq}q(U co_varnamesq (U $loop_watcherq U $read_guardq U $write_guardq U$guardq tqU co_argcountqKubU_paramsqUUidqU getAllDoerIDsqU__ac_local_roles__q}qUsteveq]qUOwnerqasU_dav_writelocksq(Uq(U PersistenceqUPersistentMappingqtqtqQU_bodyqUY# # get all the Doer IDs from the rack... # return container.defaultRack.getAllItemIDs( )qU_tq (hN(KKKKUBt}|t}t}t}||tiiSdSq!(Ntq"(U containerq#U defaultRackq$U getAllItemIDsq%h h h h tq&(h h h h tq'UScript (Python)q(hKUq))tN}q*tq+U _bind_namesq,(cShared.DC.Scripts.Bindings NameAssignments q-oq.}q/U_asgnsq0}q1(Uname_containerq2h#U name_subpathq3Utraverse_subpathq4U name_contextq5Ucontextq6U name_m_selfq7Uscriptq8usbU func_defaultsq9NU Python_magicq:UN q;u.((U#Products.PythonScripts.PythonScriptqU PythonScriptqtqNt.}q(U func_codeq(cShared.DC.Scripts.Signature FuncCode qoq}q(U co_varnamesq (Uniq Unipsq U $loop_watcherq U $read_guardq U $write_guardqU$guardqtqU co_argcountqKubU_paramsqUUidqU addNewDoerqU__ac_local_roles__q}qUsteveq]qUOwnerqasU_dav_writelocksq(Uq(U PersistenceqUPersistentMappingqtqtqQU_bodyq T# # this method creates a new Doer with id=name and # set it properties if the 'Basic' propertysheet # according to the contents of the REQUEST object. # ni=container.newItem(context.REQUEST['name']) nips=ni.propertysheets.Basic nips.manage_changeProperties(context.REQUEST)q!U_tq"(hN(KKKKUt }|t }t }t }|ti||tid} |||ii} ||i|tidSq#(NUnameq$tq%(U containerq&UnewItemq'Ucontextq(UREQUESTq)h Upropertysheetsq*UBasicq+h Umanage_changePropertiesq,h h hhtq-(h h h h hhtq.UScript (Python)q/hKUq0)tN}q1tq2U _bind_namesq3(cShared.DC.Scripts.Bindings NameAssignments q4oq5}q6U_asgnsq7}q8(Uname_containerq9U containerq:U name_subpathq;Utraverse_subpathqU name_m_selfq?Uscriptq@usbUtitleqAUAdd A New DoerqBU Python_magicqCUN qDU func_defaultsqENu.((UOFS.DTMLMethodqU DTMLMethodqtqNt.}q(U_dav_writelocksq(Uq(U PersistenceqUPersistentMappingqtq tq QU__ac_local_roles__q }q Usteveq ]qUOwnerqasU__name__qUaddNewDoerForm_htmlqUtitleqUAdd New Doer FormqUglobalsq}qUrawqT

Add New Doer

Doer Name (No spaces!)
Doer Email

qU_varsq}qu.((UOFS.DTMLMethodqU DTMLMethodqtqNt.}q(U_dav_writelocksq(Uq(U PersistenceqUPersistentMappingqtq tq QU__ac_local_roles__q }q Usteveq ]qUOwnerqasU__name__qUdeleteInstances_htmlqUtitleqUUglobalsq}qUrawqU

Deleting Instances

Your Doers have been deleted.

qU_varsq}qu.6((U#Products.PythonScripts.PythonScriptqU PythonScriptqtqNt.}q(U func_codeq(cShared.DC.Scripts.Signature FuncCode qoq}q(U co_varnamesq (Udeliverable_idq U $loop_watcherq U $read_guardq U $write_guardq U$guardqtqU co_argcountqKubU_paramsqUdeliverable_idqUidqUgetDoersForDeliverableqU__ac_local_roles__q}qUsteveq]qUOwnerqasU_dav_writelocksq(Uq(U PersistenceqUPersistentMappingqtqtqQU_bodyq U return []q!U_tq"(hN(KKKKU-t}|t}t}t}gSdSq#(Ntq$(h h h htq%hUScript (Python)q&hKUq')tN}q(tq)U _bind_namesq*(cShared.DC.Scripts.Bindings NameAssignments q+oq,}q-U_asgnsq.}q/(Uname_containerq0U containerq1U name_subpathq2Utraverse_subpathq3U name_contextq4Ucontextq5U name_m_selfq6Uscriptq7usbU func_defaultsq8NU Python_magicq9UN q:u.!((U#Products.PythonScripts.PythonScriptqU PythonScriptqtqNt.}q(U func_codeq(cShared.DC.Scripts.Signature FuncCode qoq}q(U co_varnamesq (Utodo_idq U $loop_watcherq U $read_guardq U $write_guardq U$guardqtqU co_argcountqKubU_paramsqUtodo_idqUidqUgetDoersForToDoqU__ac_local_roles__q}qUsteveq]qUOwnerqasU_dav_writelocksq(Uq(U PersistenceqUPersistentMappingqtqtqQU_bodyq U return []q!U_tq"(hN(KKKKU-t}|t}t}t}gSdSq#(Ntq$(h h h htq%hUScript (Python)q&hKUq')tN}q(tq)U _bind_namesq*(cShared.DC.Scripts.Bindings NameAssignments q+oq,}q-U_asgnsq.}q/(Uname_containerq0U containerq1U name_subpathq2Utraverse_subpathq3U name_contextq4Ucontextq5U name_m_selfq6Uscriptq7usbU func_defaultsq8NU Python_magicq9UN q:u.<((UOFS.DTMLMethodqU DTMLMethodqtqNt.}q(U_dav_writelocksq(Uq(U PersistenceqUPersistentMappingqtq tq QU__ac_local_roles__q }q Usteveq ]qUOwnerqasU__name__qUaddNewDoer_htmlqUtitleqUUglobalsq}qUrawqT@

Thanks for the new Doer!

qU_varsq}qu. ((UProducts.ZPatterns.RackqURackqtqNt.}q(U_dav_writelocksq(Uq(U PersistenceqUPersistentMappingqttQUidq U defaultRackq U__ac_local_roles__q }q Usteveq ]qUOwnerqasU_objectsq(}q(U meta_typeqULink to parent Data Plug-insqh USpecialistPlugInsqu}q(hUPersistent Sheet Providerqh UPersistentSheetsqu}q(hU&Persistent Internal Attribute Providerqh UPersistentAttributesqu}q(hUSkinScript Methodqh UdynamicAttributesqu}q(hUScript (Python)qh U getAllItemIDsq utU__allProviders__q!]q"((Uq#(U!Products.ZPatterns.SheetProvidersq$U SheetProviderq%ttQ(Uq&(U%Products.ZPatterns.AttributeProvidersq'UAttributeProviderq(ttQcProducts.ZPatterns.SkinScript.Components Compute q)NRq*}q+(Uidq,UdynamicAttributes, line 1q-U Attributesq.]q/(U myToDoIdsq0cProducts.ZPatterns.Expressions Expression q1NRq2}q3Uexprq4URESULTq5sbtaU_fromexq6h1NRq7}q8h4U3ToDos . getToDoIdsForDoer ( doer_id = self . id ) q9sbUDefaultsq:]q;(U myToDoIdsqh4U[ ]q?sbtaUinvalidate_listq@)UtitleqAUU _proxy_rolesqB)UlinenoqCKUattrlistqD]qEh0aubh)NRqF}qG(h,UdynamicAttributes, line 3qHh.]qI(UmyToDosqJh1NRqK}qLh4URESULTqMsbtah6h1NRqN}qOh4U1ToDos . getToDosForDoer ( doer_id = self . id ) qPsbh:]qQ(UmyToDosqRh1NRqS}qTh4U[ ]qUsbtah@)hAUhB)hCKhD]qVhJaubeh(UqW(UProducts.ZPatterns.ProvidersqXULinkToParentProvidersqYttQU getAllItemIDsqZ(Uq[(U#Products.PythonScripts.PythonScriptq\U PythonScriptq]ttQU_Rack__readableStorageq^(Uq_(UBTreeq`UBTreeqattQU_Rack__writeableStorageqb(h_(h`UBTreeqcttQU__provider_registry__qd}qe(Usetattrqf}qgU*]qh(h&(h'UAttributeProviderqittQasU sheet_xmlnsqj}qkU*]ql(h#(h$U SheetProviderqmttQasU sheet_namesqn}qoU*]qp(h#(h$U SheetProviderqqttQasUprovidesqr}qs(Usheetsqt]qu(h#(h$U SheetProviderqvttQaU attributesqw]qx((h&(h'UAttributeProviderqyttQh*hFeuUgetattrqz}q{(hJ]q|hFah0]q}h*auUdelattrq~}qU*]q(h&(h'UAttributeProviderqttQasuh(h#(h$U SheetProviderqttQU loadAttribqUUdynamicAttributesq(Uq(U%Products.ZPatterns.SkinScript.MethodsqUSSMethodqttQh(h&(h'UAttributeProviderqttQUtitleqUU__dataProviders__q]q((hW(hXULinkToParentProvidersqttQ(h#(h$U SheetProviderqttQ(h&(h'UAttributeProviderqttQ(h(hUSSMethodqttQeU_zclassqUToDoProduct/DoerClassqU _initializedqKu.((UOFS.DTMLMethodqU DTMLMethodqtqNt.}q(U_dav_writelocksq(Uq(U PersistenceqUPersistentMappingqtq tq QU__ac_local_roles__q }q Usteveq ]qUOwnerqasU__name__qU index_htmlqUtitleqUDoer Management PageqUglobalsq}qUrawqT

Doer List

 Doer NameDoer EmailToDos
&dtml-email; /">&dtml-sequence-item;
Sorry.. no "doer"s!

Back To Main App qU_varsq}qu.((UOFS.DTMLMethodqU DTMLMethodqtqNt.}q(U_dav_writelocksq(Uq(U PersistenceqUPersistentMappingqtq tq QU__ac_local_roles__q }q Usteveq ]qUOwnerqasU__name__qUdoerSelectionTag_htmlqUtitleqUUglobalsq}qUrawqU qU_varsq}qu.;((U#Products.PythonScripts.PythonScriptqU PythonScriptqtqNt.}q(U func_codeq(cShared.DC.Scripts.Signature FuncCode qoq}q(U co_varnamesq (Uidq Uniq U $loop_watcherq U $read_guardq U $write_guardqU$guardqtqU co_argcountqKubU_paramsqUUidqUdeleteSelectedInstancesqU__ac_local_roles__q}qUsteveq]qUOwnerqasU_dav_writelocksq(Uq(U PersistenceqUPersistentMappingqtqtqQU_bodyq UOfor id in context.REQUEST['ids']: ni=container.getItem(id) ni.manage_delete()q!U_tq"(hN(KKKKUt}|t}t }t }xX||tiddr8}|ti|}||i|qAWdSq#(NUidsq$Ktq%(Ucontextq&UREQUESTq'h U containerq(UgetItemq)h U manage_deleteq*h h hhtq+(h h h h hhtq,UScript (Python)q-hKU q.)tN}q/tq0U _bind_namesq1(cShared.DC.Scripts.Bindings NameAssignments q2oq3}q4U_asgnsq5}q6(Uname_containerq7U containerq8U name_subpathq9Utraverse_subpathq:U name_m_selfq;UscriptqusbUtitleq?UDelete Instancesq@U Python_magicqAUN qBU func_defaultsqCNu.B((U PersistenceqUPersistentMappingqtqNt.}qU _containerq}qs.B((U PersistenceqUPersistentMappingqtqNt.}qU _containerq}qs.9((UOFS.DTMLMethodqU DTMLMethodqtqNt.}q(U_dav_writelocksq(Uq(U PersistenceqUPersistentMappingqtq tq QU__ac_local_roles__q }q Usteveq ]qUOwnerqasU__name__qUdeliverableSelectionTag_htmlqUtitleqUDeliverable Selection TagqUglobalsq}qUrawqTqU_varsq}qu.J((UOFS.DTMLMethodqU DTMLMethodqtqNt.}q(U_dav_writelocksq(Uq(U PersistenceqUPersistentMappingqtq tq QU__ac_local_roles__q }q Usteveq ]qUOwnerqasU__name__qUaddNewDeliverable_htmlqUtitleqUUglobalsq}qUrawqTG

Thanks for the new Deliverable!

qU_varsq}qu.P((U#Products.PythonScripts.PythonScriptqU PythonScriptqtqNt.}q(U func_codeq(cShared.DC.Scripts.Signature FuncCode qoq}q(U co_varnamesq (Uniq U $loop_watcherq U $read_guardq U $write_guardq U$guardqtqU co_argcountqKubU_paramsqUUidqU addNewItemqU__ac_local_roles__q}qUsteveq]qUOwnerqasU_dav_writelocksq(Uq(U PersistenceqUPersistentMappingqtqtqQU_bodyqT # # this method creates a new item with id=name and # set it properties if the 'Basic' propertysheet # according to the contents of the REQUEST object. # ni=container.newItem(context.REQUEST['name']) ni.propertysheets.Basic.manage_changeProperties(context.REQUEST)q U_tq!(hN(KKKKUt}|t }t }t }|ti||tid} ||||iii|tidSq"(NUnameq#tq$(U containerq%UnewItemq&Ucontextq'UREQUESTq(Uniq)Upropertysheetsq*UBasicq+Umanage_changePropertiesq,U $loop_watcherq-U $read_guardq.U $write_guardq/U$guardq0tq1(h)h-h.h/h0tq2UScript (Python)q3hKUq4)tN}q5tq6U _bind_namesq7(cShared.DC.Scripts.Bindings NameAssignments q8oq9}q:U_asgnsq;}q<(Uname_containerq=U containerq>U name_subpathq?Utraverse_subpathq@U name_contextqAUcontextqBU name_m_selfqCUscriptqDusbUtitleqEU+Add a new Object for a Specialist to manageqFU Python_magicqGUN qHU func_defaultsqINu.((UOFS.DTMLMethodqU DTMLMethodqtqNt.}q(U_dav_writelocksq(Uq(U PersistenceqUPersistentMappingqtq tq QU__ac_local_roles__q }q Usteveq ]qUOwnerqasU__name__qU index_htmlqUtitleqUDeliverable Management PageqUglobalsq}qUrawqT~

Deliverable List

 Deliverable NameDeliverable DueDateTo Do'sDeliverable Description
&dtml-dueDate; ">&dtml-sequence-item;
 
&dtml-description;
Sorry.. no "Deliverables"s!

Back To Main App qU_varsq}qu. ((UProducts.ZPatterns.RackqURackqtqNt.}q(U_dav_writelocksq(Uq(U PersistenceqUPersistentMappingqttQUidq U defaultRackq U__ac_local_roles__q }q Usteveq ]qUOwnerqasUdynamicAttributesq(Uq(U%Products.ZPatterns.SkinScript.MethodsqUSSMethodqttQU_objectsq(}q(U meta_typeqULink to parent Data Plug-insqh USpecialistPlugInsqu}q(hUPersistent Sheet Providerqh UPersistentSheetsqu}q(hU&Persistent Internal Attribute Providerqh UPersistentAttributesqu}q(hUScript (Python)q h U getAllItemIDsq!u}q"(U meta_typeq#USkinScript Methodq$Uidq%huth(Uq&(UProducts.ZPatterns.Providersq'ULinkToParentProvidersq(ttQU getAllItemIDsq)(Uq*(U#Products.PythonScripts.PythonScriptq+U PythonScriptq,ttQU_Rack__readableStorageq-(Uq.(UBTreeq/UBTreeq0ttQU_Rack__writeableStorageq1(h.(h/UBTreeq2ttQU__provider_registry__q3}q4(Usetattrq5}q6U*]q7(Uq8(U%Products.ZPatterns.AttributeProvidersq9UAttributeProviderq:ttQasU sheet_xmlnsq;}q(U!Products.ZPatterns.SheetProvidersq?U SheetProviderq@ttQasU sheet_namesqA}qBU*]qC(h>(h?U SheetProviderqDttQasUprovidesqE}qF(UsheetsqG]qH(h>(h?U SheetProviderqIttQaU attributesqJ]qK((h8(h9UAttributeProviderqLttQcProducts.ZPatterns.SkinScript.Components Compute qMNRqN}qO(UidqPUdynamicAttributes, line 1qQU AttributesqR]qS(U myToDoIdsqTcProducts.ZPatterns.Expressions Expression qUNRqV}qWUexprqXURESULTqYsbtaU_fromexqZhUNRq[}q\hXU0ToDos . getToDoIdsForDeliverable ( self . id ) q]sbUDefaultsq^]q_(U myToDoIdsq`hUNRqa}qbhXU[ ]qcsbtaUinvalidate_listqd)UtitleqeUU _proxy_rolesqf)UlinenoqgKUattrlistqh]qihTaubhMNRqj}qk(hPUdynamicAttributes, line 3qlhR]qm(UmyToDosqnhUNRqo}qphXURESULTqqsbtahZhUNRqr}qshXU.ToDos . getToDosForDeliverable ( self . id ) qtsbh^]qu(UmyToDosqvhUNRqw}qxhXU[ ]qysbtahd)heUhf)hgKhh]qzhnaubeuUgetattrq{}q|(hn]q}hjahT]q~hNauUdelattrq}qU*]q(h8(h9UAttributeProviderqttQasuh(h>(h?U SheetProviderqttQU loadAttribqUU__allProviders__q]q((h>(h?U SheetProviderqttQ(h8(h9UAttributeProviderqttQhNhjeh(h8(h9UAttributeProviderqttQUtitleqUU__dataProviders__q]q((h&(h'ULinkToParentProvidersqttQ(h>(h?U SheetProviderqttQ(h8(h9UAttributeProviderqttQ(h(hUSSMethodqttQeU_zclassqUToDoProduct/DeliverableClassqU _initializedqKu.((UOFS.DTMLMethodqU DTMLMethodqtqNt.}q(U_dav_writelocksq(Uq(U PersistenceqUPersistentMappingqtq tq QU__ac_local_roles__q }q Usteveq ]qUOwnerqasU__name__qUdeleteInstances_htmlqUtitleqUUglobalsq}qUrawqU

Deleting Instances

Your Deliverables have been deleted.

qU_varsq}qu.*((U#Products.PythonScripts.PythonScriptqU PythonScriptqtqNt.}q(U func_codeq(cShared.DC.Scripts.Signature FuncCode qoq}q(U co_varnamesq (U $loop_watcherq U $read_guardq U $write_guardq U$guardq tqU co_argcountqKubU_paramsqUUidqUgetAllDeliverableIDsqU__ac_local_roles__q}qUsteveq]qUOwnerqasU_tq(hN(KKKKUBt}|t}t}t}||tiiSdSq(Ntq(U containerqU defaultRackqU getAllItemIDsqh h h h tq(h h h h tqUScript (Python)q hKUq!)tN}q"tq#U_bodyq$U,return container.defaultRack.getAllItemIDs()q%U _bind_namesq&(cShared.DC.Scripts.Bindings NameAssignments q'oq(}q)U_asgnsq*}q+(Uname_containerq,hU name_subpathq-Utraverse_subpathq.U name_m_selfq/Uscriptq0U name_contextq1Ucontextq2usbU func_defaultsq3NU Python_magicq4UN q5u.d((U#Products.PythonScripts.PythonScriptqU PythonScriptqtqNt.}q(U func_codeq(cShared.DC.Scripts.Signature FuncCode qoq}q(U co_varnamesq (Uidq Uniq U $loop_watcherq U $read_guardq U $write_guardqU$guardqtqU co_argcountqKubU_paramsqUh UdeleteSelectedInstancesqU__ac_local_roles__q}qUsteveq]qUOwnerqasU_dav_writelocksq(Uq(U PersistenceqUPersistentMappingqtqtqQU_bodyqUMfor id in context.REQUEST['ids']: ni=context.getItem(id) ni.manage_delete()q U_tq!(hN(KKKKUt}|t}t}t }xX||tiddr8}|ti|}||i|qAWdSq"(NUidsq#Kt(Ucontextq$UREQUESTq%Uidq&UgetItemq'Uniq(U manage_deleteq)U $loop_watcherq*U $read_guardq+U $write_guardq,U$guardq-t(h&h(h*h+h,h-tUScript (Python)q.hKU q/)tN}q0tq1U _bind_namesq2(cShared.DC.Scripts.Bindings NameAssignments q3oq4}q5U_asgnsq6}q7(Uname_containerq8U containerq9U name_subpathq:Utraverse_subpathq;U name_m_selfqUcontextq?usbUtitleq@UDelete Instances of ItemqAU Python_magicqBUN qCU func_defaultsqDNu.((UOFS.DTMLMethodqU DTMLMethodqtqNt.}q(U_dav_writelocksq(Uq(U PersistenceqUPersistentMappingqtq tq QU__ac_local_roles__q }q Usteveq ]qUOwnerqasU__name__qUaddNewDeliverableForm_htmlqUtitleqUAdd New Deliverable FormqUglobalsq}qUrawqT

Add New Deliverable

Deliverable Name (No spaces!)
Deliverable Due Date
Deliverable Description

qU_varsq}qu.B((U PersistenceqUPersistentMappingqtqNt.}qU _containerq}qs.B((U PersistenceqUPersistentMappingqtqNt.}qU _containerq}qs.B((U PersistenceqUPersistentMappingqtqNt.}qU _containerq}qs.B((U PersistenceqUPersistentMappingqtqNt.}qU _containerq}qs.B((U PersistenceqUPersistentMappingqtqNt.}qU _containerq}qs.B((U PersistenceqUPersistentMappingqtqNt.}qU _containerq}qs.B((U PersistenceqUPersistentMappingqtqNt.}qU _containerq}qs.B((U PersistenceqUPersistentMappingqtqNt.}qU _containerq}qs.B((U PersistenceqUPersistentMappingqtqNt.}qU _containerq}qs.((U!Products.ZPatterns.SheetProvidersqU SheetProviderqtqNt.}q(UtitleqUSheets stored in Rack slotsqUidqUPersistentSheetsqu.((U%Products.ZPatterns.AttributeProvidersqUAttributeProviderqtqNt.}q(UtitleqU)Attributes stored persistently in objectsqUidqUPersistentAttributesqu.((UProducts.ZPatterns.ProvidersqULinkToParentProvidersqtqNt.}q(UtitleqUPlug-ins from parent SpecialistqUidqUSpecialistPlugInsqu.((U#Products.PythonScripts.PythonScriptqU PythonScriptqtqNt.}q(U func_codeq(cShared.DC.Scripts.Signature FuncCode qoq}q(U co_varnamesq (UtheIDsq UtheIDq U $loop_watcherq U $read_guardq U $write_guardqU$guardqtqU co_argcountqKubU_paramsqUUidqU getAllItemIDsqU__ac_local_roles__q}qUsteveq]qUOwnerqasU_dav_writelocksq(Uq(U PersistenceqUPersistentMappingqtqtqQU_bodyq T# # get all the Item Ids for the class stored by this # rack. Since in this example we're storing everything # persistently.. we just call getPersistentItemIDs.. # theIDs = [] for theID in container.getPersistentItemIDs(): theIDs.append(theID) return theIDsq!U_tq"(hN(KKKKUxt}|t}t}t}g} x<|tid r#} ||i||qCW |SdSq#(NKtq$(h U containerq%UgetPersistentItemIDsq&h Uappendq'h h hhtq(hUScript (Python)q)hKU   q*)tN}q+tq,U _bind_namesq-(cShared.DC.Scripts.Bindings NameAssignments q.oq/}q0U_asgnsq1}q2(Uname_containerq3h%U name_subpathq4Utraverse_subpathq5U name_contextq6Ucontextq7U name_m_selfq8Uscriptq9usbU func_defaultsq:NU Python_magicq;UN q