commit 90b758c247ad4f630f1775c6154daaef62284f52 Author: Magnus Hagander Date: Mon Sep 14 14:39:25 2009 +0200 A first very basic import. Contains basic functionality, and an import of most of the static content from the old site. There is still plenty more to do... diff --git a/media/css/base.css b/media/css/base.css new file mode 100644 index 00000000..66eec858 --- /dev/null +++ b/media/css/base.css @@ -0,0 +1,7 @@ +@import url("global.css"); +@import url("layout.css"); +@import url("text.css"); +@import url("navigation.css"); +@import url("table.css"); + +@import url("iefixes.css"); diff --git a/media/css/docs.css b/media/css/docs.css new file mode 100644 index 00000000..8756655e --- /dev/null +++ b/media/css/docs.css @@ -0,0 +1,210 @@ +/* PostgreSQL.org Documentation Style */ + +@import url("global.css"); +@import url("table.css"); +@import url("text.css"); + +body { + font-size: 76%; +} + +/* Container Definitions */ + +#docContainerWrap { + text-align: center; /* Win IE5 */ +} + +#docContainer { + margin: 0 auto; + width: 90%; + padding-bottom: 2em; + display: block; + text-align: left; /* Win IE5 */ +} + +#docHeader { + background-image: url("/media/img/docs/bg_hdr.png"); + height: 83px; + margin: 0px; + padding: 0px; + display: block; +} + +#docHeaderLogo { + position: relative; + width: 206px; + height: 83px; + border: 0px; + padding: 0px; + margin: 0px; + margin-left: 20px; +} + +#docHeaderLogo img { border: 0px; } + +#docNavSearchContainer { + padding-bottom: 2px; +} + +#docNav { + position: relative; + text-align: left; + margin-left: 10px; + margin-top: 5px; + color: #666; + font-size: 0.95em; +} + +#docSearch { + position: relative; + text-align: right; + padding: 0; + margin: 0; + color: #666; +} + +#docTextSize { + text-align: right; + white-space: nowrap; + margin-top: 7px; + font-size: 0.95em; +} + +#docSearch form { + position: relative; + top: 5px; + right: 0; + margin: 0; /* need for IE Mac */ + text-align: right; /* need for IE Mac */ + white-space: nowrap; /* for Opera */ +} + +#docSearch form label { color: #666; font-size: 0.95em; } +#docSearch form input { font-size: 0.95em; } + +#docSearch form #submit { + font-size: 0.95em; + background: #7A7A7A; + color: #fff; + border-right: 1px solid #7A7A7A; + border-bottom: 1px solid #7A7A7A; + border-top: 1px solid #7A7A7A; + border-left: 1px solid #7A7A7A; + padding: 1px 4px; +} + +#docSearch form #q { + width: 170px; + font-size: 0.95em; + border: 1px solid #7A7A7A; + background: #E1E1E1; + color: #000000; + padding: 2px; +} + +.frmDocSearch { + padding: 0; + margin: 0; + display: inline; +} + +.inpDocSearch { + padding: 0; + margin: 0; + color: #000; +} + +#docContent { + position: relative; + margin-left: 10px; + margin-right: 10px; + margin-top: 40px; +} + +#docFooter { + position: relative; + font-size: 0.9em; + color: #666; + line-height: 1.3em; + margin-left: 10px; + margin-right: 10px; +} + +#docComments { + margin-top: 10px; +} + +#docClear { + clear: both; + margin: 0; + padding: 0; +} + +/* Heading Definitions */ + +h1 { + font-weight: bold; + color: #EC5800; + font-size: 1.4em; +} + +h2 { + font-weight: bold; + color: #666; + font-size: 1.2em; +} + +h3 { + font-weight: bold; + color: #666; + font-size: 1.1em; +} + +/* Text Styles */ + +.txtCurrentLocation { + font-weight: bold; +} + +p, ol, ul, li { + line-height: 1.5em; +} + +.txtCommentsWrap { + border: 2px solid #F5F5F5; + width: 100%; +} + +.txtCommentsContent { + background: #F5F5F5; + padding: 3px; +} + +.txtCommentsPoster { + float: left; +} + +.txtCommentsDate { + float: right; +} + +.txtCommentsComment { + padding: 3px; +} + +/* Link Styles */ + +#docNav a { + font-weight: bold; +} + + +a:link { color:#0066A2; text-decoration: underline; } +a:visited { color:#004E66; text-decoration: underline; } +a:active { color:#0066A2; text-decoration: underline; } +a:hover { color:#000000; text-decoration: underline; } + +#docFooter a:link { color:#666; text-decoration: underline; } +#docFooter a:visited { color:#666; text-decoration: underline; } +#docFooter a:active { color:#666; text-decoration: underline; } +#docFooter a:hover { color:#000000; text-decoration: underline; } diff --git a/media/css/docs_large.css b/media/css/docs_large.css new file mode 100644 index 00000000..f4f53933 --- /dev/null +++ b/media/css/docs_large.css @@ -0,0 +1,7 @@ +/* PostgreSQL Documentation Style - Large Text Version */ + +@import url("docs.css"); + +body { + font-size: 93%; +} diff --git a/media/css/geckofixes.css b/media/css/geckofixes.css new file mode 100644 index 00000000..96313fc4 --- /dev/null +++ b/media/css/geckofixes.css @@ -0,0 +1,21 @@ +/* Gecko is broken with pre,tt,code sizes */ + +#pgContainer code, #pgContainer pre, #pgContainer tt { + font-size: 1.2em; +} + +#docContainer tt, #docContainer pre, #docContainer code { + font-size: 1.4em; +} + +#docContainer tt tt, #docContainer tt code, #docContainer tt pre { + font-size: 1.0em; +} + +#docContainer pre code, #docContainer pre tt, #docContainer pre pre { + font-size: 1.0em; +} + +#docContainer code code, #docContainer code tt, #docContainer code pre { + font-size: 1.0em; +} diff --git a/media/css/global.css b/media/css/global.css new file mode 100644 index 00000000..16ec0acf --- /dev/null +++ b/media/css/global.css @@ -0,0 +1,80 @@ +/* + PostgreSQL.org - Global Styles +*/ + +body { + margin: 0; + padding: 0; + font-family: verdana, sans-serif; + font-size: 69%; + color: #000; + background-color: #fff; +} + +h1 { + font-size: 1.4em; + font-weight: bold; + margin-top: 0em; + margin-bottom: 0em; +} + +h2 { + font-size: 1.2em; + margin: 1.2em 0em 1.2em 0em; + font-weight: bold; +} + +h3 { + font-size: 1.0em; + margin: 1.2em 0em 1.2em 0em; + font-weight: bold; +} + +h4 { + font-size: 0.95em; + margin: 1.2em 0em 1.2em 0em; + font-weight: normal; +} + +h5 { + font-size: 0.9em; + margin: 1.2em 0em 1.2em 0em; + font-weight: normal; +} + +h6 { + font-size: 0.85em; + margin: 1.2em 0em 1.2em 0em; + font-weight: normal; +} + +img { + border: 0; +} + +ol, ul, li {/* + list-style: none;*/ + font-size: 1.0em; + line-height: 1.2em; + margin-top: 0.2em; + margin-bottom: 0.1em; +} + +p { + font-size: 1.0em; + line-height: 1.2em; + margin: 1.2em 0em 1.2em 0em; +} + +li > p { + margin-top: 0.2em; +} + +pre { + font-family: monospace; + font-size: 1.0em; +} + +strong, b { + font-weight: bold; +} diff --git a/media/css/iefixes.css b/media/css/iefixes.css new file mode 100644 index 00000000..8601bc1e --- /dev/null +++ b/media/css/iefixes.css @@ -0,0 +1,138 @@ +/* + PostgreSQL.org - Fixes for Internet Explorer +*/ + +/*Win IE fix \*/ +* html #pgHeaderContainer { height: 1%; } + +/*End Win IE fix*/ + +/*Win IE fix \*/ +* html #pgHeader { height: 1%; } + +/*End Win IE fix*/ + +/*Win IE fix \*/ +* html #pgTopNav { height: 1%; margin-top: 0px; } + +/*End Win IE fix*/ + +/*Win IE fix \*/ +* html #pgTopNavLeft { height: 1%; } + +/*End Win IE fix*/ + +/*Win IE fix \*/ +* html #pgTopNavRight { height: 1%; } + +/*End Win IE fix*/ + +/*Win IE fix \*/ +* html #pgTopNavList { height: 1%; margin-bottom: -2px; } +* html #pgTopNavList li { margin: 0 0.5em 0 -0.5em; } + +/*End Win IE fix*/ + + +/*Win IE fix \*/ +* html #pgSearchNavList { height: 1%; margin-right: 0.5em; } +* html #pgSearchNavList li { margin: 0 0 0 0.5em; } + +/*End Win IE fix*/ + +/*Win IE fix \*/ +* html #pgContent { height: 1%; } + +/*End Win IE fix*/ + +/*Win IE fix \*/ +* html #pgFrontContainer { height: 1%; } + +/*End Win IE fix*/ + +/*Win IE fix \*/ +* html #pgFrontMain { height: 1%; } + +/*End Win IE fix*/ + +/*Win IE fix \*/ +* html #pgFrontFeature { height: 1%; } + +/*End Win IE fix*/ + +/*Win IE fix \*/ +* html #pgFrontFeatureLink { height: 1%; } + +/*End Win IE fix*/ + +/*Win IE fix \*/ +* html #pgFrontNewsEventsContainer { height: 1%; } + +/*End Win IE fix*/ + +/*Win IE fix \*/ +* html #pgFrontNews { height: 1%; } + +/*End Win IE fix*/ + +/*Win IE fix \*/ +* html #pgFrontEvents { height: 1%; } + +/*End Win IE fix*/ + +/*Win IE fix \*/ +* html .pgNewsEventsList { height: 1%; } + +/*End Win IE fix*/ + +/*Win IE fix \*/ +* html #pgFrontUSSContainer { height: 1%; } + +/*End Win IE fix*/ + +/*Win IE fix \*/ +* html #pgFrontUser { height: 1%; } + +/*End Win IE fix*/ + +/*Win IE fix \*/ +* html #pgFrontSupportUs { height: 1%; } + +/*End Win IE fix*/ + +/*Win IE fix \*/ +* html #pgFrontShortcuts { height: 1%; } + +/*End Win IE fix*/ + +/*Win IE fix \*/ +* html #pgFrontShortcutsWrap { height: 1%; margin-top: 7px; } + +/*End Win IE fix*/ + +/*Win IE fix \*/ +* html #pgFrontShortcutsList { height: 1%; } + +/*End Win IE fix*/ + +/*Win IE fix \*/ +* html #pgFrontNewsEventsContainer h3 img { height: 1%; margin-bottom: 4px; } + +/*End Win IE fix*/ + +/*Win IE fix \*/ +* html #pgSideWrap { /* margin-top: 11px; */ } +/*End Win IE fix*/ + +/*Win IE fix \*/ +* html #pgContentWrap {margin-left: 165px; /* margin-top: 11px; */ } +/*End Win IE fix*/ + +/*Win IE fix \*/ +* html #pgSideNav { height: 1%; position: static; } + +/*End Win IE fix*/ + +/*Win IE fix \*/ +* html #txtArchives pre { font-size: 100%; } +/*End Win IE fix*/ diff --git a/media/css/layout.css b/media/css/layout.css new file mode 100644 index 00000000..2ffd2dd0 --- /dev/null +++ b/media/css/layout.css @@ -0,0 +1,656 @@ +/* + PostgreSQL.org - Layout Styles +*/ + +/* Container Definitions */ + +/* Page Container */ + +#pgContainerWrap { + text-align: center; /* Win IE5 */ +} + +#pgContainer { + margin: 0em auto; + width: 765px; + padding: 0; + padding-top: 4px; + padding-bottom: 10px; + text-align: left; /* Win IE5 */ +} + + +/* Header Container */ +#pgHeaderContainer { + padding-bottom: 2px; +} + +#pgHeader { + position: relative; + background: url("/media/img/layout/hdr_fill.png") repeat-x; + height: 80px; + margin: 0; + padding: 0; + clear: both; +} + +#pgHeaderLogoLeft { + position: relative; + width: 230px; + height: 80px; + border: 0px; + padding: 0px; + margin: 0px; + float: left; +} + +#pgHeaderLogoLeft img { + border: 0px; +} + +#pgHeaderLogoRight { + position: relative; + width: 210px; + height: 80px; + border: 0px; + padding: 0px; + margin: 0px; + float: right; +} + +#pgHeaderLogoRight img { + border: 0px; +} + +#pgSearch { + position: relative; + text-align: right; + padding: 0; + margin: 0; + color: #666; +} + +#pgSearch form { + position: relative; + top: 5px; + right: 0; + margin: 0; /* need for IE Mac */ + text-align: right; /* need for IE Mac */ + white-space: nowrap; /* for Opera */ +} + +#pgSearch form label { + color: #666; + font-size: 0.8em; +} + +#pgSearch form input { + font-size: 0.8em; +} + +#pgSearch form #submit { + font-size: 0.8em; + background: #FFFFFF; + color: #000000; + border-right: 1px solid #7A7A7A; + border-bottom: 1px solid #7A7A7A; + border-top: 1px solid #7A7A7A; + border-left: 1px solid #7A7A7A; + padding: 1px 4px; +} + +#pgSearch form #q { + font-size: 0.8em; + width: 140px; + border: 1px solid #7A7A7A; + background: #FFFFFF; + color: #000000; + padding: 2px; +} + +/* Content Container */ +#pgContent { + clear: both; + display: block; +} + +#pgFrontContainer { + width: 100%; + float: left; + margin-right: -220px; +} + +#pgFrontMain { + margin-right: 220px; + margin-top: 10px; +} + +#pgFrontFeature { + position: relative; + background: #F5F5F5 url(/media/img/feature/feature_elephant.png) right bottom no-repeat; + /* Also see pgFrontFeatureContent for image size */ + padding: 15px; + margin-bottom: 1em; + font-size: 1.0em; +} + +#pgFrontFeature:before { + line-height: 0.1; + font-size: 1px; + background: transparent url("/media/img/layout/feature_tr.gif") no-repeat top right; + margin: -15px -15px 0 -15px; + height: 15px; + display: block; + border: none; + content: url("/media/img/layout/feature_tl.gif"); +} + +#pgFrontFeature:after { + display: block; + clear: both; + padding-top: 15px; + line-height: 0.1; + font-size: 1px; + content: url("/media/img/layout/feature_bl.gif"); + margin: -15px; + height: 8px; + background: transparent url("/media/img/layout/feature_br.gif") scroll no-repeat bottom right ; +} + +#pgFrontFeature h2{ + border: none; + margin-top: 0; +} + +#pgFrontFeature p { + margin: 0 0 1em 0; +} + +#pgFrontFeature #pgFrontFeatureContent { + /* This padding controls the size of the text in the front blurb, and needs to be + * adjusted whenever the image is changed. */ + padding: 6px 132px 16px 10px; +} + +#pgFrontRightContainer { + float: right; + width: 200px; +/* border-left: 1px solid #E1E1E1;*/ + margin: 0; + padding: 0; + + padding-left: 10px; +} + +#pgFrontBottomContainer { + clear: both; + width: 100%; + padding-top: 0.7em; + margin-bottom: 15px; +} + +#pgFrontNews { + float:left; + width: 230px; + margin-right: 10px; +} + +#pgFrontEvents { + width: 240px; + border-left: 1px solid #E1E1E1; + margin: 0; + padding: 0; + padding-left: 10px; + margin-left: 250px; + margin-right: 250px; +} + +.pgNewsEventsWrap { + padding-left: 5px; +} + +.pgRSSBottomList { + list-style: none; + margin: 0; + padding: 0; + display: inline; +} + +.pgRSSBottomList img.pgRSSImage { + display: inline; + border: 0; + vertical-align: bottom; +} + +.pgRSSBottomList li { + padding: 0 0.5em 0 0.5em; + display: inline; + border-right: 1px solid #E1E1E1; +} + +.pgRSSBottomList li a { +} + +/* Uncomment when IE/Validator supports last-child + +.pgRSSBottomList li:last-child { + border-right: 0; + padding-right: 0; +} + +*/ + +.pgRSSBottomList li.last-child { + border-right: 0; + padding-right: 0; +} + +/* Used in pgRSSBottomList */ +img.pgArrowImage { + padding: 0; + margin: 0; + display: inline; + border: 0; +} + +#pgFrontUSSContainer { +} + +/* Featured User Box */ + +#pgFrontUser { + width: 545px; + padding-top: 7px; + float: left; + background: url(/media/img/layout/usr_tbl_top.png) top right no-repeat; + margin-bottom: 15px; +} + +#pgFrontUserInner { + background: url(/media/img/layout/usr_tbl_btm.png) bottom left no-repeat; + width: 100%; + padding-bottom: 7px; +} + +#pgFrontUserWrap { + padding: 11px 14px 12px 15px; + border-left: 1px solid #DADADA; + border-right: 1px solid #DADADA; +} + +#pgFrontUserContent { + margin-left: 4px; +} + +#pgFrontSupportUs { +} + +#pgFrontSupportUs h2 { + margin-bottom: 0.7em; +} + +#pgFrontSupportUsWrap { + margin-left: 8px; + color: #666; +} + +#pgFrontShortcuts h2 { + margin-bottom: 0.7em; +} + +#pgFrontShortcutsWrap { + font-size: 0.9em; + margin-left: 12px; + margin-top: 10px; + color: #666; +} + +#pgFrontShortcutsWrap img { + padding-right: 7px; +} + +#pgFrontShortcutsList { + margin: 0; + padding: 0; + list-style: none; +} + +#pgFrontShortcutsList li { + margin: 0; + padding-left: 12px; + background-image: url(/media/img/layout/blt_blu_arrow.png); + background-repeat: no-repeat; + background-position: 0px 0.5em; +} + +#pgFrontPlanet { + float: right; + width: 230px; + border-left: 1px solid #E1E1E1; + margin: 0; + padding: 0; + padding-left: 10px; +} + +#pgFrontPlanetWrap { + margin-left: 8px; + font-size: 0.9em; +} + +#pgFrontPlanetList { + margin: 0; + padding: 0; +} + +#pgFrontLatestReleases h2 { + margin-bottom: 0.7em; +} + +#pgFrontLatestReleasesWrap { + font-size: 0.9em; + margin-left: 12px; + margin-top: 10px; + color: #666; +} + +#pgFrontLatestReleasesNote { + font-size: 0.9em; + margin-left: 12px; + margin-top: 10px; + color: #666; + vertical-align: bottom; +} + +#pgFrontLatestReleasesNote IMG { + vertical-align: bottom; +} + +#pgFrontTrainingSummary { + font-size: 1.1em; + color: #666; +} + +/* Secondary Pages */ + +#pgSideWrap { + float: left; + width: 166px; + margin-top: 10px; + margin-right: -165px; +} + +#pgContentWrap { + margin-left: 165px; + padding-top: 10px; +} + +#pgAdminWrap { + padding-top: 10px; + padding-bottom: 10px; +} + +#pgCommunityWrap { + margin-right: -420px; + float: left; + width: 100%; +} + +#pgCommunity { + margin-right: 210px; +} + +#pgSurveyWrap { + float: right; + width: 200px; + margin-left: 210px; + padding: 0; + border: 0; + top: 0px; + + padding-left: 10px; +} + +#pgSurvey dl { + width: 200px; + margin: 0; + padding: 0; + background: #F5F5F5 url(/media/img/layout/box_bottom.gif) no-repeat bottom left; + padding-bottom: 10px; +} + +#pgSurvey dt { + margin: 0 0 10px 0; + padding: 10px; + font-weight: bold; + color: #666; + border-bottom: 1px solid #EFEFEF; + background: #F5F5F5 url(/media/img/layout/box_top.gif) no-repeat top left; +} + +#pgSurvey dd { + margin: 0 0 0 10px; + padding: 0 10px 0 0; + color: #666; + font-size: 0.9em; +} + +#pgSurvey form #surveySubmit { + font-size: 0.9em; + background: #F5F5F5; + color: #000000; + border-right: 1px solid #7A7A7A; + border-bottom: 1px solid #7A7A7A; + border-top: 1px solid #7A7A7A; + border-left: 1px solid #7A7A7A; + padding: 1px 4px; +} + +#pgPlanetWrap { + float: right; + width: 200px; + margin-left: 210px; + padding: 0; + border: 0; + margin-top: 10px; + + padding-left: 5px; +} + +#pgPlanet dl { + width: 200px; + margin: 0; + padding: 0; + background: #F5F5F5 url(/media/img/layout/box_bottom.gif) no-repeat bottom left; + padding-bottom: 10px; +} + +#pgPlanet dt { + margin: 0 0 10px 0; + padding: 10px; + font-weight: bold; + color: #666; + border-bottom: 1px solid #EFEFEF; + background: #F5F5F5 url(/media/img/layout/box_top.gif) no-repeat top left; +} + +#pgPlanet dd { + margin: 0 0 0 10px; + padding: 0 10px 0 0; + color: #666; + font-size: 0.9em; +} + +#pgPlanet dd ul { + margin-left: 0px; + padding-left: 10px; + margin-bottom: 10px; +} + +#pgDocsWrap { + margin-right: -420px; + float: left; + width: 100%; +} + +#pgDocs { + margin-right: 210px; +} + +#pgQuickDocsWrap { + float: right; + width: 200px; + margin-left: 210px; + padding: 0; + border: 0; + top: 0px; + + padding-left: 10px; +} + +#pgQuickDocs dl { + width: 200px; + margin: 0; + padding: 0; + background: #F5F5F5 url(/media/img/layout/box_bottom.gif) no-repeat bottom left; + padding-bottom: 10px; +} + +#pgQuickDocs dt { + margin: 0 0 10px 0; + padding: 10px; + font-weight: bold; + color: #666; + border-bottom: 1px solid #EFEFEF; + background: #F5F5F5 url(/media/img/layout/box_top.gif) no-repeat top left; +} + +#pgQuickDocs dd { + margin: 0 0 0 10px; + padding: 0 10px 0 0; + color: #666; + font-size: 0.9em; +} + +#pgCommunityDocsFooter table tr td ul { + padding-left: 0px; + list-style: none; +} + +#pgCommunityDocsHeader table tr.firstrow td { + border-bottom: none; +} + +#pgCommunityDocsHeader table tr.lastrow { + height: 1px; +} + +#pgCommunityDocsBreadcrumbs { + margin-left: 10px; + margin-top: 5px; + margin-bottom: 10px; +} + +#pgCommunityDocsPageContent { + margin-top: 5px; + margin-bottom: 20px; +} + +.pgCommunityDocsCurrentMenu { + font-weight: bold; +} + +#pgDownloadsWrap { + margin-right: -420px; + float: left; + width: 100%; +} + +#pgDownloads { + margin-right: 210px; +} + +#pgQuickDownloadsWrap { + float: right; + width: 200px; + margin-left: 210px; + padding: 0; + border: 0; + top: 0px; + + padding-left: 10px; +} + +#pgQuickDownloads dl { + width: 200px; + margin: 0; + padding: 0; + background: #F5F5F5 url(/media/img/layout/box_bottom.gif) no-repeat bottom left; + padding-bottom: 10px; +} + +#pgQuickDownloads dt { + margin: 0 0 10px 0; + padding: 10px; + font-weight: bold; + color: #666; + border-bottom: 1px solid #EFEFEF; + background: #F5F5F5 url(/media/img/layout/box_top.gif) no-repeat top left; +} + +#pgQuickDownloads dd { + margin: 0 0 0 10px; + padding: 0 10px 0 0; + color: #666; + font-size: 0.9em; +} + +#pgFtpContent table tr td { + vertical-align: bottom; +} + +#pgProfPage div.tblBasic table td { + color: black; + padding: 3px 5px; +} + +#pgPressContacts dt { + font-weight: bold; +} + +#pgPressContacts dd { + margin-bottom: 10px; + +} + +#pgArchiveWrap { + margin-top: 13px; +} + +/* Footer Container */ +#pgFooter { + font-size: 0.9em; + color: #666; + line-height: 1.3em; + padding-top: 5px; + clear: both; +} + +/* Misc Classes */ + +.pgClearBoth { + clear: both; + margin: 0; + padding: 0; +} + +.pgBlockHide { + display: none; + height: 0; + width: 0; + overflow: hidden; + position: absolute; /* IE5 Mac */ +} + +img { + border: 0; +} diff --git a/media/css/navigation.css b/media/css/navigation.css new file mode 100644 index 00000000..e8ddae5f --- /dev/null +++ b/media/css/navigation.css @@ -0,0 +1,237 @@ +/* + PostgreSQL.org - Navigation (and List) Styles +*/ + +/* Site Navigation */ + +#pgTopNav { + text-align: left; + color: #666; + font-size: 0.9em; + margin: 0; + padding: 0; + height: 23px; + background: #B7B7B7 url("/media/img/layout/nav_fill.png") top left repeat-x; + overflow: visible; + margin-top: 2px; +} + +#pgTopNavLeft { + width: 7px; + height: 23px; + border: 0px; + padding-right: 10px; + margin: 0px; + float: left; +} + +#pgTopNavLeft img { + border: 0px; + margin: 0; + padding: 0; +} + +#pgTopNavRight { + width: 7px; + height: 23px; + border: 0px; + padding: 0px; + margin: 0px; + float: right; +} + +#pgTopNavRight img { + border: 0px; + margin: 0; + padding: 0; +} + +#pgTopNavList { + list-style: none; + margin: 0; + padding: 0; + + height: 23px; + padding-top: 5px; +} + +#pgTopNavList li { + padding: 0 1em 0 1.2em; + display: inline; + border-left: 1px solid #C8C8C8; +} + +#pgTopNavList li a { + color: #fff; + font-weight: bold; + text-decoration: none; +} + +#pgTopNavList li:first-child { + border-left: 0; + padding-left: 0; +} + +#pgLoginLink { + margin: 0; + padding: 0; +} +#pgLoginlink a { + float: right; + color: #fff; + font-weight: bold; + text-decoration: none; + padding: 5px 1em 0 1.2em; + margin: 0; + height: 23px; +} + +/* The search navigation is the list of links next to the search box. */ + +#pgSearchNav { + position: relative; + float: right; + text-align: right; + color: #666; + font-size: 0.9em; + margin: 0px 0px 0px 0px; + top: -11px; + right: 209px; + padding: 0; +} + +#pgSearchNavList { + list-style: none; + margin: 0; + padding: 0; +} + +#pgSearchNavList li { + padding: 0 0.5em 0 0.5em; + display: inline; + border-right: 1px solid #C8C8C8; +} + +#pgSearchNavList li a { + color: #666; + text-decoration: none; +} + +#pgSearchNavList li a:hover { + color: #000; +} + +/* Category Navigation */ + +#pgSideNav:before { + line-height: 0.1; + font-size: 1px; + margin: 0; + display: block; +} + +#pgSideNav:after { + line-height: 0.1; + font-size: 1px; + margin: 0; + display: block; +} + +#pgSideNav, #pgSideNav ul, #pgSideNav ul ul { + margin: 0; + padding: 0; + list-style: none; + font-size: 1.0em; +} + +#pgSideNav { + width: 150px; + background-color: #F5F5F5; + background-image: url(/media/img/layout/nav_tbl_top.png); + background-position: top right; + background-repeat: no-repeat; +} + +#pgSideNav ul { + background-image: url(/media/img/layout/nav_tbl_btm.png); + background-position: bottom left; + background-repeat: no-repeat; + padding: 10px 0 10px 0; +} + +#pgSideNav ul ul { + background: none; + background-color: #F5F5F5; + margin: 0; + padding: 0; + list-style: none; +} + +#pgSideNav ul ul li { + background: none; + border: none; +} + +#pgSideNav ul li { + border-bottom: 1px solid #EFEFEF; + margin: 0; + padding-left: 12px; + background-image: url(/media/img/layout/blt_gry_arrow.png); + background-repeat: no-repeat; + background-position: 12px 0.65em; +} + +/* Uncomment when IE/Validator supports last-child + +#pgSideNav ul li:last-child { + border-bottom: 1px solid #F5F5F5; +} + +*/ + +#pgSideNav ul li.last-child { + border-bottom: 1px solid #F5F5F5; +} + +#pgSideNav ul li.active { + font-weight: bold; +} + +#pgSideNav ul li.active span { + display: none; +} + +#pgSideNav ul li a { + display: block; + color: #666; + text-decoration: none; + padding: 3px 5px 3px 15px; + margin: 0; +} + +#pgSideNav ul ul li a.active { + font-weight: bold; +} + +/* Uncomment when IE/Validator supports last-child + +#pgSideNav ul ul li:last-child { + border-bottom: none; +} + +*/ + +#pgSideNav ul ul li.last-child { + border-bottom: none; +} + +#pgSideNav ul ul li a { + display: block; + /* padding: 3px 5px 3px 12px; */ + padding-left: 12px; + margin: 0; +} + +#pgSideNav ul li a:hover { + color: #333; +} diff --git a/media/css/showdown_preview.css b/media/css/showdown_preview.css new file mode 100644 index 00000000..ba7a5dd9 --- /dev/null +++ b/media/css/showdown_preview.css @@ -0,0 +1,12 @@ +div.markdownpreview { + margin-top: 2px; + border: 1px solid black; + float: left; + overflow: auto; +} + +div.markdownpreview p { + margin-left: 0px !important; + padding-left: 0px !important; +} + diff --git a/media/css/table.css b/media/css/table.css new file mode 100644 index 00000000..98c91958 --- /dev/null +++ b/media/css/table.css @@ -0,0 +1,100 @@ +/* + PostgreSQL.org - Table Styles +*/ + +div.tblBasic h2 { + margin: 25px 0 .5em 0; +} + +div.tblBasic table { + background: #F5F5F5 url(/media/img/layout/gnav_tbl_top_lft.png) top left no-repeat; + margin-bottom: 15px; +} + +div.tblBasic table th { + padding-top: 20px; + border-bottom: 1px solid #EFEFEF; + vertical-align: bottom; +} + +div.tblBasic table td { + border-bottom: 1px solid #EFEFEF; +} + +div.tblBasic table th, +div.tblBasic table td { + padding: 8px 11px; + color: #555555; +} + +div.tblBasic table td.indented { + text-indent: 30px; +} + +div.tblBasic table.tblCompact td { + padding: 3px 3px; +} + +div.tblBasic table tr.lastrow td { + border-bottom: none; + padding-bottom: 13px; +} + +div.tblBasic table.tblCompact tr.lastrow td { + padding-bottom: 3px; +} + +div.tblBasic table tr.lastrow td.colFirstT, +div.tblBasic table tr.lastrow td.colFirst { + background: url(/media/img/layout/gnav_tbl_btm_lft.png) bottom left no-repeat; +} + +div.tblBasic table.tblBasicGrey th.colLast, +div.tblBasic table.tblCompact th.colLast { + background: #F5F5F5 url(/media/img/layout/gnav_tbl_top_rgt.png) top right no-repeat; +} + +div.tblBasic table.tblBasicGrey tr.lastrow td.colLastT, +div.tblBasic table.tblBasicGrey tr.lastrow td.colLast, +div.tblBasic table.tblCompact tr.lastrow td.colLast, +div.tblBasic table.tblCompact tr.lastrow td.colLastT{ + background: #F5F5F5 url(/media/img/layout/gnav_tbl_btm_rgt.png) bottom right no-repeat; +} + +div.tblBasic table.tblBasicGrey tr.firstrow td.colLastT, +div.tblBasic table.tblBasicGrey tr.firstrow td.colLast, +div tblBasic table.tblCompact tr.firstrow td.colLast { + background: #F5F5F5 url(/media/img/layout/gnav_tbl_top_rgt.png) top right no-repeat; +} + +div.tblBasic table th.colMid, +div.tblBasic table td.colMid, +div.tblBasic table th.colLast, +div.tblBasic table td.colLast { + background-color: #F5F5F5 ; +} + +div.tblBasic table th.colLastC, +div.tblBasic table td.colFirstC, +div.tblBasic table td.colLastC { + text-align: center; +} + +div.tblBasic table th.colLastR, +div.tblBasic table td.colFirstR, +div.tblBasic table td.colLastR { + text-align: right; +} + +div.tblBasic table td.colFirstT, +div.tblBasic table td.colMidT, +div.tblBasic table td.colLastT { + vertical-align: top; +} + +div.tblBasic table th.colLastRT, +div.tblBasic table td.colFirstRT, +div.tblBasic table td.colLastRT { + text-align: right; + vertical-align: top; +} diff --git a/media/css/text.css b/media/css/text.css new file mode 100644 index 00000000..902a1186 --- /dev/null +++ b/media/css/text.css @@ -0,0 +1,162 @@ +/* + PostgreSQL.org - Text Styles +*/ + +/* Heading Definitions */ + +h1 { + color: #EC5800; +} + +h2 { + color: #666; +} + +h3 { + color: #666; +} + +h4 { + color: #666; +} + +/* Text Styles */ + +.txtColumn1 { + width: 50%; + line-height: 1.3em; +} + +.txtColumn2 { + width: 50%; + line-height: 1.5em; +} + +.txtCurrentLocation { + font-weight: bold; +} + +.txtDivider { + font-size: 0.8em; + color: #E1E1E1; + padding-left: 4px; + padding-right: 4px; +} + +.txtNewsEvent { + font-size: 0.9em; + color: #0094C7; +} + +.txtDate { + font-size: 0.9em; + color: #666; +} + +.txtMediumGrey { + color: #666; +} + +.txtFormLabel { + color: #666; + font-weight: bold; + text-align: right; + vertical-align: top; +} + +.txtRequiredField { + color: #EC5800; +} + +.txtImportant { + color: #EC5800; +} + +.txtOffScreen { + position: absolute; + left: -1999px; + width: 1990px; +} + +#txtFrontFeatureHeading { + padding-bottom: 1.1em; +} + +#txtFrontFeatureLink a { + font-size: 1.2em; + font-weight: bold; + padding-left: 5px; +} + +#txtFrontUserText { + font-size: 1.0em; + color: #666; + margin-top: 12px; +} + +#txtFrontUserName { + font-size: 0.9em; + color: #666; + margin-top: 9px; + font-weight: bold; +} + +#txtFrontUserLink { + font-size: 0.9em; + color: #666; + margin-top: 11px; + margin-left: 1px; +} + +#txtFrontUserLink img { + padding-right: 5px; +} + +#txtFrontSupportUsText { + font-size: 1.0em; + margin-top: 9px; +} + +#txtFrontSupportUsLink { + font-size: 0.9em; + margin-top: 6px; +} + +#txtFrontSupportUsLink img { + padding-right: 7px; +} + +/* Link Styles */ + +a:link { color:#0085B0; text-decoration: underline; } +a:visited { color:#004E66; text-decoration: underline; } +a:active { color:#0085B0; text-decoration: underline; } +a:hover { color:#000000; text-decoration: underline; } + +#pgFooter a:link { color:#666; text-decoration: underline; } +#pgFooter a:visited { color:#666; text-decoration: underline; } +#pgFooter a:active { color:#666; text-decoration: underline; } +#pgFooter a:hover { color:#000000; text-decoration: underline; } + +#txtFrontUserName a:link { color:#666; text-decoration: underline; } +#txtFrontUserName a:visited { color:#666; text-decoration: underline; } +#txtFrontUserName a:active { color:#666; text-decoration: underline; } +#txtFrontUserName a:hover { color:#000; text-decoration: underline; } + +#txtArchives a:visited { color:#00536E; text-decoration: underline; } +#txtArchives pre { word-wrap: break-word; font-size: 150%; } +#txtArchives tt { word-wrap: break-word; font-size: 150%; } + +#pgFrontUSSContainer h2, #pgFrontUSSContainer h3 { + margin: 0; + padding: 0; +} + +#pgFrontNewsEventsContainer h2, #pgFrontNewsEventsContainer h3 { + margin: 0; + padding: 0; +} + +#pgFrontNewsEventsContainer h3 img { + margin-bottom: 10px; +} diff --git a/media/favicon.ico b/media/favicon.ico new file mode 100644 index 00000000..a1cc036e Binary files /dev/null and b/media/favicon.ico differ diff --git a/media/img/about/sponsors/logo_2q.png b/media/img/about/sponsors/logo_2q.png new file mode 100644 index 00000000..27d41549 Binary files /dev/null and b/media/img/about/sponsors/logo_2q.png differ diff --git a/media/img/about/sponsors/logo_afilias.png b/media/img/about/sponsors/logo_afilias.png new file mode 100644 index 00000000..608c2e42 Binary files /dev/null and b/media/img/about/sponsors/logo_afilias.png differ diff --git a/media/img/about/sponsors/logo_cmd.png b/media/img/about/sponsors/logo_cmd.png new file mode 100644 index 00000000..51a54d8f Binary files /dev/null and b/media/img/about/sponsors/logo_cmd.png differ diff --git a/media/img/about/sponsors/logo_conovacom.jpg b/media/img/about/sponsors/logo_conovacom.jpg new file mode 100644 index 00000000..4cc68b8d Binary files /dev/null and b/media/img/about/sponsors/logo_conovacom.jpg differ diff --git a/media/img/about/sponsors/logo_credativ.png b/media/img/about/sponsors/logo_credativ.png new file mode 100644 index 00000000..93be25ee Binary files /dev/null and b/media/img/about/sponsors/logo_credativ.png differ diff --git a/media/img/about/sponsors/logo_ds.gif b/media/img/about/sponsors/logo_ds.gif new file mode 100644 index 00000000..2ba71079 Binary files /dev/null and b/media/img/about/sponsors/logo_ds.gif differ diff --git a/media/img/about/sponsors/logo_edb.png b/media/img/about/sponsors/logo_edb.png new file mode 100644 index 00000000..587eb240 Binary files /dev/null and b/media/img/about/sponsors/logo_edb.png differ diff --git a/media/img/about/sponsors/logo_ehpg.png b/media/img/about/sponsors/logo_ehpg.png new file mode 100644 index 00000000..1551a7f7 Binary files /dev/null and b/media/img/about/sponsors/logo_ehpg.png differ diff --git a/media/img/about/sponsors/logo_fujitsu.png b/media/img/about/sponsors/logo_fujitsu.png new file mode 100644 index 00000000..500d9d32 Binary files /dev/null and b/media/img/about/sponsors/logo_fujitsu.png differ diff --git a/media/img/about/sponsors/logo_gp.png b/media/img/about/sponsors/logo_gp.png new file mode 100644 index 00000000..b3a1307f Binary files /dev/null and b/media/img/about/sponsors/logo_gp.png differ diff --git a/media/img/about/sponsors/logo_huborg.png b/media/img/about/sponsors/logo_huborg.png new file mode 100644 index 00000000..31b574ad Binary files /dev/null and b/media/img/about/sponsors/logo_huborg.png differ diff --git a/media/img/about/sponsors/logo_jfg.png b/media/img/about/sponsors/logo_jfg.png new file mode 100644 index 00000000..c9c3eba8 Binary files /dev/null and b/media/img/about/sponsors/logo_jfg.png differ diff --git a/media/img/about/sponsors/logo_ntt.png b/media/img/about/sponsors/logo_ntt.png new file mode 100644 index 00000000..db33e04c Binary files /dev/null and b/media/img/about/sponsors/logo_ntt.png differ diff --git a/media/img/about/sponsors/logo_pervasive.png b/media/img/about/sponsors/logo_pervasive.png new file mode 100644 index 00000000..45910eaa Binary files /dev/null and b/media/img/about/sponsors/logo_pervasive.png differ diff --git a/media/img/about/sponsors/logo_pgsql.png b/media/img/about/sponsors/logo_pgsql.png new file mode 100644 index 00000000..241a55bd Binary files /dev/null and b/media/img/about/sponsors/logo_pgsql.png differ diff --git a/media/img/about/sponsors/logo_rh.png b/media/img/about/sponsors/logo_rh.png new file mode 100644 index 00000000..ad8596fa Binary files /dev/null and b/media/img/about/sponsors/logo_rh.png differ diff --git a/media/img/about/sponsors/logo_skype.png b/media/img/about/sponsors/logo_skype.png new file mode 100644 index 00000000..35ce2b21 Binary files /dev/null and b/media/img/about/sponsors/logo_skype.png differ diff --git a/media/img/about/sponsors/logo_sra.png b/media/img/about/sponsors/logo_sra.png new file mode 100644 index 00000000..8cc94107 Binary files /dev/null and b/media/img/about/sponsors/logo_sra.png differ diff --git a/media/img/about/sponsors/logo_sun.png b/media/img/about/sponsors/logo_sun.png new file mode 100644 index 00000000..c1bc1a6e Binary files /dev/null and b/media/img/about/sponsors/logo_sun.png differ diff --git a/media/img/docs/bg_hdr.png b/media/img/docs/bg_hdr.png new file mode 100644 index 00000000..07c3b651 Binary files /dev/null and b/media/img/docs/bg_hdr.png differ diff --git a/media/img/docs/hdr_logo.png b/media/img/docs/hdr_logo.png new file mode 100644 index 00000000..3e3ef7d0 Binary files /dev/null and b/media/img/docs/hdr_logo.png differ diff --git a/media/img/feature/feature_elephant.png b/media/img/feature/feature_elephant.png new file mode 100644 index 00000000..70ca5942 Binary files /dev/null and b/media/img/feature/feature_elephant.png differ diff --git a/media/img/feature/feature_gears.png b/media/img/feature/feature_gears.png new file mode 100644 index 00000000..7c733fbf Binary files /dev/null and b/media/img/feature/feature_gears.png differ diff --git a/media/img/ftp/file.png b/media/img/ftp/file.png new file mode 100644 index 00000000..07906ed4 Binary files /dev/null and b/media/img/ftp/file.png differ diff --git a/media/img/ftp/folder.png b/media/img/ftp/folder.png new file mode 100644 index 00000000..b6daf922 Binary files /dev/null and b/media/img/ftp/folder.png differ diff --git a/media/img/hdr/hdr_feature.png b/media/img/hdr/hdr_feature.png new file mode 100644 index 00000000..2496ff68 Binary files /dev/null and b/media/img/hdr/hdr_feature.png differ diff --git a/media/img/hdr/hdr_featureduser.png b/media/img/hdr/hdr_featureduser.png new file mode 100644 index 00000000..6709cc01 Binary files /dev/null and b/media/img/hdr/hdr_featureduser.png differ diff --git a/media/img/hdr/hdr_latestnews.png b/media/img/hdr/hdr_latestnews.png new file mode 100644 index 00000000..6b3fe86d Binary files /dev/null and b/media/img/hdr/hdr_latestnews.png differ diff --git a/media/img/hdr/hdr_latestreleases.png b/media/img/hdr/hdr_latestreleases.png new file mode 100644 index 00000000..4d5be86a Binary files /dev/null and b/media/img/hdr/hdr_latestreleases.png differ diff --git a/media/img/hdr/hdr_planetpg.png b/media/img/hdr/hdr_planetpg.png new file mode 100644 index 00000000..2470a2a0 Binary files /dev/null and b/media/img/hdr/hdr_planetpg.png differ diff --git a/media/img/hdr/hdr_postgresql.png b/media/img/hdr/hdr_postgresql.png new file mode 100644 index 00000000..3e5de7af Binary files /dev/null and b/media/img/hdr/hdr_postgresql.png differ diff --git a/media/img/hdr/hdr_shortcuts.png b/media/img/hdr/hdr_shortcuts.png new file mode 100644 index 00000000..f29c9fb2 Binary files /dev/null and b/media/img/hdr/hdr_shortcuts.png differ diff --git a/media/img/hdr/hdr_sponsor.png b/media/img/hdr/hdr_sponsor.png new file mode 100644 index 00000000..fc1074da Binary files /dev/null and b/media/img/hdr/hdr_sponsor.png differ diff --git a/media/img/hdr/hdr_supportus.png b/media/img/hdr/hdr_supportus.png new file mode 100644 index 00000000..3c34cad4 Binary files /dev/null and b/media/img/hdr/hdr_supportus.png differ diff --git a/media/img/hdr/hdr_upcomingevents.png b/media/img/hdr/hdr_upcomingevents.png new file mode 100644 index 00000000..f5fdf774 Binary files /dev/null and b/media/img/hdr/hdr_upcomingevents.png differ diff --git a/media/img/hdr/hdr_upcomingtraining.png b/media/img/hdr/hdr_upcomingtraining.png new file mode 100644 index 00000000..9797d482 Binary files /dev/null and b/media/img/hdr/hdr_upcomingtraining.png differ diff --git a/media/img/layout/blt_blu_arrow.png b/media/img/layout/blt_blu_arrow.png new file mode 100644 index 00000000..32ae5e3e Binary files /dev/null and b/media/img/layout/blt_blu_arrow.png differ diff --git a/media/img/layout/blt_gry_arrow.png b/media/img/layout/blt_gry_arrow.png new file mode 100644 index 00000000..ce9b38e9 Binary files /dev/null and b/media/img/layout/blt_gry_arrow.png differ diff --git a/media/img/layout/box_bottom.gif b/media/img/layout/box_bottom.gif new file mode 100644 index 00000000..5d29384b Binary files /dev/null and b/media/img/layout/box_bottom.gif differ diff --git a/media/img/layout/box_top.gif b/media/img/layout/box_top.gif new file mode 100644 index 00000000..a4d927d4 Binary files /dev/null and b/media/img/layout/box_top.gif differ diff --git a/media/img/layout/feature_bl.gif b/media/img/layout/feature_bl.gif new file mode 100644 index 00000000..fe6f8257 Binary files /dev/null and b/media/img/layout/feature_bl.gif differ diff --git a/media/img/layout/feature_br.gif b/media/img/layout/feature_br.gif new file mode 100644 index 00000000..0ae41178 Binary files /dev/null and b/media/img/layout/feature_br.gif differ diff --git a/media/img/layout/feature_tl.gif b/media/img/layout/feature_tl.gif new file mode 100644 index 00000000..87d7cd0d Binary files /dev/null and b/media/img/layout/feature_tl.gif differ diff --git a/media/img/layout/feature_tr.gif b/media/img/layout/feature_tr.gif new file mode 100644 index 00000000..1e5675ab Binary files /dev/null and b/media/img/layout/feature_tr.gif differ diff --git a/media/img/layout/hdr_fill.png b/media/img/layout/hdr_fill.png new file mode 100644 index 00000000..ed2e57cb Binary files /dev/null and b/media/img/layout/hdr_fill.png differ diff --git a/media/img/layout/hdr_left.png b/media/img/layout/hdr_left.png new file mode 100644 index 00000000..c483920f Binary files /dev/null and b/media/img/layout/hdr_left.png differ diff --git a/media/img/layout/hdr_right.png b/media/img/layout/hdr_right.png new file mode 100644 index 00000000..d3de11c0 Binary files /dev/null and b/media/img/layout/hdr_right.png differ diff --git a/media/img/layout/nav_fill.png b/media/img/layout/nav_fill.png new file mode 100644 index 00000000..124a783a Binary files /dev/null and b/media/img/layout/nav_fill.png differ diff --git a/media/img/layout/nav_lft.png b/media/img/layout/nav_lft.png new file mode 100644 index 00000000..f0aa5ff3 Binary files /dev/null and b/media/img/layout/nav_lft.png differ diff --git a/media/img/layout/nav_rgt.png b/media/img/layout/nav_rgt.png new file mode 100644 index 00000000..4eadb0a9 Binary files /dev/null and b/media/img/layout/nav_rgt.png differ diff --git a/media/img/layout/nav_tbl_btm.png b/media/img/layout/nav_tbl_btm.png new file mode 100644 index 00000000..ec897afc Binary files /dev/null and b/media/img/layout/nav_tbl_btm.png differ diff --git a/media/img/layout/nav_tbl_top.png b/media/img/layout/nav_tbl_top.png new file mode 100644 index 00000000..3a223683 Binary files /dev/null and b/media/img/layout/nav_tbl_top.png differ diff --git a/media/img/layout/usr_tbl_btm.png b/media/img/layout/usr_tbl_btm.png new file mode 100644 index 00000000..b62d0c11 Binary files /dev/null and b/media/img/layout/usr_tbl_btm.png differ diff --git a/media/img/layout/usr_tbl_top.png b/media/img/layout/usr_tbl_top.png new file mode 100644 index 00000000..42eaab0d Binary files /dev/null and b/media/img/layout/usr_tbl_top.png differ diff --git a/media/img/misc/ico_rss.png b/media/img/misc/ico_rss.png new file mode 100644 index 00000000..47856a44 Binary files /dev/null and b/media/img/misc/ico_rss.png differ diff --git a/media/js/showdown_preview.js b/media/js/showdown_preview.js new file mode 100644 index 00000000..ef0c907a --- /dev/null +++ b/media/js/showdown_preview.js @@ -0,0 +1,43 @@ +// Functions to generate showdown previews for +// the django admin interface + +var converter = null; + +function attach_showdown_preview(objid) { + if (!converter) { + converter = new Showdown.converter(); + } + obj = document.getElementById(objid); + + if (!obj) { + alert('Could not locate object ' + objid + ' in DOM'); + return; + } + obj.style.cssFloat = 'left'; + obj.style.marginRight = '10px'; + newdiv = document.createElement('div'); + newdiv.className = 'markdownpreview'; + obj.style.width = newdiv.style.width = "400px"; + obj.style.height = newdiv.style.height = "200px"; + + obj.parentNode.insertBefore(newdiv, obj.nextSibling); + + update_markdown(obj, newdiv); + + window.onkeyup = obj.onkeyup = function() { + /* Using a timer make sure we only update max 4 times / second */ + if (obj.current_timeout) { + clearTimeout(obj.current_timeout); + } + obj.current_timeout = setTimeout(function() { + update_markdown(obj, newdiv); + }, 250); + }; +} + +function update_markdown(src, dest) { + if (src.value != src.lastvalue) { + src.lastvalue = src.value; + dest.innerHTML = converter.makeHtml(src.value); + } +} diff --git a/media/showdown/license.txt b/media/showdown/license.txt new file mode 100644 index 00000000..a6096c84 --- /dev/null +++ b/media/showdown/license.txt @@ -0,0 +1,34 @@ +Copyright (c) 2007, John Fraser + +All rights reserved. + +Original Markdown copyright (c) 2004, John Gruber + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name "Markdown" nor the names of its contributors may + be used to endorse or promote products derived from this software + without specific prior written permission. + +This software is provided by the copyright holders and contributors "as +is" and any express or implied warranties, including, but not limited +to, the implied warranties of merchantability and fitness for a +particular purpose are disclaimed. In no event shall the copyright owner +or contributors be liable for any direct, indirect, incidental, special, +exemplary, or consequential damages (including, but not limited to, +procurement of substitute goods or services; loss of use, data, or +profits; or business interruption) however caused and on any theory of +liability, whether in contract, strict liability, or tort (including +negligence or otherwise) arising in any way out of the use of this +software, even if advised of the possibility of such damage. diff --git a/media/showdown/showdown.js b/media/showdown/showdown.js new file mode 100644 index 00000000..86b9bc16 --- /dev/null +++ b/media/showdown/showdown.js @@ -0,0 +1,419 @@ +/* + A A L Source code at: + T C A + T K B +*/ + +var Showdown={}; +Showdown.converter=function(){ +var _1; +var _2; +var _3; +var _4=0; +this.makeHtml=function(_5){ +_1=new Array(); +_2=new Array(); +_3=new Array(); +_5=_5.replace(/~/g,"~T"); +_5=_5.replace(/\$/g,"~D"); +_5=_5.replace(/\r\n/g,"\n"); +_5=_5.replace(/\r/g,"\n"); +_5="\n\n"+_5+"\n\n"; +_5=_6(_5); +_5=_5.replace(/^[ \t]+$/mg,""); +_5=_7(_5); +_5=_8(_5); +_5=_9(_5); +_5=_a(_5); +_5=_5.replace(/~D/g,"$$"); +_5=_5.replace(/~T/g,"~"); +return _5; +}; +var _8=function(_b){ +var _b=_b.replace(/^[ ]{0,3}\[(.+)\]:[ \t]*\n?[ \t]*?[ \t]*\n?[ \t]*(?:(\n*)["(](.+?)[")][ \t]*)?(?:\n+|\Z)/gm,function(_c,m1,m2,m3,m4){ +m1=m1.toLowerCase(); +_1[m1]=_11(m2); +if(m3){ +return m3+m4; +}else{ +if(m4){ +_2[m1]=m4.replace(/"/g,"""); +} +} +return ""; +}); +return _b; +}; +var _7=function(_12){ +_12=_12.replace(/\n/g,"\n\n"); +var _13="p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del"; +var _14="p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math"; +_12=_12.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del)\b[^\r]*?\n<\/\2>[ \t]*(?=\n+))/gm,_15); +_12=_12.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math)\b[^\r]*?.*<\/\2>[ \t]*(?=\n+)\n)/gm,_15); +_12=_12.replace(/(\n[ ]{0,3}(<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g,_15); +_12=_12.replace(/(\n\n[ ]{0,3}[ \t]*(?=\n{2,}))/g,_15); +_12=_12.replace(/(?:\n\n)([ ]{0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g,_15); +_12=_12.replace(/\n\n/g,"\n"); +return _12; +}; +var _15=function(_16,m1){ +var _18=m1; +_18=_18.replace(/\n\n/g,"\n"); +_18=_18.replace(/^\n/,""); +_18=_18.replace(/\n+$/g,""); +_18="\n\n~K"+(_3.push(_18)-1)+"K\n\n"; +return _18; +}; +var _9=function(_19){ +_19=_1a(_19); +var key=_1c("
"); +_19=_19.replace(/^[ ]{0,2}([ ]?\*[ ]?){3,}[ \t]*$/gm,key); +_19=_19.replace(/^[ ]{0,2}([ ]?\-[ ]?){3,}[ \t]*$/gm,key); +_19=_19.replace(/^[ ]{0,2}([ ]?\_[ ]?){3,}[ \t]*$/gm,key); +_19=_1d(_19); +_19=_1e(_19); +_19=_1f(_19); +_19=_7(_19); +_19=_20(_19); +return _19; +}; +var _21=function(_22){ +_22=_23(_22); +_22=_24(_22); +_22=_25(_22); +_22=_26(_22); +_22=_27(_22); +_22=_28(_22); +_22=_11(_22); +_22=_29(_22); +_22=_22.replace(/ +\n/g,"
\n"); +return _22; +}; +var _24=function(_2a){ +var _2b=/(<[a-z\/!$]("[^"]*"|'[^']*'|[^'">])*>|)/gi; +_2a=_2a.replace(_2b,function(_2c){ +var tag=_2c.replace(/(.)<\/?code>(?=.)/g,"$1`"); +tag=_2e(tag,"\\`*_"); +return tag; +}); +return _2a; +}; +var _27=function(_2f){ +_2f=_2f.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g,_30); +_2f=_2f.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\]\([ \t]*()?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g,_30); +_2f=_2f.replace(/(\[([^\[\]]+)\])()()()()()/g,_30); +return _2f; +}; +var _30=function(_31,m1,m2,m3,m4,m5,m6,m7){ +if(m7==undefined){ +m7=""; +} +var _39=m1; +var _3a=m2; +var _3b=m3.toLowerCase(); +var url=m4; +var _3d=m7; +if(url==""){ +if(_3b==""){ +_3b=_3a.toLowerCase().replace(/ ?\n/g," "); +} +url="#"+_3b; +if(_1[_3b]!=undefined){ +url=_1[_3b]; +if(_2[_3b]!=undefined){ +_3d=_2[_3b]; +} +}else{ +if(_39.search(/\(\s*\)$/m)>-1){ +url=""; +}else{ +return _39; +} +} +} +url=_2e(url,"*_"); +var _3e=""; +return _3e; +}; +var _26=function(_3f){ +_3f=_3f.replace(/(!\[(.*?)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g,_40); +_3f=_3f.replace(/(!\[(.*?)\]\s?\([ \t]*()?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g,_40); +return _3f; +}; +var _40=function(_41,m1,m2,m3,m4,m5,m6,m7){ +var _49=m1; +var _4a=m2; +var _4b=m3.toLowerCase(); +var url=m4; +var _4d=m7; +if(!_4d){ +_4d=""; +} +if(url==""){ +if(_4b==""){ +_4b=_4a.toLowerCase().replace(/ ?\n/g," "); +} +url="#"+_4b; +if(_1[_4b]!=undefined){ +url=_1[_4b]; +if(_2[_4b]!=undefined){ +_4d=_2[_4b]; +} +}else{ +return _49; +} +} +_4a=_4a.replace(/"/g,"""); +url=_2e(url,"*_"); +var _4e="\""+_4a+"\"";"+_21(m1)+""); +}); +_4f=_4f.replace(/^(.+)[ \t]*\n-+[ \t]*\n+/gm,function(_52,m1){ +return _1c("

"+_21(m1)+"

"); +}); +_4f=_4f.replace(/^(\#{1,6})[ \t]*(.+?)[ \t]*\#*\n+/gm,function(_54,m1,m2){ +var _57=m1.length; +return _1c(""+_21(m2)+""); +}); +return _4f; +}; +var _58; +var _1d=function(_59){ +_59+="~0"; +var _5a=/^(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm; +if(_4){ +_59=_59.replace(_5a,function(_5b,m1,m2){ +var _5e=m1; +var _5f=(m2.search(/[*+-]/g)>-1)?"ul":"ol"; +_5e=_5e.replace(/\n{2,}/g,"\n\n\n"); +var _60=_58(_5e); +_60=_60.replace(/\s+$/,""); +_60="<"+_5f+">"+_60+"\n"; +return _60; +}); +}else{ +_5a=/(\n\n|^\n?)(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/g; +_59=_59.replace(_5a,function(_61,m1,m2,m3){ +var _65=m1; +var _66=m2; +var _67=(m3.search(/[*+-]/g)>-1)?"ul":"ol"; +var _66=_66.replace(/\n{2,}/g,"\n\n\n"); +var _68=_58(_66); +_68=_65+"<"+_67+">\n"+_68+"\n"; +return _68; +}); +} +_59=_59.replace(/~0/,""); +return _59; +}; +_58=function(_69){ +_4++; +_69=_69.replace(/\n{2,}$/,"\n"); +_69+="~0"; +_69=_69.replace(/(\n)?(^[ \t]*)([*+-]|\d+[.])[ \t]+([^\r]+?(\n{1,2}))(?=\n*(~0|\2([*+-]|\d+[.])[ \t]+))/gm,function(_6a,m1,m2,m3,m4){ +var _6f=m4; +var _70=m1; +var _71=m2; +if(_70||(_6f.search(/\n{2,}/)>-1)){ +_6f=_9(_72(_6f)); +}else{ +_6f=_1d(_72(_6f)); +_6f=_6f.replace(/\n$/,""); +_6f=_21(_6f); +} +return "
  • "+_6f+"
  • \n"; +}); +_69=_69.replace(/~0/g,""); +_4--; +return _69; +}; +var _1e=function(_73){ +_73+="~0"; +_73=_73.replace(/(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=~0))/g,function(_74,m1,m2){ +var _77=m1; +var _78=m2; +_77=_79(_72(_77)); +_77=_6(_77); +_77=_77.replace(/^\n+/g,""); +_77=_77.replace(/\n+$/g,""); +_77="
    "+_77+"\n
    "; +return _1c(_77)+_78; +}); +_73=_73.replace(/~0/,""); +return _73; +}; +var _1c=function(_7a){ +_7a=_7a.replace(/(^\n+|\n+$)/g,""); +return "\n\n~K"+(_3.push(_7a)-1)+"K\n\n"; +}; +var _23=function(_7b){ +_7b=_7b.replace(/(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm,function(_7c,m1,m2,m3,m4){ +var c=m3; +c=c.replace(/^([ \t]*)/g,""); +c=c.replace(/[ \t]*$/g,""); +c=_79(c); +return m1+""+c+""; +}); +return _7b; +}; +var _79=function(_82){ +_82=_82.replace(/&/g,"&"); +_82=_82.replace(//g,">"); +_82=_2e(_82,"*_{}[]\\",false); +return _82; +}; +var _29=function(_83){ +_83=_83.replace(/(\*\*|__)(?=\S)([^\r]*?\S[*_]*)\1/g,"$2"); +_83=_83.replace(/(\*|_)(?=\S)([^\r]*?\S)\1/g,"$2"); +return _83; +}; +var _1f=function(_84){ +_84=_84.replace(/((^[ \t]*>[ \t]?.+\n(.+\n)*\n*)+)/gm,function(_85,m1){ +var bq=m1; +bq=bq.replace(/^[ \t]*>[ \t]?/gm,"~0"); +bq=bq.replace(/~0/g,""); +bq=bq.replace(/^[ \t]+$/gm,""); +bq=_9(bq); +bq=bq.replace(/(^|\n)/g,"$1 "); +bq=bq.replace(/(\s*
    [^\r]+?<\/pre>)/gm,function(_88,m1){
    +var pre=m1;
    +pre=pre.replace(/^  /mg,"~0");
    +pre=pre.replace(/~0/g,"");
    +return pre;
    +});
    +return _1c("
    \n"+bq+"\n
    "); +}); +return _84; +}; +var _20=function(_8b){ +_8b=_8b.replace(/^\n+/g,""); +_8b=_8b.replace(/\n+$/g,""); +var _8c=_8b.split(/\n{2,}/g); +var _8d=new Array(); +var end=_8c.length; +for(var i=0;i=0){ +_8d.push(str); +}else{ +if(str.search(/\S/)>=0){ +str=_21(str); +str=str.replace(/^([ \t]*)/g,"

    "); +str+="

    "; +_8d.push(str); +} +} +} +end=_8d.length; +for(var i=0;i=0){ +var _91=_3[RegExp.$1]; +_91=_91.replace(/\$/g,"$$$$"); +_8d[i]=_8d[i].replace(/~K\d+K/,_91); +} +} +return _8d.join("\n\n"); +}; +var _11=function(_92){ +_92=_92.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/g,"&"); +_92=_92.replace(/<(?![a-z\/?\$!])/gi,"<"); +return _92; +}; +var _25=function(_93){ +_93=_93.replace(/\\(\\)/g,_94); +_93=_93.replace(/\\([`*_{}\[\]()>#+-.!])/g,_94); +return _93; +}; +var _28=function(_95){ +_95=_95.replace(/<((https?|ftp|dict):[^'">\s]+)>/gi,"
    $1"); +_95=_95.replace(/<(?:mailto:)?([-.\w]+\@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi,function(_96,m1){ +return _98(_a(m1)); +}); +return _95; +}; +var _98=function(_99){ +function char2hex(ch){ +var _9b="0123456789ABCDEF"; +var dec=ch.charCodeAt(0); +return (_9b.charAt(dec>>4)+_9b.charAt(dec&15)); +} +var _9d=[function(ch){ +return "&#"+ch.charCodeAt(0)+";"; +},function(ch){ +return "&#x"+char2hex(ch)+";"; +},function(ch){ +return ch; +}]; +_99="mailto:"+_99; +_99=_99.replace(/./g,function(ch){ +if(ch=="@"){ +ch=_9d[Math.floor(Math.random()*2)](ch); +}else{ +if(ch!=":"){ +var r=Math.random(); +ch=(r>0.9?_9d[2](ch):r>0.45?_9d[1](ch):_9d[0](ch)); +} +} +return ch; +}); +_99=""+_99+""; +_99=_99.replace(/">.+:/g,"\">"); +return _99; +}; +var _a=function(_a3){ +_a3=_a3.replace(/~E(\d+)E/g,function(_a4,m1){ +var _a6=parseInt(m1); +return String.fromCharCode(_a6); +}); +return _a3; +}; +var _72=function(_a7){ +_a7=_a7.replace(/^(\t|[ ]{1,4})/gm,"~0"); +_a7=_a7.replace(/~0/g,""); +return _a7; +}; +var _6=function(_a8){ +_a8=_a8.replace(/\t(?=\t)/g," "); +_a8=_a8.replace(/\t/g,"~A~B"); +_a8=_a8.replace(/~B(.+?)~A/g,function(_a9,m1,m2){ +var _ac=m1; +var _ad=4-_ac.length%4; +for(var i=0;i<_ad;i++){ +_ac+=" "; +} +return _ac; +}); +_a8=_a8.replace(/~A/g," "); +_a8=_a8.replace(/~B/g,""); +return _a8; +}; +var _2e=function(_af,_b0,_b1){ +var _b2="(["+_b0.replace(/([\[\]\\])/g,"\\$1")+"])"; +if(_b1){ +_b2="\\\\"+_b2; +} +var _b3=new RegExp(_b2,"g"); +_af=_af.replace(_b3,_94); +return _af; +}; +var _94=function(_b4,m1){ +var _b6=m1.charCodeAt(0); +return "~E"+_b6+"E"; +}; +}; + diff --git a/pgweb/.gitignore b/pgweb/.gitignore new file mode 100644 index 00000000..b7a3ffac --- /dev/null +++ b/pgweb/.gitignore @@ -0,0 +1,2 @@ +settings_local.py +*.pyc diff --git a/pgweb/__init__.py b/pgweb/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pgweb/account/__init__.py b/pgweb/account/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pgweb/account/models.py b/pgweb/account/models.py new file mode 100644 index 00000000..71a83623 --- /dev/null +++ b/pgweb/account/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/pgweb/account/urls.py b/pgweb/account/urls.py new file mode 100644 index 00000000..a568eb90 --- /dev/null +++ b/pgweb/account/urls.py @@ -0,0 +1,14 @@ +from django.conf.urls.defaults import * +from django.contrib.auth.views import logout_then_login + + +urlpatterns = patterns('', + (r'^$', 'account.views.home'), + + # News & Events + (r'^news/(.*)/$', 'news.views.form'), + (r'^events/(.*)/$', 'events.views.form'), + + # Log out + (r'^logout/$', logout_then_login, {'login_url': '/' }), +) diff --git a/pgweb/account/views.py b/pgweb/account/views.py new file mode 100644 index 00000000..5064d3b4 --- /dev/null +++ b/pgweb/account/views.py @@ -0,0 +1,19 @@ +from django.contrib.auth.models import User +from django.http import HttpResponseRedirect, HttpResponse +from django.shortcuts import render_to_response +from django.contrib.auth.decorators import login_required + +from pgweb.util.contexts import NavContext + +from pgweb.news.models import NewsArticle +from pgweb.events.models import Event + +@login_required +def home(request): + myarticles = NewsArticle.objects.filter(submitter=request.user) + myevents = Event.objects.filter(submitter=request.user) + return render_to_response('account/index.html', { + 'newsarticles': myarticles, + 'events': myevents, + }, NavContext(request, 'account')) + diff --git a/pgweb/contributors/__init__.py b/pgweb/contributors/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pgweb/contributors/admin.py b/pgweb/contributors/admin.py new file mode 100644 index 00000000..c8f6baae --- /dev/null +++ b/pgweb/contributors/admin.py @@ -0,0 +1,5 @@ +from django.contrib import admin +from models import * + +admin.site.register(ContributorType) +admin.site.register(Contributor) diff --git a/pgweb/contributors/fixtures/initial_data.yaml b/pgweb/contributors/fixtures/initial_data.yaml new file mode 100644 index 00000000..17cf0993 --- /dev/null +++ b/pgweb/contributors/fixtures/initial_data.yaml @@ -0,0 +1,52 @@ +[ + { + "pk": 1, + "model": "contributors.contributortype", + "fields": { + "detailed": true, + "typename": "Core Team", + "extrainfo": "", + "sortorder": 100 + } + }, + { + "pk": 2, + "model": "contributors.contributortype", + "fields": { + "detailed": true, + "typename": "Major Contributors", + "extrainfo": "", + "sortorder": 200 + } + }, + { + "pk": 4, + "model": "contributors.contributortype", + "fields": { + "detailed": false, + "typename": "Contributors", + "extrainfo": "", + "sortorder": 300 + } + }, + { + "pk": 3, + "model": "contributors.contributortype", + "fields": { + "detailed": true, + "typename": "Hackers Emeritus", + "extrainfo": "The following hackers were previously part of the core team. Although they no longer work on the project, they are included here in recognition of their valuable contributions over the years.", + "sortorder": 400 + } + }, + { + "pk": 5, + "model": "contributors.contributortype", + "fields": { + "detailed": false, + "typename": "Past Contributors", + "extrainfo": "", + "sortorder": 500 + } + } +] diff --git a/pgweb/contributors/models.py b/pgweb/contributors/models.py new file mode 100644 index 00000000..4f662d4e --- /dev/null +++ b/pgweb/contributors/models.py @@ -0,0 +1,30 @@ +from django.db import models + + +class ContributorType(models.Model): + typename = models.CharField(max_length=32, null=False, blank=False) + sortorder = models.IntegerField(null=False, default=100) + extrainfo = models.TextField(null=True, blank=True) + detailed = models.BooleanField(null=False, default=True) + + def __unicode__(self): + return self.typename + + class Meta: + ordering = ('sortorder',) + +class Contributor(models.Model): + ctype = models.ForeignKey(ContributorType) + lastname = models.CharField(max_length=100, null=False, blank=False) + firstname = models.CharField(max_length=100, null=False, blank=False) + email = models.EmailField(null=False, blank=False) + company = models.CharField(max_length=100, null=True, blank=True) + companyurl = models.URLField(max_length=100, null=True, blank=True) + location = models.CharField(max_length=100, null=True, blank=True) + contribution = models.TextField(null=True, blank=True) + + def __unicode__(self): + return "%s %s" % (self.firstname, self.lastname) + + class Meta: + ordering = ('lastname', 'firstname',) diff --git a/pgweb/contributors/views.py b/pgweb/contributors/views.py new file mode 100644 index 00000000..7d8c628b --- /dev/null +++ b/pgweb/contributors/views.py @@ -0,0 +1,15 @@ +from django.shortcuts import render_to_response, get_object_or_404 +from django.http import HttpResponse, Http404, HttpResponseRedirect +from django.template import TemplateDoesNotExist, loader, Context +from django.contrib.auth.decorators import login_required + +from pgweb.util.contexts import NavContext + +from models import Contributor, ContributorType + +def completelist(request): + contributortypes = list(ContributorType.objects.all()) + return render_to_response('contributors/list.html', { + 'contributortypes': contributortypes, + }, NavContext(request, 'community')) + diff --git a/pgweb/core/__init__.py b/pgweb/core/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pgweb/core/admin.py b/pgweb/core/admin.py new file mode 100644 index 00000000..2d129dc0 --- /dev/null +++ b/pgweb/core/admin.py @@ -0,0 +1,8 @@ +from django.contrib import admin +from django import forms +from django.db import connection +from django.http import HttpResponseRedirect, HttpResponse + +from pgweb.core.models import * + +admin.site.register(Version) diff --git a/pgweb/core/feeds.py b/pgweb/core/feeds.py new file mode 100644 index 00000000..8bc92ce4 --- /dev/null +++ b/pgweb/core/feeds.py @@ -0,0 +1,23 @@ +from django.contrib.syndication.feeds import Feed + +from models import Version + +from datetime import datetime, time + +class VersionFeed(Feed): + title = "PostgreSQL latest versions" + link = "http://www.postgresql.org/" + description = "PostgreSQL latest versions" + + description_template = 'core/version_rss_description.html' + title_template = 'core/version_rss_title.html' + + def items(self): + return Version.objects.all() + + def item_link(self, obj): + return "http://www.postgresql.org/docs/%s/static/%s" % (obj.tree, obj.relnotes) + + def item_pubdate(self, obj): + return datetime.combine(obj.reldate,time.min) + diff --git a/pgweb/core/fixtures/initial_data.yaml b/pgweb/core/fixtures/initial_data.yaml new file mode 100644 index 00000000..2c94cefc --- /dev/null +++ b/pgweb/core/fixtures/initial_data.yaml @@ -0,0 +1,52 @@ +[ + { + "pk": 1, + "model": "core.version", + "fields": { + "relnotes": "release-8-4.html", + "tree": "8.4", + "reldate": "2009-07-01", + "latestminor": 0 + } + }, + { + "pk": 2, + "model": "core.version", + "fields": { + "relnotes": "release-8-3-7.html", + "tree": "8.3", + "reldate": "2009-03-17", + "latestminor": 7 + } + }, + { + "pk": 3, + "model": "core.version", + "fields": { + "relnotes": "release-8-2-13.html", + "tree": "8.2", + "reldate": "2009-03-17", + "latestminor": 13 + } + }, + { + "pk": 4, + "model": "core.version", + "fields": { + "relnotes": "release.html#RELEASE-8-1-17", + "tree": "8.1", + "reldate": "2009-03-17", + "latestminor": 17 + } + }, + { + "pk": 5, + "model": "core.version", + "fields": { + "relnotes": "release.html#RELEASE-8-0-21", + "tree": "8.0", + "reldate": "2009-03-17", + "latestminor": 21 + } + } +] diff --git a/pgweb/core/models.py b/pgweb/core/models.py new file mode 100644 index 00000000..64b7f921 --- /dev/null +++ b/pgweb/core/models.py @@ -0,0 +1,30 @@ +from django.db import models +from django.contrib.auth.models import User +from django.db.models.signals import pre_save + +class Version(models.Model): + tree = models.DecimalField(max_digits=3, decimal_places=1, null=False, blank=False) + latestminor = models.IntegerField(null=False, blank=False, default=0) + reldate = models.DateField(null=False, blank=False) + relnotes = models.CharField(max_length=32, null=False, blank=False) + + def __unicode__(self): + return "%s.%s" % (self.tree, self.latestminor) + + class Meta: + ordering = ('-tree', ) + + +class Country(models.Model): + name = models.CharField(max_length=100, null=False, blank=False) + tld = models.CharField(max_length=3, null=False, blank=False) + + class Meta: + db_table = 'countries' + ordering = ('name',) + verbose_name = 'Country' + verbose_name_plural = 'Countries' + + def __unicode__(self): + return self.name + diff --git a/pgweb/core/templatetags/__init__.py b/pgweb/core/templatetags/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pgweb/core/templatetags/pgfilters.py b/pgweb/core/templatetags/pgfilters.py new file mode 100644 index 00000000..37157201 --- /dev/null +++ b/pgweb/core/templatetags/pgfilters.py @@ -0,0 +1,9 @@ +from django.template.defaultfilters import stringfilter +from django import template +register = template.Library() + +@register.filter(name='hidemail') +@stringfilter +def hidemail(value): + return value.replace('@', ' at ') + diff --git a/pgweb/core/views.py b/pgweb/core/views.py new file mode 100644 index 00000000..9a36237a --- /dev/null +++ b/pgweb/core/views.py @@ -0,0 +1,46 @@ +from django.shortcuts import render_to_response, get_object_or_404 +from django.http import HttpResponse, Http404 +from django.template import TemplateDoesNotExist, loader, Context + +from pgweb.util.contexts import NavContext + +# models needed for the pieces on the frontpage +from news.models import NewsArticle +from events.models import Event +from quotes.models import Quote +from models import Version + +# Front page view +def home(request): + news = NewsArticle.objects.filter(approved=True)[:3] + events = Event.objects.select_related('country').filter(approved=True).filter(training=False)[:3] + quote = Quote.objects.filter(approved=True).order_by('?')[0] + versions = Version.objects.all() + + return render_to_response('index.html', { + 'title': 'The world\'s most advanced open source database', + 'news': news, + 'events': events, + 'quote': quote, + 'versions': versions, + }) + + +# Generic fallback view for static pages +def fallback(request, url): + if url.find('..') > -1: + raise Http404('Page not found.') + + try: + t = loader.get_template('pages/%s.html' % url) + except TemplateDoesNotExist, e: + raise Http404('Page not found.') + + # Guestimate the nav section by looking at the URL and taking the first + # piece of it. + try: + navsect = url.split('/',2)[0] + except: + navsect = '' + return HttpResponse(t.render(NavContext(request, navsect))) + diff --git a/pgweb/docs/__init__.py b/pgweb/docs/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pgweb/docs/models.py b/pgweb/docs/models.py new file mode 100644 index 00000000..ebafe955 --- /dev/null +++ b/pgweb/docs/models.py @@ -0,0 +1,12 @@ +from django.db import models + +class DocPage(models.Model): + id = models.AutoField(null=False, primary_key=True) + file = models.CharField(max_length=64, null=False, blank=False) + version = models.DecimalField(max_digits=3, decimal_places=1, null=False) + title = models.CharField(max_length=256, null=True, blank=True) + content = models.TextField(null=True, blank=True) + + class Meta: + db_table = 'docs' + diff --git a/pgweb/docs/views.py b/pgweb/docs/views.py new file mode 100644 index 00000000..25cc3790 --- /dev/null +++ b/pgweb/docs/views.py @@ -0,0 +1,25 @@ +from django.shortcuts import render_to_response, get_object_or_404 +from django.http import HttpResponse, Http404, HttpResponseRedirect +from django.template import TemplateDoesNotExist, loader, Context +from django.contrib.auth.decorators import login_required + +from pgweb.util.contexts import NavContext + +from models import DocPage + +def docpage(request, version, typ, filename): + if version == 'current': + #FIXME: get from settings + ver = '8.4' + else: + ver = version + page = get_object_or_404(DocPage, version=ver, file="%s.html" % filename) + + return render_to_response('docs/docspage.html', { + 'title': page.title, + 'doc_nav_version': version, + 'doc_type': typ, + 'page_content': page.content, + 'doc_index_filename': 'index.html', + }) + diff --git a/pgweb/downloads/__init__.py b/pgweb/downloads/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pgweb/downloads/models.py b/pgweb/downloads/models.py new file mode 100644 index 00000000..71a83623 --- /dev/null +++ b/pgweb/downloads/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/pgweb/downloads/views.py b/pgweb/downloads/views.py new file mode 100644 index 00000000..21ed476c --- /dev/null +++ b/pgweb/downloads/views.py @@ -0,0 +1,97 @@ +from django.shortcuts import render_to_response, get_object_or_404 +from django.http import HttpResponse, Http404, HttpResponseRedirect +from django.template import TemplateDoesNotExist, loader, Context +from django.contrib.auth.decorators import login_required +from django.conf import settings + +import os +from datetime import datetime + +from pgweb.util.contexts import NavContext + +def _getfiledata(root, paths): + for path in paths: + fn = "%s/%s" % (root,path) + if not os.path.isfile(fn): + continue + stat = os.stat(fn) + yield { + 'name':path, + 'mtime': datetime.fromtimestamp(stat.st_mtime), + 'size': stat.st_size, + } + +def _getdirectorydata(root, paths): + for path in paths: + fn = "%s/%s" % (root,path) + if not os.path.isdir(fn): + continue + if os.path.islink(fn): + # This is a link, so change the url to point directly + # to the link target. We'll just assume the link + # is safe. Oh, and links must be relative + yield { + 'link': path, + 'url': os.readlink(fn), + } + else: + yield { + 'link': path, + 'url': path, + } + +def _getfile(root, filename): + fn = "%s/%s" % (root,filename) + if os.path.isfile(fn): + f = open(fn) + r = f.read() + f.close() + return r + return None + +def ftpbrowser(request, subpath): + if subpath: + # An actual path has been selected. Fancy! + + if subpath.find('..') > -1: + # Just claim it doesn't exist if the user tries to do this + # type of bad thing + raise Http404 + fspath = os.path.join(settings.FTP_ROOT, subpath) + else: + fspath = settings.FTP_ROOT + subpath="" + + if not os.path.isdir(fspath): + raise Http404 + + everything = [n for n in os.listdir(fspath) if not n.startswith('.')] + + directories = list(_getdirectorydata(fspath, everything)) + if subpath: + directories.append({'link':'[Parent Directory]', 'url':'..'}) + files = list(_getfiledata(fspath, everything)) + + breadcrumbs = [] + if subpath: + breadroot = "" + for pathpiece in subpath.split('/'): + if not pathpiece: + # Trailing slash will give out an empty pathpiece + continue + if breadroot: + breadroot = "%s/%s" % (breadroot, pathpiece) + else: + breadroot = pathpiece + breadcrumbs.append({'name': pathpiece, 'path': breadroot}); + + return render_to_response('downloads/ftpbrowser.html', { + 'basepath': subpath.rstrip('/'), + 'directories': sorted(directories), + 'files': sorted(files), + 'breadcrumbs': breadcrumbs, + 'readme': _getfile(fspath, 'README'), + 'messagesfile': _getfile(fspath, '.messages'), + 'maintainer': _getfile(fspath, 'CURRENT_MAINTAINER'), + }, NavContext(request, 'download')) + diff --git a/pgweb/events/__init__.py b/pgweb/events/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pgweb/events/admin.py b/pgweb/events/admin.py new file mode 100644 index 00000000..4ec5c5fb --- /dev/null +++ b/pgweb/events/admin.py @@ -0,0 +1,4 @@ +from django.contrib import admin +from models import * + +admin.site.register(Event) diff --git a/pgweb/events/feeds.py b/pgweb/events/feeds.py new file mode 100644 index 00000000..1c6e2b82 --- /dev/null +++ b/pgweb/events/feeds.py @@ -0,0 +1,22 @@ +from django.contrib.syndication.feeds import Feed + +from models import Event + +from datetime import datetime, time + +class EventFeed(Feed): + title = description = "PostgreSQL events" + link = "http://www.postgresql.org/" + + description_template = 'events/rss_description.html' + title_template = 'events/rss_title.html' + + def items(self): + return Event.objects.filter(approved=True).filter(training=False)[:10] + + def item_link(self, obj): + return "http://www.postgresql.org/about/event/%s/" % obj.id + + def item_pubdate(self, obj): + return datetime.combine(obj.startdate,time.min) + diff --git a/pgweb/events/forms.py b/pgweb/events/forms.py new file mode 100644 index 00000000..cafdcbd3 --- /dev/null +++ b/pgweb/events/forms.py @@ -0,0 +1,8 @@ +from django import forms + +from models import Event + +class EventForm(forms.ModelForm): + class Meta: + model = Event + exclude = ('submitter', 'approved', ) diff --git a/pgweb/events/models.py b/pgweb/events/models.py new file mode 100644 index 00000000..744c2ed2 --- /dev/null +++ b/pgweb/events/models.py @@ -0,0 +1,44 @@ +from django.db import models +from django.contrib.auth.models import User +from datetime import date +from pgweb.util.bases import PgModel + +from core.models import Country + +class Event(models.Model, PgModel): + submitter = models.ForeignKey(User, null=False, blank=False) + approved = models.BooleanField(null=False, blank=False, default=False) + + org = models.CharField(max_length=50, null=False, blank=False) + title = models.CharField(max_length=100, null=False, blank=False) + city = models.CharField(max_length=50, null=False, blank=False) + state = models.CharField(max_length=50, null=False, blank=True) + country = models.ForeignKey(Country, null=False, blank=False) + + training = models.BooleanField(null=False, blank=False, default=False) + startdate = models.DateField(null=False, blank=False) + enddate = models.DateField(null=False, blank=False) + + summary = models.TextField(blank=False, null=False) + details = models.TextField(blank=False, null=False) + + send_notification = True + + def __unicode__(self): + return "%s: %s" % (self.startdate, self.title) + + @property + def displaydate(self): + if self.startdate == self.enddate: + return self.startdate + else: + return "%s – %s" % (self.startdate, self.enddate) + + @property + def locationstring(self): + #FIXME, deal with state etc + return "%s, %s" % (self.city, self.country) + + class Meta: + ordering = ('startdate',) + diff --git a/pgweb/events/views.py b/pgweb/events/views.py new file mode 100644 index 00000000..4df6adcc --- /dev/null +++ b/pgweb/events/views.py @@ -0,0 +1,31 @@ +from django.shortcuts import render_to_response, get_object_or_404 +from django.http import HttpResponse, Http404, HttpResponseRedirect +from django.template import TemplateDoesNotExist, loader, Context +from django.contrib.auth.decorators import login_required + +from datetime import date + +from pgweb.util.contexts import NavContext +from pgweb.util.helpers import simple_form + +from models import Event +from forms import EventForm + +def archive(request, paging=None): + event = Event.objects.filter(approved=True).filter(enddate__gt=date.today) + return render_to_response('events/archive.html', { + 'events': event, + }, NavContext(request, 'about')) + +def item(request, itemid, throwaway=None): + event = get_object_or_404(Event, pk=itemid) + if not event.approved: + raise Http404 + return render_to_response('events/item.html', { + 'obj': event, + }, NavContext(request, 'about')) + +@login_required +def form(request, itemid): + return simple_form(Event, itemid, request, EventForm) + diff --git a/pgweb/lists/__init__.py b/pgweb/lists/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pgweb/lists/admin.py b/pgweb/lists/admin.py new file mode 100644 index 00000000..7e6576b3 --- /dev/null +++ b/pgweb/lists/admin.py @@ -0,0 +1,5 @@ +from django.contrib import admin +from models import * + +admin.site.register(MailingListGroup) +admin.site.register(MailingList) diff --git a/pgweb/lists/models.py b/pgweb/lists/models.py new file mode 100644 index 00000000..7a7d02dd --- /dev/null +++ b/pgweb/lists/models.py @@ -0,0 +1,31 @@ +from django.db import models + +class MailingListGroup(models.Model): + groupname = models.CharField(max_length=64, null=False, blank=False) + sortkey = models.IntegerField(null=False, default=10) + + def __unicode__(self): + return self.groupname + + class Meta: + ordering = ('sortkey', ) + +class MailingList(models.Model): + group = models.ForeignKey(MailingListGroup, null=False) + listname = models.CharField(max_length=64, null=False, blank=False) + active = models.BooleanField(null=False, default=False) + externallink = models.URLField(max_length=200, null=True, blank=True) + description = models.TextField(null=False, blank=True) + shortdesc = models.TextField(null=False, blank=True) + + @property + def maybe_shortdesc(self): + if self.shortdesc: + return self.shortdesc + return self.listname + + def __unicode__(self): + return self.listname + + class Meta: + ordering = ('listname', ) diff --git a/pgweb/lists/views.py b/pgweb/lists/views.py new file mode 100644 index 00000000..eee529b3 --- /dev/null +++ b/pgweb/lists/views.py @@ -0,0 +1,16 @@ +from django.shortcuts import render_to_response, get_object_or_404 +from django.http import HttpResponse, Http404, HttpResponseRedirect +from django.template import TemplateDoesNotExist, loader, Context +from django.contrib.auth.decorators import login_required + +from pgweb.util.contexts import NavContext + +from models import MailingList, MailingListGroup + +def root(request): + lists = MailingList.objects.all().order_by('group__sortkey', 'listname') + + return render_to_response('lists/root.html', { + 'lists': lists, + }, NavContext(request, 'community')) + diff --git a/pgweb/manage.py b/pgweb/manage.py new file mode 100755 index 00000000..5e78ea97 --- /dev/null +++ b/pgweb/manage.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python +from django.core.management import execute_manager +try: + import settings # Assumed to be in the same directory. +except ImportError: + import sys + sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__) + sys.exit(1) + +if __name__ == "__main__": + execute_manager(settings) diff --git a/pgweb/news/__init__.py b/pgweb/news/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pgweb/news/admin.py b/pgweb/news/admin.py new file mode 100644 index 00000000..20c401f6 --- /dev/null +++ b/pgweb/news/admin.py @@ -0,0 +1,4 @@ +from django.contrib import admin +from models import * + +admin.site.register(NewsArticle) diff --git a/pgweb/news/feeds.py b/pgweb/news/feeds.py new file mode 100644 index 00000000..a67f1a54 --- /dev/null +++ b/pgweb/news/feeds.py @@ -0,0 +1,22 @@ +from django.contrib.syndication.feeds import Feed + +from models import NewsArticle + +from datetime import datetime, time + +class NewsFeed(Feed): + title = description = "PostgreSQL news" + link = "http://www.postgresql.org/" + + description_template = 'news/rss_description.html' + title_template = 'news/rss_title.html' + + def items(self): + return NewsArticle.objects.filter(approved=True)[:10] + + def item_link(self, obj): + return "http://www.postgresql.org/about/news/%s/" % obj.id + + def item_pubdate(self, obj): + return datetime.combine(obj.date,time.min) + diff --git a/pgweb/news/forms.py b/pgweb/news/forms.py new file mode 100644 index 00000000..3cdf4871 --- /dev/null +++ b/pgweb/news/forms.py @@ -0,0 +1,9 @@ +from django import forms + +from models import NewsArticle + +class NewsArticleForm(forms.ModelForm): + class Meta: + model = NewsArticle + exclude = ('submitter', 'approved', ) + diff --git a/pgweb/news/models.py b/pgweb/news/models.py new file mode 100644 index 00000000..99e8142d --- /dev/null +++ b/pgweb/news/models.py @@ -0,0 +1,20 @@ +from django.db import models +from django.contrib.auth.models import User +from datetime import date +from pgweb.util.bases import PgModel + +class NewsArticle(PgModel, models.Model): + submitter = models.ForeignKey(User, null=False, blank=False) + approved = models.BooleanField(null=False, blank=False, default=False) + date = models.DateField(null=False, blank=False, default=date.today) + title = models.CharField(max_length=200, null=False, blank=False) + content = models.TextField(null=False, blank=False) + + send_notification = True + + def __unicode__(self): + return "%s: %s" % (self.date, self.title) + + class Meta: + ordering = ('-date',) + diff --git a/pgweb/news/views.py b/pgweb/news/views.py new file mode 100644 index 00000000..aeebf20f --- /dev/null +++ b/pgweb/news/views.py @@ -0,0 +1,29 @@ +from django.shortcuts import render_to_response, get_object_or_404 +from django.http import HttpResponse, Http404, HttpResponseRedirect +from django.template import TemplateDoesNotExist, loader, Context +from django.contrib.auth.decorators import login_required + +from pgweb.util.contexts import NavContext +from pgweb.util.helpers import simple_form + +from models import NewsArticle +from forms import NewsArticleForm + +def archive(request, paging=None): + news = NewsArticle.objects.filter(approved=True) + return render_to_response('news/newsarchive.html', { + 'news': news, + }, NavContext(request, 'about')) + +def item(request, itemid, throwaway=None): + news = get_object_or_404(NewsArticle, pk=itemid) + if not news.approved: + raise Http404 + return render_to_response('news/item.html', { + 'obj': news, + }, NavContext(request, 'about')) + +@login_required +def form(request, itemid): + return simple_form(NewsArticle, itemid, request, NewsArticleForm) + diff --git a/pgweb/pages/__init__.py b/pgweb/pages/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pgweb/pages/models.py b/pgweb/pages/models.py new file mode 100644 index 00000000..71a83623 --- /dev/null +++ b/pgweb/pages/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/pgweb/pages/views.py b/pgweb/pages/views.py new file mode 100644 index 00000000..60f00ef0 --- /dev/null +++ b/pgweb/pages/views.py @@ -0,0 +1 @@ +# Create your views here. diff --git a/pgweb/profserv/__init__.py b/pgweb/profserv/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pgweb/profserv/admin.py b/pgweb/profserv/admin.py new file mode 100644 index 00000000..204ecc7f --- /dev/null +++ b/pgweb/profserv/admin.py @@ -0,0 +1,4 @@ +from django.contrib import admin +from models import * + +admin.site.register(ProfessionalService) diff --git a/pgweb/profserv/models.py b/pgweb/profserv/models.py new file mode 100644 index 00000000..543c0054 --- /dev/null +++ b/pgweb/profserv/models.py @@ -0,0 +1,38 @@ +from django.db import models +from django.contrib.auth.models import User + +from pgweb.util.bases import PgModel + +class ProfessionalService(models.Model): + submitter = models.ForeignKey(User, null=False, blank=False) + approved = models.BooleanField(null=False, blank=False, default=False) + + name = models.CharField(max_length=100, null=False, blank=False) + description = models.TextField(null=False,blank=False) + employees = models.CharField(max_length=32, null=True, blank=True) + locations = models.CharField(max_length=128, null=True, blank=True) + region_africa = models.BooleanField(null=False, default=False) + region_asia = models.BooleanField(null=False, default=False) + region_europe = models.BooleanField(null=False, default=False) + region_northamerica = models.BooleanField(null=False, default=False) + region_oceania = models.BooleanField(null=False, default=False) + region_southamerica = models.BooleanField(null=False, default=False) + hours = models.CharField(max_length=128, null=True, blank=True) + languages = models.CharField(max_length=128, null=True, blank=True) + customerexample = models.TextField(blank=True, null=True) + experience = models.TextField(blank=True, null=True) + contact = models.CharField(max_length=128, null=True, blank=True) + url = models.URLField(max_length=128, null=True, blank=True) + provides_support = models.BooleanField(null=False, default=False) + provides_hosting = models.BooleanField(null=False, default=False) + interfaces = models.CharField(max_length=128, null=True, blank=True) + + + send_notification = True + + def __unicode__(self): + return self.name + + class Meta: + ordering = ('name',) + diff --git a/pgweb/profserv/views.py b/pgweb/profserv/views.py new file mode 100644 index 00000000..668a3a5e --- /dev/null +++ b/pgweb/profserv/views.py @@ -0,0 +1,57 @@ +from django.shortcuts import render_to_response, get_object_or_404 +from django.http import HttpResponse, Http404, HttpResponseRedirect +from django.template import TemplateDoesNotExist, loader, Context +from django.contrib.auth.decorators import login_required +from django.db.models import Q + +from pgweb.util.contexts import NavContext +from pgweb.util.helpers import simple_form + +from models import ProfessionalService +#from forms import NewsArticleForm + +regions = ( + ('africa','Africa'), + ('asia','Asia'), + ('europe','Europe'), + ('northamerica','North America'), + ('oceania','Oceania'), + ('southamerica','South America'), +) + +def root(request, servtype): + title = servtype=='support' and 'Professional Services' or 'Hosting Providers' + what = servtype=='support' and 'support' or 'hosting' + support = servtype=='support' + return render_to_response('profserv/root.html', { + 'title': title, + 'support': support, + 'regions': regions, + 'what': what, + }, NavContext(request, 'support')) + + +def region(request, servtype, regionname): + regname = [n for r,n in regions if r==regionname] + if not regname: + raise Http404 + regname = regname[0] + + what = servtype=='support' and 'support' or 'hosting' + whatname = servtype=='support' and 'Professional Services' or 'Hosting Providers' + title = "%s - %s" % (whatname, regname) + support = servtype=='support' + + # DB model is a bit funky here, so use the extra-where functionality to filter properly. + # Field names are cleaned up earlier, so it's safe against injections. + services = ProfessionalService.objects.filter(approved=True).extra(where=["region_%s AND provides_%s" % (regionname, what),]) + + return render_to_response('profserv/list.html', { + 'title': title, + 'support': support, + 'what': what, + 'whatname': whatname, + 'regionname': regname, + 'services': services, + }, NavContext(request, 'support')) + diff --git a/pgweb/quotes/__init__.py b/pgweb/quotes/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pgweb/quotes/admin.py b/pgweb/quotes/admin.py new file mode 100644 index 00000000..85f670f6 --- /dev/null +++ b/pgweb/quotes/admin.py @@ -0,0 +1,4 @@ +from django.contrib import admin +from models import * + +admin.site.register(Quote) diff --git a/pgweb/quotes/models.py b/pgweb/quotes/models.py new file mode 100644 index 00000000..908455fe --- /dev/null +++ b/pgweb/quotes/models.py @@ -0,0 +1,17 @@ +from django.db import models +from pgweb.util.bases import PgModel + +class Quote(models.Model, PgModel): + approved = models.BooleanField(null=False, default=False) + quote = models.TextField(null=False, blank=False) + who = models.CharField(max_length=100, null=False, blank=False) + org = models.CharField(max_length=100, null=False, blank=False) + link = models.URLField(null=False, blank=False) + + send_notification = True + + def __unicode__(self): + if len(self.quote) > 75: + return "%s..." % self.quote[:75] + else: + return self.quote diff --git a/pgweb/quotes/views.py b/pgweb/quotes/views.py new file mode 100644 index 00000000..8ba62005 --- /dev/null +++ b/pgweb/quotes/views.py @@ -0,0 +1,11 @@ +from django.shortcuts import render_to_response, get_object_or_404 + +from pgweb.util.contexts import NavContext + +from models import Quote + +def allquotes(request): + quotes = Quote.objects.filter(approved=True) + return render_to_response('quotes/quotelist.html', { + 'quotes': quotes, + }, NavContext(request, 'about')) diff --git a/pgweb/settings.py b/pgweb/settings.py new file mode 100644 index 00000000..72a8382f --- /dev/null +++ b/pgweb/settings.py @@ -0,0 +1,96 @@ +# Django settings for pgweb project. + +DEBUG = False +#TEMPLATE_DEBUG = DEBUG + +ADMINS = ( + ('PostgreSQL Webmaster', 'webmaster@postgresql.org'), +) + +MANAGERS = ADMINS + +DATABASE_ENGINE = 'postgresql_psycopg2' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. +DATABASE_NAME = '' # Or path to database file if using sqlite3. +DATABASE_USER = '' # Not used with sqlite3. +DATABASE_PASSWORD = '' # Not used with sqlite3. +DATABASE_HOST = '' # Set to empty string for localhost. Not used with sqlite3. +DATABASE_PORT = '' # Set to empty string for default. Not used with sqlite3. + +# Local time zone for this installation. Choices can be found here: +# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name +# although not all choices may be available on all operating systems. +# If running in a Windows environment this must be set to the same as your +# system time zone. +TIME_ZONE = 'GMT' + +# Language code for this installation. All choices can be found here: +# http://www.i18nguy.com/unicode/language-identifiers.html +LANGUAGE_CODE = 'en-us' + +SITE_ID = 1 + +# If you set this to False, Django will make some optimizations so as not +# to load the internationalization machinery. +USE_I18N = False + +# Absolute path to the directory that holds media. +# Example: "/home/media/media.lawrence.com/" +MEDIA_ROOT = '' + +# URL that handles the media served from MEDIA_ROOT. Make sure to use a +# trailing slash if there is a path component (optional in other cases). +# Examples: "http://media.lawrence.com", "http://example.com/media/" +MEDIA_URL = '' + +# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a +# trailing slash. +# Examples: "http://foo.com/media/", "/media/". +ADMIN_MEDIA_PREFIX = '/adminmedia/' + +# Make this unique, and don't share it with anybody. +SECRET_KEY = 'REALLYCHANGETHISINSETTINGS_LOCAL.PY' + +# List of callables that know how to import templates from various sources. +TEMPLATE_LOADERS = ( + 'django.template.loaders.filesystem.load_template_source', + 'django.template.loaders.app_directories.load_template_source', +# 'django.template.loaders.eggs.load_template_source', +) + +MIDDLEWARE_CLASSES = [ + 'django.middleware.common.CommonMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'util.middleware.PgMiddleware', +] + +ROOT_URLCONF = 'pgweb.urls' + +TEMPLATE_DIRS = ( + '../templates/', +) + +INSTALLED_APPS = [ + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.sites', + 'django.contrib.admin', + 'django.contrib.markup', + 'pgweb.core', + 'pgweb.account', + 'pgweb.news', + 'pgweb.events', + 'pgweb.quotes', + 'pgweb.downloads', + 'pgweb.docs', + 'pgweb.contributors', + 'pgweb.profserv', + 'pgweb.lists', + 'pgweb.sponsors', +] + + +# Load local settings overrides +from settings_local import * + diff --git a/pgweb/sponsors/__init__.py b/pgweb/sponsors/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pgweb/sponsors/admin.py b/pgweb/sponsors/admin.py new file mode 100644 index 00000000..52018197 --- /dev/null +++ b/pgweb/sponsors/admin.py @@ -0,0 +1,7 @@ +from django.contrib import admin +from models import * + +admin.site.register(SponsorType) +admin.site.register(Sponsor) +admin.site.register(Server) + diff --git a/pgweb/sponsors/models.py b/pgweb/sponsors/models.py new file mode 100644 index 00000000..1febc4c4 --- /dev/null +++ b/pgweb/sponsors/models.py @@ -0,0 +1,43 @@ +from django.db import models + +from core.models import Country + +class SponsorType(models.Model): + typename = models.CharField(max_length=32, null=False, blank=False) + description = models.TextField(null=False, blank=False) + sortkey = models.IntegerField(null=False, default=10) + + def __unicode__(self): + return self.typename + + class Meta: + ordering = ('sortkey', ) + +class Sponsor(models.Model): + sponsortype = models.ForeignKey(SponsorType, null=False) + name = models.CharField(max_length=128, null=False, blank=False) + url = models.URLField(null=False, blank=False) + logoname = models.CharField(max_length=64, null=False, blank=False) + country = models.ForeignKey(Country, null=False) + + def __unicode__(self): + return self.name + + class Meta: + ordering = ('name', ) + +class Server(models.Model): + name = models.CharField(max_length=32, null=False, blank=False) + sponsors = models.ManyToManyField(Sponsor) + dedicated = models.BooleanField(null=False, default=True) + performance = models.CharField(max_length=128, null=False, blank=False) + os = models.CharField(max_length=32, null=False, blank=False) + location = models.CharField(max_length=128, null=False, blank=False) + usage = models.TextField(null=False, blank=False) + + def __unicode__(self): + return self.name + + class Meta: + ordering = ('name', ) + diff --git a/pgweb/sponsors/views.py b/pgweb/sponsors/views.py new file mode 100644 index 00000000..45ebdb9a --- /dev/null +++ b/pgweb/sponsors/views.py @@ -0,0 +1,22 @@ +from django.shortcuts import render_to_response, get_object_or_404 +from django.http import HttpResponse, Http404, HttpResponseRedirect +from django.template import TemplateDoesNotExist, loader, Context +from django.contrib.auth.decorators import login_required + +from pgweb.util.contexts import NavContext +from pgweb.util.helpers import simple_form + +from models import Sponsor, Server + +def sponsors(request): + sponsors = Sponsor.objects.select_related().filter(sponsortype__sortkey__gt=0).order_by('sponsortype__sortkey' ,'name') + return render_to_response('sponsors/sponsors.html', { + 'sponsors': sponsors, + }, NavContext(request, 'about')) + +def servers(request): + servers = Server.objects.select_related().all() + return render_to_response('sponsors/servers.html', { + 'servers': servers, + }, NavContext(request, 'about')) + diff --git a/pgweb/urls.py b/pgweb/urls.py new file mode 100644 index 00000000..73d9e210 --- /dev/null +++ b/pgweb/urls.py @@ -0,0 +1,68 @@ +from django.conf.urls.defaults import * + +# Register our save signal handlers +from pgweb.util.bases import register_basic_signal_handlers +register_basic_signal_handlers() + +# Uncomment the next two lines to enable the admin: +from django.contrib import admin +admin.autodiscover() + + +# dict with all the RSS feeds we can serve +from core.feeds import VersionFeed +from news.feeds import NewsFeed +from events.feeds import EventFeed +feeds = { + 'versions': VersionFeed, + 'news': NewsFeed, + 'events': EventFeed, +} + +urlpatterns = patterns('', + (r'^$', 'pgweb.core.views.home'), + + (r'^about/newsarchive/$', 'news.views.archive'), + (r'^about/news/(\d+)(-.*)?/$', 'news.views.item'), + (r'^about/eventarchive/$', 'events.views.archive'), + (r'^about/event/(\d+)(-.*)?/$', 'events.views.item'), + (r'^about/quotesarchive/$', 'quotes.views.allquotes'), + + (r'^ftp/(.*/)?$', 'downloads.views.ftpbrowser'), + + (r'^docs/(current|\d\.\d)/(static|interactive)/(.*).html$', 'docs.views.docpage'), + + (r'^community/contributors/$', 'contributors.views.completelist'), + (r'^community/lists/$', 'lists.views.root'), + + (r'^support/professional_(support|hosting)/$', 'profserv.views.root'), + (r'^support/professional_(support|hosting)[/_](.*)/$', 'profserv.views.region'), + + (r'about/sponsors/$', 'pgweb.sponsors.views.sponsors'), + (r'about/servers/$', 'pgweb.sponsors.views.servers'), + + ### + # RSS feeds + ### + (r'^(versions|news|events).rss$', 'django.contrib.syndication.views.feed', {'feed_dict':feeds}), + + ### + # Special secttions + ### + (r'account/', include('account.urls')), + + # Uncomment the next line to enable the admin: + (r'^admin/(.*)', admin.site.root), + + # This should not happen in production - serve by the webserver natively! + url(r'^media/(.*)$', 'django.views.static.serve', { + 'document_root': '../media', + }), + url(r'^(favicon.ico)$', 'django.views.static.serve', { + 'document_root': '../media', + }), + + # Fallback for static pages, must be at the bottom + (r'^(.*)/$', 'pgweb.core.views.fallback'), +) + diff --git a/pgweb/util/__init__.py b/pgweb/util/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pgweb/util/bases.py b/pgweb/util/bases.py new file mode 100644 index 00000000..018a3e4a --- /dev/null +++ b/pgweb/util/bases.py @@ -0,0 +1,96 @@ +from django.db.models.signals import pre_save +from django.db import models +from django.conf import settings + +from util.middleware import get_current_user + +class PgModel(object): + send_notification = False + notify_fields = None + modifying_user = None + + def PreSaveHandler(self): + """If send_notification is set to True, send a default formatted notification mail""" + + print "Handler called!" + if not self.send_notification: + return + + (subj, cont) = self._get_changes_texts() + + if not cont: + # If any of these come back as None, it means that nothing actually changed, + # or that we don't care to send out notifications about it. + return + + print "Sending notification to %s" % settings.NOTIFICATION_EMAIL + print "Generate subject: %s by %s\nGenerate contents: %s\n------------------------------" % (subj, get_current_user(), cont) + + + def _get_changes_texts(self): + try: + oldobj = self.__class__.objects.get(pk=self.pk) + except self.DoesNotExist, e: + return ('A new %s has been added' % self._meta.verbose_name, self.full_text_representation()) + + if hasattr(self,'approved'): + # This object has the capability to do approving. Apply the following logic: + # 1. If object was unapproved, and is still unapproved, don't send notification + # 2. If object was unapproved, and is now approved, send "object approved" notification + # 3. If object was approved, and is no longer approved, send "object unapproved" notification + # 4. (FIXME: configurable?) If object was approved and is still approved, send changes notification + if not self.approved: + if not oldobj.approved: + # Still unapproved, just accept the changes + return (None, None) + # Went from approved to unapproved + return ('%s id %s has been unapproved' % (self._meta.verbose_name, self.id), self.full_text_representation()) + else: + if not oldobj.approved: + # Object went from unapproved to approved + return ('%s id %s has been approved' % (self._meta.verbose_name, self.id), + self.full_text_representation()) + # Object contents have changed. Generate a diff! + diff = self.full_text_diff(oldobj) + if not diff: + return (None, None) + return ('%s id %s has been modified' % (self._meta.verbose_name, self.id), + "The following fields have been modified:\n\n%s" % diff) + + + def _get_all_notification_fields(self): + if self.notify_fields: + return self.notify_fields + else: + return [n for n in self._meta.get_all_field_names() if not n in ('approved', 'submitter', 'id', )] + + def full_text_representation(self): + fieldlist = self._get_all_notification_fields() + if not fieldlist: + return "This object does not know how to express itself." + + return "\n".join(['%s: %s' % (n, getattr(self, n)) for n in fieldlist]) + + def full_text_diff(self, oldobj): + fieldlist = self._get_all_notification_fields() + if not fieldlist: + return "This object does not know how to express ifself." + + s = "\n\n".join(["%s from: %s\n%s to: %s" % ( + n, + getattr(oldobj, n), + n, + getattr(self, n), + ) for n in fieldlist if not getattr(oldobj,n)==getattr(self,n)]) + if not s: return None + return s + + +def my_pre_save_handler(sender, **kwargs): + instance = kwargs['instance'] + if isinstance(instance, PgModel): + instance.PreSaveHandler() + +def register_basic_signal_handlers(): + pre_save.connect(my_pre_save_handler) + diff --git a/pgweb/util/contexts.py b/pgweb/util/contexts.py new file mode 100644 index 00000000..07772912 --- /dev/null +++ b/pgweb/util/contexts.py @@ -0,0 +1,90 @@ +from django.template import RequestContext + +# This is the whole site navigation structure. Stick in a smarter file? +sitenav = { + 'about': [ + {'title': 'About', 'link':'/about/'}, + {'title': 'Advantages', 'link':'/about/advantages/'}, + {'title': 'Feature Matrix', 'link':'/about/featurematrix/'}, + {'title': 'Awards', 'link':'/about/awards/'}, + {'title': 'Donate', 'link':'/about/donate/'}, + {'title': 'Case Studies', 'link':'/about/casestudies/'}, + {'title': 'Quotes', 'link':'/about/quotesarchive/'}, + {'title': 'Featured Users', 'link':'/about/users/'}, + {'title': 'History', 'link':'/about/history/'}, + {'title': 'Sponsors', 'link':'/about/sponsors/', 'submenu': [ + {'title': 'Servers', 'link': '/about/servers/'}, + ]}, + {'title': 'Latest news', 'link':'/about/newsarchive/'}, + {'title': 'Upcoming events', 'link':'/about/eventarchive/'}, + {'title': 'Press', 'link':'/about/press/'}, + {'title': 'Licence', 'link':'/about/licence/'}, + ], + 'download': [ + {'title': 'Downloads', 'link':'/download/'}, + {'title': 'Software Catalogue', 'link':'/download/product-categories/'}, + {'title': 'pgFoundry', 'link':'http://pgfoundry.org/'}, + {'title': 'File Browser', 'link':'/ftp/'}, + ], + 'docs': [ + {'title': 'Documentation', 'link':'/docs/'}, + {'title': 'Manuals', 'link':'/docs/manuals/', 'submenu': [ + {'title': 'Archive', 'link':'/docs/manuals/archive/'}, + {'title': 'French', 'link':'http://docs.postgresqlfr.org/'}, + {'title': 'Japanese', 'link':'http://www.postgresql.jp/document/'}, + ]}, + {'title': 'Security', 'link':'/support/security/'}, + {'title': 'What''s New', 'link':'/docs/8.4/static/release-8-4.html'}, + {'title': 'FAQ', 'link':'http://wiki.postgresql.org/wiki/Category:FAQ'}, + {'title': 'Books', 'link':'/docs/books/'}, + {'title': 'Wiki', 'link':'http://wiki.postgresql.org'}, + ], + 'community': [ + {'title': 'Community', 'link':'/community/'}, + {'title': 'Contributors', 'link':'/community/contributors/'}, + {'title': 'Mailing Lists', 'link':'/community/lists/', 'submenu': [ + {'title': 'Subscribe', 'link':'/community/lists/subscribe/'}, + {'title': 'Archives', 'link':'http://archives.postgresql.org/'}, + ]}, + {'title': 'IRC', 'link':'/community/irc/'}, + {'title': 'Featured Users', 'link':'/about/users/'}, + {'title': 'International Sites','link':'/community/international/'}, + {'title': 'Propaganda', 'link':'/community/propaganda/'}, + {'title': 'Resources', 'link':'/community/resources/'}, + {'title': 'Weekly News', 'link':'/community/weeklynews/'}, + ], + 'developer': [ + {'title': 'Developers', 'link':'/developer/'}, + {'title': 'Roadmap', 'link':'/developer/roadmap/'}, + {'title': 'Coding', 'link':'/developer/coding/'}, + {'title': 'Testing', 'link':'/developer/testing/', 'submenu': [ + {'title': 'Alpha Information', 'link':'/developer/alpha/'}, + {'title': 'Beta Information', 'link':'/developer/beta/'}, + ]}, + {'title': 'Mailing Lists', 'link':'/community/lists/'}, + {'title': 'Developer FAQ', 'link':'http://wiki.postgresql.org/wiki/Developer_FAQ'}, + ], + 'support': [ + {'title': 'Support', 'link':'/support/'}, + {'title': 'Versioning policy', 'link':'/support/versioning/'}, + {'title': 'Security', 'link':'/support/security/'}, + {'title': 'Professional Services','link':'/support/professional_support/'}, + {'title': 'Hosting Solutions', 'link':'/support/professional_hosting/'}, + {'title': 'Report a Bug', 'link':'/support/submitbug/'}, + ], + 'account': [ + {'title': 'Your account', 'link':'/account'}, + {'title': 'Logout', 'link':'/account/logout'}, + ], +} + + +class NavContext(RequestContext): + def __init__(self, request, section): + RequestContext.__init__(self, request) + if sitenav.has_key(section): + navsection = sitenav[section] + else: + navsection = {} + self.update({'navmenu': navsection}) + diff --git a/pgweb/util/decorators.py b/pgweb/util/decorators.py new file mode 100644 index 00000000..791888d0 --- /dev/null +++ b/pgweb/util/decorators.py @@ -0,0 +1,4 @@ +def ssl_required(fn): + def _require_ssl(*_args): + return fn(_args) + return _require_ssl diff --git a/pgweb/util/helpers.py b/pgweb/util/helpers.py new file mode 100644 index 00000000..99b1ff80 --- /dev/null +++ b/pgweb/util/helpers.py @@ -0,0 +1,30 @@ +from django.shortcuts import render_to_response, get_object_or_404 +from pgweb.util.contexts import NavContext +from django.http import HttpResponseRedirect + +def simple_form(instancetype, itemid, request, formclass, formtemplate='base/form.html', redirect='/account/', navsection='account'): + if itemid == 'new': + instance = instancetype() + else: + # Regular news item, attempt to edit it + instance = get_object_or_404(instancetype, pk=itemid) + if not instance.submitter == request.user: + raise Exception("You are not the owner of this item!") + + if request.method == 'POST': + # Process this form + form = formclass(data=request.POST, instance=instance) + if form.is_valid(): + r = form.save(commit=False) + r.submitter = request.user + r.save() + return HttpResponseRedirect(redirect) + else: + # Generate form + form = formclass(instance=instance) + + return render_to_response(formtemplate, { + 'form': form, + 'formitemtype': instance._meta.verbose_name, + }, NavContext(request, navsection)) + diff --git a/pgweb/util/middleware.py b/pgweb/util/middleware.py new file mode 100644 index 00000000..0646673a --- /dev/null +++ b/pgweb/util/middleware.py @@ -0,0 +1,37 @@ +from django.http import HttpResponseRedirect, HttpResponse + +# Use thread local storage to pass the username down. +# http://code.djangoproject.com/wiki/CookBookThreadlocalsAndUser +try: + from threading import local, currentThread +except ImportError: + from django.utils._threading_local import local + +_thread_locals = local() +def get_current_user(): + return getattr(_thread_locals, 'user', None) + + +# General middleware for all middleware functionality specific to the pgweb +# project. +class PgMiddleware(object): + def process_view(self, request, view_func, view_args, view_kwargs): + # We implement the SSL verification in a middleware and not just a decorator, because + # if we do it just in a decorator we'd have to add a decorator for each and every + # view that *doesn't* require SSL. This is much easier, of course. + if view_func.__name__ == '_require_ssl': + # This view requires SSL, so check if we have it + if not request.is_secure(): + # May need to deal with ports specified here? + return HttpResponseRedirect(request.build_absolute_uri().replace('http://','https://',1)) + else: + # This view must not use SSL, so make sure we don't have it + if request.is_secure(): + return HttpResponseRedirect(request.build_absolute_uri().replace('https://','http://',1)) + + return None + +# Thread local store for username, see comment at the top of this file + def process_request(self, request): + _thread_locals.user = getattr(request, 'user', None) + diff --git a/pgweb/util/misc.py b/pgweb/util/misc.py new file mode 100644 index 00000000..e74d2436 --- /dev/null +++ b/pgweb/util/misc.py @@ -0,0 +1,10 @@ +def prettySize(size): + if size < 1024: + return "%s bytes" % size + suffixes = [("bytes",2**10), ("KB",2**20), ("MB",2**30), ("GB",2**40), ("TB",2**50)] + for suf, lim in suffixes: + if size > lim: + continue + else: + return "%s %s" % (round(size/float(lim/2**10),2).__str__(),suf) + diff --git a/templates/account/index.html b/templates/account/index.html new file mode 100644 index 00000000..3515878e --- /dev/null +++ b/templates/account/index.html @@ -0,0 +1,30 @@ +{%extends "base/page.html"%} +{%block contents%} +

    Your account

    +

    +This page contains information about your postgresql.org account. +

    + +

    Submitted data

    +

    +Submitted data should be moved to a subpage! +

    + +

    News articles

    +
      +{%for article in newsarticles%} +
    • {{article}}
    • +{%endfor%} +
    +Submit news + +

    Events

    +
      +{%for event in events%} +
    • {{event}}
    • +{%endfor%} +
    +Submit event + +{%endblock%} + diff --git a/templates/base/base.html b/templates/base/base.html new file mode 100644 index 00000000..c4d524e6 --- /dev/null +++ b/templates/base/base.html @@ -0,0 +1,53 @@ + + + + PostgreSQL: {%block title%}{%endblock%} + + + + + + + + +
    +
    +
    +
    +
    + PostgreSQL +
    +
    + The world's most advanced open source database. +
    +
    + + +
    +
    +{%block layoutblock%}{%endblock%} +
    +
    +
    + Privacy Policy | + About the website
    + Copyright © 1996-2009 PostgreSQL Global Development Group +
    +
    +
    + + diff --git a/templates/base/form.html b/templates/base/form.html new file mode 100644 index 00000000..5316bad1 --- /dev/null +++ b/templates/base/form.html @@ -0,0 +1,11 @@ +{%extends "base/page.html"%} +{%block contents%} +

    Edit {{formitemtype}}

    +
    + +{{form.as_table}} +
    + +
    +{%endblock%} + diff --git a/templates/base/page.html b/templates/base/page.html new file mode 100644 index 00000000..b8021a50 --- /dev/null +++ b/templates/base/page.html @@ -0,0 +1,27 @@ +{%extends "base/base.html" %} +{%block layoutblock%} +
    +
    +
      + {%for m in navmenu%} + {%if not forloop.first %}{%endif%} + {{m.title}} + {%if m.submenu %} + + {%endif%} + {%if forloop.last%} + + {%endif%} + {%endfor%} +
    +
    +
    +
    +{%block contents%}{%endblock%} +
    +{%endblock%} + diff --git a/templates/contributors/list.html b/templates/contributors/list.html new file mode 100644 index 00000000..0ffbb3ee --- /dev/null +++ b/templates/contributors/list.html @@ -0,0 +1,49 @@ +{%extends "base/page.html"%} +{%load pgfilters%} +{%block title%}Contributor Profiles{%endblock%} +{%block contents%} +

    Contributor Profiles

    +

    These are the fine people that make PostgreSQL what it is today!

    + + +{%for t in contributortypes%} +

    {{t.typename}}

    +{%if t.extrainfo%}

    {{t.extrainfo}}

    {%endif%} +
    + + {%if t.detailed%} + + + + + {%endif%} + {%for c in t.contributor_set.all %} + {%if t.detailed%} + + + + + {%else%} + {%if forloop.counter0|divisibleby:"2" %} + + + {%if forloop.last%} + + + {%endif%} + {%else%} + + {%endif%} + {%endif%} + {%endfor%} +
    ContributorContribution
    {{c.firstname}} {{c.lastname}} ({{c.email|hidemail}}) + {%if c.company %}
    {{c.company}}{%endif%} +
    {{c.location}}
    {{c.contribution}}
    {{c.firstname}} {{c.lastname}}{%if c.email%} ({{c.email|hidemail}}){%endif%}
    {{c.firstname}} {{c.lastname}}{%if c.email%} ({{c.email|hidemail}}){%endif%} +
    +
    +{%endfor%} + +

    All contributors are listed in alphabetical order. +Please report omissions or corrections to the webmaster.

    +{%endblock%} + diff --git a/templates/core/version_rss_description.html b/templates/core/version_rss_description.html new file mode 100644 index 00000000..81818c2f --- /dev/null +++ b/templates/core/version_rss_description.html @@ -0,0 +1 @@ +{{obj.tree}}.{{obj.latestminor}} is the latest release in the {{obj.tree}} series. diff --git a/templates/core/version_rss_title.html b/templates/core/version_rss_title.html new file mode 100644 index 00000000..d1d58aa1 --- /dev/null +++ b/templates/core/version_rss_title.html @@ -0,0 +1 @@ +{{obj.tree}}.{{obj.latestminor}} diff --git a/templates/docs/docspage.html b/templates/docs/docspage.html new file mode 100644 index 00000000..a73bef36 --- /dev/null +++ b/templates/docs/docspage.html @@ -0,0 +1,48 @@ + + + + PostgreSQL: Documentation: Manuals: {{title}} + + + + + + + +
    + +
    + +
    +
    +
    +
    +
    +
    + + +
    +
    +
    Text Size: Normal / Large
    +
    + +
    + +
    +{{page_content|safe}} +{comments} +
    + +
    + Privacy Policy | FIXME
    +Copyright © 1996-2009 PostgreSQL Global Development Group +
    +
    +
    + + diff --git a/templates/downloads/ftpbrowser.html b/templates/downloads/ftpbrowser.html new file mode 100644 index 00000000..13af9759 --- /dev/null +++ b/templates/downloads/ftpbrowser.html @@ -0,0 +1,47 @@ +{%extends "base/page.html"%} +{%block title%}File Browser{%endblock%} +{%block contents%} +

    File Browser

    +

    Top{%for b in breadcrumbs%} → {{b.name}}{%endfor%}

    + +{%if directories%} +

    Directories

    +
    + +{%for dir in directories%} + +{%endfor%} +
    {{dir.link}} {{dir.link}}
    +
    +{%endif%} + +{%if files%} +

    Files

    +
    + +{%for file in files%} + +{%endfor%} +
    {{file.name}} {{file.name}}{{file.mtime}}{{file.size|filesizeformat}}
    +
    +{%endif%} + + +{%if maintainer%} +

    Current Maintainer

    +
    {{maintainer}}
    +{%endif%} + + +{%if readme%} +

    README File

    +
    {{readme}}
    +{%endif%} + +{%if messagefile%} +

    MESSAGE File

    +
    {{messagefile}}
    +{%endif%} + +{%endblock%} + diff --git a/templates/events/archive.html b/templates/events/archive.html new file mode 100644 index 00000000..286c526c --- /dev/null +++ b/templates/events/archive.html @@ -0,0 +1,11 @@ +{%extends "base/page.html"%} +{%block title%}Event archive{%endblock%} +{%block contents%} +

    Event archive

    +{%for obj in events %} +

    {{obj.title}}

    +{%include "events/inc_event.html"%} +{%endfor%} +

    Submit event

    +{%endblock%} + diff --git a/templates/events/inc_event.html b/templates/events/inc_event.html new file mode 100644 index 00000000..3784a961 --- /dev/null +++ b/templates/events/inc_event.html @@ -0,0 +1,6 @@ +{%load markup%} +
    Posted on {{obj.date}}
    +

    +{{obj.content|markdown:"safe"}} +

    + diff --git a/templates/events/item.html b/templates/events/item.html new file mode 100644 index 00000000..8e3edb19 --- /dev/null +++ b/templates/events/item.html @@ -0,0 +1,6 @@ +{%extends "base/page.html"%} +{%block contents%} +

    {{obj.title}}

    +{%include "events/inc_event.html"%} +{%endblock%} + diff --git a/templates/events/rss_description.html b/templates/events/rss_description.html new file mode 100644 index 00000000..9d79bd83 --- /dev/null +++ b/templates/events/rss_description.html @@ -0,0 +1,3 @@ +{%load markup%} +{{obj.summary|markdown:"safe"}} + diff --git a/templates/events/rss_title.html b/templates/events/rss_title.html new file mode 100644 index 00000000..d992ff6e --- /dev/null +++ b/templates/events/rss_title.html @@ -0,0 +1 @@ +{{obj.title}} diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 00000000..72b336e6 --- /dev/null +++ b/templates/index.html @@ -0,0 +1,179 @@ +{%extends "base/base.html" %} +{%block title%}Welcome{%endblock%} +{%block layoutblock%} +
    +
    +
    +
    +

    + PostgreSQL 8.4 Release Now Available +

    +

    + After more than a year of development work, the next version of PostgreSQL, the world's most advanced + Open Source database is now available for download. +

    + +
    +
    +
    +
    +
    +
    +

    Featured User

    +
    +
    {{quote.quote}}
    +
    {{quote.who}}, {{quote.org}}
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    Latest Releases

    +
    + {%for v in versions %} + {{v.tree}}.{{v.latestminor}} · {{v.reldate}} · Notes +
    + {%endfor%} +
    + +
    +
    +

    Shortcuts

    +
    + +
    +
    +
    +

    Support Us

    +
    +
    + PostgreSQL is free. Please support our work by making a donation. +
    +
    +
    +
    +
    +
    + + Latest News + +
    + {% for n in news %} +

    + {{n.date}}
    + {{n.title}} +

    + {% endfor %} +
    + + +
    +
    +
    +
    + + Planet PostgreSQL + +
    + +

    + {date}
    + {title} +

    + +
    + +
      +
    • + More +
    • +
    • + PlanetPostgreSQL RSS Feed +
    • +
    +
    +
    +
    +
    + + Upcoming Events + +
    + {% for e in events %} +

    + {{e.displaydate|safe}}
    + {{e.title}}
    ({{e.locationstring}}) +

    + {% endfor %} +
    + + Upcoming training + +
    +
    + Include Dave's magic training blurb here later! + +
    +
    + + +
    +
    +
    +
    +{%endblock%} + diff --git a/templates/lists/root.html b/templates/lists/root.html new file mode 100644 index 00000000..69b61afa --- /dev/null +++ b/templates/lists/root.html @@ -0,0 +1,52 @@ +{%extends "base/page.html"%} +{%block title%}Mailing Lists{%endblock%} +{%block contents%} + +

    Mailing Lists

    + +

    The following is a list of PostgreSQL related mailing lists.

    + +

    How to Subscribe or Unsubscribe

    + +

    Fill out this form.

    + + +

    Please do not subscribe to mailing lists using e-mail accounts protected by +mail-back anti-spam systems. These are extremely annoying to the list +maintainers and other members, and you may be automatically unsubscribed. +

    + +

    Archives

    + +

    Before posting to a list, you may wish to search the archives.

    + +

    The mailing lists are also available at the PostgreSQL news server. +However, in order to post to a list, you must still subscribe to that list (but it is possible to subscribe without +receiving mail).

    + +{% for l in lists %} +{%ifchanged l.group %} +{%if not forloop.first %} + + + +{%endif%} +

    {{l.group.name}}

    +
    + + + + + + +{%endifchanged%} + + + + +{%endfor%} +
    ListDescription
    {{l.maybe_shortdesc}}{{l.description}}
    +
    + +{%endblock%} + diff --git a/templates/news/inc_newsitem.html b/templates/news/inc_newsitem.html new file mode 100644 index 00000000..991a138b --- /dev/null +++ b/templates/news/inc_newsitem.html @@ -0,0 +1,6 @@ +{%load markup%} +
    Posted on {{obj.date}}
    +

    +{{obj.content|markdown:"safe"}} +

    + diff --git a/templates/news/item.html b/templates/news/item.html new file mode 100644 index 00000000..25f56f49 --- /dev/null +++ b/templates/news/item.html @@ -0,0 +1,6 @@ +{%extends "base/page.html"%} +{%block contents%} +

    {{obj.title}}

    +{%include "news/inc_newsitem.html"%} +{%endblock%} + diff --git a/templates/news/newsarchive.html b/templates/news/newsarchive.html new file mode 100644 index 00000000..2ca01c27 --- /dev/null +++ b/templates/news/newsarchive.html @@ -0,0 +1,11 @@ +{%extends "base/page.html"%} +{%block title%}News archive{%endblock%} +{%block contents%} +

    News archive

    +{%for obj in news %} +

    {{obj.title}}

    +{%include "news/inc_newsitem.html"%} +{%endfor%} +

    Submit news

    +{%endblock%} + diff --git a/templates/news/rss_description.html b/templates/news/rss_description.html new file mode 100644 index 00000000..d2662c17 --- /dev/null +++ b/templates/news/rss_description.html @@ -0,0 +1,3 @@ +{%load markup%} +{{obj.content|markdown:"safe"}} + diff --git a/templates/news/rss_title.html b/templates/news/rss_title.html new file mode 100644 index 00000000..d992ff6e --- /dev/null +++ b/templates/news/rss_title.html @@ -0,0 +1 @@ +{{obj.title}} diff --git a/templates/pages/about.html b/templates/pages/about.html new file mode 100644 index 00000000..9f820016 --- /dev/null +++ b/templates/pages/about.html @@ -0,0 +1,105 @@ +{%extends "base/page.html"%} +{%block title%}About{%endblock%} +{%block contents%} +

    About

    + +

    PostgreSQL is a powerful, open source object-relational database system. It has +more than 15 years of active development and a proven architecture that has +earned it a strong reputation for reliability, data integrity, and +correctness. It runs on all major operating systems, including Linux, UNIX (AIX, +BSD, HP-UX, SGI IRIX, Mac OS X, Solaris, Tru64), and Windows. It is +fully ACID compliant, has full support for foreign keys, joins, views, triggers, +and stored procedures (in multiple languages). It includes most SQL92 and SQL99 +data types, including INTEGER, NUMERIC, BOOLEAN, CHAR, VARCHAR, DATE, INTERVAL, +and TIMESTAMP. It also supports storage of binary large objects, including pictures, +sounds, or video. It has native programming interfaces for C/C++, Java, .Net, Perl, +Python, Ruby, Tcl, ODBC, among others, and exceptional documentation. +

    An enterprise class database, PostgreSQL boasts sophisticated features +such as Multi-Version Concurrency Control (MVCC), point in time recovery, +tablespaces, asynchronous replication, nested transactions (savepoints), +online/hot backups, a sophisticated query planner/optimizer, and write ahead logging +for fault tolerance. It supports international character sets, multibyte +character encodings, Unicode, and it is locale-aware for sorting, +case-sensitivity, and formatting. It is highly scalable both in the sheer quantity +of data it can manage and in the number of concurrent users it can +accommodate. There are active PostgreSQL systems in production environments that +manage in excess of 4 terabytes of data. Some general PostgreSQL limits are +included in the table below.

    LimitValue
    Maximum Database SizeUnlimited
    Maximum Table Size32 TB
    Maximum Row Size1.6 TB
    Maximum Field Size1 GB
    Maximum Rows per TableUnlimited
    Maximum Columns per Table250 - 1600 depending on column types
    Maximum Indexes per TableUnlimited
    +

    PostgreSQL has won praise from its users and industry recognition, including the Linux New Media Award for Best Database System and five time winner of the The Linux Journal Editors' Choice Award for best DBMS. + +

    +

    Featureful and Standards Compliant

    PostgreSQL prides itself in standards compliance. Its SQL implementation +strongly conforms to the ANSI-SQL 92/99 standards. It has full support for +subqueries (including subselects in the FROM clause), read-committed and +serializable transaction isolation levels. And while PostgreSQL has a fully +relational system catalog which itself supports multiple schemas per database, +its catalog is also accessible through the Information Schema as defined in the +SQL standard. +

    Data integrity features include (compound) primary keys, foreign keys with +restricting and cascading updates/deletes, check constraints, unique +constraints, and not null constraints.

    +

    It also has a host of extensions and advanced features. Among the +conveniences are auto-increment columns through sequences, and +LIMIT/OFFSET allowing the return of partial result +sets. PostgreSQL supports compound, unique, partial, and functional indexes +which can use any of its B-tree, R-tree, hash, or GiST storage methods.

    GiST +(Generalized Search Tree) indexing is an advanced system +which brings together a wide array of different sorting and searching algorithms +including B-tree, B+-tree, R-tree, partial sum trees, ranked B+-trees and many +others. It also provides an interface which allows both the creation of custom +data types as well as extensible query methods with which to search them. Thus, +GiST offers the flexibility to specify what you store, +how you store it, and the ability to define new +ways to search through it --- ways that far exceed those offered by +standard B-tree, R-tree and other generalized search algorithms.

    GiST serves as a foundation for many public projects that use PostgreSQL +such as OpenFTS and PostGIS. OpenFTS (Open Source Full +Text Search engine) provides online indexing of data and relevance ranking for +database searching. PostGIS is a project which adds support for geographic +objects in PostgreSQL, allowing it to be used as a spatial database for +geographic information systems (GIS), much like ESRI's SDE or Oracle's Spatial +extension. + +

    Other advanced features include table inheritance, a rules systems, and +database events. Table inheritance puts an object oriented slant on table +creation, allowing database designers to derive new tables +from other tables, treating them as base classes. Even better, PostgreSQL +supports both single and multiple inheritance in this manner.

    The rules system, also called the query rewrite +system, allows the database designer to create rules which identify +specific operations for a given table or view, and dynamically transform them +into alternate operations when they are processed.

    The events system is an interprocess communication system in which +messages and events can be transmitted between clients using the +LISTEN and NOTIFY commands, allowing both +simple peer to peer communication and advanced coordination on database +events. Since notifications can be issued from triggers and stored procedures, +PostgreSQL clients can monitor database events such as table updates, inserts, +or deletes as they happen. +

    +

    Highly Customizable

    +

    PostgreSQL runs stored procedures in more than a dozen programming languages, including Java, Perl, Python, Ruby, Tcl, C/C++, +and its own PL/pgSQL, which is similar to Oracle's PL/SQL. Included with its +standard function library are hundreds of built-in functions that range from +basic math and string operations to cryptography and Oracle +compatibility. Triggers and stored procedures can be written in C and loaded +into the database as a library, allowing great flexibility in extending its +capabilities. Similarly, PostgreSQL includes a framework that allows developers +to define and create their own custom data types along with supporting functions +and operators that define their behavior. As a result, a host of advanced data +types have been created that range from geometric and spatial primitives to +network addresses to even ISBN/ISSN (International Standard Book +Number/International Standard Serial Number) data types, all of which can be +optionally added to the system. +

    Just as there are many procedure languages supported by PostgreSQL, there +are also many library interfaces as well, allowing various languages both +compiled and interpreted to interface with PostgreSQL. There are interfaces for +Java (JDBC), ODBC, Perl, Python, Ruby, C, C++, PHP, Lisp, Scheme, and Qt just to +name a few. +

    Best of all, PostgreSQL's source code is available under the most liberal +open source license: the BSD license. This license gives you the freedom to use, +modify and distribute PostgreSQL in any form you like, open or closed +source. Any modifications, enhancements, or changes you make are yours to do +with as you please. As such, PostgreSQL is not only a powerful database system +capable of running the enterprise, it is a development platform upon which to +develop in-house, web, or commercial software products that require a capable +RDBMS. +

    +{%endblock%} diff --git a/templates/pages/about/advantages.html b/templates/pages/about/advantages.html new file mode 100644 index 00000000..30d32a67 --- /dev/null +++ b/templates/pages/about/advantages.html @@ -0,0 +1,77 @@ +{%extends "base/page.html"%} +{%block title %}Advantages{%endblock%} +{%block contents%} +

    Advantages

    +

    PostgreSQL offers many advantages for your company or business over other database systems.

    + + +

    Immunity to over-deployment

    +

    Over-deployment is what some proprietary database vendors regard as their #1 licence compliance problem.  With PostgreSQL, no-one can sue you for breaking licensing agreements, as there is no associated licensing cost for the software.

    +

    This has several additional advantages:

    +
      +
    • More profitable business models with wide-scale deployment.
    • +
    • No possibility of being audited for license compliance at any stage.
    • +
    • Flexibility to do concept research and trial deployments without needing to include additional licensing costs.
    • +
    + + +

    Better support than the proprietary vendors

    +

    In addition to our strong support offerings, we have a vibrant community of PostgreSQL professionals and enthusiasts that your staff can draw upon and contribute to.

    + + +

    Significant saving on staffing costs

    +

    Our software has been designed and created to have much lower maintenance and tuning requirements than the leading proprietary databases, yet still retain all of the features, stability, and performance.

    +

    In addition to this, our training programs are generally regarded as being far more cost effective, manageable, and practical in the real world than that of the leading proprietary database vendors.

    + + +

    Legendary reliability and stability

    +

    Unlike many proprietary databases, it is extremely common for companies to report that PostgreSQL has never, ever crashed for them in several years of high activity operation.  Not even once.  It just works.

    + + +

    Extensible

    +

    The source code is available to all at no charge.  If your staff have a need to customise or extend PostgreSQL in any way then they are able to do so with a minimum of effort, and with no attached costs.  This is complemented by the community of PostgreSQL professionals and enthusiasts around the globe that also actively extend PostgreSQL on a daily basis.

    + + +

    Cross platform

    +

    PostgreSQL is available for almost every brand of Unix (34 platforms with the latest stable release), and Windows compatibility is available via the Cygwin framework. Native Windows compatibility is also available with version 8.0 and above.

    + + +

    Designed for high volume environments

    +

    We use a multiple row data storage strategy called MVCC to make PostgreSQL extremely responsive in high volume environments.  The leading proprietary database vendor uses this technology as well, for the same reasons.

    + + +

    GUI database design and administration tools

    +

    There are many high-quality GUI Tools available for PostgreSQL from both open source developers and commercial providers. A list is available on our wiki as a community guide to PostgreSQL GUI Tools. + + +

    Technical Features

    +
      +
    • Fully ACID compliant.
    • +
    • ANSI SQL compliant.
    • +
    • Referential Integrity.
    • +
    • Replication (non-commercial and commercial solutions) allowing the duplication of the master database to multiple slave machines.
    • +
    • Native interfaces for ODBC, JDBC, .Net, C, C++, PHP, Perl, TCL, ECPG, Python, and Ruby.
    • +
    • Rules.
    • +
    • Views.
    • +
    • Triggers.
    • +
    • Unicode.
    • +
    • Sequences.
    • +
    • Inheritance.
    • +
    • Outer Joins.
    • +
    • Sub-selects.
    • +
    • An open API.
    • +
    • Stored Procedures.
    • +
    • Native SSL support.
    • +
    • Procedural languages.
    • +
    • Hot stand-by (commercial solutions).
    • +
    • Better than row-level locking.
    • +
    • Functional and Partial indexes.
    • +
    • Native Kerberos authentication.
    • +
    • Support for UNION, UNION ALL and EXCEPT queries.
    • +
    • Loadable extensions offering SHA1, MD5, XML, and other functionality.
    • +
    • Tools for generating portable SQL to share with other SQL-compliant systems.
    • +
    • Extensible data type system providing for custom, user-defined datatypes and rapid development of new datatypes.
    • +
    • Cross-database compatibility functions for easing the transition from other, less SQL-compliant RDBMS.
    • +
    +{%endblock%} + diff --git a/templates/pages/about/awards.html b/templates/pages/about/awards.html new file mode 100644 index 00000000..f30371ba --- /dev/null +++ b/templates/pages/about/awards.html @@ -0,0 +1,126 @@ +{%extends "base/page.html"%} +{%block title%}Awards{%endblock%} +{%block contents%} +

    Awards

    +

    PostgreSQL, Award Winning Software

    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + 2008 Developer.com Product of the Year, Database Tool +
    +
    + "And the winner is PostgreSQL. This one surprised us and taught us something about our audience base. We need to do a better job of covering this topic! Postgresql.org touts this product as "The world's most advanced open source database" and after seeing the votes, they may just be correct." +
    +

    + 2006 Linux Journal Editors' Choice Awards for Best Database +
    +
    + "It handles everything we throw at it and just keeps working, flawlessly. It's almost invisible from an administrative perspective. It handles huge quantities of data, and it has all of the goodies that we expect in a relational database (such as referential integrity, column-level constraints and checks, server-side functions, subselects and unions). The original 8.1 release, which came out in November 2005, included a number of new features, such as two-phase commits. We can't recommend PostgreSQL highly enough." +
    +

    + 2005 Linux Journal Editors' Choice Awards for Best Database +
    +
    + "More and more organizations are working with high-end database systems but can't afford, or don't want, a full-time database administrator. PostgreSQL complies with SQL standards but needs less babysitting than complicated legacy databases. Ludovic calls it, "easy to install, configure and relatively easy to tune for performance." In our June 2005 issue, he covered Slony-I, which adds replication to PostgreSQL, giving you multisite redundancy, increased performance or both. Reuven points out that PostgreSQL has programmer-friendly features, which for 8.0, include server-side scripting in Perl." +
    +

    + 2004 ArsTechnica Best Server Application Award +
    +
    + "It's rare for any kind of sizable organization to not use a database for anything, and to that end, PostgreSQL provides a very reliable solution for Linux users. Sporting many advanced features missing from other available database packages, PostgreSQL is a perennial favorite for many of our developers. " +
    + +

    + 2004 Linux Journal Editors' Choice Awards for Best Database +
    +
    + "I strongly recommend PostgreSQL to anyone who needs a relational database." +
    + +

    + 2004 Linux New Media Award For Best Database +
    +
    + "The PostgreSQL team has demonstrated that it is possible to produce a database with the price and ease of administration of MySQL, but with the feature set of Oracle. " +
    + +

    + 2003 Linux Journal Editors' Choice Awards for Best Database +
    +
    +
    + +

    + 2002 Linux New Media Editors Choice Award for Best Database +
    +
    +
    + +

    + 2000 Linux Journal Editors' Choice Awards for Best Database +
    +
    + "For ``big-database'' features and the configurability and administration advantages of open source, we give PostgreSQL a big thumbs-up." +
    + +

    + 1999 LinuxWorld Editor's Choice Award for Best Database +
    +
    +
    + +
    + + +{%endblock%} diff --git a/templates/pages/about/casestudies.html b/templates/pages/about/casestudies.html new file mode 100644 index 00000000..2189d2f7 --- /dev/null +++ b/templates/pages/about/casestudies.html @@ -0,0 +1,21 @@ +{%extends "base/page.html"%} +{%block title%}Case Studies{%endblock%} +{%block contents%} +

    Case Studies

    +

    How does PostgreSQL make a difference for businesses?

    +

    These case studies are just some of the success stories from companies around the world. Each study highlights one or more important aspects of how PostgreSQL solved specific business needs, lowered cost of ownership, and reduced deployment time for a complex data management infrastructure.

    +

    Organizations Using PostgreSQL

    +BASF (PDF format)
    +Mohawk Software
    +Proximity (PDF format)
    +Radio Paradise (PDF format)
    +Shannon Medical Center
    +Spiros Louis Stadium (PDF format)
    +The Dravis Group OSS Report (PDF format)
    +Travelpost (PDF format)
    +Valhalla (PDF format)
    +Vanten Inc.
    +
    +
    +Share Your Story
    +{%endblock%} diff --git a/templates/pages/about/donate.html b/templates/pages/about/donate.html new file mode 100644 index 00000000..290cc899 --- /dev/null +++ b/templates/pages/about/donate.html @@ -0,0 +1,33 @@ +{%extends "base/page.html"%} +{%block title%}Donate{%endblock%} +{%block contents%} + +

    Donate

    + +

    General PostgreSQL efforts

    +

    PostgreSQL is an affiliated project of Software in the Public Interest. Funds donated to PostgreSQL are used +to sponsor general PostgreSQL efforts. These funds are managed by the Fund raising group. Donate to +PostgreSQL. +

    + +

    PostgreSQL Europe (PgEU)

    +

    PostgreSQL Europe is a European region non profit focusing on the support of other PostgreSQL groups in Europe. +You may also use this link to donate to specific European groups such as those in Germany or the +United Kingdom. Donate to PostgreSQL Europe.

    + +

    PostgreSQL United States (PgUS)

    +

    PostgreSQL United States is a non profit for PostgreSQL in the United States. +It focuses on Education, User Groups, and Advocacy. Donate to PostgreSQL United States.

    + +

    Tax deductibility

    +

    Please be aware that PostgreSQL contributions may or may not be tax exempt. For more information please +refer to the party you are donating to and your tax professsional.

    + +

    Questions

    +

    If you have any questions about donations please contact either the +PostgreSQL fund raising contact or the +respective organization your are donating to. +

    + + +{%endblock%} diff --git a/templates/pages/about/history.html b/templates/pages/about/history.html new file mode 100644 index 00000000..3bbd45c1 --- /dev/null +++ b/templates/pages/about/history.html @@ -0,0 +1,87 @@ +{%extends "base/page.html"%} +{%block title%}History{%endblock%} +{%block contents%} +

    History

    +

    Given its powerful and advanced features, you may wonder how such a +valuable piece of software came to be both free and open source.  As with +many other key open source projects, the answer starts at the University of +California at Berkeley (UCB).

    +

    PostgreSQL, originally called Postgres, was created at +UCB by a computer science professor named Michael Stonebraker, +who went on to become the CTO of Informix Corporation. Stonebraker +started Postgres in 1986 as a followup project to its predecessor, Ingres, now +owned by Computer Associates. The name Postgres thus plays off of its predecessor (as +in "after Ingres"). Ingres, developed from 1977 to 1985, had been an exercise in +creating a database system according to classic RDBMS theory. Postgres, +developed between 1986-1994, was a project meant to break new ground in database +concepts such as exploration of "object relational" technologies.

    +

    Stonebraker and his graduate students actively developed Postgres for +eight years. During that time, Postgres introduced rules, procedures, time +travel, extensible types with indices and object-relational concepts. Postgres +was later commercialized to become Illustra which was later bought by Informix +and integrated into its Universal Server. Informix was purchased by IBM in 2001 +for one billion +dollars.

    +

    In 1995, two Ph.D. students from Stonebraker's lab, Andrew Yu and Jolly +Chen, replaced Postgres' POSTQUEL query language with an extended subset of +SQL. They renamed the system to Postgres95.

    +

    In 1996, Postgres95 departed from academia and started a new life in the +open source world when a group of dedicated developers outside of Berkeley saw +the promise of the system, and devoted themselves to its continued +development. Contributing enormous amounts of time, skill, labor, and technical +expertise, this global development group radically transformed Postgres. Over +the next eight years, they brought consistency and uniformity to the code base, +created detailed regression tests for quality assurance, set up mailing lists +for bug reports, fixed innumerable bugs, added incredible new features, and +rounded out the system by filling various gaps such as documentation for +developers and users.

    +

    The fruition of their labor was a new database that garnered a +reputation for rock solid stability. With the start of its new life in the open +source world, with many new features and enhancements, the database system took +its current name: PostgreSQL. ("Postgres" is still used as an easy-to-pronounce +nick-name.)

    +

    PostgreSQL began at version 6.0, giving credit to its many years of prior +development. With the help of hundreds of developers from around the world, +the system was changed and improved in almost every area. Over the next four years +(versions 6.0 - 7.0), major improvements and new features were made such as: +

    +
    • Multiversion Concurrency Control (MVCC). + Table-level locking was replaced with a sophisticated multiversion concurrency + control system, which allows readers to continue reading consistent data + during writer activity and enables online (hot) backups while the database is + running.

    • Important SQL features. Many SQL enhancements + were made including subselects, defaults, constraints, primary keys, foreign + keys, quoted identifiers, literal string type coercion, type casting, and + binary and hexadecimal integer input among others.

    • Improved built-in types. New native types + were added including a wide-range of date/time types and additional geometric + types.

    • Speed. Major speed and performance increases + in the order of 20-40% we made, and backend start-up time was decreased by + 80%.

    + +

    The four years following (versions 7.0 to 7.4) brought the Write-Ahead Log +(WAL), SQL schemas, prepared queries, outer joins, complex queries, SQL92 join +syntax, TOAST, IPv6 support, SQL-standard information schema, full-text +indexing, auto-vacuum, Perl/Python/TCL procedural languages, improved SSL +support, an optimizer overhaul, database statistics information, added security, +table functions, and logging enhancements and significant speed improvements, among +other things. A small measure of PostgreSQL's intensive development is reflected +in its release notes. +

    Today, PostgreSQL's user base is larger than ever and includes a sizeable +group of large corporations who use it in demanding environments. Some of these +companies such as Afilias and Fujitsu have made significant +contributions to PostgreSQL's development. And, true to its roots, it +continues to improve in both sophistication and performance, now more than +ever. Version 8.0 is PostgreSQL's long awaited debut into the enterprise +database market, bringing features such as tablespaces, Java stored procedures, +point in time recovery, and nested transactions (savepoints). +With it came a long awaited feature --- a native Windows port.

    +

    +Many organizations, government agencies and companies use PostgreSQL. +You will find installations in ADP, CISCO, NTT Data, NOAA, Research In +Motion, The US Forestry Service and The American Chemical Society. +Today, it's rare to find a large corporation or government agency which +isn't using PostgreSQL in at least one department. +

    If there were ever a time for you to seriously consider using PostgreSQL +to power your application or business, it would be now. +

    +{%endblock%} diff --git a/templates/pages/about/licence.html b/templates/pages/about/licence.html new file mode 100644 index 00000000..be2f3431 --- /dev/null +++ b/templates/pages/about/licence.html @@ -0,0 +1,33 @@ +{%extends "base/page.html"%} +{%block title%}License{%endblock%} +{%block contents%} +

    License

    +

    PostgreSQL is released under the BSD license.

    +

    PostgreSQL Database Management System
    +(formerly known as Postgres, then as Postgres95)

    + +Portions Copyright (c) 1996-2009, The PostgreSQL Global Development Group

    + +Portions Copyright (c) 1994, The Regents of the University of California

    + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose, without fee, and without a written agreement +is hereby granted, provided that the above copyright notice and this +paragraph and the following two paragraphs appear in all copies.

    + +IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING +LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS +DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE.

    + +THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
    +

    +

    Why not the GNU General Public License?

    +

    People often ask why PostgreSQL is not released under the GNU General Public License. The simple answer is because we like the BSD license and do not want to change it. If you are keen to read more about this topic, then please take a look in the Archives at any of the many threads on this subject, but please don't start yet another debate on the subject! +

    +{%endblock%} diff --git a/templates/pages/about/press.html b/templates/pages/about/press.html new file mode 100644 index 00000000..668b576b --- /dev/null +++ b/templates/pages/about/press.html @@ -0,0 +1,32 @@ +{%extends "base/page.html"%} +{%block title%}Press{%endblock%} +{%block contents%} + +

    Press

    + +

    For press enquiries, please see the Press Contacts.

    + +

    PostgreSQL 8.4 Press Information

    + + + +

    Press Kit in Other Languages

    + + + +{%endblock%} diff --git a/templates/pages/about/users.html b/templates/pages/about/users.html new file mode 100644 index 00000000..5a178397 --- /dev/null +++ b/templates/pages/about/users.html @@ -0,0 +1,135 @@ +{%extends "base/page.html"%} +{%block title%}PostgreSQL Featured Users{%endblock%} +{%block contents%} + +

    Featured Users

    +

    Here are a few of the hundreds of companies who have built products, solutions, web sites and tools using the world's most advanced open source database system. If you work for a major corporation or organization and you would like to be included in this list, please drop us a line.

    + + +

    BioPharm

    +
      +
    • Affymetrix
    • +
    • American Chemical Society
    • +
    • BASF, Agricultural Product Division (case study)
    • +
    • Institut de Biologie et Chimie des Protéines (article)
    • +
    • Genentech, Inc. (presentation)
    • +
    +

    e-Commerce

    +
      +
    • CD Baby (article)
    • +
    • Champion Products
    • +
    • Endpoint Corporation
    • +
    • Etsy.com
    • +
    • Freeportway
    • +
    • FlightAware (podcast)
    • +
    • FlightStats
    • +
    • RedSherriff (article)
    • +
    • Whitepages.com
    • +
    +

    Education

    +
      +
    • .LRN Project
    • +
    • Cognivity
    • +
    • Moscow State University, Moscow, Russia
    • +
    • Sternberg Astronomical Institute, Russia
    • +
    • Texas Cooperative Extension
    • +
    • University of Alabama, Birmingham (documentation)
    • +
    • University of California, Berkeley
    • +
    • University of New South Wales
    • +
    • University of Oslo, Norway
    • +
    • University of Sydney
    • +
    • University of Western Sydney
    • +
    • Charles University in Prague, Czech Republic
    • +
    • Université Saint-Joseph (USJ) in Lebanon
    • +
    +

    Finance

    +
      +
    • Journyx Timesheets
    • +
    • Logictree Systems
    • +
    • Trust-Commerce
    • +
    +

    Gaming

    +
      +
    • Perpetual Entertainment, Inc.
    • +
    • MobyGames
    • +
    +

    Government

    +
      +
    • City of Garden Grove, California (quote)
    • +
    • National Physical Laboratory of India
    • +
    • The National Weather Service
    • +
    • Registre Francais des Emissions Polluantes
    • +
    • United Nations Children's Fund
    • +
    • United Nations Industrial Development Organisation
    • +
    • U.S. Agency for International Development
    • +
    • U.S. Centers For Disease Control and Prevention
    • +
    • U.S. Department of Labor
    • +
    • U.S. General Services Administration
    • +
    • U.S. State Department
    • +
    +

    Healthcare

    + +

    Manufacturing

    + +

    Media

    +
      +
    • Chicagocrime.org
    • +
    • Creative Commons
    • +
    • Greenpeace
    • +
    • IMDB.com, The Internet Movie Database
    • +
    • Macworld
    • +
    • Penny Arcade
    • +
    • the451.com
    • +
    • The Washington Post U.S. Congress Votes Database
    • +
    +

    Open Source Projects

    +
      +
    • Bricolage
    • +
    • Debian
    • +
    • FreshPorts
    • +
    • FLPR (FreeBsd,LightHttpd,PostgreSQL,Ruby)
    • +
    • GForge
    • +
    • LAMP (Linux/Apache/Middleware(Perl,PHP,Python,Ruby)/PostgreSQL)
    • +
    • OpenACS
    • +
    • SourceForge
    • +
    +

    Retail

    +
      +
    • ADP Dealer Services (article)
    • +
    • Courage To Change
    • +
    • Safeway
    • +
    • Tsutaya
    • +
    • The Rockport Company, LLC
    • +
    +

    Technology

    + +

    Telecom

    +
      +
    • Cisco (documentation)
    • +
    • NTT Data
    • +
    • Optus
    • +
    • Rambler Internet Holdings
    • +
    • Skype
    • +
    • Telstra
    • +
    +
    +
    + +These users are listed here as a demonstration of their confidence in using PostgreSQL. This is not a solicitation list or directory. Please do not contact these companies with commercial offers or requests for interviews (contact press@postgresql.org instead). + +{%endblock%} diff --git a/templates/pages/community.html b/templates/pages/community.html new file mode 100644 index 00000000..ed9aa946 --- /dev/null +++ b/templates/pages/community.html @@ -0,0 +1,54 @@ +{%extends "base/page.html"%} +{%block title%}Community{%endblock%} +{%block contents%} +
    +
    +

    Community

    + +

    PostgreSQL is well supported by its active community. Current developments are chronicled in the PostgreSQL Weekly News and there are more than a dozen mailing lists available, categorized into topics like administration, announcements, jobs, performance, and SQL. We also have several PostgreSQL User Groups in the world, and there is also an active IRC community.

    + +

    In addition to the resources available on this site, there are also links to international sites that contain PostgreSQL information in various languages. PostgreSQL community resources are also highlighted in this section of the website.

    +
    +
    + + +
    +
    +
    +
    User Survey
    +
    {survey_question}
    +
    +
    +

    + + + +
    + +

    +

    +
    +
    +
    Results
    +
    +
    +
    + + + +
    +
    +
    +
    Planet PostgreSQL
    +
    +
    More
    +
    +
    +
    + + +{%endblock%} diff --git a/templates/pages/community/international.html b/templates/pages/community/international.html new file mode 100644 index 00000000..bf9eb3af --- /dev/null +++ b/templates/pages/community/international.html @@ -0,0 +1,81 @@ +{%extends "base/page.html"%} +{%block title%}International Sites{%endblock%} +{%block contents%} + +

    International Sites

    + +

    Following are links to international PostgreSQL community websites.

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CommunityDescription
    BrazilianO centro de informações para os usuários brasileiros
    CzechInformace o PostgreSQL v češtině
    Chinese (Simplified)Simplified Chinese PostgreSQL Community
    Chinese (Traditional)Traditional Chinese PostgreSQL Community
    DeutschDie Deutsche PostgreSQL Seite
    Español (Argentina)Comunidad en Español de PostgreSQL (Argentina)
    Español (Perú)Comunidad en Español de PostgreSQL (Perú)
    FrançaisLa communaute Française de PostgreSQL
    GreekThe Greek PostgreSQL Community
    ItalianoAssociazione Italian PostgreSQL Users Group
    ItalianoComunità italiana di PostgreSQL
    JapaneseThe Japanese PostgreSQL Community
    KoreanThe Korean PostgreSQL Community
    PolskaInformacje o PostgreSQL po polsku
    Türkçe/TurkishPostgreSQL Türkiye Web Sayfası
    +
    + +

    If you know of an international PostgreSQL community site that isn't listed on this page, please contact webmaster@postgresql.org.

    +{%endblock%} diff --git a/templates/pages/community/irc.html b/templates/pages/community/irc.html new file mode 100644 index 00000000..666b53b9 --- /dev/null +++ b/templates/pages/community/irc.html @@ -0,0 +1,30 @@ +{%extends "base/page.html"%} +{%block title%}IRC{%endblock%} +{%block contents%} + +

    IRC

    + +

    If you have a problem that you cannot resolve, you might want to try asking a question in our IRC channel +#postgresql on irc.freenode.net. The channel has many active users, +and it is an entry into participating in the wider PostgreSQL community. Don't forget to consult +the documentation about your problem before asking your question.

    + +

    Other PostgreSQL Related Channels

    +

    PostgreSQL Related Projects:

    +
      +
    • pgAdmin - Cross platform graphical administration
    • +
    • PLphp - Procedures and Functions in PHP
    • +
    • PostGIS - Spatial objects for PostgreSQL
    • +
    • Slony - FOSS PostgreSQL replication
    • +
    • postgresql-eu - European PostgreSQL Usergroup
    • +
    +

    Language Specific Channels:

    + +{%endblock%} diff --git a/templates/pages/community/propaganda.html b/templates/pages/community/propaganda.html new file mode 100644 index 00000000..71c7b6a1 --- /dev/null +++ b/templates/pages/community/propaganda.html @@ -0,0 +1,81 @@ +{%extends "base/page.html"%} +{%block title%}Propaganda{%endblock%} +{%block contents%} + +

    Propaganda

    + +

    Template Monster, a graphics and website design company, has provided us with a number of updated PostgreSQL related graphics that you can use on your website. Right click on these images and select "Save As" to save the logo, then link them to the PostgreSQL home page at www.postgresql.org. You can also find more logos for different styles and colors, and the source files for these graphics, on our logo project page at http://pgfoundry.org/projects/graphics/ in case you want to play around with them and maybe submit your own. +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + PostgreSQL logo + PostgreSQL logo + PostgreSQL logo +
    • 32 x 32 pixels
    • Web Icons
    • Elephant Style
    • GIF Format

    + PostgreSQL logo +
    + PostgreSQL logo +
    + PostgreSQL logo +
    • 80 x 15 pixels
    • "PostgreSQL Powered" logo
    • Suitable for any background, usually used on blogs
    • GIF Format

    PostgreSQL logo
    • 88 x 31 pixels
    • "PostgreSQL Powered" logo
    • Text Style
    • GIF Format

    PostgreSQL logo
    • 95 x 51 pixels
    • "PostgreSQL Powered" logo
    • Elephant Style
    • GIF Format

    PostgreSQL logo
    • 95 x 51 pixels
    • "PostgreSQL Powered" logo
    • Turtle Style
    • GIF Format

    PostgreSQL logo
    • 100 x 58 pixels
    • "PostgreSQL Powered" logo
    • Elephant Style
    • GIF Format
    + +
    + + +These works are licensed under a Creative Commons Attribution-ShareAlike 2.5 License. + + + + +{%endblock%} diff --git a/templates/pages/community/resources.html b/templates/pages/community/resources.html new file mode 100644 index 00000000..e1d1a2ab --- /dev/null +++ b/templates/pages/community/resources.html @@ -0,0 +1,18 @@ +{%extends "base/page.html"%} +{%block title%}Resources{%endblock%} +{%block contents%} +

    Resources

    +

    Following are resources that may be of interest to the PostgreSQL community.

    +

    Community Resources

    +
      +
    • Planet PostgreSQL, a site dedicated to aggregating PostgreSQL related blogs.
    • +
    • pgFoundry, our project site, hosting various useful PostgreSQL related projects.
    • +
    • PostgreSQL Wiki, our wiki, hosting user created content and development related information
    • +
    +

    External Resources

    +
      +
    • pg-forum.de, a German PostgreSQL forum.
    • +
    • PGSearch, a fast search engine (powered by PostgreSQL & TSearch2) indexing a number of PostgreSQL and PostgreSQL related websites.
    • +
    +

    Please send appropriate links to webmaster@postgresql.org for possible inclusion on this page.

    +{%endblock%} diff --git a/templates/pages/developer.html b/templates/pages/developer.html new file mode 100644 index 00000000..11234f89 --- /dev/null +++ b/templates/pages/developer.html @@ -0,0 +1,32 @@ +{%extends "base/page.html"%} +{%block title%}Developers{%endblock%} +{%block contents%} +

    Developers

    + +

    Who are we?

    + +

    A PostgreSQL database developer is someone who is actually working on the project, not someone using it to develop +an application or a website. We don't hire programmers, we reach across the Internet, drawing the best database +developers in the world to PostgreSQL. Read about the people behind PostgreSQL and +check out the group picture from the 2006 +PostgreSQL Anniversary Summit. +

    + +

    What will you find here?

    + +

    The information available in this section will mainly interest PostgreSQL developers. Here you'll find the +roadmap with current TODO list, coding and +testing information, mailing lists, and +the developer FAQ. Keep in mind the information available here is not +necessarily available in the release version of PostgreSQL - it may not yet even be in the development version. +

    + + +{%endblock%} diff --git a/templates/pages/developer/alpha.html b/templates/pages/developer/alpha.html new file mode 100644 index 00000000..e66b90f2 --- /dev/null +++ b/templates/pages/developer/alpha.html @@ -0,0 +1,39 @@ +{%extends "base/page.html"%} +{%block title%}Alpha Information{%endblock%} +{%block contents%} +

    Alpha Information

    + +

    +PostgreSQL alpha releases are snapshots of development code. They are +intended to preview and test upcoming features and to provide the +possibility for early feedback. They should not be used in production +installations or active development projects. While the PostgreSQL +code is continuously subject to a number of automated and manual +tests, alpha releases might have serious bugs. Also features may be +changed incompatibly or removed at any time during the development +cycle. +

    +

    +The development cycle of a PostgreSQL major release alternates between +periods of development and periods of integration work, called commit +fests, normally one month each. Alpha releases are planned to be +produced at the end of every commit fest, thus every two months. +Since the first commit fest starts within a month from the beginning +of development altogether, early alpha releases are not indicative of +the likely feature set of the final release. +

    +

    +The current alpha is 8.5Alpha1, which is the first Alpha ever released by the +PostgreSQL Project. As Alpha releases are intended for developers, it is available +in source code form. Binary releases for some platforms may be available later.

    + +

    +Issues you discover while testing the Alpha releases should be reported on the +pgsql-hackers mailing list, +or by using our Bug Report Form. +Please make sure you indicate which alpha you're using. +

    +{%endblock%} diff --git a/templates/pages/developer/beta.html b/templates/pages/developer/beta.html new file mode 100644 index 00000000..c5686ff4 --- /dev/null +++ b/templates/pages/developer/beta.html @@ -0,0 +1,10 @@ +{%extends "base/page.html"%} +{%block title%}Beta Information{%endblock%} +{%block contents%} +

    Beta Information

    + +

    +PostgreSQL 8.4 was released on July 1st. The +development tree for 8.5 is now open. +

    +{%endblock%} diff --git a/templates/pages/developer/coding.html b/templates/pages/developer/coding.html new file mode 100644 index 00000000..d3925025 --- /dev/null +++ b/templates/pages/developer/coding.html @@ -0,0 +1,35 @@ +{%extends "base/page.html"%} +{%block title%}Coding{%endblock%} +{%block contents%} + +

    Coding

    + +

    The following links are useful when exploring the PostgreSQL source code.

    + +

    Code access and information

    + + +

    Documentation

    + + +

    Presentations

    + +{%endblock%} diff --git a/templates/pages/developer/roadmap.html b/templates/pages/developer/roadmap.html new file mode 100644 index 00000000..751f8ff7 --- /dev/null +++ b/templates/pages/developer/roadmap.html @@ -0,0 +1,25 @@ +{%extends "base/page.html"%} +{%block title%}Roadmap{%endblock%} +{%block contents%} + +

    Roadmap

    + +

    PostgreSQL is a non-commercial, all volunteer, free software project, and as +such there is no formal list of feature requirements required for development. +We really do follow the mantra of letting developers scratch their own itches. +

    + +

    The next release of PostgreSQL is planned to be the 8.5 release. A tentative +schedule for this version has a release in the first quarter of 2010.

    + +

    While there are no formal requirements for each PostgreSQL release, there +are several places you can look to find out more information on upcoming +features:

    +
    +
    General development information
    +
    A wiki page about various aspects of the PostgreSQL development process
    +
    Information about the current commit fest
    +
    An overview about the status on patches for the current commitfest
    +
    + +{%endblock%} diff --git a/templates/pages/developer/testing.html b/templates/pages/developer/testing.html new file mode 100644 index 00000000..e46c55f3 --- /dev/null +++ b/templates/pages/developer/testing.html @@ -0,0 +1,31 @@ +{%extends "base/page.html"%} +{%block title%}Testing{%endblock%} +{%block contents%} + +

    Testing

    + +

    The following links are relevant to PostgreSQL testing.

    + +

    Test Builds

    + + +

    QA and Performance

    +

    +We have two performance labs. One is located in Portland Oregon at Command Prompt's facility. The other is located in France at the OpenWide facility. +These facilities are used for a wide range of tasks from DBT-style tests, to system monitoring and feature specific testing. You can review more information at the Performance and QA testing wiki page. +

    +

    Documentation

    + + +{%endblock%} diff --git a/templates/pages/docs.html b/templates/pages/docs.html new file mode 100644 index 00000000..8d8e93e5 --- /dev/null +++ b/templates/pages/docs.html @@ -0,0 +1,41 @@ +{%extends "base/page.html"%} +{%block title%}Documentation{%endblock%} +{%block contents%} +
    +
    +

    Documentation

    + +

    There is a wealth of PostgreSQL information available online. This section contains current +and archived manuals for PostgreSQL users, as well as +frequently asked questions.

    + +

    You can learn what's new in the latest release, and view a listing of books +written about PostgreSQL (some of which are available in their entirety online). +Technical documentation is also available in this section, or you can check Security Information.

    + +
    +
    + +
    +
    +
    +
    Online Manuals
    +
    +

    8.4 (with/without comments)

    +

    8.3 (with/without comments)

    +

    8.2 (with/without comments)

    +

    8.1 (with/without comments)

    +

    8.0 (with/without comments)

    +
    +
    Translated Manuals
    +
    + +
    +

    More manuals
    +
    +
    +
    +{%endblock%} diff --git a/templates/pages/docs/books.html b/templates/pages/docs/books.html new file mode 100644 index 00000000..a4802626 --- /dev/null +++ b/templates/pages/docs/books.html @@ -0,0 +1,288 @@ +{%extends "base/page.html"%} +{%block title%}Books{%endblock%} +{%block contents%} +

    Books

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CoverInformation
    + PostgreSQL.  Datenbankpraxis für Anwender, Administratoren und Entwickler (Broschiert) + + Title: PostgreSQL. Datenbankpraxis für Anwender, Administratoren und Entwickler (Broschiert)
    + Author: Andreas Scherbaum
    + Format: Paperback
    + Published: August 2009
    +
    + PostgreSQL-Administration + + Title: PostgreSQL-Administration
    + Author: Peter Eisentraut, Bernd Helmle
    + Format: Hardback
    + Published: October 2008
    +
    + PostgreSQL - Administration et exploitation d’une base de données (2ème édition) + + Title: PostgreSQL - Administration et exploitation d’une base de données (2ème édition)
    + Author: Sébastien LARDIERE
    + Format: Paperback
    + Published: October 2007
    +
    + PostgreSQL Reference Manual - Volume 1 + + Title: PostgreSQL Reference Manual - Volume 1-3
    + Author: The PostgreSQL Global Development Group
    + Format: Paperback
    + Published: June 2007
    +
    + PostgreSQL 8 For Windows + + Title: PostgreSQL 8 For Windows
    + Author: Richard Blum
    + Format: Paperback
    + Published: March 2007
    +
    + Cover of Beginning PHP and PostgreSQL E-Commerce + + Title: Beginning PHP and PostgreSQL E-Commerce
    + Author: Cristian Darie, Emilian Balanescu, Mihai Bucica
    + Format: Paperback
    + Published: December 2006
    +
    + Cover of PHP and PostgreSQL 8 + + Title: PHP & PostgreSQL 8
    + Author: W. Jason Gilmore, Robert H. Treat
    + Format: Paperback
    + Published: March 2006
    +
    + Cover of PostgreSQL ile Programlama + + Title: PostgreSQL ile Programlama
    + Author: Volkan YAZICI
    + Format: Paperback
    + Published: February 2006
    +
    + Cover of PostgreSQL, 2nd Edition + + Title: PostgreSQL, 2nd Edition
    + Author: Korry Douglas, Susan Douglas
    + Format: Paperback
    + Published: July 2005
    +
    + Cover of Beginning Databases with PostgreSQL, 2nd Edition + + Title: Beginning Databases with PostgreSQL, 2nd Edition
    + Author: Neil Matthew, Richard Stone
    + Format: Paperback
    + Published: April 2005
    +
    + Cover of PostgreSQL GE-PACKT + + Title: PostgreSQL GE-PACKT
    + Author: Peter Eisentraut
    + Format: Paperback
    + Published: Janurary 2005
    +
    + Cover of PostgreSQL, m. CD-ROM + + Title: PostgreSQL, m. CD-ROM
    + Author: Paul Weinstabl
    + Format: Paperback
    + Published: November 2004
    +
    + Cover of PostgreSQL: Das offizielle Handbuch + + Title: PostgreSQL: Das offizielle Handbuch
    + Author: Peter Eisentraut
    + Format: Paperback
    + Published: August 2003
    + Available online (auf Deutsch/in German)
    +
    + Cover of PostgreSQL + + Title: PostgreSQL
    + Author: Korry Douglas, Susan Douglas
    + Format: Paperback
    + Published: February 2003
    +
    + Cover of PostgreSQL. Grundlagen - Praxis - Anwendungsentwicklung mit PHP + + Title: PostgreSQL. Grundlagen - Praxis - Anwendungsentwicklung mit PHP.
    + Author: Cornelia Boenigk
    + Format: Paperback
    + Published: September 2002
    +
    + Cover of PHP and PostgreSQL Advanced Web Programming + + Title: PHP and PostgreSQL Advanced Web Programming
    + Author: Ewald Geschwinde and Hans-Juergen Schoenig
    + Format: Paperback
    + Published: June 2002
    +
    + Cover of Practical PostgreSQL + + Title: Practical PostgreSQL (O'Reilly Unix)
    + Author: Command Prompt Inc (Editor), et al
    + Format: Paperback
    + Published: January 2002
    + Available online
    +
    + Cover of Postgresql Developer's Handbook + + Title: Postgresql Developer's Handbook
    + Author: Ewald Geschwinde, et al
    + Format: Paperback
    + Published: December 2001
    +
    + Cover of PostgreSQL + + Title: PostgreSQL
    + Author: Jeff Perkins
    + Format: Paperback
    + Published: October 2001
    +
    + Cover of PostgreSQL Essential Reference + + Title: PostgreSQL Essential Reference
    + Author: Barry Stinson
    + Format: Paperback
    + Published: October 2001
    +
    + Cover of Begining Databases with PostgreSQL + + Title: Beginning Databases with PostgreSQL
    + Author: Richard Stones, Neil Matthew
    + Format: Paperback
    + Published: September 2001
    +
    + Cover of PostgreSQL: Introduction and Concepts + + Title: PostgreSQL: Introduction and Concepts
    + Author: Bruce Momjian
    + Format: Paperback
    + Published: December 2000
    + Available online
    +
    + Cover of Postgresql Programmer's Guide + + Title: Postgresql Programmer's Guide
    + Author: Thomas Lockhart (Editor)
    + Format: Paperback
    + Published: December 2000
    +
    +
    +{%endblock%} + diff --git a/templates/pages/docs/faq.html b/templates/pages/docs/faq.html new file mode 100644 index 00000000..004932c7 --- /dev/null +++ b/templates/pages/docs/faq.html @@ -0,0 +1,55 @@ +{%extends "base/page.html"%} +{%block title%}Frequently Asked Questions{%endblock%} +{%block contents%} + +

    Frequently Asked Questions

    + +

    General

    + + + +

    Platform

    + + +

    International

    + +
    +

    PostgreSQL FAQ

    + +
    +
    +

    Running & Installing PostgreSQL on Windows FAQ

    + +
    + +{%endblock%} diff --git a/templates/pages/docs/manuals.html b/templates/pages/docs/manuals.html new file mode 100644 index 00000000..93a3e3db --- /dev/null +++ b/templates/pages/docs/manuals.html @@ -0,0 +1,116 @@ +{%extends "base/page.html"%} +{%block title%}Manuals{%endblock%} +{%block contents%} + +

    Manuals

    +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ReleaseOnline VersionDownloadable Version
    8.4 + + +
      +
    • Comprehensive Manual: A4 PDF (17 MB)
    • +
    • Comprehensive Manual: US PDF (17 MB)
    • +
    • Windows help file (3.3 MB)
    • +
    +
    8.3 + + +
      +
    • Comprehensive Manual: A4 PDF (16.5 MB)
    • +
    • Comprehensive Manual: US PDF (16.7 MB)
    • +
    • Windows help file (3 MB)
    • +
    +
    8.2 + + +
      +
    • Comprehensive Manual: A4 PDF (14.1 MB)
    • +
    • Comprehensive Manual: US PDF (14.1 MB)
    • +
    + +
    8.1 + + +
      +
    • Comprehensive Manual: A4 PDF (12.1 MB)
    • +
    • Comprehensive Manual: US PDF (12.1 MB)
    • +
    +
    8.0 + + +
      +
    • Comprehensive Manual: A4 PDF (9.8 MB)
    • +
    • Comprehensive Manual: US PDF (9.9 MB)
    • +
    +
    7.4 + + +
      +
    • Comprehensive Manual: A4 PDF (9.0 MB)
    • +
    • Comprehensive Manual: US PDF (9.1 MB) +
    +
    +
    + +

    Please see the manual archive for documentation for older releases. +The DocBook SGML source for the manuals is available as part of the PostgreSQL source download available in +the FTP area.

    +{%endblock%} diff --git a/templates/pages/docs/manuals/archive.html b/templates/pages/docs/manuals/archive.html new file mode 100644 index 00000000..63712f73 --- /dev/null +++ b/templates/pages/docs/manuals/archive.html @@ -0,0 +1,127 @@ +{%extends "base/page.html"%} +{%block title%}Manual Archive{%endblock%} +{%block contents%} + +

    Manual Archive

    + +

    Following are links to manuals (both online and printable versions) for PostgreSQL releases that are no longer supported. +If you are still using any of these releases, you are strongly advised to upgrade.

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ReleaseOnline VersionPDF Version
    7.3 + + + +
    7.2 + + +
      +
    • Administrators Guide: US A4
    • +
    • Developers Guide: US A4
    • +
    • Programmers Guide: US A4
    • +
    • Reference Guide: US A4
    • +
    • Tutorial: US A4
    • +
    • Users Guide: US A4
    • +
    +
    7.1 + + + +
    7.0 + + +
      +
    • PDF version not available
    • +
    +
    6.5 + + +
      +
    • PDF version not available
    • +
    +
    6.4 + + +
      +
    • PDF version not available
    • +
    +
    6.3 + + +
      +
    • PDF version not available
    • +
    +
    +
    +{%endblock%} diff --git a/templates/pages/docs/t.patch b/templates/pages/docs/t.patch new file mode 100644 index 00000000..9133d6d3 --- /dev/null +++ b/templates/pages/docs/t.patch @@ -0,0 +1,24 @@ +1,3c1,3 +< {%extends "base/page.html"%} +< {%block title%}Books{%endblock%} +< {%block contents%} +--- +> +> Books +> +13a14,24 +> PostgreSQL.  Datenbankpraxis für Anwender, Administratoren und Entwickler (Broschiert) +> +> +> Title: PostgreSQL. Datenbankpraxis für Anwender, Administratoren und Entwickler (Broschiert)
    +> Author: Andreas Scherbaum
    +> Format: Paperback
    +> Published: August 2009
    +> +> +> +> +22a34 +> +275d286 +< {%endblock%} diff --git a/templates/pages/download.html b/templates/pages/download.html new file mode 100644 index 00000000..fae83c16 --- /dev/null +++ b/templates/pages/download.html @@ -0,0 +1,84 @@ +{%extends "base/page.html"%} +{%block title%}Downloads{%endblock%} +{%block contents%} +
    + +

    Downloads

    + +

    PostgreSQL Core Distribution

    + +

    The core of the PostgreSQL object-relational database management system is available in several source and binary formats. +The full package includes:

    + +
      +
    • The core server with full documentation (html, man)
    • +
    • Several command line tools (e.g. psql, pg_ctl, pg_dump, pg_restore)
    • +
    • C library (libpq) and embedded C processor (ecpg)
    • +
    • Several server-side procedural languages (e.g. plpgsql, pltcl, plperl)
    • +
    • Several popular add-on packages (e.g. metaphone, pgcrypto and other useful enhancements)
    • +
    + +

    In addition, some 'one click' installers include additional packages such as pgAdmin and PostGIS. + +

    Binary packages

    + +

    Pre-built binary packages are available for a number of different operating systems:

    + + + +

    Source code

    + +

    You can download the source code from a mirror site using our File Browser + +

    3rd party distributions

    + +
      +
    • Postgres Plus - 'one click' installers for Linux, Mac, and Win32, which include many of the most commonly used components and helper applications. Published by EnterpriseDB.
    • +
    • 'LAPP', 'MAPP' and 'WAPP' (Linux/Mac/Windows + Apache + PHP + PostgreSQL) stacks are available from BitNami. Sponsored by BitRock.
    • +
    + +

    Live CDs/Software appliances

    + +

    Live CDs are bootable CD images that allow you to run and play with PostgreSQL and a selection of related tools and +software, without installing anything on your PC. Software appliances are similarly pre-configured, but are designed to run in a virtual machine or be installed onto real hardware. Note that as complete operating systems, these distributions may not be updated immediately when new versions of PostgreSQL are released.

    + +
      +
    • pg_live - a Xubuntu based live CD designed and optimized expressly for the PostgreSQL Database administrator and enthusiast. Sponsored by Open Technology Group.
    • + +
    • PostgreSQL Live CD - a Fedora based PostgreSQL live CD, + containing packages from the PostgreSQL Yum repository. Maintained by Devrim GÜNDÜZ at + Command Prompt.
    • + +
    • TurnKey PostgreSQL - An Ubuntu based live CD and software appliance featuring a Mac OS X-themed Web management interface and a Python configuration and installation console. Published by TurnKey Linux.
    • + +
    + +

    Development snapshots (unstable)

    + +

    There are source code and binary development snapshots of the current development code +available for testing and evaluation of new features. Note that these builds should be used for testing purposes +only, and not for production systems.

    + +

    Additional software

    + +

    Software Catalogue

    + +

    There is much software available that is not bundled with PostgreSQL. The Software +Catalogue offers a listing of many commercial and Open Source applications, interfaces and extensions to PostgreSQL +that you may find useful.

    + +

    If you wish to have your product listed in the catalogue, please fill out this form.

    + +

    pgFoundry

    + +

    pgFoundry is home to a huge array of PostgreSQL related projects. As well as +downloading software, you can observe or participate in the development activities of the projects that interest you.

    + +

    File Browser

    +

    You can download most of the software we publish from a mirror site using our File Browser. If you prefer, +you can browse the download mirrors directly.

    + +
    +{%endblock%} diff --git a/templates/pages/download/freebsd.html b/templates/pages/download/freebsd.html new file mode 100644 index 00000000..cd3d98b5 --- /dev/null +++ b/templates/pages/download/freebsd.html @@ -0,0 +1,18 @@ +{%extends "base/page.html"%} +{%block title%}FreeBSD packages{%endblock%} +{%block contents%} + +

    FreeBSD packages

    + +

    FreeBSD Ports

    + +

    PostgreSQL packages are available for FreeBSD from the FreeBSD + Ports and Packages Collection. Please see the ports documentation for information on how +to install ports.

    + +

    A list of PostgreSQL + packages can be found using the Ports Search tool on the FreeBSD website.

    + +

    The FreeBSD PostgreSQL Ports are maintained by Palle Girgensohn.

    + +{%endblock%} diff --git a/templates/pages/download/linux.html b/templates/pages/download/linux.html new file mode 100644 index 00000000..1b17d5da --- /dev/null +++ b/templates/pages/download/linux.html @@ -0,0 +1,66 @@ +{%extends "base/page.html"%} +{%block title%}Linux packages{%endblock%} +{%block contents%} + +

    Linux packages

    + +

    One click installer

    + +

    One click installers are available for 32 and 64 bit Linux distributions and include PostgreSQL, +pgAdmin, PL/Java and the PL/pgSQL debugger plugin. The installer has been tested with a number of +recent Linux distributions and should work on Ubuntu 6.06 and above, Fedora 6 and above, CentOS/Red Hat +Enterprise Linux 4 and above and others.

    + +

    Note: The one click installers do not integrate with platform-specific packaging systems. If you need +RPM, APT or Portage integration, please use the packages below.

    + + + +

    The one click installers are maintained by Dave Page at EnterpriseDB.

    + +

    CentOS, Fedora and RHEL Yum Repository

    + +

    RPMs for CentOS, Fedora and Red Hat Enterprise Linux are available from the PostgreSQL +Yum repository. Platform-specific RPM packages of PostgreSQL are available as well as a variety of related projects +such as pgAdmin and PostGIS.

    + +

    A list of packages available from the Yum Repository can be found here.

    + +

    To setup your system to use the repository, please see the Yum HOWTO. + +

    The PostgreSQL Yum repository is maintained by Devrim GÜNDÜZ at Command Prompt.

    + +

    Debian Apt

    + +

    Debian users may install PostgreSQL using the apt utility. For +details on the use of apt on Debian, please see the documentation.

    + +

    A list +of PostgreSQL Debian packages is available from the package search tool.

    + +

    The PostgreSQL packages for Debian are maintained by Martin Pitt.

    + +

    Gentoo Portage

    + +

    Gentoo users may install PostgreSQL using the portage system. For +details on the use of Gentoo's Portage, please see the documentation.

    + +

    SUSE RPMs

    + +

    RPMs for SUSE Linux and openSUSE are available from the openSUSE Build Service +in the project server:database:postgresql. Platform-specific RPM packages are available for PostgreSQL +as well as a variety of related software. Use the search facility to find +suitable packages. Documentation is also available there.

    + +

    The PostgreSQL packages for SUSE are maintained by Reinhard Max.

    + +

    Ubuntu Apt

    + +

    Ubuntu users may install PostgreSQL using the apt utility. For +details on the use of apt on Ubuntu, please see the documentation.

    + +

    The PostgreSQL packages for Ubuntu are maintained by Martin Pitt.

    +{%endblock%} diff --git a/templates/pages/download/macosx.html b/templates/pages/download/macosx.html new file mode 100644 index 00000000..7ca3fb87 --- /dev/null +++ b/templates/pages/download/macosx.html @@ -0,0 +1,37 @@ +{%extends "base/page.html"%} +{%block title%}Mac OS X packages{%endblock%} +{%block contents%} + +

    Mac OS X packages

    + +

    One click installer

    + +

    A one click installer is available for for Mac OS X 10.4 and above on Intel and PPC and includes PostgreSQL, +pgAdmin, PL/Java and the PL/pgSQL debugger plugin.

    + + + +

    The one click installer is maintained by Dave Page at EnterpriseDB.

    + +

    Fink

    + +

    PostgreSQL packages are available for Mac OS X from the Fink +Project. Please see the Fink documentation for information on how to install packages.

    + +

    A list of PostgreSQL +packages can be found using the package search tool on the Fink website.

    + +

    The PostgreSQL Fink packages are maintained by Benjamin Reed.

    + +

    MacPorts

    + +

    PostgreSQL packages are also available for Mac OS X from the MacPorts +Project. Please see the MacPorts documentation for information on how to install ports.

    + +

    A list of PostgreSQL +packages can be found using the portfiles search tool on the MacPorts website.

    + +

    The PostgreSQL MacPorts are maintained by Jyrki Wahlstedt and Markus Weissmann.

    +{%endblock%} diff --git a/templates/pages/download/snapshots.html b/templates/pages/download/snapshots.html new file mode 100644 index 00000000..145f732c --- /dev/null +++ b/templates/pages/download/snapshots.html @@ -0,0 +1,46 @@ +{%extends "base/page.html"%} +{%block title%}Development snapshots (unstable){%endblock%} +{%block contents%} + +

    Development snapshots (unstable)

    + +

    Development snapshots are built from the latest source code versions that the developers are working on. These are 'bleeding edge' +versions of PostgreSQL and should not be used in production systems as they have had little or no testing or quality control.

    + +

    The latest development version of the documentation is also +available online. + +

    One click installer

    + +

    One click installers are available for 32 and 64 bit Linux distributions, Mac OS X and Windows and +include PostgreSQL, pgAdmin, PL/Java and the PL/pgSQL debugger plugin.

    + +

    Note: The one click installers do not integrate with platform-specific packaging systems on Linux. If you need +RPM packages for CentOS, Fedora or RHEL please use the packages below.

    + + + +

    The one click installers are maintained by Dave Page at EnterpriseDB.

    + +

    CentOS, Fedora and RHEL Yum Repository

    + +

    RPMs for CentOS, Fedora and Red Hat Enterprise Linux are available from the +PostgreSQL Yum repository. + +

    To setup your system to use the repository, please see the Yum HOWTO. + +

    The PostgreSQL Yum repository is maintained by Devrim GÜNDÜZ at Command Prompt.

    + +

    Source code

    + +

    Source code tarballs are built automatically every night on the main PostgreSQL development server. The +development snapshot is taken from the HEAD of the CVS repository, and +includes the new features being worked on for the next release.

    + + +{%endblock%} diff --git a/templates/pages/download/solaris.html b/templates/pages/download/solaris.html new file mode 100644 index 00000000..6b1010d8 --- /dev/null +++ b/templates/pages/download/solaris.html @@ -0,0 +1,20 @@ +{%extends "base/page.html"%} +{%block title%}Solaris packages{%endblock%} +{%block contents%} + +

    Solaris packages

    + +

    Download Solaris packages from the solaris +subdirectory of the version you require from our file browser.

    + +

    Packages for OpenSolaris (PostgreSQL 8.3.0 and above) and Solaris 10 (8.3.1 +and above) are available for Sparc and i386 platforms. Although produced by Sun, +these packages are not officially supported by them.

    + +

    Solaris packages are installed by unpacking the compressed tar files +directly into the install directory; see the README files for details.

    + +

    The Solaris PostgreSQL packages are maintained by Bjorn Munch at + Sun Microsystems.

    + +{%endblock%} diff --git a/templates/pages/download/windows.html b/templates/pages/download/windows.html new file mode 100644 index 00000000..7236cdba --- /dev/null +++ b/templates/pages/download/windows.html @@ -0,0 +1,33 @@ +{%extends "base/page.html"%} +{%block title%}Windows packages{%endblock%} +{%block contents%} + +

    Windows packages

    + +

    The Windows installer for PostgreSQL includes the PostgreSQL server, pgAdmin III; a graphical tool for managing and developing your databases, and StackBuilder; a package manager that can be used to download and install additional PostgreSQL applications and drivers.

    + +

    Note: Only PostgreSQL 8.2 and above are supported on Windows.

    + +

    One click installer

    + +

    The one click installer is designed to be as straightforward as possible and the fastest way to get up and running with PostgreSQL on Windows.

    + + + +

    Advanced users can also download a zip archive of the binaries, without the installer.

    + +

    The one click installer is maintained by Dave Page at EnterpriseDB.

    + +

    pgInstaller

    + +

    pgInstaller is a Windows Installer package that offers advanced configuration options. pgInstaller packages are only being maintained for PostgreSQL 8.2 and 8.3.

    + +
      +
    • Download pgInstaller from the win32 subdirectory of the version you require from our file browser.
    • +
    + +

    pgInstaller is maintained by Dave Page and Magnus Hagander.

    + +{%endblock%} diff --git a/templates/pages/support.html b/templates/pages/support.html new file mode 100644 index 00000000..5a884b3a --- /dev/null +++ b/templates/pages/support.html @@ -0,0 +1,24 @@ +{%extends "base/page.html"%} +{%block title%}Support{%endblock%} +{%block contents%} + +

    Support

    + +

    PostgreSQL has a wide variety of community and commercial support options available for users. +The Community section of this website details the support options available to users from the PostgreSQL +community, including mailing lists and IRC. +And don't forget to read the FAQs and documentation. +

    + +

    Commercial support is also available from one of the many companies providing professional services +to the PostgreSQL community. A listing of companies that provide hosting with PostgreSQL access is +also available.

    + +

    Bug Reporting

    + +

    Found a bug in PostgreSQL? Please read over our bug reporting guidelines +and then report it using our bug reporting form.

    + +

    You can see previous bug reports, and track your own on the pgsql-bugs@postgresql.org mailing +list.

    +{%endblock%} diff --git a/templates/pages/support/security.html b/templates/pages/support/security.html new file mode 100644 index 00000000..31853b8f --- /dev/null +++ b/templates/pages/support/security.html @@ -0,0 +1,397 @@ +{%extends "base/page.html"%} +{%block title%}Security Information{%endblock%} +{%block contents%} + +

    Security Information

    + +

    +If you wish to report a new security vulnerability in PostgreSQL, please +send an email to +security@postgresql.org. +For reporting non-security bugs, please see the Report a Bug page. +

    + +

    +The PostgreSQL Global Development Group (PGDG) takes security seriously, +allowing our users to place their trust in the web sites and applications +built around PostgreSQL. Our approach covers fail-safe configuration options, +a secure and robust database server as well as good integration with other +security infrastructure software. +

    + +

    +PostgreSQL security updates are primarily made available as minor version +upgrades. You are always advised to use the latest minor version available, +as it will likely also contain other non-security related fixes. All known +security issues are always fixed in the next major release, when it comes out. +

    + +

    +PGDG believes that accuracy, completeness and availability of security +information is essential for our users. We choose to pool all information on +this one page, allowing easy searching for vulnerabilities by a range of +criteria. +

    + +

    +The following table lists all known security issues. +Please note that versions prior to 7.4 are no longer +supported and vulnerabilities for these versions are not included +in this list. New vulnerabilities in these versions are no longer patched. +

    + +

    +Vulnerabilities list which major releases they were present +in, and which version they are fixed in for each. If the vulnerability +was exploitable without a valid login, this is also stated. They also +list a severity, but we urge all users to read the description +to determine if the bug affects specific installations or not. +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ReferenceAffected
    versions
    Fixed inComponentSevDescription
    CVE-2009-09228.3, 8.2, 8.1, 8.0, 7.48.3.7, 8.2.13, 8.1.17, 8.0.21, 7.4.25core serverDIt is possible to cause a momentary denial of service when there is a failure to convert a localized error message to the client-specified encoding. A valid login is required to exploit this vulnerability.
    CVE-2007-6600
    Announcement
    8.2, 8.1, 8.0, 7.4, 7.38.2.6, 8.1.11, 8.0.15, 7.4.19, 7.3.21core serverCTwo vulnerabilities in how ANALYZE executes user defined functions that are part of expression indexes allows users to gain superuser privileges. A valid login that has permissions to create functions and tables is required to exploit this vulnearbility.
    CVE-2007-4769
    CVE-2007-4772
    CVE-2007-6067
    Announcement
    8.2, 8.1, 8.0, 7.48.2.6, 8.1.11, 8.0.15, 7.4.19core serverBThree vulnearbilities in the regular expression handling libraries can be exploited to cause a backend crash, infinite loops or memory exhaustion. This vulnearbility can be exploited through frontend applications that allow unfiltered regular expressions to be passed in queries.
    CVE-2007-6601
    Announcement
    8.2, 8.1, 8.0, 7.4, 7.38.2.6, 8.1.11, 8.0.15, 7.4.19, 7.3.21contrib moduleCDBLink functions combined with local trust or ident access control could be used by a malicious user togain superuser privileges. A valid login is required to exploit this vulnerability.
    CVE-2007-2138
    Announcement
    8.2, 8.1, 8.0, 7.4, 7.38.2.4, 8.1.9, 8.0.13, 7.4.17, 7.3.19core serverCA vulnerability involving insecure search_path settings allows unprivileged users to gain the SQL privileges of the owner of any SECURITY DEFINER function they are allowed to call. Securing such a function requires both a software update and changes to the function definition.
    CVE-2007-05568.2, 8.1, 8.08.2.2, 8.1.7, 8.0.11core serverCA vulnerability involving changing the data type of a table column can easily be exploited to cause a backend crash, and in principle might be used to read database content that the user should not be able to access.
    CVE-2007-05558.2, 8.1, 8.0, 7.4, 7.38.2.2, 8.1.7, 8.0.11, 7.4.16, 7.3.13core serverCA vulnerability allows suppressing the normal checks that a SQL function returns the data type it's declared to do. These errors can easily be exploited to cause a backend crash, and in principle might be used to read database content that the user should not be able to access.
    CVE-2006-5542
    Announcement
    8.18.1.5core serverDA bug in the logging of V3 protocol messages can cause a denial of service. A valid login is required to exploit this vulnerability.
    CVE-2006-5541
    Announcement
    8.1, 8.0, 7.48.1.5, 8.0.9, 7.4.14core serverDA bug in the coercion of unknown literals to ANYARRAY can cause a denial of service. A valid login is required to exploit this vulnerability.
    CVE-2006-5540
    Announcement
    8.18.1.5core serverDA bug in the handling of aggregates in UPDATE can cause a denial of service. A valid login is required to exploit this vulnerability.
    CVE-2006-2314
    FAQ
    8.1, 8.0, 7.4, 7.38.1.4, 8.0.8, 7.4.13, 7.3.15core serverAThe widely-used practice of escaping ASCII single quote "'" by turning it into "\'" is unsafe when operating in multibyte encodings that allow 0x5c (ASCII code for backslash) as the trailing byte of a multibyte character.
    CVE-2006-2313
    FAQ
    8.1, 8.0, 7.4, 7.38.1.4, 8.0.8, 7.4.13, 7.3.15core serverAAn attacker able to submit crafted strings to an application that will embed those strings in SQL commands can use invalidly-encoded multibyte characters to bypass standard string-escaping methods, resulting in possible SQL injection.
    CVE-2006-0553
    Announcement
    8.18.1.3core serverCA bug in the handling of SET ROLE allows escalation of privileges to any other database user, including superuser. A valid login is required to exploit this vulnerability.
    CVE-2006-0678
    Announcement
    8.0, 7.4, 7.38.0.7, 7.4.12, 7.3.14core serverDA bug in the handling of SET SESSION AUTHORIZATION can cause a backend crash in Assert enabled builds. This will cause the postmaster to restart all backend, resulting in a denial of service. A valid login is required to exploit this vulnerability.
    CVE-2006-0105
    Announcement
    8.1, 8.08.1.2, 8.0.6core server, win32 onlyBOn Windows only, the postmaster will exit if too many connection requests arrive simultaneously. This does not affect existing database connections, but will prevent new connections from being established until the postmaster is manually restarted.
    Announcement8.1, 8.0, 7.4, 7.38.1.2, 8.0.6, 7.4.11, 7.3.13contrib moduleThere is a signedness bug in Openwall gen_salt code that pgcrypto uses. This makes the salt space for md5 and xdes algorithms a lot smaller than it should be. This only affects the gen_salt() function with md5 or xdes.
    Release notes8.0, 7.48.0.3, 7.4.8core serverDCalling COALESCE() with two NULL parameters would cause the current backend to crash, causing a denial of service. A valid login is required to exploit this vulnerability.
    CVE-2005-1410
    Announcement
    8.0, 7.48.0.3, 7.4.8contrib moduleDThe tsearch2 contrib module declares several functions as internal even though they don't take an internal argument. This allows attackers to cause a denial of service and may possibly have other impacts. A valid login is required to exploit this vulnerability.
    Note! See the announcement for special upgrade instructions.
    CVE-2005-1409
    Announcement
    8.0, 7.4, 7.38.0.3, 7.4.8, 7.3.10core serverDPublic EXECUTE access is given to certain character conversion functions that are not designed to be safe against malicious arguments. This can cause at least a denial of service. A valid login is required to exploit this vulnerability.
    Note! See the announcement for special upgrade instructions.
    CVE-2005-02478.0, 7.48.0.2, 7.4.8core serverCMultiple buffer overflows in the PL/PGSQL parser may allow attackers to execute arbitrary code. A valid login is required to exploit this vulnerability.
    CVE-2005-02468.0, 7.4, 7.38.0.1, 7.4.7, 7.3.9contrib moduleDThe intagg contrib module allows attackers to cause a denial of service. A valid login is required to exploit this vulnerability.
    CVE-2005-02458.0, 7.4, 7.38.0.1, 7.4.7, 7.3.10core serverCMultiple buffer overflows in the PL/PGSQL parser may allow attackers to execute arbitrary code. A valid login is required to exploit this vulnerability.
    CVE-2005-02448.0, 7.4, 7.38.0.1, 7.4.7, 7.3.9core serverCEXECUTE permissions are not properly checked when creating aggregates. A valid login is required to exploit this vulnerability.
    CVE-2005-02278.0, 7.4, 7.38.0.1, 7.4.7, 7.3.9core serverCAny database user is permitted to load arbitrary shared libraries using the LOAD command. A valid login is required to exploit this vulnerability.
    CVE-2005-09777.4, 7.37.4.6, 7.3.8client contrib moduleContrib script make_oidjoins_check uses unsafe temporary files. This script is not a user-facing script.
    Release notes7.47.4.3core serverCA buffer overrun vulnerability exists in the enlargeStringInfo function and can be triggered by injecting bogus data in the datastream of an existing connection. A valid login is required to exploit this vulnerability.
    Release notes7.37.3.6core serverCA patch applied in 7.3.3 to fix a corner case in rule permissions checks turns out to have disabled rule-related permissions checks in many not-so-corner cases. This would for example allow users to insert into views they weren't supposed to have permission to insert into. A valid login is required to exploit this vulnerability.
    CVE-2003-09017.37.3.4core serverCA buffer overflow in the to_ascii function allows attackers to execute arbitrary code. A valid login is required to exploit this vulnerability.
    Release notes7.37.3.2core serverCThe fastpath function interface did not properly check for permissions before executing a function. A valid login is required to exploit this vulnerability.
    +
    + + +

    Severities

    +

    +The following severity references are used in the above table: +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    SeverityDescription
    AA vulnerability that is exploitable for privilege escalation without requiring a prior login.
    BA vulnerability that is exploitable for denial-of-service without requiring a prior login.
    CA vulnerabilty that is exploitable for privilege escalation, but requiring a valid prior login.
    DA vulnerability that is exploitable for denial-of-service, but requiring a valid prior login.
    +
    + + +

    Components

    +

    +The following component references are used in the above table: +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ComponentDescription
    core serverThis vulnerability exists in the core server product.
    clientThis vulnerability exists in a client library or client application only.
    contrib moduleThis vulnerability exists in a contrib modules. Contrib modules are not installed by default when PostgreSQL is installed from source. They may be installed by binary packages.
    client contrib moduleThis vulnerability exists in a contrib module used on the client only.
    +
    + +{%endblock%} diff --git a/templates/pages/support/versioning.html b/templates/pages/support/versioning.html new file mode 100644 index 00000000..86157119 --- /dev/null +++ b/templates/pages/support/versioning.html @@ -0,0 +1,26 @@ +{%extends "base/page.html"%} +{%block title%}Versioning policy{%endblock%} +{%block contents%} + +

    Versioning policy

    + +

    +We always recommend that all users run the latest available minor release for whatever major version is in use. +

    + +

    +PostgreSQL major releases include new features and occur roughly once every year. A major release is numbered by increasing either the first or second part of the version number, e.g. 8.2 to 8.3. +

    + +

    +Major releases usually change the internal format of system tables and data files. These changes are often complex, so we don't maintain backward compatibility for data files. A dump/reload of the database is required for major upgrades. +

    + +

    +Minor releases are numbered by increasing the third part of the version number, e.g. 8.1.5 to 8.1.6. The PostgreSQL team only adds bug fixes to minor releases. All users should upgrade to the most recent minor release as soon as possible. While upgrades always have some risk, PostgreSQL minor releases fix only frequently-encountered, security, and data corruption bugs to reduce the risk of upgrading. The community considers not upgrading to be riskier than upgrading. +

    + +

    +Upgrading to a minor release does not require a dump and restore; merely stop the database server, install the updated binaries, and restart the server. For some releases, manual changes may be required to complete the upgrade, so always read the release notes before upgrading. +

    +{%endblock%} diff --git a/templates/profserv/list.html b/templates/profserv/list.html new file mode 100644 index 00000000..dfa152b3 --- /dev/null +++ b/templates/profserv/list.html @@ -0,0 +1,81 @@ +{%extends "base/page.html"%} +{%block title%}{{title}}{%endblock%} +{%block contents%} +

    {{title}}

    +

    The following {{whatname}} are registered in {{regionname}}.

    + +{%for s in services%} +
    + + + + + + {%if s.provides_hosting and s.provides_support %} + + + + + {%endif%} + + + + + {%if s.employees %} + + + + + {%endif%} + {%if s.locations%} + + + + + {%endif%} + {%if s.hours %} + + + + + {%endif%} + {%if s.languages%} + + + + + {%endif%} + {%if s.customerexample%} + + + + + {%endif%} + {%if s.experience %} + + + + + {%endif%} + {%if s.contact%} + + + + + {%endif%} +
    Name{{s.name}}{%if s.url%} ({{s.url}}){%endif%} +
    ProvidesProvides both support and hosting. +
    Description{{s.description}} +
    Number of employees{{s.employees}} +
    Office locations{{s.locations}} +
    Hours{{s.hours}} +
    Languages{{s.languages}} +
    Customer example{{s.customerexample}} +
    Experience{{s.experience}} +
    Contact information{{s.contact}} +
    +
    +{%endfor%} + +{%endblock%} + diff --git a/templates/profserv/root.html b/templates/profserv/root.html new file mode 100644 index 00000000..2f9b3069 --- /dev/null +++ b/templates/profserv/root.html @@ -0,0 +1,28 @@ +{%extends "base/page.html"%} +{%block title%}{{title}}{%endblock%} +{%block contents%} +

    {{title}}

    + +{%if support%} +

    Commercial support is available from many different companies providing professional services +to the PostgreSQL community.

    +{%else%} +

    Many companies provide hosting solutions based on PostgreSQL. Some also provide complete +solutions including support contracts.

    +{%endif%} + +

    If your company would like to be listed here, please fill out this form.

    + +

    Please select a region:

    + +
      +{%for rl, rn in regions%} +
    • {{rn}}
    • +{%endfor%} +
    + +

    For more companies that provide PostgreSQL related consulting we also suggest you check +Open Source Experts.

    + +{%endblock%} + diff --git a/templates/quotes/quotelist.html b/templates/quotes/quotelist.html new file mode 100644 index 00000000..010f33f7 --- /dev/null +++ b/templates/quotes/quotelist.html @@ -0,0 +1,11 @@ +{%extends "base/page.html"%} +{%block title%}Quotes{%endblock%} +{%block contents%} +

    Quotes

    +
    +{% for obj in quotes %} +
    {{obj.quote|safe}}
    +
    {{obj.who}}, {{obj.org}}
    +{% endfor %} +
    +{%endblock%} diff --git a/templates/sponsors/servers.html b/templates/sponsors/servers.html new file mode 100644 index 00000000..31e0c9a1 --- /dev/null +++ b/templates/sponsors/servers.html @@ -0,0 +1,43 @@ +{%extends "base/page.html"%} +{%block title%}Servers{%endblock%} +{%block contents%} + +

    Servers

    + +

    +The servers that power the services of postgresql.org are provided by +different companies and organisations around the world. +

    + +
    + + + + + + + + + + + +{% for s in servers %} + + + + + + + + + +{% endfor %} +
    NameProviderDecic.Perf.OSLocationUsage
    {{s.name}} + {%for p in s.sponsors.all %} + {{p.name}}{%if not forloop.last%}, {%endif%} + {%endfor%} + {{s.dedicated}}{{s.performance}}{{s.os}}{{s.location}}{{s.usage}}
    +
    + +{%endblock%} + diff --git a/templates/sponsors/sponsors.html b/templates/sponsors/sponsors.html new file mode 100644 index 00000000..611ecb0e --- /dev/null +++ b/templates/sponsors/sponsors.html @@ -0,0 +1,51 @@ +{%extends "base/page.html"%} +{%block title%}Sponsors{%endblock%} +{%block contents%} + +

    Sponsors

    + +

    The following is a categorized list of significant sponsors to PostgreSQL. +Sponsors are listed in alphabetical order within each section, with just the location of the head office +for each company shown. +

    + +{% for s in sponsors %} +{%ifchanged s.sponsortype %} +{%if not forloop.first %} + + + +{%endif%} +
    + + + + + + +{%endifchanged%} + + + + + +{%endfor%} +

    {{s.sponsortype.typename}}

    {{s.sponsortype.description}}
    {{s.name}} logo{{s.name}}{{s.country}}
    +
    + +
    + + + + + + +
    Sponsorship levels are meant to provide the general public and idea of how levels are determined. + They are not set in stone and all sponsorship recognition shall be determined on its own merits by the + Sponsorship Committee as determined by a simple majority vote. +
    + +
    + +{%endblock%} + diff --git a/tools/docs/docload.py b/tools/docs/docload.py new file mode 100755 index 00000000..5abc2f73 --- /dev/null +++ b/tools/docs/docload.py @@ -0,0 +1,87 @@ +#!/usr/bin/env python + +# Script to load documentation from tarballs + +import sys +import os +import tarfile +import re +import tidy +import psycopg2 + +pagecount = 0 + +re_titlematch = re.compile('([^<]+)', re.IGNORECASE) + +## Load a single page +def load_doc_file(filename, f): + tidyopts = dict(drop_proprietary_attributes=1, + alt_text='', + hide_comments=1, + output_xhtml=1, + show_body_only=1, + clean=1, + char_encoding='utf8', + indent='auto', + ) + + contents = unicode(f.read(),'latin1') + tm = re_titlematch.search(contents) + if tm: + title = tm.group(1) + else: + title = "" + print "--- file: %s (%s) ---" % (filename, title) + + s = tidy.parseString(contents.encode('utf-8'), **tidyopts) + curs.execute("INSERT INTO docs (file, version, title, content) VALUES (%(f)s, %(v)s, %(t)s, %(c)s)",{ + 'f': filename, + 'v': ver, + 't': title, + 'c': str(s), + }) + global pagecount + pagecount += 1 + +## Your typical usage message +def Usage(): + print "Usage: docload.py " + sys.exit(1) + +## Main execution + +if len(sys.argv) != 3: + Usage() + +ver = sys.argv[1] +tarfilename = sys.argv[2] + +if not os.path.isfile(tarfilename): + print "File %s not found" % tarfilename + sys.exit(1) + +tf = tarfile.open(tarfilename) + +db = psycopg2.connect('host=/tmp dbname=pgweb') +curs = db.cursor() +# Remove any old docs for this version (still protected by a transaction while +# we perform the load) +curs.execute("DELETE FROM docs WHERE version=%(v)s", {'v': ver}) + + +re_htmlfile = re.compile('[^/]*/doc/src/sgml/html/.*') +re_tarfile = re.compile('[^/]*/doc/postgres.tar.gz$') +for member in tf: + if re_htmlfile.match(member.name): + load_doc_file(os.path.basename(member.name), tf.extractfile(member)) + if re_tarfile.match(member.name): + f = tf.extractfile(member) + inner_tar = tarfile.open(fileobj=f) + for inner_member in inner_tar: + if inner_member.name.endswith('.html') or inner_member.name.endswith('.htm'): + load_doc_file(inner_member.name, inner_tar.extractfile(inner_member)) +tf.close() + +db.commit() +print "Done (%i pages)." % pagecount +