blob: ebe8dcfccabac71e230522e59afe1c887ed5bb8d [file] [log] [blame]
/* 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;
}