aboutsummaryrefslogtreecommitdiffstats
path: root/topics/project-management
diff options
context:
space:
mode:
authorTom Christie2014-12-18 13:49:50 +0000
committerTom Christie2014-12-18 13:49:50 +0000
commitc678a1f118ea65fc1d13c40ef1a083577fdd5381 (patch)
treeab605146f9cb29aab24bad787affa8eaad4e8acb /topics/project-management
parentf8adbda0790679bdb6331894ece5a70e2bf0ba31 (diff)
downloaddjango-rest-framework-c678a1f118ea65fc1d13c40ef1a083577fdd5381.tar.bz2
Update documentation
Diffstat (limited to 'topics/project-management')
-rw-r--r--topics/project-management/index.html537
1 files changed, 537 insertions, 0 deletions
diff --git a/topics/project-management/index.html b/topics/project-management/index.html
new file mode 100644
index 00000000..036e23a0
--- /dev/null
+++ b/topics/project-management/index.html
@@ -0,0 +1,537 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <meta charset="utf-8">
+ <title>Project management - Django REST framework</title>
+ <link href="../../img/favicon.ico" rel="icon" type="image/x-icon">
+ <link rel="canonical" href="http://www.django-rest-framework.org/topics/project-management/" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="description" content="Django, API, REST, Project management">
+ <meta name="author" content="Tom Christie">
+
+ <!-- Le styles -->
+ <link href="../../css/prettify.css" rel="stylesheet">
+ <link href="../../css/bootstrap.css" rel="stylesheet">
+ <link href="../../css/bootstrap-responsive.css" rel="stylesheet">
+ <link href="../../css/default.css" rel="stylesheet">
+
+ <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
+ <!--[if lt IE 9]>
+ <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+ <![endif]-->
+
+ <script type="text/javascript">
+ var _gaq = _gaq || [];
+ _gaq.push(['_setAccount', 'UA-18852272-2']);
+ _gaq.push(['_trackPageview']);
+
+ (function() {
+ var ga = document.createElement('script');
+ ga.type = 'text/javascript';
+ ga.async = true;
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(ga, s);
+ })();
+ </script>
+
+ <style>
+ span.fusion-wrap a {
+ display: block;
+ margin-top: 10px;
+ color: black;
+ }
+ a.fusion-poweredby {
+ display: block;
+ margin-top: 10px;
+ }
+ @media (max-width: 767px) {
+ div.promo {
+ display: none;
+ }
+ }
+ </style>
+</head>
+<body onload="prettyPrint()" class="-page">
+
+ <div class="wrapper">
+
+ <div class="navbar navbar-inverse navbar-fixed-top">
+ <div class="navbar-inner">
+ <div class="container-fluid">
+ <a class="repo-link btn btn-primary btn-small" href="https://github.com/tomchristie/django-rest-framework/tree/master">GitHub</a>
+ <a class="repo-link btn btn-inverse btn-small " rel="prev" href="../rest-framework-2-announcement">
+ Next <i class="icon-arrow-right icon-white"></i>
+ </a>
+ <a class="repo-link btn btn-inverse btn-small " rel="next" href="../contributing">
+ <i class="icon-arrow-left icon-white"></i> Previous
+ </a>
+ <a class="repo-link btn btn-inverse btn-small" href="#searchModal" data-toggle="modal"><i class="icon-search icon-white"></i> Search</a>
+ <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ </a>
+ <a class="brand" href="http://www.django-rest-framework.org">Django REST framework</a>
+ <div class="nav-collapse collapse">
+
+ <!-- Main navigation -->
+ <ul class="nav navbar-nav">
+ <li ><a href="/">Home</a></li>
+
+ <li class="dropdown">
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown">Tutorial <b class="caret"></b></a>
+ <ul class="dropdown-menu">
+
+ <li >
+ <a href="../../tutorial/quickstart">Quickstart</a>
+ </li>
+
+ <li >
+ <a href="../../tutorial/1-serialization">1 - Serialization</a>
+ </li>
+
+ <li >
+ <a href="../../tutorial/2-requests-and-responses">2 - Requests and responses</a>
+ </li>
+
+ <li >
+ <a href="../../tutorial/3-class-based-views">3 - Class based views</a>
+ </li>
+
+ <li >
+ <a href="../../tutorial/4-authentication-and-permissions">4 - Authentication and permissions</a>
+ </li>
+
+ <li >
+ <a href="../../tutorial/5-relationships-and-hyperlinked-apis">5 - Relationships and hyperlinked APIs</a>
+ </li>
+
+ <li >
+ <a href="../../tutorial/6-viewsets-and-routers">6 - Viewsets and routers</a>
+ </li>
+
+ </ul>
+ </li>
+
+ <li class="dropdown">
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown">API Guide <b class="caret"></b></a>
+ <ul class="dropdown-menu">
+
+ <li >
+ <a href="../../api-guide/requests">Requests</a>
+ </li>
+
+ <li >
+ <a href="../../api-guide/responses">Responses</a>
+ </li>
+
+ <li >
+ <a href="../../api-guide/views">Views</a>
+ </li>
+
+ <li >
+ <a href="../../api-guide/generic-views">Generic views</a>
+ </li>
+
+ <li >
+ <a href="../../api-guide/viewsets">Viewsets</a>
+ </li>
+
+ <li >
+ <a href="../../api-guide/routers">Routers</a>
+ </li>
+
+ <li >
+ <a href="../../api-guide/parsers">Parsers</a>
+ </li>
+
+ <li >
+ <a href="../../api-guide/renderers">Renderers</a>
+ </li>
+
+ <li >
+ <a href="../../api-guide/serializers">Serializers</a>
+ </li>
+
+ <li >
+ <a href="../../api-guide/fields">Serializer fields</a>
+ </li>
+
+ <li >
+ <a href="../../api-guide/relations">Serializer relations</a>
+ </li>
+
+ <li >
+ <a href="../../api-guide/validators">Validators</a>
+ </li>
+
+ <li >
+ <a href="../../api-guide/authentication">Authentication</a>
+ </li>
+
+ <li >
+ <a href="../../api-guide/permissions">Permissions</a>
+ </li>
+
+ <li >
+ <a href="../../api-guide/throttling">Throttling</a>
+ </li>
+
+ <li >
+ <a href="../../api-guide/filtering">Filtering</a>
+ </li>
+
+ <li >
+ <a href="../../api-guide/pagination">Pagination</a>
+ </li>
+
+ <li >
+ <a href="../../api-guide/content-negotiation">Content negotiation</a>
+ </li>
+
+ <li >
+ <a href="../../api-guide/format-suffixes">Format suffixes</a>
+ </li>
+
+ <li >
+ <a href="../../api-guide/reverse">Returning URLs</a>
+ </li>
+
+ <li >
+ <a href="../../api-guide/exceptions">Exceptions</a>
+ </li>
+
+ <li >
+ <a href="../../api-guide/status-codes">Status codes</a>
+ </li>
+
+ <li >
+ <a href="../../api-guide/testing">Testing</a>
+ </li>
+
+ <li >
+ <a href="../../api-guide/settings">Settings</a>
+ </li>
+
+ </ul>
+ </li>
+
+ <li class="dropdown active">
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown">Topics <b class="caret"></b></a>
+ <ul class="dropdown-menu">
+
+ <li >
+ <a href="../documenting-your-api">Documenting your API</a>
+ </li>
+
+ <li >
+ <a href="../ajax-csrf-cors">AJAX, CSRF & CORS</a>
+ </li>
+
+ <li >
+ <a href="../browser-enhancements">Browser enhancements</a>
+ </li>
+
+ <li >
+ <a href="../browsable-api">The Browsable API</a>
+ </li>
+
+ <li >
+ <a href="../rest-hypermedia-hateoas">REST, Hypermedia & HATEOAS</a>
+ </li>
+
+ <li >
+ <a href="../third-party-resources">Third Party Resources</a>
+ </li>
+
+ <li >
+ <a href="../contributing">Contributing to REST framework</a>
+ </li>
+
+ <li class="active" >
+ <a href=".">Project management</a>
+ </li>
+
+ <li >
+ <a href="../rest-framework-2-announcement">2.0 Announcement</a>
+ </li>
+
+ <li >
+ <a href="../2.2-announcement">2.2 Announcement</a>
+ </li>
+
+ <li >
+ <a href="../2.3-announcement">2.3 Announcement</a>
+ </li>
+
+ <li >
+ <a href="../2.4-announcement">2.4 Announcement</a>
+ </li>
+
+ <li >
+ <a href="../3.0-announcement">3.0 Announcement</a>
+ </li>
+
+ <li >
+ <a href="../kickstarter-announcement">Kickstarter Announcement</a>
+ </li>
+
+ <li >
+ <a href="../release-notes">Release Notes</a>
+ </li>
+
+ <li >
+ <a href="../credits">Credits</a>
+ </li>
+
+ </ul>
+ </li>
+
+
+ </ul>
+
+ </div>
+ <!--/.nav-collapse -->
+
+ </div>
+ </div>
+ </div>
+
+ <div class="body-content">
+ <div class="container-fluid">
+
+ <!-- Search Modal -->
+ <div id="searchModal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h3 id="myModalLabel">Documentation search</h3>
+ </div>
+
+ <div class="modal-body">
+ <!-- Custom google search -->
+ <script>
+ (function() {
+ var cx = '015016005043623903336:rxraeohqk6w';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') +
+ '//www.google.com/cse/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+
+ <div class="modal-footer">
+ <button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
+ </div>
+ </div>
+
+ <div class="row-fluid">
+
+ <div class="span3">
+ <!-- TODO
+ <p style="margin-top: -12px">
+ <a class="btn btn-mini btn-primary" style="width: 60px">&laquo; previous</a>
+ <a class="btn btn-mini btn-primary" style="float: right; margin-right: 8px; width: 60px;">next &raquo;</a>
+ </p>
+ -->
+ <div id="table-of-contents">
+ <ul class="nav nav-list side-nav well sidebar-nav-fixed">
+
+
+
+
+
+ <li class="main">
+ <a href="#project-management">Project management</a>
+ </li>
+
+
+ <li>
+ <a href="#maintenance-team">Maintenance team</a>
+ </li>
+
+ <li>
+ <a href="#release-process">Release process</a>
+ </li>
+
+ <li>
+ <a href="#project-ownership">Project ownership</a>
+ </li>
+
+
+
+
+
+
+ </ul>
+
+ </div>
+ </div>
+
+ <div id="main-content" class="span9">
+
+
+ <h1 id="project-management">Project management</h1>
+<blockquote>
+<p>"No one can whistle a symphony; it takes a whole orchestra to play it"</p>
+<p>&mdash; Halford E. Luccock</p>
+</blockquote>
+<p>This document outlines our project management processes for REST framework.</p>
+<p>The aim is to ensure that the project has a high
+<a href="http://en.wikipedia.org/wiki/Bus_factor">"bus factor"</a>, and can continue to remain well supported for the foreseeable future. Suggestions for improvements to our process are welcome.</p>
+<hr />
+<h2 id="maintenance-team">Maintenance team</h2>
+<p>We have a quarterly maintenance cycle where new members may join the maintenance team. We currently cap the size of the team at 5 members, and may encourage folks to step out of the team for a cycle to allow new members to participate.</p>
+<h4 id="current-team">Current team</h4>
+<p>The <a href="https://github.com/tomchristie/django-rest-framework/issues/2190">maintenance team for Q1 2015</a>:</p>
+<ul>
+<li><a href="https://github.com/tomchristie/">@tomchristie</a></li>
+<li><a href="https://github.com/xordoquy/">@xordoquy</a> (Release manager.)</li>
+<li><a href="https://github.com/carltongibson/">@carltongibson</a></li>
+<li><a href="https://github.com/kevin-brown/">@kevin-brown</a></li>
+<li><a href="https://github.com/jpadilla/">@jpadilla</a></li>
+</ul>
+<h4 id="maintenance-cycles">Maintenance cycles</h4>
+<p>Each maintenance cycle is initiated by an issue being opened with the <code>Process</code> label.</p>
+<ul>
+<li>To be considered for a maintainer role simply comment against the issue.</li>
+<li>Existing members must explicitly opt-in to the next cycle by check-marking their name.</li>
+<li>The final decision on the incoming team will be made by <code>@tomchristie</code>.</li>
+</ul>
+<p>Members of the maintenance team will be added as collaborators to the repository.</p>
+<p>The following template should be used for the description of the issue, and serves as the formal process for selecting the team.</p>
+<pre><code>This issue is for determining the maintenance team for the *** period.
+
+Please see the [Project management](http://www.django-rest-framework.org/topics/project-management/) section of our documentation for more details.
+
+---
+
+#### Renewing existing members.
+
+The following people are the current maintenance team. Please checkmark your name if you wish to continue to have write permission on the repository for the *** period.
+
+- [ ] @***
+- [ ] @***
+- [ ] @***
+- [ ] @***
+- [ ] @***
+
+---
+
+#### New members.
+
+If you wish to be considered for this or a future date, please comment against this or subsequent issues.
+</code></pre>
+<h4 id="responsibilities-of-team-members">Responsibilities of team members</h4>
+<p>Team members have the following responsibilities.</p>
+<ul>
+<li>Add triage labels and milestones to tickets.</li>
+<li>Close invalid or resolved tickets.</li>
+<li>Merge finalized pull requests.</li>
+<li>Build and deploy the documentation, using <code>mkdocs gh-deploy</code>.</li>
+</ul>
+<p>Further notes for maintainers:</p>
+<ul>
+<li>Code changes should come in the form of a pull request - do not push directly to master.</li>
+<li>Maintainers should typically not merge their own pull requests.</li>
+<li>Each issue/pull request should have exactly one label once triaged.</li>
+<li>Search for un-triaged issues with <a href="https://github.com/tomchristie/django-rest-framework/issues?q=is%3Aopen+no%3Alabel">is:open no:label</a>.</li>
+</ul>
+<p>It should be noted that participating actively in the REST framework project clearly <strong>does not require being part of the maintenance team</strong>. Almost every import part of issue triage and project improvement can be actively worked on regardless of your collaborator status on the repository.</p>
+<hr />
+<h2 id="release-process">Release process</h2>
+<p>The release manager is selected on every quarterly maintenance cycle.</p>
+<ul>
+<li>The manager should be selected by <code>@tomchristie</code>.</li>
+<li>The manager will then have the maintainer role added to PyPI package.</li>
+<li>The previous manager will then have the maintainer role removed from the PyPI package.</li>
+</ul>
+<p>Our PyPI releases will be handled by either the current release manager, or by <code>@tomchristie</code>. Every release should have an open issue tagged with the <code>Release</code> label and marked against the appropriate milestone.</p>
+<p>The following template should be used for the description of the issue, and serves as a release checklist.</p>
+<pre><code>Release manager is @***.
+Pull request is #***.
+
+Checklist:
+
+- [ ] Create pull request for [release notes](https://github.com/tomchristie/django-rest-framework/blob/master/docs/topics/release-notes.md) based on the [*.*.* milestone](https://github.com/tomchristie/django-rest-framework/milestones/***).
+- [ ] Ensure the pull request increments the version to `*.*.*` in [`restframework/__init__.py`](https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/__init__.py).
+- [ ] Confirm with @tomchristie that release is finalized and ready to go.
+- [ ] Ensure that release date is included in pull request.
+- [ ] Merge the release pull request.
+- [ ] Push the package to PyPI with `./setup.py publish`.
+- [ ] Tag the release, with `git tag -a *.*.* -m 'version *.*.*'; git push --tags`.
+- [ ] Deploy the documentation with `mkdocs gh-deploy`.
+- [ ] Make a release announcement on the [discussion group](https://groups.google.com/forum/?fromgroups#!forum/django-rest-framework).
+- [ ] Make a release announcement on twitter.
+- [ ] Close the milestone on GitHub.
+</code></pre>
+<p>When pushing the release to PyPI ensure that your environment has been installed from our development <code>requirement.txt</code>, so that documentation and PyPI installs are consistently being built against a pinned set of packages.</p>
+<hr />
+<h2 id="project-ownership">Project ownership</h2>
+<p>The PyPI package is owned by <code>@tomchristie</code>. As a backup <code>@j4mie</code> also has ownership of the package.</p>
+<p>If <code>@tomchristie</code> ceases to participate in the project then <code>@j4mie</code> has responsibility for handing over ownership duties.</p>
+<h4 id="outstanding-management-ownership-issues">Outstanding management &amp; ownership issues</h4>
+<p>The following issues still need to be addressed:</p>
+<ul>
+<li><a href="https://github.com/tomchristie/django-rest-framework/issues/2162">Consider moving the repo into a proper GitHub organization</a>.</li>
+<li>Ensure <code>@jamie</code> has back-up access to the <code>django-rest-framework.org</code> domain setup and admin.</li>
+<li>Document ownership of the <a href="http://restframework.herokuapp.com/">live example</a> API.</li>
+<li>Document ownership of the <a href="https://groups.google.com/forum/#!forum/django-rest-framework">mailing list</a> and IRC channel.</li>
+</ul>
+
+ </div>
+ <!--/span-->
+ </div>
+ <!--/row-->
+ </div>
+ <!--/.fluid-container-->
+ </div>
+ <!--/.body content-->
+ <div id="push"></div>
+ </div>
+ <!--/.wrapper -->
+
+ <footer class="span12">
+ <p>Documentation built with <a href="http://www.mkdocs.org/">MkDocs</a>.</a>
+ </p>
+ </footer>
+
+ <!-- Le javascript
+ ================================================== -->
+ <!-- Placed at the end of the document so the pages load faster -->
+ <script src="../../js/jquery-1.8.1-min.js"></script>
+ <script src="../../js/prettify-1.0.js"></script>
+ <script src="../../js/bootstrap-2.1.1-min.js"></script>
+ <script src="../../js/theme.js"></script>
+
+ <script>
+ //$('.side-nav').scrollspy()
+ var shiftWindow = function() {
+ scrollBy(0, -50)
+ };
+ if (location.hash) shiftWindow();
+ window.addEventListener("hashchange", shiftWindow);
+
+ $('.dropdown-menu').on('click touchstart', function(event) {
+ event.stopPropagation();
+ });
+
+ // Dynamically force sidenav to no higher than browser window
+ $('.side-nav').css('max-height', window.innerHeight - 130);
+
+ $(function() {
+ $(window).resize(function() {
+ $('.side-nav').css('max-height', window.innerHeight - 130);
+ });
+ });
+ </script>
+</body>
+
+</html> \ No newline at end of file