From: yomguy Date: Fri, 23 Mar 2012 11:53:57 +0000 (+0100) Subject: add graphs X-Git-Tag: 1.4.3-2~45 X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=b732ea073df4f11d5e8f3c28425c93872c136ea0;p=telemeta.git add graphs --- diff --git a/doc/devel/telemeta-all.dot b/doc/devel/telemeta-all.dot new file mode 100644 index 00000000..4cb096e6 --- /dev/null +++ b/doc/devel/telemeta-all.dot @@ -0,0 +1,3076 @@ + +digraph name { + fontname = "Helvetica" + fontsize = 8 + + node [ + fontname = "Helvetica" + fontsize = 8 + shape = "plaintext" + ] + edge [ + fontname = "Helvetica" + fontsize = 8 + ] + + + + + django_contrib_auth_models_Permission [label=< + + + + + + + + + + + + + + +
Permission
idAutoField
nameCharField
codenameCharField
+ >] + + django_contrib_auth_models_Group [label=< + + + + + + + + + + + +
Group
idAutoField
nameCharField
+ >] + + django_contrib_auth_models_User [label=< + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
User
idAutoField
usernameCharField
first_nameCharField
last_nameCharField
emailEmailField
passwordCharField
is_staffBooleanField
is_activeBooleanField
is_superuserBooleanField
last_loginDateTimeField
date_joinedDateTimeField
+ >] + + django_contrib_auth_models_Message [label=< + + + + + + + + + + + +
Message
idAutoField
messageTextField
+ >] + + + + + django_contrib_contenttypes_models_ContentType [label=< + + + + + + + + + + + + + + + + + +
ContentType
idAutoField
nameCharField
app_labelCharField
modelCharField
+ >] + + + + + django_contrib_sessions_models_Session [label=< + + + + + + + + + + + + + + +
Session
session_keyCharField
session_dataTextField
expire_dateDateTimeField
+ >] + + + + + django_contrib_sites_models_Site [label=< + + + + + + + + + + + + + + +
Site
idAutoField
domainCharField
nameCharField
+ >] + + + + + + + + django_contrib_admin_models_LogEntry [label=< + + + + + + + + + + + + + + + + + + + + + + + +
LogEntry
idAutoField
action_timeDateTimeField
object_idTextField
object_reprCharField
action_flagPositiveSmallIntegerField
change_messageTextField
+ >] + + + + + + + + telemeta_models_enum_Enumeration [label=< + + + + + + + + +
Enumeration
<ModelCore>
valueCharField
+ >] + + telemeta_models_core_ModelCore [label=< + + + + + +
ModelCore
<EnhancedModel>
+ >] + + telemeta_models_media_MediaResource [label=< + + + + + +
MediaResource
<ModelCore>
+ >] + + telemeta_models_media_MediaRelated [label=< + + + + + + + + + + + + + + + + + + + + + + + + + + +
MediaRelated
<MediaResource>
titleCharField
dateDateTimeField
descriptionTextField
mime_typeCharField
urlCharField
creditsCharField
fileFileField
+ >] + + telemeta_models_media_MediaBaseResource [label=< + + + + + + + + + + + + + + + + + + + + +
MediaBaseResource
<MediaResource>
titleCharField
descriptionCharField
codeCharField
referenceCharField
public_accessCharField
+ >] + + telemeta_models_enum_PhysicalFormat [label=< + + + + + + + + + + + +
PhysicalFormat
<Enumeration>
idAutoField
valueCharField
+ >] + + telemeta_models_enum_PublishingStatus [label=< + + + + + + + + + + + +
PublishingStatus
<Enumeration>
idAutoField
valueCharField
+ >] + + telemeta_models_enum_AcquisitionMode [label=< + + + + + + + + + + + +
AcquisitionMode
<Enumeration>
idAutoField
valueCharField
+ >] + + telemeta_models_enum_MetadataAuthor [label=< + + + + + + + + + + + +
MetadataAuthor
<Enumeration>
idAutoField
valueCharField
+ >] + + telemeta_models_enum_MetadataWriter [label=< + + + + + + + + + + + +
MetadataWriter
<Enumeration>
idAutoField
valueCharField
+ >] + + telemeta_models_enum_LegalRight [label=< + + + + + + + + + + + +
LegalRight
<Enumeration>
idAutoField
valueCharField
+ >] + + telemeta_models_enum_RecordingContext [label=< + + + + + + + + + + + +
RecordingContext
<Enumeration>
idAutoField
valueCharField
+ >] + + telemeta_models_enum_AdConversion [label=< + + + + + + + + + + + +
AdConversion
<Enumeration>
idAutoField
valueCharField
+ >] + + telemeta_models_enum_VernacularStyle [label=< + + + + + + + + + + + +
VernacularStyle
<Enumeration>
idAutoField
valueCharField
+ >] + + telemeta_models_enum_GenericStyle [label=< + + + + + + + + + + + +
GenericStyle
<Enumeration>
idAutoField
valueCharField
+ >] + + telemeta_models_enum_ContextKeyword [label=< + + + + + + + + + + + +
ContextKeyword
<Enumeration>
idAutoField
valueCharField
+ >] + + telemeta_models_enum_Publisher [label=< + + + + + + + + + + + +
Publisher
<Enumeration>
idAutoField
valueCharField
+ >] + + telemeta_models_enum_PublisherCollection [label=< + + + + + + + + + + + +
PublisherCollection
<ModelCore>
idAutoField
valueCharField
+ >] + + telemeta_models_enum_EthnicGroup [label=< + + + + + + + + + + + +
EthnicGroup
<Enumeration>
idAutoField
valueCharField
+ >] + + telemeta_models_enum_EthnicGroupAlias [label=< + + + + + + + + + + + +
EthnicGroupAlias
<ModelCore>
idAutoField
valueCharField
+ >] + + telemeta_models_enum_TapeLength [label=< + + + + + + + + + + + +
TapeLength
<Enumeration>
idAutoField
valueCharField
+ >] + + telemeta_models_enum_TapeWidth [label=< + + + + + + + + + + + +
TapeWidth
<Enumeration>
idAutoField
valueCharField
+ >] + + telemeta_models_enum_TapeSpeed [label=< + + + + + + + + + + + +
TapeSpeed
<Enumeration>
idAutoField
valueCharField
+ >] + + telemeta_models_enum_TapeVendor [label=< + + + + + + + + + + + +
TapeVendor
<Enumeration>
idAutoField
valueCharField
+ >] + + telemeta_models_location_Location [label=< + + + + + + + + + + + + + + + + + + + + + + + +
Location
<ModelCore>
idAutoField
nameCharField
typeIntegerField
latitudeFloatField
longitudeFloatField
is_authoritativeBooleanField
+ >] + + telemeta_models_location_LocationType [label=< + + + + + + + + + + + + + + +
LocationType
<ModelCore>
idAutoField
codeCharField
nameCharField
+ >] + + telemeta_models_location_LocationAlias [label=< + + + + + + + + + + + + + + +
LocationAlias
<ModelCore>
idAutoField
aliasCharField
is_authoritativeBooleanField
+ >] + + telemeta_models_location_LocationRelation [label=< + + + + + + + + + + + + + + +
LocationRelation
<ModelCore>
idAutoField
is_directBooleanField
is_authoritativeBooleanField
+ >] + + telemeta_models_system_Revision [label=< + + + + + + + + + + + + + + + + + + + + +
Revision
<ModelCore>
idAutoField
element_typeCharField
element_idIntegerField
change_typeCharField
timeDateTimeField
+ >] + + telemeta_models_system_UserProfile [label=< + + + + + + + + + + + + + + + + + + + + + + + + + + +
UserProfile
idAutoField
institutionCharField
functionCharField
addressTextField
telephoneCharField
expiration_dateDateField
init_passwordBooleanField
+ >] + + telemeta_models_system_Criteria [label=< + + + + + + + + + + + + + + +
Criteria
<ModelCore>
idAutoField
keyCharField
valueCharField
+ >] + + telemeta_models_system_Search [label=< + + + + + + + + + + + + + + +
Search
<ModelCore>
idAutoField
dateDateTimeField
descriptionCharField
+ >] + + telemeta_models_instrument_Instrument [label=< + + + + + + + + + + + +
Instrument
<ModelCore>
idAutoField
nameCharField
+ >] + + telemeta_models_instrument_InstrumentAlias [label=< + + + + + + + + + + + +
InstrumentAlias
<ModelCore>
idAutoField
nameCharField
+ >] + + telemeta_models_instrument_InstrumentRelation [label=< + + + + + + + + +
InstrumentRelation
<ModelCore>
idAutoField
+ >] + + telemeta_models_instrument_InstrumentAliasRelation [label=< + + + + + + + + +
InstrumentAliasRelation
<ModelCore>
idAutoField
+ >] + + telemeta_models_language_Language [label=< + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Language
<ModelCore>
idAutoField
identifierCharField
part2BCharField
part2TCharField
part1CharField
scopeCharField
typeCharField
nameCharField
commentTextField
+ >] + + telemeta_models_media_MediaCollection [label=< + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MediaCollection
<MediaResource>
idAutoField
referenceCharField
titleCharField
alt_titleCharField
creatorCharField
recorded_from_yearIntegerField
recorded_to_yearIntegerField
year_publishedIntegerField
collectorCharField
publisher_serialCharField
booklet_authorCharField
external_referencesTextField
doctype_codeIntegerField
public_accessCharField
cnrs_contributorCharField
booklet_descriptionTextField
alt_idsCharField
commentTextField
travailCharField
items_doneCharField
collector_is_creatorBooleanField
is_publishedBooleanField
conservation_siteCharField
codeCharField
old_codeCharField
approx_durationDurationField
physical_items_numIntegerField
stateTextField
a_informer_07_03CharField
+ >] + + telemeta_models_media_MediaCollectionRelated [label=< + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MediaCollectionRelated
<MediaRelated>
idAutoField
titleCharField
dateDateTimeField
descriptionTextField
mime_typeCharField
urlCharField
creditsCharField
fileFileField
+ >] + + telemeta_models_media_MediaItem [label=< + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MediaItem
<MediaResource>
idAutoField
titleCharField
alt_titleCharField
collectorCharField
recorded_from_dateDateField
recorded_to_dateDateField
location_commentCharField
cultural_areaCharField
languageCharField
context_commentTextField
moda_executCharField
authorCharField
commentTextField
collector_selectionCharField
collector_from_collectionBooleanField
codeCharField
old_codeCharField
trackCharField
creator_referenceCharField
external_referencesTextField
public_accessCharField
fileFileField
approx_durationDurationField
+ >] + + telemeta_models_media_MediaItemRelated [label=< + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MediaItemRelated
<MediaRelated>
idAutoField
titleCharField
dateDateTimeField
descriptionTextField
mime_typeCharField
urlCharField
creditsCharField
fileFileField
+ >] + + telemeta_models_media_MediaItemKeyword [label=< + + + + + + + + +
MediaItemKeyword
<ModelCore>
idAutoField
+ >] + + telemeta_models_media_MediaItemPerformance [label=< + + + + + + + + + + + + + + +
MediaItemPerformance
<ModelCore>
idAutoField
instruments_numCharField
musiciansCharField
+ >] + + telemeta_models_media_MediaItemAnalysis [label=< + + + + + + + + + + + + + + + + + + + + +
MediaItemAnalysis
<ModelCore>
idAutoField
analyzer_idCharField
nameCharField
valueCharField
unitCharField
+ >] + + telemeta_models_media_MediaPart [label=< + + + + + + + + + + + + + + + + + +
MediaPart
<MediaResource>
idAutoField
titleCharField
startFloatField
endFloatField
+ >] + + telemeta_models_media_Playlist [label=< + + + + + + + + + + + + + + + + + +
Playlist
<ModelCore>
idAutoField
public_idCharField
titleCharField
descriptionTextField
+ >] + + telemeta_models_media_PlaylistResource [label=< + + + + + + + + + + + + + + + + + +
PlaylistResource
<ModelCore>
idAutoField
public_idCharField
resource_typeCharField
resource_idCharField
+ >] + + telemeta_models_media_MediaItemMarker [label=< + + + + + + + + + + + + + + + + + + + + + + + +
MediaItemMarker
<MediaResource>
idAutoField
public_idCharField
timeFloatField
titleCharField
dateDateTimeField
descriptionTextField
+ >] + + telemeta_models_media_MediaItemTranscodingFlag [label=< + + + + + + + + + + + + + + + + + +
MediaItemTranscodingFlag
<ModelCore>
idAutoField
mime_typeCharField
dateDateTimeField
valueBooleanField
+ >] + + telemeta_models_media_MediaCorpus [label=< + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MediaCorpus
<MediaBaseResource>
idAutoField
titleCharField
descriptionCharField
codeCharField
referenceCharField
public_accessCharField
recorded_from_yearIntegerField
recorded_to_yearIntegerField
+ >] + + telemeta_models_media_MediaFonds [label=< + + + + + + + + + + + + + + + + + + + + + + + +
MediaFonds
<MediaBaseResource>
idAutoField
titleCharField
descriptionCharField
codeCharField
referenceCharField
public_accessCharField
+ >] + + telemeta_models_media_MediaCorpusRelated [label=< + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MediaCorpusRelated
<MediaRelated>
idAutoField
titleCharField
dateDateTimeField
descriptionTextField
mime_typeCharField
urlCharField
creditsCharField
fileFileField
+ >] + + telemeta_models_media_MediaFondsRelated [label=< + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MediaFondsRelated
<MediaRelated>
idAutoField
titleCharField
dateDateTimeField
descriptionTextField
mime_typeCharField
urlCharField
creditsCharField
fileFileField
+ >] + + telemeta_models_media_Format [label=< + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Format
<ModelCore>
idAutoField
original_codeCharField
tape_numberCharField
statusCharField
conservation_stateCharField
commentsTextField
tape_thicknessCharField
tape_diameterCharField
tape_referenceCharField
+ >] + + + + + south_models_MigrationHistory [label=< + + + + + + + + + + + + + + + + + +
MigrationHistory
idAutoField
app_nameCharField
migrationCharField
appliedDateTimeField
+ >] + + + + + sorl_thumbnail_models_KVStore [label=< + + + + + + + + + + + +
KVStore
keyCharField
valueTextField
+ >] + + + + + + django_contrib_auth_models_Permission -> django_contrib_contenttypes_models_ContentType + [label="content_type (permission)"] [arrowhead=none, arrowtail=dot]; + + + + + django_contrib_auth_models_Group -> django_contrib_auth_models_Permission + [label="permissions (group)"] [arrowhead=dot arrowtail=dot, dir=both]; + + + + + django_contrib_auth_models_User -> django_contrib_auth_models_Group + [label="groups (user)"] [arrowhead=dot arrowtail=dot, dir=both]; + + + django_contrib_auth_models_User -> django_contrib_auth_models_Permission + [label="user_permissions (user)"] [arrowhead=dot arrowtail=dot, dir=both]; + + + + + django_contrib_auth_models_Message -> django_contrib_auth_models_User + [label="user (_message_set)"] [arrowhead=none, arrowtail=dot]; + + + + + + + + + + + + + + + + django_contrib_admin_models_LogEntry -> django_contrib_auth_models_User + [label="user (logentry)"] [arrowhead=none, arrowtail=dot]; + + + django_contrib_admin_models_LogEntry -> django_contrib_contenttypes_models_ContentType + [label="content_type (logentry)"] [arrowhead=none, arrowtail=dot]; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + telemeta_models_enum_PublisherCollection -> telemeta_models_enum_Publisher + [label="publisher (publisher_collections)"] [arrowhead=none, arrowtail=dot]; + + + + + + + telemeta_models_enum_EthnicGroupAlias -> telemeta_models_enum_EthnicGroup + [label="ethnic_group (aliases)"] [arrowhead=none, arrowtail=dot]; + + + + + + + + + + + + + telemeta_models_location_Location -> telemeta_models_location_LocationType + [label="complete_type (locations)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_location_Location -> telemeta_models_location_Location + [label="current_location (past_names)"] [arrowhead=none, arrowtail=dot]; + + + + + + + telemeta_models_location_LocationAlias -> telemeta_models_location_Location + [label="location (aliases)"] [arrowhead=none, arrowtail=dot]; + + + + + telemeta_models_location_LocationRelation -> telemeta_models_location_Location + [label="location (ancestor_relations)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_location_LocationRelation -> telemeta_models_location_Location + [label="ancestor_location (descendant_relations)"] [arrowhead=none, arrowtail=dot]; + + + + + telemeta_models_system_Revision -> django_contrib_auth_models_User + [label="user (revisions)"] [arrowhead=none, arrowtail=dot]; + + + + + telemeta_models_system_UserProfile -> django_contrib_auth_models_User + [label="user (userprofile)"] [arrowhead=none, arrowtail=dot]; + + + + + + + telemeta_models_system_Search -> django_contrib_auth_models_User + [label="username (searches)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_system_Search -> telemeta_models_system_Criteria + [label="criteria (search)"] [arrowhead=dot arrowtail=dot, dir=both]; + + + + + + + + + telemeta_models_instrument_InstrumentRelation -> telemeta_models_instrument_Instrument + [label="instrument (parent_relation)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_instrument_InstrumentRelation -> telemeta_models_instrument_Instrument + [label="parent_instrument (child_relation)"] [arrowhead=none, arrowtail=dot]; + + + + + telemeta_models_instrument_InstrumentAliasRelation -> telemeta_models_instrument_InstrumentAlias + [label="alias (other_name)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_instrument_InstrumentAliasRelation -> telemeta_models_instrument_InstrumentAlias + [label="instrument (relation)"] [arrowhead=none, arrowtail=dot]; + + + + + + + telemeta_models_media_MediaCollection -> telemeta_models_enum_RecordingContext + [label="recording_context (collections)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_MediaCollection -> telemeta_models_enum_Publisher + [label="publisher (collections)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_MediaCollection -> telemeta_models_enum_PublisherCollection + [label="publisher_collection (collections)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_MediaCollection -> telemeta_models_enum_LegalRight + [label="legal_rights (collections)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_MediaCollection -> telemeta_models_enum_AcquisitionMode + [label="acquisition_mode (collections)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_MediaCollection -> telemeta_models_enum_MetadataAuthor + [label="metadata_author (collections)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_MediaCollection -> telemeta_models_enum_PublishingStatus + [label="publishing_status (collections)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_MediaCollection -> telemeta_models_enum_MetadataWriter + [label="metadata_writer (collections)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_MediaCollection -> telemeta_models_enum_PhysicalFormat + [label="physical_format (collections)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_MediaCollection -> telemeta_models_enum_AdConversion + [label="ad_conversion (collections)"] [arrowhead=none, arrowtail=dot]; + + + + + telemeta_models_media_MediaCollectionRelated -> telemeta_models_media_MediaCollection + [label="collection (related)"] [arrowhead=none, arrowtail=dot]; + + + + + telemeta_models_media_MediaItem -> telemeta_models_media_MediaCollection + [label="collection (items)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_MediaItem -> telemeta_models_location_Location + [label="location (mediaitem)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_MediaItem -> telemeta_models_enum_EthnicGroup + [label="ethnic_group (items)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_MediaItem -> telemeta_models_language_Language + [label="language_iso (items)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_MediaItem -> telemeta_models_enum_VernacularStyle + [label="vernacular_style (items)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_MediaItem -> telemeta_models_enum_GenericStyle + [label="generic_style (items)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_MediaItem -> telemeta_models_media_MediaItem + [label="copied_from_item (copies)"] [arrowhead=none, arrowtail=dot]; + + + + + telemeta_models_media_MediaItemRelated -> telemeta_models_media_MediaItem + [label="item (related)"] [arrowhead=none, arrowtail=dot]; + + + + + telemeta_models_media_MediaItemKeyword -> telemeta_models_media_MediaItem + [label="item (keyword_relations)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_MediaItemKeyword -> telemeta_models_enum_ContextKeyword + [label="keyword (item_relations)"] [arrowhead=none, arrowtail=dot]; + + + + + telemeta_models_media_MediaItemPerformance -> telemeta_models_media_MediaItem + [label="media_item (performances)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_MediaItemPerformance -> telemeta_models_instrument_Instrument + [label="instrument (performances)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_MediaItemPerformance -> telemeta_models_instrument_InstrumentAlias + [label="alias (performances)"] [arrowhead=none, arrowtail=dot]; + + + + + telemeta_models_media_MediaItemAnalysis -> telemeta_models_media_MediaItem + [label="item (analysis)"] [arrowhead=none, arrowtail=dot]; + + + + + telemeta_models_media_MediaPart -> telemeta_models_media_MediaItem + [label="item (parts)"] [arrowhead=none, arrowtail=dot]; + + + + + telemeta_models_media_Playlist -> django_contrib_auth_models_User + [label="author (playlists)"] [arrowhead=none, arrowtail=dot]; + + + + + telemeta_models_media_PlaylistResource -> telemeta_models_media_Playlist + [label="playlist (resources)"] [arrowhead=none, arrowtail=dot]; + + + + + telemeta_models_media_MediaItemMarker -> telemeta_models_media_MediaItem + [label="item (markers)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_MediaItemMarker -> django_contrib_auth_models_User + [label="author (markers)"] [arrowhead=none, arrowtail=dot]; + + + + + telemeta_models_media_MediaItemTranscodingFlag -> telemeta_models_media_MediaItem + [label="item (transcoding)"] [arrowhead=none, arrowtail=dot]; + + + + + telemeta_models_media_MediaCorpus -> telemeta_models_media_MediaCollection + [label="children (corpus)"] [arrowhead=dot arrowtail=dot, dir=both]; + + + + + telemeta_models_media_MediaFonds -> telemeta_models_media_MediaCorpus + [label="children (fonds)"] [arrowhead=dot arrowtail=dot, dir=both]; + + + + + telemeta_models_media_MediaCorpusRelated -> telemeta_models_media_MediaCorpus + [label="resource (related)"] [arrowhead=none, arrowtail=dot]; + + + + + telemeta_models_media_MediaFondsRelated -> telemeta_models_media_MediaFonds + [label="resource (related)"] [arrowhead=none, arrowtail=dot]; + + + + + telemeta_models_media_Format -> telemeta_models_media_MediaItem + [label="item (formats)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_Format -> telemeta_models_enum_TapeLength + [label="tape_length (formats)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_Format -> telemeta_models_enum_TapeWidth + [label="tape_width (formats)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_Format -> telemeta_models_enum_TapeSpeed + [label="tape_speed (formats)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_Format -> telemeta_models_enum_TapeVendor + [label="tape_vendor (formats)"] [arrowhead=none, arrowtail=dot]; + + + + + + + + +} diff --git a/doc/devel/telemeta-all.pdf b/doc/devel/telemeta-all.pdf new file mode 100644 index 00000000..7a5aa994 Binary files /dev/null and b/doc/devel/telemeta-all.pdf differ diff --git a/doc/devel/telemeta.dot b/doc/devel/telemeta.dot new file mode 100644 index 00000000..2550f75f --- /dev/null +++ b/doc/devel/telemeta.dot @@ -0,0 +1,2642 @@ + +digraph name { + fontname = "Helvetica" + fontsize = 8 + + node [ + fontname = "Helvetica" + fontsize = 8 + shape = "plaintext" + ] + edge [ + fontname = "Helvetica" + fontsize = 8 + ] + + + + + telemeta_models_enum_Enumeration [label=< + + + + + + + + +
Enumeration
<ModelCore>
valueCharField
+ >] + + telemeta_models_core_ModelCore [label=< + + + + + +
ModelCore
<EnhancedModel>
+ >] + + telemeta_models_media_MediaResource [label=< + + + + + +
MediaResource
<ModelCore>
+ >] + + telemeta_models_media_MediaRelated [label=< + + + + + + + + + + + + + + + + + + + + + + + + + + +
MediaRelated
<MediaResource>
titleCharField
dateDateTimeField
descriptionTextField
mime_typeCharField
urlCharField
creditsCharField
fileFileField
+ >] + + telemeta_models_media_MediaBaseResource [label=< + + + + + + + + + + + + + + + + + + + + +
MediaBaseResource
<MediaResource>
titleCharField
descriptionCharField
codeCharField
referenceCharField
public_accessCharField
+ >] + + telemeta_models_enum_PhysicalFormat [label=< + + + + + + + + + + + +
PhysicalFormat
<Enumeration>
idAutoField
valueCharField
+ >] + + telemeta_models_enum_PublishingStatus [label=< + + + + + + + + + + + +
PublishingStatus
<Enumeration>
idAutoField
valueCharField
+ >] + + telemeta_models_enum_AcquisitionMode [label=< + + + + + + + + + + + +
AcquisitionMode
<Enumeration>
idAutoField
valueCharField
+ >] + + telemeta_models_enum_MetadataAuthor [label=< + + + + + + + + + + + +
MetadataAuthor
<Enumeration>
idAutoField
valueCharField
+ >] + + telemeta_models_enum_MetadataWriter [label=< + + + + + + + + + + + +
MetadataWriter
<Enumeration>
idAutoField
valueCharField
+ >] + + telemeta_models_enum_LegalRight [label=< + + + + + + + + + + + +
LegalRight
<Enumeration>
idAutoField
valueCharField
+ >] + + telemeta_models_enum_RecordingContext [label=< + + + + + + + + + + + +
RecordingContext
<Enumeration>
idAutoField
valueCharField
+ >] + + telemeta_models_enum_AdConversion [label=< + + + + + + + + + + + +
AdConversion
<Enumeration>
idAutoField
valueCharField
+ >] + + telemeta_models_enum_VernacularStyle [label=< + + + + + + + + + + + +
VernacularStyle
<Enumeration>
idAutoField
valueCharField
+ >] + + telemeta_models_enum_GenericStyle [label=< + + + + + + + + + + + +
GenericStyle
<Enumeration>
idAutoField
valueCharField
+ >] + + telemeta_models_enum_ContextKeyword [label=< + + + + + + + + + + + +
ContextKeyword
<Enumeration>
idAutoField
valueCharField
+ >] + + telemeta_models_enum_Publisher [label=< + + + + + + + + + + + +
Publisher
<Enumeration>
idAutoField
valueCharField
+ >] + + telemeta_models_enum_PublisherCollection [label=< + + + + + + + + + + + +
PublisherCollection
<ModelCore>
idAutoField
valueCharField
+ >] + + telemeta_models_enum_EthnicGroup [label=< + + + + + + + + + + + +
EthnicGroup
<Enumeration>
idAutoField
valueCharField
+ >] + + telemeta_models_enum_EthnicGroupAlias [label=< + + + + + + + + + + + +
EthnicGroupAlias
<ModelCore>
idAutoField
valueCharField
+ >] + + telemeta_models_enum_TapeLength [label=< + + + + + + + + + + + +
TapeLength
<Enumeration>
idAutoField
valueCharField
+ >] + + telemeta_models_enum_TapeWidth [label=< + + + + + + + + + + + +
TapeWidth
<Enumeration>
idAutoField
valueCharField
+ >] + + telemeta_models_enum_TapeSpeed [label=< + + + + + + + + + + + +
TapeSpeed
<Enumeration>
idAutoField
valueCharField
+ >] + + telemeta_models_enum_TapeVendor [label=< + + + + + + + + + + + +
TapeVendor
<Enumeration>
idAutoField
valueCharField
+ >] + + telemeta_models_location_Location [label=< + + + + + + + + + + + + + + + + + + + + + + + +
Location
<ModelCore>
idAutoField
nameCharField
typeIntegerField
latitudeFloatField
longitudeFloatField
is_authoritativeBooleanField
+ >] + + telemeta_models_location_LocationType [label=< + + + + + + + + + + + + + + +
LocationType
<ModelCore>
idAutoField
codeCharField
nameCharField
+ >] + + telemeta_models_location_LocationAlias [label=< + + + + + + + + + + + + + + +
LocationAlias
<ModelCore>
idAutoField
aliasCharField
is_authoritativeBooleanField
+ >] + + telemeta_models_location_LocationRelation [label=< + + + + + + + + + + + + + + +
LocationRelation
<ModelCore>
idAutoField
is_directBooleanField
is_authoritativeBooleanField
+ >] + + telemeta_models_system_Revision [label=< + + + + + + + + + + + + + + + + + + + + +
Revision
<ModelCore>
idAutoField
element_typeCharField
element_idIntegerField
change_typeCharField
timeDateTimeField
+ >] + + telemeta_models_system_UserProfile [label=< + + + + + + + + + + + + + + + + + + + + + + + + + + +
UserProfile
idAutoField
institutionCharField
functionCharField
addressTextField
telephoneCharField
expiration_dateDateField
init_passwordBooleanField
+ >] + + telemeta_models_system_Criteria [label=< + + + + + + + + + + + + + + +
Criteria
<ModelCore>
idAutoField
keyCharField
valueCharField
+ >] + + telemeta_models_system_Search [label=< + + + + + + + + + + + + + + +
Search
<ModelCore>
idAutoField
dateDateTimeField
descriptionCharField
+ >] + + telemeta_models_instrument_Instrument [label=< + + + + + + + + + + + +
Instrument
<ModelCore>
idAutoField
nameCharField
+ >] + + telemeta_models_instrument_InstrumentAlias [label=< + + + + + + + + + + + +
InstrumentAlias
<ModelCore>
idAutoField
nameCharField
+ >] + + telemeta_models_instrument_InstrumentRelation [label=< + + + + + + + + +
InstrumentRelation
<ModelCore>
idAutoField
+ >] + + telemeta_models_instrument_InstrumentAliasRelation [label=< + + + + + + + + +
InstrumentAliasRelation
<ModelCore>
idAutoField
+ >] + + telemeta_models_language_Language [label=< + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Language
<ModelCore>
idAutoField
identifierCharField
part2BCharField
part2TCharField
part1CharField
scopeCharField
typeCharField
nameCharField
commentTextField
+ >] + + telemeta_models_media_MediaCollection [label=< + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MediaCollection
<MediaResource>
idAutoField
referenceCharField
titleCharField
alt_titleCharField
creatorCharField
recorded_from_yearIntegerField
recorded_to_yearIntegerField
year_publishedIntegerField
collectorCharField
publisher_serialCharField
booklet_authorCharField
external_referencesTextField
doctype_codeIntegerField
public_accessCharField
cnrs_contributorCharField
booklet_descriptionTextField
alt_idsCharField
commentTextField
travailCharField
items_doneCharField
collector_is_creatorBooleanField
is_publishedBooleanField
conservation_siteCharField
codeCharField
old_codeCharField
approx_durationDurationField
physical_items_numIntegerField
stateTextField
a_informer_07_03CharField
+ >] + + telemeta_models_media_MediaCollectionRelated [label=< + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MediaCollectionRelated
<MediaRelated>
idAutoField
titleCharField
dateDateTimeField
descriptionTextField
mime_typeCharField
urlCharField
creditsCharField
fileFileField
+ >] + + telemeta_models_media_MediaItem [label=< + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MediaItem
<MediaResource>
idAutoField
titleCharField
alt_titleCharField
collectorCharField
recorded_from_dateDateField
recorded_to_dateDateField
location_commentCharField
cultural_areaCharField
languageCharField
context_commentTextField
moda_executCharField
authorCharField
commentTextField
collector_selectionCharField
collector_from_collectionBooleanField
codeCharField
old_codeCharField
trackCharField
creator_referenceCharField
external_referencesTextField
public_accessCharField
fileFileField
approx_durationDurationField
+ >] + + telemeta_models_media_MediaItemRelated [label=< + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MediaItemRelated
<MediaRelated>
idAutoField
titleCharField
dateDateTimeField
descriptionTextField
mime_typeCharField
urlCharField
creditsCharField
fileFileField
+ >] + + telemeta_models_media_MediaItemKeyword [label=< + + + + + + + + +
MediaItemKeyword
<ModelCore>
idAutoField
+ >] + + telemeta_models_media_MediaItemPerformance [label=< + + + + + + + + + + + + + + +
MediaItemPerformance
<ModelCore>
idAutoField
instruments_numCharField
musiciansCharField
+ >] + + telemeta_models_media_MediaItemAnalysis [label=< + + + + + + + + + + + + + + + + + + + + +
MediaItemAnalysis
<ModelCore>
idAutoField
analyzer_idCharField
nameCharField
valueCharField
unitCharField
+ >] + + telemeta_models_media_MediaPart [label=< + + + + + + + + + + + + + + + + + +
MediaPart
<MediaResource>
idAutoField
titleCharField
startFloatField
endFloatField
+ >] + + telemeta_models_media_Playlist [label=< + + + + + + + + + + + + + + + + + +
Playlist
<ModelCore>
idAutoField
public_idCharField
titleCharField
descriptionTextField
+ >] + + telemeta_models_media_PlaylistResource [label=< + + + + + + + + + + + + + + + + + +
PlaylistResource
<ModelCore>
idAutoField
public_idCharField
resource_typeCharField
resource_idCharField
+ >] + + telemeta_models_media_MediaItemMarker [label=< + + + + + + + + + + + + + + + + + + + + + + + +
MediaItemMarker
<MediaResource>
idAutoField
public_idCharField
timeFloatField
titleCharField
dateDateTimeField
descriptionTextField
+ >] + + telemeta_models_media_MediaItemTranscodingFlag [label=< + + + + + + + + + + + + + + + + + +
MediaItemTranscodingFlag
<ModelCore>
idAutoField
mime_typeCharField
dateDateTimeField
valueBooleanField
+ >] + + telemeta_models_media_MediaCorpus [label=< + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MediaCorpus
<MediaBaseResource>
idAutoField
titleCharField
descriptionCharField
codeCharField
referenceCharField
public_accessCharField
recorded_from_yearIntegerField
recorded_to_yearIntegerField
+ >] + + telemeta_models_media_MediaFonds [label=< + + + + + + + + + + + + + + + + + + + + + + + +
MediaFonds
<MediaBaseResource>
idAutoField
titleCharField
descriptionCharField
codeCharField
referenceCharField
public_accessCharField
+ >] + + telemeta_models_media_MediaCorpusRelated [label=< + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MediaCorpusRelated
<MediaRelated>
idAutoField
titleCharField
dateDateTimeField
descriptionTextField
mime_typeCharField
urlCharField
creditsCharField
fileFileField
+ >] + + telemeta_models_media_MediaFondsRelated [label=< + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MediaFondsRelated
<MediaRelated>
idAutoField
titleCharField
dateDateTimeField
descriptionTextField
mime_typeCharField
urlCharField
creditsCharField
fileFileField
+ >] + + telemeta_models_media_Format [label=< + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Format
<ModelCore>
idAutoField
original_codeCharField
tape_numberCharField
statusCharField
conservation_stateCharField
commentsTextField
tape_thicknessCharField
tape_diameterCharField
tape_referenceCharField
+ >] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + telemeta_models_enum_PublisherCollection -> telemeta_models_enum_Publisher + [label="publisher (publisher_collections)"] [arrowhead=none, arrowtail=dot]; + + + + + + + telemeta_models_enum_EthnicGroupAlias -> telemeta_models_enum_EthnicGroup + [label="ethnic_group (aliases)"] [arrowhead=none, arrowtail=dot]; + + + + + + + + + + + + + telemeta_models_location_Location -> telemeta_models_location_LocationType + [label="complete_type (locations)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_location_Location -> telemeta_models_location_Location + [label="current_location (past_names)"] [arrowhead=none, arrowtail=dot]; + + + + + + + telemeta_models_location_LocationAlias -> telemeta_models_location_Location + [label="location (aliases)"] [arrowhead=none, arrowtail=dot]; + + + + + telemeta_models_location_LocationRelation -> telemeta_models_location_Location + [label="location (ancestor_relations)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_location_LocationRelation -> telemeta_models_location_Location + [label="ancestor_location (descendant_relations)"] [arrowhead=none, arrowtail=dot]; + + + + + django_contrib_auth_models_User [label=< + + +
User
+ >] + + telemeta_models_system_Revision -> django_contrib_auth_models_User + [label="user (revisions)"] [arrowhead=none, arrowtail=dot]; + + + + + django_contrib_auth_models_User [label=< + + +
User
+ >] + + telemeta_models_system_UserProfile -> django_contrib_auth_models_User + [label="user (userprofile)"] [arrowhead=none, arrowtail=dot]; + + + + + + + django_contrib_auth_models_User [label=< + + +
User
+ >] + + telemeta_models_system_Search -> django_contrib_auth_models_User + [label="username (searches)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_system_Search -> telemeta_models_system_Criteria + [label="criteria (search)"] [arrowhead=dot arrowtail=dot, dir=both]; + + + + + + + + + telemeta_models_instrument_InstrumentRelation -> telemeta_models_instrument_Instrument + [label="instrument (parent_relation)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_instrument_InstrumentRelation -> telemeta_models_instrument_Instrument + [label="parent_instrument (child_relation)"] [arrowhead=none, arrowtail=dot]; + + + + + telemeta_models_instrument_InstrumentAliasRelation -> telemeta_models_instrument_InstrumentAlias + [label="alias (other_name)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_instrument_InstrumentAliasRelation -> telemeta_models_instrument_InstrumentAlias + [label="instrument (relation)"] [arrowhead=none, arrowtail=dot]; + + + + + + + telemeta_models_media_MediaCollection -> telemeta_models_enum_RecordingContext + [label="recording_context (collections)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_MediaCollection -> telemeta_models_enum_Publisher + [label="publisher (collections)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_MediaCollection -> telemeta_models_enum_PublisherCollection + [label="publisher_collection (collections)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_MediaCollection -> telemeta_models_enum_LegalRight + [label="legal_rights (collections)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_MediaCollection -> telemeta_models_enum_AcquisitionMode + [label="acquisition_mode (collections)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_MediaCollection -> telemeta_models_enum_MetadataAuthor + [label="metadata_author (collections)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_MediaCollection -> telemeta_models_enum_PublishingStatus + [label="publishing_status (collections)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_MediaCollection -> telemeta_models_enum_MetadataWriter + [label="metadata_writer (collections)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_MediaCollection -> telemeta_models_enum_PhysicalFormat + [label="physical_format (collections)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_MediaCollection -> telemeta_models_enum_AdConversion + [label="ad_conversion (collections)"] [arrowhead=none, arrowtail=dot]; + + + + + telemeta_models_media_MediaCollectionRelated -> telemeta_models_media_MediaCollection + [label="collection (related)"] [arrowhead=none, arrowtail=dot]; + + + + + telemeta_models_media_MediaItem -> telemeta_models_media_MediaCollection + [label="collection (items)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_MediaItem -> telemeta_models_location_Location + [label="location (mediaitem)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_MediaItem -> telemeta_models_enum_EthnicGroup + [label="ethnic_group (items)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_MediaItem -> telemeta_models_language_Language + [label="language_iso (items)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_MediaItem -> telemeta_models_enum_VernacularStyle + [label="vernacular_style (items)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_MediaItem -> telemeta_models_enum_GenericStyle + [label="generic_style (items)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_MediaItem -> telemeta_models_media_MediaItem + [label="copied_from_item (copies)"] [arrowhead=none, arrowtail=dot]; + + + + + telemeta_models_media_MediaItemRelated -> telemeta_models_media_MediaItem + [label="item (related)"] [arrowhead=none, arrowtail=dot]; + + + + + telemeta_models_media_MediaItemKeyword -> telemeta_models_media_MediaItem + [label="item (keyword_relations)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_MediaItemKeyword -> telemeta_models_enum_ContextKeyword + [label="keyword (item_relations)"] [arrowhead=none, arrowtail=dot]; + + + + + telemeta_models_media_MediaItemPerformance -> telemeta_models_media_MediaItem + [label="media_item (performances)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_MediaItemPerformance -> telemeta_models_instrument_Instrument + [label="instrument (performances)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_MediaItemPerformance -> telemeta_models_instrument_InstrumentAlias + [label="alias (performances)"] [arrowhead=none, arrowtail=dot]; + + + + + telemeta_models_media_MediaItemAnalysis -> telemeta_models_media_MediaItem + [label="item (analysis)"] [arrowhead=none, arrowtail=dot]; + + + + + telemeta_models_media_MediaPart -> telemeta_models_media_MediaItem + [label="item (parts)"] [arrowhead=none, arrowtail=dot]; + + + + + django_contrib_auth_models_User [label=< + + +
User
+ >] + + telemeta_models_media_Playlist -> django_contrib_auth_models_User + [label="author (playlists)"] [arrowhead=none, arrowtail=dot]; + + + + + telemeta_models_media_PlaylistResource -> telemeta_models_media_Playlist + [label="playlist (resources)"] [arrowhead=none, arrowtail=dot]; + + + + + telemeta_models_media_MediaItemMarker -> telemeta_models_media_MediaItem + [label="item (markers)"] [arrowhead=none, arrowtail=dot]; + + + django_contrib_auth_models_User [label=< + + +
User
+ >] + + telemeta_models_media_MediaItemMarker -> django_contrib_auth_models_User + [label="author (markers)"] [arrowhead=none, arrowtail=dot]; + + + + + telemeta_models_media_MediaItemTranscodingFlag -> telemeta_models_media_MediaItem + [label="item (transcoding)"] [arrowhead=none, arrowtail=dot]; + + + + + telemeta_models_media_MediaCorpus -> telemeta_models_media_MediaCollection + [label="children (corpus)"] [arrowhead=dot arrowtail=dot, dir=both]; + + + + + telemeta_models_media_MediaFonds -> telemeta_models_media_MediaCorpus + [label="children (fonds)"] [arrowhead=dot arrowtail=dot, dir=both]; + + + + + telemeta_models_media_MediaCorpusRelated -> telemeta_models_media_MediaCorpus + [label="resource (related)"] [arrowhead=none, arrowtail=dot]; + + + + + telemeta_models_media_MediaFondsRelated -> telemeta_models_media_MediaFonds + [label="resource (related)"] [arrowhead=none, arrowtail=dot]; + + + + + telemeta_models_media_Format -> telemeta_models_media_MediaItem + [label="item (formats)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_Format -> telemeta_models_enum_TapeLength + [label="tape_length (formats)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_Format -> telemeta_models_enum_TapeWidth + [label="tape_width (formats)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_Format -> telemeta_models_enum_TapeSpeed + [label="tape_speed (formats)"] [arrowhead=none, arrowtail=dot]; + + + telemeta_models_media_Format -> telemeta_models_enum_TapeVendor + [label="tape_vendor (formats)"] [arrowhead=none, arrowtail=dot]; + + +} diff --git a/doc/devel/telemeta.pdf b/doc/devel/telemeta.pdf new file mode 100644 index 00000000..c6b8a651 Binary files /dev/null and b/doc/devel/telemeta.pdf differ diff --git a/example/sandbox_sqlite/diag.sh b/example/sandbox_sqlite/diag.sh new file mode 100755 index 00000000..438276b3 --- /dev/null +++ b/example/sandbox_sqlite/diag.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +app="telemeta" +dir="../../doc/devel" + +python modelviz.py -a > $dir/$app-all.dot +python modelviz.py $app > $dir/$app.dot + +dot $dir/$app-all.dot -Tpdf -o $dir/$app-all.pdf +dot $dir/$app.dot -Tpdf -o $dir/$app.pdf + diff --git a/example/sandbox_sqlite/modelviz.py b/example/sandbox_sqlite/modelviz.py new file mode 100644 index 00000000..24af0627 --- /dev/null +++ b/example/sandbox_sqlite/modelviz.py @@ -0,0 +1,359 @@ +#!/usr/bin/env python + +"""Django model to DOT (Graphviz) converter +by Antonio Cavedoni + +Make sure your DJANGO_SETTINGS_MODULE is set to your project or +place this script in the same directory of the project and call +the script like this: + +$ python modelviz.py [-h] [-a] [-d] [-g] [-n] [-L ] [-i ] ... > .dot +$ dot .dot -Tpng -o .png + +options: + -h, --help + show this help message and exit. + + -a, --all_applications + show models from all applications. + + -d, --disable_fields + don't show the class member fields. + + -g, --group_models + draw an enclosing box around models from the same app. + + -i, --include_models=User,Person,Car + only include selected models in graph. + + -n, --verbose_names + use verbose_name for field and models. + + -L, --language + specify language used for verrbose_name localization + + -x, --exclude_columns + exclude specific column(s) from the graph. + + -X, --exclude_models + exclude specific model(s) from the graph. + + -e, --inheritance + show inheritance arrows. +""" +__version__ = "0.9" +__svnid__ = "$Id$" +__license__ = "Python" +__author__ = "Antonio Cavedoni " +__contributors__ = [ + "Stefano J. Attardi ", + "limodou ", + "Carlo C8E Miron", + "Andre Campos ", + "Justin Findlay ", + "Alexander Houben ", + "Bas van Oostveen ", + "Joern Hees " +] + +import os +import sys +import getopt + +from django.core.management import setup_environ + +try: + import settings +except ImportError: + pass +else: + setup_environ(settings) + +from django.utils.translation import activate as activate_language +from django.utils.safestring import mark_safe +from django.template import Template, Context, loader +from django.db import models +from django.db.models import get_models +from django.db.models.fields.related import \ + ForeignKey, OneToOneField, ManyToManyField, RelatedField + +try: + from django.db.models.fields.generic import GenericRelation +except ImportError: + from django.contrib.contenttypes.generic import GenericRelation + +def parse_file_or_list(arg): + if not arg: + return [] + if not ',' in arg and os.path.isfile(arg): + return [e.strip() for e in open(arg).readlines()] + return arg.split(',') + + +def generate_dot(app_labels, **kwargs): + disable_fields = kwargs.get('disable_fields', False) + include_models = parse_file_or_list(kwargs.get('include_models', "")) + all_applications = kwargs.get('all_applications', False) + use_subgraph = kwargs.get('group_models', False) + verbose_names = kwargs.get('verbose_names', False) + inheritance = kwargs.get('inheritance', False) + language = kwargs.get('language', None) + if language is not None: + activate_language(language) + exclude_columns = parse_file_or_list(kwargs.get('exclude_columns', "")) + exclude_models = parse_file_or_list(kwargs.get('exclude_models', "")) + + def skip_field(field): + if exclude_columns: + if verbose_names and field.verbose_name: + if field.verbose_name in exclude_columns: + return True + if field.name in exclude_columns: + return True + return False + + + + + t = loader.get_template('django_extensions/graph_models/head.html') + c = Context({}) + dot = t.render(c) + + apps = [] + if all_applications: + apps = models.get_apps() + + for app_label in app_labels: + app = models.get_app(app_label) + if not app in apps: + apps.append(app) + + graphs = [] + for app in apps: + graph = Context({ + 'name': '"%s"' % app.__name__, + 'app_name': "%s" % '.'.join(app.__name__.split('.')[:-1]), + 'cluster_app_name': "cluster_%s" % app.__name__.replace(".", "_"), + 'disable_fields': disable_fields, + 'use_subgraph': use_subgraph, + 'models': [] + }) + + appmodels = get_models(app) + abstract_models = [] + for appmodel in appmodels: + abstract_models = abstract_models + [abstract_model for abstract_model in appmodel.__bases__ if hasattr(abstract_model, '_meta') and abstract_model._meta.abstract] + abstract_models = list(set(abstract_models)) # remove duplicates + appmodels = abstract_models + appmodels + + + for appmodel in appmodels: + appmodel_abstracts = [abstract_model.__name__ for abstract_model in appmodel.__bases__ if hasattr(abstract_model, '_meta') and abstract_model._meta.abstract] + + # collect all attribs of abstract superclasses + def getBasesAbstractFields(c): + _abstract_fields = [] + for e in c.__bases__: + if hasattr(e, '_meta') and e._meta.abstract: + _abstract_fields.extend(e._meta.fields) + _abstract_fields.extend(getBasesAbstractFields(e)) + return _abstract_fields + abstract_fields = getBasesAbstractFields(appmodel) + + model = { + 'app_name': appmodel.__module__.replace(".", "_"), + 'name': appmodel.__name__, + 'abstracts': appmodel_abstracts, + 'fields': [], + 'relations': [] + } + + # consider given model name ? + def consider(model_name): + if exclude_models and model_name in exclude_models: + return False + return not include_models or model_name in include_models + + if not consider(appmodel._meta.object_name): + continue + + if verbose_names and appmodel._meta.verbose_name: + model['label'] = appmodel._meta.verbose_name + else: + model['label'] = model['name'] + + # model attributes + def add_attributes(field): + if verbose_names and field.verbose_name: + label = field.verbose_name + else: + label = field.name + + t = type(field).__name__ + if isinstance(field, (OneToOneField, ForeignKey)): + t += " ({0})".format(field.rel.field_name) + # TODO: ManyToManyField, GenericRelation + + model['fields'].append({ + 'name': field.name, + 'label': label, + 'type': t, + 'blank': field.blank, + 'abstract': field in abstract_fields, + }) + + # Find all the real attributes. Relations are depicted as graph edges instead of attributes + attributes = [field for field in appmodel._meta.local_fields if not isinstance(field, RelatedField)] + + # find primary key and print it first, ignoring implicit id if other pk exists + pk = appmodel._meta.pk + if not appmodel._meta.abstract and pk in attributes: + add_attributes(pk) + for field in attributes: + if skip_field(field): + continue + if not field.primary_key: + add_attributes(field) + + # FIXME: actually many_to_many fields aren't saved in this model's db table, so why should we add an attribute-line for them in the resulting graph? + #if appmodel._meta.many_to_many: + # for field in appmodel._meta.many_to_many: + # if skip_field(field): + # continue + # add_attributes(field) + + # relations + def add_relation(field, extras=""): + if verbose_names and field.verbose_name: + label = field.verbose_name + else: + label = field.name + + # show related field name + if hasattr(field, 'related_query_name'): + label += ' (%s)' % field.related_query_name() + + _rel = { + 'target_app': field.rel.to.__module__.replace('.', '_'), + 'target': field.rel.to.__name__, + 'type': type(field).__name__, + 'name': field.name, + 'label': label, + 'arrows': extras, + 'needs_node': True + } + if _rel not in model['relations'] and consider(_rel['target']): + model['relations'].append(_rel) + + for field in appmodel._meta.local_fields: + if field.attname.endswith('_ptr_id'): # excluding field redundant with inheritance relation + continue + if field in abstract_fields: # excluding fields inherited from abstract classes. they too show as local_fields + continue + if skip_field(field): + continue + if isinstance(field, OneToOneField): + add_relation(field, '[arrowhead=none, arrowtail=none]') + elif isinstance(field, ForeignKey): + add_relation(field, '[arrowhead=none, arrowtail=dot]') + + for field in appmodel._meta.local_many_to_many: + if skip_field(field): + continue + if isinstance(field, ManyToManyField): + if (getattr(field, 'creates_table', False) or # django 1.1. + (hasattr(field.rel.through, '_meta') and field.rel.through._meta.auto_created)): # django 1.2 + add_relation(field, '[arrowhead=dot arrowtail=dot, dir=both]') + elif isinstance(field, GenericRelation): + add_relation(field, mark_safe('[style="dotted", arrowhead=normal, arrowtail=normal, dir=both]')) + + if inheritance: + # add inheritance arrows + for parent in appmodel.__bases__: + if hasattr(parent, "_meta"): # parent is a model + l = "multi-table" + if parent._meta.abstract: + l = "abstract" + if appmodel._meta.proxy: + l = "proxy" + l += r"\ninheritance" + _rel = { + 'target_app': parent.__module__.replace(".", "_"), + 'target': parent.__name__, + 'type': "inheritance", + 'name': "inheritance", + 'label': l, + 'arrows': '[arrowhead=empty, arrowtail=none]', + 'needs_node': True + } + # TODO: seems as if abstract models aren't part of models.getModels, which is why they are printed by this without any attributes. + if _rel not in model['relations'] and consider(_rel['target']): + model['relations'].append(_rel) + + graph['models'].append(model) + graphs.append(graph) + + nodes = [] + for graph in graphs: + nodes.extend([e['name'] for e in graph['models']]) + + for graph in graphs: + # don't draw duplication nodes because of relations + for model in graph['models']: + for relation in model['relations']: + if relation['target'] in nodes: + relation['needs_node'] = False + # render templates + t = loader.get_template('django_extensions/graph_models/body.html') + dot += '\n' + t.render(graph) + + for graph in graphs: + t = loader.get_template('django_extensions/graph_models/rel.html') + dot += '\n' + t.render(graph) + + + t = loader.get_template('django_extensions/graph_models/tail.html') + c = Context({}) + dot += '\n' + t.render(c) + return dot + +def main(): + try: + opts, args = getopt.getopt(sys.argv[1:], "hadgi:L:x:X:en", + ["help", "all_applications", "disable_fields", "group_models", "include_models=", "inheritance", "verbose_names", "language=", "exclude_columns=", "exclude_models="]) + except getopt.GetoptError, error: + print __doc__ + sys.exit(error) + + kwargs = {} + for opt, arg in opts: + if opt in ("-h", "--help"): + print __doc__ + sys.exit() + if opt in ("-a", "--all_applications"): + kwargs['all_applications'] = True + if opt in ("-d", "--disable_fields"): + kwargs['disable_fields'] = True + if opt in ("-g", "--group_models"): + kwargs['group_models'] = True + if opt in ("-i", "--include_models"): + kwargs['include_models'] = arg + if opt in ("-e", "--inheritance"): + kwargs['inheritance'] = True + if opt in ("-n", "--verbose-names"): + kwargs['verbose_names'] = True + if opt in ("-L", "--language"): + kwargs['language'] = arg + if opt in ("-x", "--exclude_columns"): + kwargs['exclude_columns'] = arg + if opt in ("-X", "--exclude_models"): + kwargs['exclude_models'] = arg + + if not args and not kwargs.get('all_applications', False): + print __doc__ + sys.exit() + + print generate_dot(args, **kwargs) + +if __name__ == "__main__": + main() diff --git a/example/sandbox_sqlite/settings.py b/example/sandbox_sqlite/settings.py index e0b13d4f..5ff93f3e 100644 --- a/example/sandbox_sqlite/settings.py +++ b/example/sandbox_sqlite/settings.py @@ -102,6 +102,7 @@ INSTALLED_APPS = ( 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.admin', + 'django_extensions', 'telemeta', 'jsonrpc', 'south',