/* Copyright 2008 Google Inc. | |
This work is licensed under a Creative Commons Attribution 2.5 License. | |
For information, see: | |
http://creativecommons.org/licenses/by/2.5/ | |
For the actual license text, see: | |
http://creativecommons.org/licenses/by/2.5/legalcode | |
*/ | |
digraph MVCOverview { | |
/* 11 inches x 96 DPI is 1056 pixels wide */ | |
size="11,11"; | |
node [shape=box]; | |
subgraph cluster0 { | |
color="white"; | |
AppEngine | |
[shape=record style=filled fillcolor=lightgrey color=black | |
label="{{ <DatastoreAPI> Datastore API | <UsersAPI> Users API | <DjangoForms> Django Forms }| Google App Engine}"] | |
00 [style=invis]; | |
/* manually assigned "level" ranks to produce an easier-to-read graph */ | |
{ rank=same; | |
"00"; "AppEngine"; | |
}; | |
}; | |
/* invisible "level" graph to enable assigned of levels to groups of nodes */ | |
01 [style=invis]; | |
01 -> 00 [style=invis]; | |
10 -> 01 [style=invis]; | |
subgraph cluster1 { | |
label="SoC Framework"; | |
node [shape=box style=filled fillcolor=lightgrey color=black]; | |
SoCModels [label="Common Models (Person, Work, Group, Program, etc.)"]; | |
SoCViews [label="Common Views (Models, Actions, Reports, etc.)"]; | |
SoCTemplates | |
[label="Base Django Templates" shape=ellipse style=solid]; | |
SoCControllers | |
[label="Generic Controllers (Auth, Membership, Attach, etc.)" shape=diamond]; | |
12 [style=invis]; | |
11 [style=invis]; | |
10 [style=invis]; | |
{ rank=same; | |
"12"; "SoCViews"; | |
}; | |
{ rank=same; | |
"10"; "SoCControllers"; "SoCModels"; | |
}; | |
}; | |
13 [style=invis]; | |
20 -> 13 [style=invis]; | |
13 -> 12 [style=invis]; | |
12 -> 11 [style=invis]; | |
11 -> 10 [style=invis]; | |
SoCViews -> AppEngine:DjangoForms; | |
SoCControllers -> AppEngine:UsersAPI; | |
SoCModels -> AppEngine:DatastoreAPI; | |
SoCViews -> SoCModels; | |
SoCViews -> SoCTemplates [constraint=false]; | |
SoCModels -> SoCViews [style=dashed constraint=false]; | |
SoCViews -> SoCControllers [style=dashed]; | |
SoCControllers -> SoCViews [constraint=false]; | |
SoCControllers -> SoCModels [constraint=false]; | |
subgraph cluster2 { | |
label="A Melange Web Application"; | |
style=filled; | |
color=black; | |
fillcolor=lightgrey; | |
node [shape=box style=filled color=black fillcolor=white]; | |
AppController [label="Application-specific Controller" shape=diamond]; | |
AppViews [label="Application-unique Views"]; | |
AppTemplates | |
[label="Application Django Templates" shape=ellipse style=solid color=white]; | |
AppModels [label="Application-unique Models"]; | |
AppEntities | |
[label="Application Entities" shape=parallelogram style=solid color=white]; | |
22 [style=invis]; | |
21 [style=invis]; | |
20 [style=invis]; | |
{ rank=same; | |
"22"; "AppViews"; "AppTemplates"; | |
}; | |
{ rank=same; | |
"21"; | |
}; | |
{ rank=same; | |
"20"; "AppModels"; "AppController"; "AppEntities"; | |
}; | |
}; | |
22 -> 21 [style=invis]; | |
21 -> 20 [style=invis]; | |
AppModels -> SoCModels; | |
AppViews -> SoCViews; | |
AppController -> SoCControllers; | |
AppViews -> AppModels; | |
AppModels -> AppViews [style=dashed constraint=false]; | |
AppViews -> AppController [style=dashed]; | |
AppController -> AppViews [constraint=false]; | |
AppController -> AppModels [constraint=false]; | |
AppViews -> AppTemplates [constraint=false]; | |
AppModels -> AppEntities; | |
} |