Remove erronous htmlcov files

This commit is contained in:
Tom Christie 2013-06-21 22:04:38 +01:00
parent 3d4bb4b553
commit f2e6af8975
46 changed files with 0 additions and 20271 deletions

View File

@ -1,372 +0,0 @@
// Coverage.py HTML report browser code.
/*jslint browser: true, sloppy: true, vars: true, plusplus: true, maxerr: 50, indent: 4 */
/*global coverage: true, document, window, $ */
coverage = {};
// Find all the elements with shortkey_* class, and use them to assign a shotrtcut key.
coverage.assign_shortkeys = function () {
$("*[class*='shortkey_']").each(function (i, e) {
$.each($(e).attr("class").split(" "), function (i, c) {
if (/^shortkey_/.test(c)) {
$(document).bind('keydown', c.substr(9), function () {
$(e).click();
});
}
});
});
};
// Create the events for the help panel.
coverage.wire_up_help_panel = function () {
$("#keyboard_icon").click(function () {
// Show the help panel, and position it so the keyboard icon in the
// panel is in the same place as the keyboard icon in the header.
$(".help_panel").show();
var koff = $("#keyboard_icon").offset();
var poff = $("#panel_icon").position();
$(".help_panel").offset({
top: koff.top-poff.top,
left: koff.left-poff.left
});
});
$("#panel_icon").click(function () {
$(".help_panel").hide();
});
};
// Loaded on index.html
coverage.index_ready = function ($) {
// Look for a cookie containing previous sort settings:
var sort_list = [];
var cookie_name = "COVERAGE_INDEX_SORT";
var i;
// This almost makes it worth installing the jQuery cookie plugin:
if (document.cookie.indexOf(cookie_name) > -1) {
var cookies = document.cookie.split(";");
for (i = 0; i < cookies.length; i++) {
var parts = cookies[i].split("=");
if ($.trim(parts[0]) === cookie_name && parts[1]) {
sort_list = eval("[[" + parts[1] + "]]");
break;
}
}
}
// Create a new widget which exists only to save and restore
// the sort order:
$.tablesorter.addWidget({
id: "persistentSort",
// Format is called by the widget before displaying:
format: function (table) {
if (table.config.sortList.length === 0 && sort_list.length > 0) {
// This table hasn't been sorted before - we'll use
// our stored settings:
$(table).trigger('sorton', [sort_list]);
}
else {
// This is not the first load - something has
// already defined sorting so we'll just update
// our stored value to match:
sort_list = table.config.sortList;
}
}
});
// Configure our tablesorter to handle the variable number of
// columns produced depending on report options:
var headers = [];
var col_count = $("table.index > thead > tr > th").length;
headers[0] = { sorter: 'text' };
for (i = 1; i < col_count-1; i++) {
headers[i] = { sorter: 'digit' };
}
headers[col_count-1] = { sorter: 'percent' };
// Enable the table sorter:
$("table.index").tablesorter({
widgets: ['persistentSort'],
headers: headers
});
coverage.assign_shortkeys();
coverage.wire_up_help_panel();
// Watch for page unload events so we can save the final sort settings:
$(window).unload(function () {
document.cookie = cookie_name + "=" + sort_list.toString() + "; path=/";
});
};
// -- pyfile stuff --
coverage.pyfile_ready = function ($) {
// If we're directed to a particular line number, highlight the line.
var frag = location.hash;
if (frag.length > 2 && frag[1] === 'n') {
$(frag).addClass('highlight');
coverage.set_sel(parseInt(frag.substr(2), 10));
}
else {
coverage.set_sel(0);
}
$(document)
.bind('keydown', 'j', coverage.to_next_chunk_nicely)
.bind('keydown', 'k', coverage.to_prev_chunk_nicely)
.bind('keydown', '0', coverage.to_top)
.bind('keydown', '1', coverage.to_first_chunk)
;
coverage.assign_shortkeys();
coverage.wire_up_help_panel();
};
coverage.toggle_lines = function (btn, cls) {
btn = $(btn);
var hide = "hide_"+cls;
if (btn.hasClass(hide)) {
$("#source ."+cls).removeClass(hide);
btn.removeClass(hide);
}
else {
$("#source ."+cls).addClass(hide);
btn.addClass(hide);
}
};
// Return the nth line div.
coverage.line_elt = function (n) {
return $("#t" + n);
};
// Return the nth line number div.
coverage.num_elt = function (n) {
return $("#n" + n);
};
// Return the container of all the code.
coverage.code_container = function () {
return $(".linenos");
};
// Set the selection. b and e are line numbers.
coverage.set_sel = function (b, e) {
// The first line selected.
coverage.sel_begin = b;
// The next line not selected.
coverage.sel_end = (e === undefined) ? b+1 : e;
};
coverage.to_top = function () {
coverage.set_sel(0, 1);
coverage.scroll_window(0);
};
coverage.to_first_chunk = function () {
coverage.set_sel(0, 1);
coverage.to_next_chunk();
};
coverage.is_transparent = function (color) {
// Different browsers return different colors for "none".
return color === "transparent" || color === "rgba(0, 0, 0, 0)";
};
coverage.to_next_chunk = function () {
var c = coverage;
// Find the start of the next colored chunk.
var probe = c.sel_end;
while (true) {
var probe_line = c.line_elt(probe);
if (probe_line.length === 0) {
return;
}
var color = probe_line.css("background-color");
if (!c.is_transparent(color)) {
break;
}
probe++;
}
// There's a next chunk, `probe` points to it.
var begin = probe;
// Find the end of this chunk.
var next_color = color;
while (next_color === color) {
probe++;
probe_line = c.line_elt(probe);
next_color = probe_line.css("background-color");
}
c.set_sel(begin, probe);
c.show_selection();
};
coverage.to_prev_chunk = function () {
var c = coverage;
// Find the end of the prev colored chunk.
var probe = c.sel_begin-1;
var probe_line = c.line_elt(probe);
if (probe_line.length === 0) {
return;
}
var color = probe_line.css("background-color");
while (probe > 0 && c.is_transparent(color)) {
probe--;
probe_line = c.line_elt(probe);
if (probe_line.length === 0) {
return;
}
color = probe_line.css("background-color");
}
// There's a prev chunk, `probe` points to its last line.
var end = probe+1;
// Find the beginning of this chunk.
var prev_color = color;
while (prev_color === color) {
probe--;
probe_line = c.line_elt(probe);
prev_color = probe_line.css("background-color");
}
c.set_sel(probe+1, end);
c.show_selection();
};
// Return the line number of the line nearest pixel position pos
coverage.line_at_pos = function (pos) {
var l1 = coverage.line_elt(1),
l2 = coverage.line_elt(2),
result;
if (l1.length && l2.length) {
var l1_top = l1.offset().top,
line_height = l2.offset().top - l1_top,
nlines = (pos - l1_top) / line_height;
if (nlines < 1) {
result = 1;
}
else {
result = Math.ceil(nlines);
}
}
else {
result = 1;
}
return result;
};
// Returns 0, 1, or 2: how many of the two ends of the selection are on
// the screen right now?
coverage.selection_ends_on_screen = function () {
if (coverage.sel_begin === 0) {
return 0;
}
var top = coverage.line_elt(coverage.sel_begin);
var next = coverage.line_elt(coverage.sel_end-1);
return (
(top.isOnScreen() ? 1 : 0) +
(next.isOnScreen() ? 1 : 0)
);
};
coverage.to_next_chunk_nicely = function () {
coverage.finish_scrolling();
if (coverage.selection_ends_on_screen() === 0) {
// The selection is entirely off the screen: select the top line on
// the screen.
var win = $(window);
coverage.select_line_or_chunk(coverage.line_at_pos(win.scrollTop()));
}
coverage.to_next_chunk();
};
coverage.to_prev_chunk_nicely = function () {
coverage.finish_scrolling();
if (coverage.selection_ends_on_screen() === 0) {
var win = $(window);
coverage.select_line_or_chunk(coverage.line_at_pos(win.scrollTop() + win.height()));
}
coverage.to_prev_chunk();
};
// Select line number lineno, or if it is in a colored chunk, select the
// entire chunk
coverage.select_line_or_chunk = function (lineno) {
var c = coverage;
var probe_line = c.line_elt(lineno);
if (probe_line.length === 0) {
return;
}
var the_color = probe_line.css("background-color");
if (!c.is_transparent(the_color)) {
// The line is in a highlighted chunk.
// Search backward for the first line.
var probe = lineno;
var color = the_color;
while (probe > 0 && color === the_color) {
probe--;
probe_line = c.line_elt(probe);
if (probe_line.length === 0) {
break;
}
color = probe_line.css("background-color");
}
var begin = probe + 1;
// Search forward for the last line.
probe = lineno;
color = the_color;
while (color === the_color) {
probe++;
probe_line = c.line_elt(probe);
color = probe_line.css("background-color");
}
coverage.set_sel(begin, probe);
}
else {
coverage.set_sel(lineno);
}
};
coverage.show_selection = function () {
var c = coverage;
// Highlight the lines in the chunk
c.code_container().find(".highlight").removeClass("highlight");
for (var probe = c.sel_begin; probe > 0 && probe < c.sel_end; probe++) {
c.num_elt(probe).addClass("highlight");
}
c.scroll_to_selection();
};
coverage.scroll_to_selection = function () {
// Scroll the page if the chunk isn't fully visible.
if (coverage.selection_ends_on_screen() < 2) {
// Need to move the page. The html,body trick makes it scroll in all
// browsers, got it from http://stackoverflow.com/questions/3042651
var top = coverage.line_elt(coverage.sel_begin);
var top_pos = parseInt(top.offset().top, 10);
coverage.scroll_window(top_pos - 30);
}
};
coverage.scroll_window = function (to_pos) {
$("html,body").animate({scrollTop: to_pos}, 200);
};
coverage.finish_scrolling = function () {
$("html,body").stop(true, true);
};

View File

@ -1,404 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<title>Coverage report</title>
<link rel='stylesheet' href='style.css' type='text/css'>
<script type='text/javascript' src='jquery-1.4.3.min.js'></script>
<script type='text/javascript' src='jquery.tablesorter.min.js'></script>
<script type='text/javascript' src='jquery.hotkeys.js'></script>
<script type='text/javascript' src='coverage_html.js'></script>
<script type='text/javascript' charset='utf-8'>
jQuery(document).ready(coverage.index_ready);
</script>
</head>
<body id='indexfile'>
<div id='header'>
<div class='content'>
<h1>Coverage report:
<span class='pc_cov'>89%</span>
</h1>
<img id='keyboard_icon' src='keybd_closed.png'>
</div>
</div>
<div class='help_panel'>
<img id='panel_icon' src='keybd_open.png'>
<p class='legend'>Hot-keys on this page</p>
<div>
<p class='keyhelp'>
<span class='key'>n</span>
<span class='key'>s</span>
<span class='key'>m</span>
<span class='key'>x</span>
<span class='key'>c</span> &nbsp; change column sorting
</p>
</div>
</div>
<div id='index'>
<table class='index'>
<thead>
<tr class='tablehead' title='Click to sort'>
<th class='name left headerSortDown shortkey_n'>Module</th>
<th class='shortkey_s'>statements</th>
<th class='shortkey_m'>missing</th>
<th class='shortkey_x'>excluded</th>
<th class='right shortkey_c'>coverage</th>
</tr>
</thead>
<tfoot>
<tr class='total'>
<td class='name left'>Total</td>
<td>3621</td>
<td>406</td>
<td>0</td>
<td class='right'>89%</td>
</tr>
</tfoot>
<tbody>
<tr class='file'>
<td class='name left'><a href='rest_framework___init__.html'>rest_framework/__init__</a></td>
<td>4</td>
<td>0</td>
<td>0</td>
<td class='right'>100%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='rest_framework_authentication.html'>rest_framework/authentication</a></td>
<td>169</td>
<td>33</td>
<td>0</td>
<td class='right'>80%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='rest_framework_authtoken___init__.html'>rest_framework/authtoken/__init__</a></td>
<td>0</td>
<td>0</td>
<td>0</td>
<td class='right'>100%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='rest_framework_authtoken_models.html'>rest_framework/authtoken/models</a></td>
<td>21</td>
<td>1</td>
<td>0</td>
<td class='right'>95%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='rest_framework_authtoken_serializers.html'>rest_framework/authtoken/serializers</a></td>
<td>17</td>
<td>2</td>
<td>0</td>
<td class='right'>88%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='rest_framework_authtoken_views.html'>rest_framework/authtoken/views</a></td>
<td>21</td>
<td>0</td>
<td>0</td>
<td class='right'>100%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='rest_framework_decorators.html'>rest_framework/decorators</a></td>
<td>60</td>
<td>0</td>
<td>0</td>
<td class='right'>100%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='rest_framework_exceptions.html'>rest_framework/exceptions</a></td>
<td>51</td>
<td>2</td>
<td>0</td>
<td class='right'>96%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='rest_framework_fields.html'>rest_framework/fields</a></td>
<td>594</td>
<td>80</td>
<td>0</td>
<td class='right'>87%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='rest_framework_filters.html'>rest_framework/filters</a></td>
<td>77</td>
<td>6</td>
<td>0</td>
<td class='right'>92%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='rest_framework_generics.html'>rest_framework/generics</a></td>
<td>196</td>
<td>34</td>
<td>0</td>
<td class='right'>83%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='rest_framework_mixins.html'>rest_framework/mixins</a></td>
<td>97</td>
<td>7</td>
<td>0</td>
<td class='right'>93%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='rest_framework_models.html'>rest_framework/models</a></td>
<td>0</td>
<td>0</td>
<td>0</td>
<td class='right'>100%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='rest_framework_negotiation.html'>rest_framework/negotiation</a></td>
<td>41</td>
<td>4</td>
<td>0</td>
<td class='right'>90%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='rest_framework_pagination.html'>rest_framework/pagination</a></td>
<td>43</td>
<td>0</td>
<td>0</td>
<td class='right'>100%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='rest_framework_parsers.html'>rest_framework/parsers</a></td>
<td>153</td>
<td>13</td>
<td>0</td>
<td class='right'>92%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='rest_framework_permissions.html'>rest_framework/permissions</a></td>
<td>63</td>
<td>12</td>
<td>0</td>
<td class='right'>81%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='rest_framework_relations.html'>rest_framework/relations</a></td>
<td>365</td>
<td>88</td>
<td>0</td>
<td class='right'>76%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='rest_framework_renderers.html'>rest_framework/renderers</a></td>
<td>282</td>
<td>23</td>
<td>0</td>
<td class='right'>92%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='rest_framework_request.html'>rest_framework/request</a></td>
<td>161</td>
<td>8</td>
<td>0</td>
<td class='right'>95%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='rest_framework_response.html'>rest_framework/response</a></td>
<td>42</td>
<td>1</td>
<td>0</td>
<td class='right'>98%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='rest_framework_reverse.html'>rest_framework/reverse</a></td>
<td>12</td>
<td>3</td>
<td>0</td>
<td class='right'>75%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='rest_framework_routers.html'>rest_framework/routers</a></td>
<td>108</td>
<td>7</td>
<td>0</td>
<td class='right'>94%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='rest_framework_serializers.html'>rest_framework/serializers</a></td>
<td>464</td>
<td>27</td>
<td>0</td>
<td class='right'>94%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='rest_framework_settings.html'>rest_framework/settings</a></td>
<td>44</td>
<td>2</td>
<td>0</td>
<td class='right'>95%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='rest_framework_status.html'>rest_framework/status</a></td>
<td>46</td>
<td>0</td>
<td>0</td>
<td class='right'>100%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='rest_framework_throttling.html'>rest_framework/throttling</a></td>
<td>90</td>
<td>17</td>
<td>0</td>
<td class='right'>81%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='rest_framework_urlpatterns.html'>rest_framework/urlpatterns</a></td>
<td>31</td>
<td>4</td>
<td>0</td>
<td class='right'>87%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='rest_framework_urls.html'>rest_framework/urls</a></td>
<td>4</td>
<td>0</td>
<td>0</td>
<td class='right'>100%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='rest_framework_utils___init__.html'>rest_framework/utils/__init__</a></td>
<td>0</td>
<td>0</td>
<td>0</td>
<td class='right'>100%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='rest_framework_utils_breadcrumbs.html'>rest_framework/utils/breadcrumbs</a></td>
<td>27</td>
<td>0</td>
<td>0</td>
<td class='right'>100%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='rest_framework_utils_encoders.html'>rest_framework/utils/encoders</a></td>
<td>70</td>
<td>19</td>
<td>0</td>
<td class='right'>73%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='rest_framework_utils_formatting.html'>rest_framework/utils/formatting</a></td>
<td>39</td>
<td>1</td>
<td>0</td>
<td class='right'>97%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='rest_framework_utils_mediatypes.html'>rest_framework/utils/mediatypes</a></td>
<td>44</td>
<td>10</td>
<td>0</td>
<td class='right'>77%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='rest_framework_views.html'>rest_framework/views</a></td>
<td>146</td>
<td>0</td>
<td>0</td>
<td class='right'>100%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='rest_framework_viewsets.html'>rest_framework/viewsets</a></td>
<td>39</td>
<td>2</td>
<td>0</td>
<td class='right'>95%</td>
</tr>
</tbody>
</table>
</div>
<div id='footer'>
<div class='content'>
<p>
<a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.5.1</a>
</p>
</div>
</div>
</body>
</html>

View File

@ -1,166 +0,0 @@
/*!
* jQuery JavaScript Library v1.4.3
* http://jquery.com/
*
* Copyright 2010, John Resig
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
* Includes Sizzle.js
* http://sizzlejs.com/
* Copyright 2010, The Dojo Foundation
* Released under the MIT, BSD, and GPL Licenses.
*
* Date: Thu Oct 14 23:10:06 2010 -0400
*/
(function(E,A){function U(){return false}function ba(){return true}function ja(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function Ga(a){var b,d,e=[],f=[],h,k,l,n,s,v,B,D;k=c.data(this,this.nodeType?"events":"__events__");if(typeof k==="function")k=k.events;if(!(a.liveFired===this||!k||!k.live||a.button&&a.type==="click")){if(a.namespace)D=RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)");a.liveFired=this;var H=k.live.slice(0);for(n=0;n<H.length;n++){k=H[n];k.origType.replace(X,
"")===a.type?f.push(k.selector):H.splice(n--,1)}f=c(a.target).closest(f,a.currentTarget);s=0;for(v=f.length;s<v;s++){B=f[s];for(n=0;n<H.length;n++){k=H[n];if(B.selector===k.selector&&(!D||D.test(k.namespace))){l=B.elem;h=null;if(k.preType==="mouseenter"||k.preType==="mouseleave"){a.type=k.preType;h=c(a.relatedTarget).closest(k.selector)[0]}if(!h||h!==l)e.push({elem:l,handleObj:k,level:B.level})}}}s=0;for(v=e.length;s<v;s++){f=e[s];if(d&&f.level>d)break;a.currentTarget=f.elem;a.data=f.handleObj.data;
a.handleObj=f.handleObj;D=f.handleObj.origHandler.apply(f.elem,arguments);if(D===false||a.isPropagationStopped()){d=f.level;if(D===false)b=false}}return b}}function Y(a,b){return(a&&a!=="*"?a+".":"")+b.replace(Ha,"`").replace(Ia,"&")}function ka(a,b,d){if(c.isFunction(b))return c.grep(a,function(f,h){return!!b.call(f,h,f)===d});else if(b.nodeType)return c.grep(a,function(f){return f===b===d});else if(typeof b==="string"){var e=c.grep(a,function(f){return f.nodeType===1});if(Ja.test(b))return c.filter(b,
e,!d);else b=c.filter(b,e)}return c.grep(a,function(f){return c.inArray(f,b)>=0===d})}function la(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var e=c.data(a[d++]),f=c.data(this,e);if(e=e&&e.events){delete f.handle;f.events={};for(var h in e)for(var k in e[h])c.event.add(this,h,e[h][k],e[h][k].data)}}})}function Ka(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}
function ma(a,b,d){var e=b==="width"?a.offsetWidth:a.offsetHeight;if(d==="border")return e;c.each(b==="width"?La:Ma,function(){d||(e-=parseFloat(c.css(a,"padding"+this))||0);if(d==="margin")e+=parseFloat(c.css(a,"margin"+this))||0;else e-=parseFloat(c.css(a,"border"+this+"Width"))||0});return e}function ca(a,b,d,e){if(c.isArray(b)&&b.length)c.each(b,function(f,h){d||Na.test(a)?e(a,h):ca(a+"["+(typeof h==="object"||c.isArray(h)?f:"")+"]",h,d,e)});else if(!d&&b!=null&&typeof b==="object")c.isEmptyObject(b)?
e(a,""):c.each(b,function(f,h){ca(a+"["+f+"]",h,d,e)});else e(a,b)}function S(a,b){var d={};c.each(na.concat.apply([],na.slice(0,b)),function(){d[this]=a});return d}function oa(a){if(!da[a]){var b=c("<"+a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d==="")d="block";da[a]=d}return da[a]}function ea(a){return c.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var u=E.document,c=function(){function a(){if(!b.isReady){try{u.documentElement.doScroll("left")}catch(i){setTimeout(a,
1);return}b.ready()}}var b=function(i,r){return new b.fn.init(i,r)},d=E.jQuery,e=E.$,f,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,k=/\S/,l=/^\s+/,n=/\s+$/,s=/\W/,v=/\d/,B=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,D=/^[\],:{}\s]*$/,H=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,w=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,G=/(?:^|:|,)(?:\s*\[)+/g,M=/(webkit)[ \/]([\w.]+)/,g=/(opera)(?:.*version)?[ \/]([\w.]+)/,j=/(msie) ([\w.]+)/,o=/(mozilla)(?:.*? rv:([\w.]+))?/,m=navigator.userAgent,p=false,
q=[],t,x=Object.prototype.toString,C=Object.prototype.hasOwnProperty,P=Array.prototype.push,N=Array.prototype.slice,R=String.prototype.trim,Q=Array.prototype.indexOf,L={};b.fn=b.prototype={init:function(i,r){var y,z,F;if(!i)return this;if(i.nodeType){this.context=this[0]=i;this.length=1;return this}if(i==="body"&&!r&&u.body){this.context=u;this[0]=u.body;this.selector="body";this.length=1;return this}if(typeof i==="string")if((y=h.exec(i))&&(y[1]||!r))if(y[1]){F=r?r.ownerDocument||r:u;if(z=B.exec(i))if(b.isPlainObject(r)){i=
[u.createElement(z[1])];b.fn.attr.call(i,r,true)}else i=[F.createElement(z[1])];else{z=b.buildFragment([y[1]],[F]);i=(z.cacheable?z.fragment.cloneNode(true):z.fragment).childNodes}return b.merge(this,i)}else{if((z=u.getElementById(y[2]))&&z.parentNode){if(z.id!==y[2])return f.find(i);this.length=1;this[0]=z}this.context=u;this.selector=i;return this}else if(!r&&!s.test(i)){this.selector=i;this.context=u;i=u.getElementsByTagName(i);return b.merge(this,i)}else return!r||r.jquery?(r||f).find(i):b(r).find(i);
else if(b.isFunction(i))return f.ready(i);if(i.selector!==A){this.selector=i.selector;this.context=i.context}return b.makeArray(i,this)},selector:"",jquery:"1.4.3",length:0,size:function(){return this.length},toArray:function(){return N.call(this,0)},get:function(i){return i==null?this.toArray():i<0?this.slice(i)[0]:this[i]},pushStack:function(i,r,y){var z=b();b.isArray(i)?P.apply(z,i):b.merge(z,i);z.prevObject=this;z.context=this.context;if(r==="find")z.selector=this.selector+(this.selector?" ":
"")+y;else if(r)z.selector=this.selector+"."+r+"("+y+")";return z},each:function(i,r){return b.each(this,i,r)},ready:function(i){b.bindReady();if(b.isReady)i.call(u,b);else q&&q.push(i);return this},eq:function(i){return i===-1?this.slice(i):this.slice(i,+i+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(N.apply(this,arguments),"slice",N.call(arguments).join(","))},map:function(i){return this.pushStack(b.map(this,function(r,y){return i.call(r,
y,r)}))},end:function(){return this.prevObject||b(null)},push:P,sort:[].sort,splice:[].splice};b.fn.init.prototype=b.fn;b.extend=b.fn.extend=function(){var i=arguments[0]||{},r=1,y=arguments.length,z=false,F,I,K,J,fa;if(typeof i==="boolean"){z=i;i=arguments[1]||{};r=2}if(typeof i!=="object"&&!b.isFunction(i))i={};if(y===r){i=this;--r}for(;r<y;r++)if((F=arguments[r])!=null)for(I in F){K=i[I];J=F[I];if(i!==J)if(z&&J&&(b.isPlainObject(J)||(fa=b.isArray(J)))){if(fa){fa=false;clone=K&&b.isArray(K)?K:[]}else clone=
K&&b.isPlainObject(K)?K:{};i[I]=b.extend(z,clone,J)}else if(J!==A)i[I]=J}return i};b.extend({noConflict:function(i){E.$=e;if(i)E.jQuery=d;return b},isReady:false,readyWait:1,ready:function(i){i===true&&b.readyWait--;if(!b.readyWait||i!==true&&!b.isReady){if(!u.body)return setTimeout(b.ready,1);b.isReady=true;if(!(i!==true&&--b.readyWait>0)){if(q){for(var r=0;i=q[r++];)i.call(u,b);q=null}b.fn.triggerHandler&&b(u).triggerHandler("ready")}}},bindReady:function(){if(!p){p=true;if(u.readyState==="complete")return setTimeout(b.ready,
1);if(u.addEventListener){u.addEventListener("DOMContentLoaded",t,false);E.addEventListener("load",b.ready,false)}else if(u.attachEvent){u.attachEvent("onreadystatechange",t);E.attachEvent("onload",b.ready);var i=false;try{i=E.frameElement==null}catch(r){}u.documentElement.doScroll&&i&&a()}}},isFunction:function(i){return b.type(i)==="function"},isArray:Array.isArray||function(i){return b.type(i)==="array"},isWindow:function(i){return i&&typeof i==="object"&&"setInterval"in i},isNaN:function(i){return i==
null||!v.test(i)||isNaN(i)},type:function(i){return i==null?String(i):L[x.call(i)]||"object"},isPlainObject:function(i){if(!i||b.type(i)!=="object"||i.nodeType||b.isWindow(i))return false;if(i.constructor&&!C.call(i,"constructor")&&!C.call(i.constructor.prototype,"isPrototypeOf"))return false;for(var r in i);return r===A||C.call(i,r)},isEmptyObject:function(i){for(var r in i)return false;return true},error:function(i){throw i;},parseJSON:function(i){if(typeof i!=="string"||!i)return null;i=b.trim(i);
if(D.test(i.replace(H,"@").replace(w,"]").replace(G,"")))return E.JSON&&E.JSON.parse?E.JSON.parse(i):(new Function("return "+i))();else b.error("Invalid JSON: "+i)},noop:function(){},globalEval:function(i){if(i&&k.test(i)){var r=u.getElementsByTagName("head")[0]||u.documentElement,y=u.createElement("script");y.type="text/javascript";if(b.support.scriptEval)y.appendChild(u.createTextNode(i));else y.text=i;r.insertBefore(y,r.firstChild);r.removeChild(y)}},nodeName:function(i,r){return i.nodeName&&i.nodeName.toUpperCase()===
r.toUpperCase()},each:function(i,r,y){var z,F=0,I=i.length,K=I===A||b.isFunction(i);if(y)if(K)for(z in i){if(r.apply(i[z],y)===false)break}else for(;F<I;){if(r.apply(i[F++],y)===false)break}else if(K)for(z in i){if(r.call(i[z],z,i[z])===false)break}else for(y=i[0];F<I&&r.call(y,F,y)!==false;y=i[++F]);return i},trim:R?function(i){return i==null?"":R.call(i)}:function(i){return i==null?"":i.toString().replace(l,"").replace(n,"")},makeArray:function(i,r){var y=r||[];if(i!=null){var z=b.type(i);i.length==
null||z==="string"||z==="function"||z==="regexp"||b.isWindow(i)?P.call(y,i):b.merge(y,i)}return y},inArray:function(i,r){if(r.indexOf)return r.indexOf(i);for(var y=0,z=r.length;y<z;y++)if(r[y]===i)return y;return-1},merge:function(i,r){var y=i.length,z=0;if(typeof r.length==="number")for(var F=r.length;z<F;z++)i[y++]=r[z];else for(;r[z]!==A;)i[y++]=r[z++];i.length=y;return i},grep:function(i,r,y){var z=[],F;y=!!y;for(var I=0,K=i.length;I<K;I++){F=!!r(i[I],I);y!==F&&z.push(i[I])}return z},map:function(i,
r,y){for(var z=[],F,I=0,K=i.length;I<K;I++){F=r(i[I],I,y);if(F!=null)z[z.length]=F}return z.concat.apply([],z)},guid:1,proxy:function(i,r,y){if(arguments.length===2)if(typeof r==="string"){y=i;i=y[r];r=A}else if(r&&!b.isFunction(r)){y=r;r=A}if(!r&&i)r=function(){return i.apply(y||this,arguments)};if(i)r.guid=i.guid=i.guid||r.guid||b.guid++;return r},access:function(i,r,y,z,F,I){var K=i.length;if(typeof r==="object"){for(var J in r)b.access(i,J,r[J],z,F,y);return i}if(y!==A){z=!I&&z&&b.isFunction(y);
for(J=0;J<K;J++)F(i[J],r,z?y.call(i[J],J,F(i[J],r)):y,I);return i}return K?F(i[0],r):A},now:function(){return(new Date).getTime()},uaMatch:function(i){i=i.toLowerCase();i=M.exec(i)||g.exec(i)||j.exec(i)||i.indexOf("compatible")<0&&o.exec(i)||[];return{browser:i[1]||"",version:i[2]||"0"}},browser:{}});b.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(i,r){L["[object "+r+"]"]=r.toLowerCase()});m=b.uaMatch(m);if(m.browser){b.browser[m.browser]=true;b.browser.version=
m.version}if(b.browser.webkit)b.browser.safari=true;if(Q)b.inArray=function(i,r){return Q.call(r,i)};if(!/\s/.test("\u00a0")){l=/^[\s\xA0]+/;n=/[\s\xA0]+$/}f=b(u);if(u.addEventListener)t=function(){u.removeEventListener("DOMContentLoaded",t,false);b.ready()};else if(u.attachEvent)t=function(){if(u.readyState==="complete"){u.detachEvent("onreadystatechange",t);b.ready()}};return E.jQuery=E.$=b}();(function(){c.support={};var a=u.documentElement,b=u.createElement("script"),d=u.createElement("div"),
e="script"+c.now();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var f=d.getElementsByTagName("*"),h=d.getElementsByTagName("a")[0],k=u.createElement("select"),l=k.appendChild(u.createElement("option"));if(!(!f||!f.length||!h)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(h.getAttribute("style")),
hrefNormalized:h.getAttribute("href")==="/a",opacity:/^0.55$/.test(h.style.opacity),cssFloat:!!h.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:l.selected,optDisabled:false,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};k.disabled=true;c.support.optDisabled=!l.disabled;b.type="text/javascript";try{b.appendChild(u.createTextNode("window."+e+"=1;"))}catch(n){}a.insertBefore(b,
a.firstChild);if(E[e]){c.support.scriptEval=true;delete E[e]}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function s(){c.support.noCloneEvent=false;d.detachEvent("onclick",s)});d.cloneNode(true).fireEvent("onclick")}d=u.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=u.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var s=u.createElement("div");
s.style.width=s.style.paddingLeft="1px";u.body.appendChild(s);c.boxModel=c.support.boxModel=s.offsetWidth===2;if("zoom"in s.style){s.style.display="inline";s.style.zoom=1;c.support.inlineBlockNeedsLayout=s.offsetWidth===2;s.style.display="";s.innerHTML="<div style='width:4px;'></div>";c.support.shrinkWrapBlocks=s.offsetWidth!==2}s.innerHTML="<table><tr><td style='padding:0;display:none'></td><td>t</td></tr></table>";var v=s.getElementsByTagName("td");c.support.reliableHiddenOffsets=v[0].offsetHeight===
0;v[0].style.display="";v[1].style.display="none";c.support.reliableHiddenOffsets=c.support.reliableHiddenOffsets&&v[0].offsetHeight===0;s.innerHTML="";u.body.removeChild(s).style.display="none"});a=function(s){var v=u.createElement("div");s="on"+s;var B=s in v;if(!B){v.setAttribute(s,"return;");B=typeof v[s]==="function"}return B};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=f=h=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",
cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var pa={},Oa=/^(?:\{.*\}|\[.*\])$/;c.extend({cache:{},uuid:0,expando:"jQuery"+c.now(),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},data:function(a,b,d){if(c.acceptData(a)){a=a==E?pa:a;var e=a.nodeType,f=e?a[c.expando]:null,h=c.cache;if(!(e&&!f&&typeof b==="string"&&d===A)){if(e)f||(a[c.expando]=f=++c.uuid);else h=a;if(typeof b==="object")if(e)h[f]=
c.extend(h[f],b);else c.extend(h,b);else if(e&&!h[f])h[f]={};a=e?h[f]:h;if(d!==A)a[b]=d;return typeof b==="string"?a[b]:a}}},removeData:function(a,b){if(c.acceptData(a)){a=a==E?pa:a;var d=a.nodeType,e=d?a[c.expando]:a,f=c.cache,h=d?f[e]:e;if(b){if(h){delete h[b];d&&c.isEmptyObject(h)&&c.removeData(a)}}else if(d&&c.support.deleteExpando)delete a[c.expando];else if(a.removeAttribute)a.removeAttribute(c.expando);else if(d)delete f[e];else for(var k in a)delete a[k]}},acceptData:function(a){if(a.nodeName){var b=
c.noData[a.nodeName.toLowerCase()];if(b)return!(b===true||a.getAttribute("classid")!==b)}return true}});c.fn.extend({data:function(a,b){if(typeof a==="undefined")return this.length?c.data(this[0]):null;else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===A){var e=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(e===A&&this.length){e=c.data(this[0],a);if(e===A&&this[0].nodeType===1){e=this[0].getAttribute("data-"+a);if(typeof e===
"string")try{e=e==="true"?true:e==="false"?false:e==="null"?null:!c.isNaN(e)?parseFloat(e):Oa.test(e)?c.parseJSON(e):e}catch(f){}else e=A}}return e===A&&d[1]?this.data(d[0]):e}else return this.each(function(){var h=c(this),k=[d[0],b];h.triggerHandler("setData"+d[1]+"!",k);c.data(this,a,b);h.triggerHandler("changeData"+d[1]+"!",k)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var e=c.data(a,b);if(!d)return e||
[];if(!e||c.isArray(d))e=c.data(a,b,c.makeArray(d));else e.push(d);return e}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),e=d.shift();if(e==="inprogress")e=d.shift();if(e){b==="fx"&&d.unshift("inprogress");e.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===A)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,
a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var qa=/[\n\t]/g,ga=/\s+/,Pa=/\r/g,Qa=/^(?:href|src|style)$/,Ra=/^(?:button|input)$/i,Sa=/^(?:button|input|object|select|textarea)$/i,Ta=/^a(?:rea)?$/i,ra=/^(?:radio|checkbox)$/i;c.fn.extend({attr:function(a,b){return c.access(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,
a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(s){var v=c(this);v.addClass(a.call(this,s,v.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ga),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===1)if(f.className){for(var h=" "+f.className+" ",k=f.className,l=0,n=b.length;l<n;l++)if(h.indexOf(" "+b[l]+" ")<0)k+=" "+b[l];f.className=c.trim(k)}else f.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(n){var s=
c(this);s.removeClass(a.call(this,n,s.attr("class")))});if(a&&typeof a==="string"||a===A)for(var b=(a||"").split(ga),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===1&&f.className)if(a){for(var h=(" "+f.className+" ").replace(qa," "),k=0,l=b.length;k<l;k++)h=h.replace(" "+b[k]+" "," ");f.className=c.trim(h)}else f.className=""}return this},toggleClass:function(a,b){var d=typeof a,e=typeof b==="boolean";if(c.isFunction(a))return this.each(function(f){var h=c(this);h.toggleClass(a.call(this,
f,h.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var f,h=0,k=c(this),l=b,n=a.split(ga);f=n[h++];){l=e?l:!k.hasClass(f);k[l?"addClass":"removeClass"](f)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(qa," ").indexOf(a)>-1)return true;return false},
val:function(a){if(!arguments.length){var b=this[0];if(b){if(c.nodeName(b,"option")){var d=b.attributes.value;return!d||d.specified?b.value:b.text}if(c.nodeName(b,"select")){var e=b.selectedIndex;d=[];var f=b.options;b=b.type==="select-one";if(e<0)return null;var h=b?e:0;for(e=b?e+1:f.length;h<e;h++){var k=f[h];if(k.selected&&(c.support.optDisabled?!k.disabled:k.getAttribute("disabled")===null)&&(!k.parentNode.disabled||!c.nodeName(k.parentNode,"optgroup"))){a=c(k).val();if(b)return a;d.push(a)}}return d}if(ra.test(b.type)&&
!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Pa,"")}return A}var l=c.isFunction(a);return this.each(function(n){var s=c(this),v=a;if(this.nodeType===1){if(l)v=a.call(this,n,s.val());if(v==null)v="";else if(typeof v==="number")v+="";else if(c.isArray(v))v=c.map(v,function(D){return D==null?"":D+""});if(c.isArray(v)&&ra.test(this.type))this.checked=c.inArray(s.val(),v)>=0;else if(c.nodeName(this,"select")){var B=c.makeArray(v);c("option",this).each(function(){this.selected=
c.inArray(c(this).val(),B)>=0});if(!B.length)this.selectedIndex=-1}else this.value=v}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,e){if(!a||a.nodeType===3||a.nodeType===8)return A;if(e&&b in c.attrFn)return c(a)[b](d);e=a.nodeType!==1||!c.isXMLDoc(a);var f=d!==A;b=e&&c.props[b]||b;if(a.nodeType===1){var h=Qa.test(b);if((b in a||a[b]!==A)&&e&&!h){if(f){b==="type"&&Ra.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");
if(d===null)a.nodeType===1&&a.removeAttribute(b);else a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:Sa.test(a.nodeName)||Ta.test(a.nodeName)&&a.href?0:A;return a[b]}if(!c.support.style&&e&&b==="style"){if(f)a.style.cssText=""+d;return a.style.cssText}f&&a.setAttribute(b,""+d);if(!a.attributes[b]&&a.hasAttribute&&!a.hasAttribute(b))return A;a=!c.support.hrefNormalized&&e&&
h?a.getAttribute(b,2):a.getAttribute(b);return a===null?A:a}}});var X=/\.(.*)$/,ha=/^(?:textarea|input|select)$/i,Ha=/\./g,Ia=/ /g,Ua=/[^\w\s.|`]/g,Va=function(a){return a.replace(Ua,"\\$&")},sa={focusin:0,focusout:0};c.event={add:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(c.isWindow(a)&&a!==E&&!a.frameElement)a=E;if(d===false)d=U;var f,h;if(d.handler){f=d;d=f.handler}if(!d.guid)d.guid=c.guid++;if(h=c.data(a)){var k=a.nodeType?"events":"__events__",l=h[k],n=h.handle;if(typeof l===
"function"){n=l.handle;l=l.events}else if(!l){a.nodeType||(h[k]=h=function(){});h.events=l={}}if(!n)h.handle=n=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(n.elem,arguments):A};n.elem=a;b=b.split(" ");for(var s=0,v;k=b[s++];){h=f?c.extend({},f):{handler:d,data:e};if(k.indexOf(".")>-1){v=k.split(".");k=v.shift();h.namespace=v.slice(0).sort().join(".")}else{v=[];h.namespace=""}h.type=k;if(!h.guid)h.guid=d.guid;var B=l[k],D=c.event.special[k]||{};if(!B){B=l[k]=[];
if(!D.setup||D.setup.call(a,e,v,n)===false)if(a.addEventListener)a.addEventListener(k,n,false);else a.attachEvent&&a.attachEvent("on"+k,n)}if(D.add){D.add.call(a,h);if(!h.handler.guid)h.handler.guid=d.guid}B.push(h);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(d===false)d=U;var f,h,k=0,l,n,s,v,B,D,H=a.nodeType?"events":"__events__",w=c.data(a),G=w&&w[H];if(w&&G){if(typeof G==="function"){w=G;G=G.events}if(b&&b.type){d=b.handler;b=b.type}if(!b||
typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(f in G)c.event.remove(a,f+b)}else{for(b=b.split(" ");f=b[k++];){v=f;l=f.indexOf(".")<0;n=[];if(!l){n=f.split(".");f=n.shift();s=RegExp("(^|\\.)"+c.map(n.slice(0).sort(),Va).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(B=G[f])if(d){v=c.event.special[f]||{};for(h=e||0;h<B.length;h++){D=B[h];if(d.guid===D.guid){if(l||s.test(D.namespace)){e==null&&B.splice(h--,1);v.remove&&v.remove.call(a,D)}if(e!=null)break}}if(B.length===0||e!=null&&B.length===1){if(!v.teardown||
v.teardown.call(a,n)===false)c.removeEvent(a,f,w.handle);delete G[f]}}else for(h=0;h<B.length;h++){D=B[h];if(l||s.test(D.namespace)){c.event.remove(a,v,D.handler,h);B.splice(h--,1)}}}if(c.isEmptyObject(G)){if(b=w.handle)b.elem=null;delete w.events;delete w.handle;if(typeof w==="function")c.removeData(a,H);else c.isEmptyObject(w)&&c.removeData(a)}}}}},trigger:function(a,b,d,e){var f=a.type||a;if(!e){a=typeof a==="object"?a[c.expando]?a:c.extend(c.Event(f),a):c.Event(f);if(f.indexOf("!")>=0){a.type=
f=f.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[f]&&c.each(c.cache,function(){this.events&&this.events[f]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return A;a.result=A;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(e=d.nodeType?c.data(d,"handle"):(c.data(d,"__events__")||{}).handle)&&e.apply(d,b);e=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+f]&&d["on"+f].apply(d,b)===
false){a.result=false;a.preventDefault()}}catch(h){}if(!a.isPropagationStopped()&&e)c.event.trigger(a,b,e,true);else if(!a.isDefaultPrevented()){e=a.target;var k,l=f.replace(X,""),n=c.nodeName(e,"a")&&l==="click",s=c.event.special[l]||{};if((!s._default||s._default.call(d,a)===false)&&!n&&!(e&&e.nodeName&&c.noData[e.nodeName.toLowerCase()])){try{if(e[l]){if(k=e["on"+l])e["on"+l]=null;c.event.triggered=true;e[l]()}}catch(v){}if(k)e["on"+l]=k;c.event.triggered=false}}},handle:function(a){var b,d,e;
d=[];var f,h=c.makeArray(arguments);a=h[0]=c.event.fix(a||E.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;if(!b){e=a.type.split(".");a.type=e.shift();d=e.slice(0).sort();e=RegExp("(^|\\.)"+d.join("\\.(?:.*\\.)?")+"(\\.|$)")}a.namespace=a.namespace||d.join(".");f=c.data(this,this.nodeType?"events":"__events__");if(typeof f==="function")f=f.events;d=(f||{})[a.type];if(f&&d){d=d.slice(0);f=0;for(var k=d.length;f<k;f++){var l=d[f];if(b||e.test(l.namespace)){a.handler=l.handler;a.data=
l.data;a.handleObj=l;l=l.handler.apply(this,h);if(l!==A){a.result=l;if(l===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
fix:function(a){if(a[c.expando])return a;var b=a;a=c.Event(b);for(var d=this.props.length,e;d;){e=this.props[--d];a[e]=b[e]}if(!a.target)a.target=a.srcElement||u;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=u.documentElement;d=u.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(a.which==null&&(a.charCode!=null||a.keyCode!=null))a.which=a.charCode!=null?a.charCode:a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==A)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,Y(a.origType,a.selector),c.extend({},a,{handler:Ga,guid:a.handler.guid}))},remove:function(a){c.event.remove(this,
Y(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,d){if(c.isWindow(this))this.onbeforeunload=d},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};c.removeEvent=u.removeEventListener?function(a,b,d){a.removeEventListener&&a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent&&a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=a;this.type=a.type}else this.type=a;this.timeStamp=
c.now();this[c.expando]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=ba;var a=this.originalEvent;if(a)if(a.preventDefault)a.preventDefault();else a.returnValue=false},stopPropagation:function(){this.isPropagationStopped=ba;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=ba;this.stopPropagation()},isDefaultPrevented:U,isPropagationStopped:U,isImmediatePropagationStopped:U};
var ta=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},ua=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?ua:ta,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?ua:ta)}}});if(!c.support.submitBubbles)c.event.special.submit={setup:function(){if(this.nodeName.toLowerCase()!==
"form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length){a.liveFired=A;return ja("submit",this,arguments)}});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13){a.liveFired=A;return ja("submit",this,arguments)}})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};if(!c.support.changeBubbles){var V,
va=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(e){return e.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},Z=function(a,b){var d=a.target,e,f;if(!(!ha.test(d.nodeName)||d.readOnly)){e=c.data(d,"_change_data");f=va(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",f);if(!(e===A||f===e))if(e!=null||f){a.type="change";a.liveFired=
A;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:Z,beforedeactivate:Z,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return Z.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return Z.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,"_change_data",va(a))}},setup:function(){if(this.type===
"file")return false;for(var a in V)c.event.add(this,a+".specialChange",V[a]);return ha.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return ha.test(this.nodeName)}};V=c.event.special.change.filters;V.focus=V.beforeactivate}u.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e.target)}c.event.special[b]={setup:function(){sa[b]++===0&&u.addEventListener(a,d,true)},teardown:function(){--sa[b]===
0&&u.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,e,f){if(typeof d==="object"){for(var h in d)this[b](h,e,d[h],f);return this}if(c.isFunction(e)||e===false){f=e;e=A}var k=b==="one"?c.proxy(f,function(n){c(this).unbind(n,k);return f.apply(this,arguments)}):f;if(d==="unload"&&b!=="one")this.one(d,e,f);else{h=0;for(var l=this.length;h<l;h++)c.event.add(this[h],d,k,e)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&!a.preventDefault)for(var d in a)this.unbind(d,
a[d]);else{d=0;for(var e=this.length;d<e;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,e){return this.live(b,d,e,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var d=c.Event(a);d.preventDefault();d.stopPropagation();c.event.trigger(d,b,this[0]);return d.result}},toggle:function(a){for(var b=arguments,d=
1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(e){var f=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,f+1);e.preventDefault();return b[f].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var wa={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,e,f,h){var k,l=0,n,s,v=h||this.selector;h=h?this:c(this.context);if(typeof d===
"object"&&!d.preventDefault){for(k in d)h[b](k,e,d[k],v);return this}if(c.isFunction(e)){f=e;e=A}for(d=(d||"").split(" ");(k=d[l++])!=null;){n=X.exec(k);s="";if(n){s=n[0];k=k.replace(X,"")}if(k==="hover")d.push("mouseenter"+s,"mouseleave"+s);else{n=k;if(k==="focus"||k==="blur"){d.push(wa[k]+s);k+=s}else k=(wa[k]||k)+s;if(b==="live"){s=0;for(var B=h.length;s<B;s++)c.event.add(h[s],"live."+Y(k,v),{data:e,selector:v,handler:f,origType:k,origHandler:f,preType:n})}else h.unbind("live."+Y(k,v),f)}}return this}});
c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){c.fn[b]=function(d,e){if(e==null){e=d;d=null}return arguments.length>0?this.bind(b,d,e):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});E.attachEvent&&!E.addEventListener&&c(E).bind("unload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});
(function(){function a(g,j,o,m,p,q){p=0;for(var t=m.length;p<t;p++){var x=m[p];if(x){x=x[g];for(var C=false;x;){if(x.sizcache===o){C=m[x.sizset];break}if(x.nodeType===1&&!q){x.sizcache=o;x.sizset=p}if(x.nodeName.toLowerCase()===j){C=x;break}x=x[g]}m[p]=C}}}function b(g,j,o,m,p,q){p=0;for(var t=m.length;p<t;p++){var x=m[p];if(x){x=x[g];for(var C=false;x;){if(x.sizcache===o){C=m[x.sizset];break}if(x.nodeType===1){if(!q){x.sizcache=o;x.sizset=p}if(typeof j!=="string"){if(x===j){C=true;break}}else if(l.filter(j,
[x]).length>0){C=x;break}}x=x[g]}m[p]=C}}}var d=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,h=false,k=true;[0,0].sort(function(){k=false;return 0});var l=function(g,j,o,m){o=o||[];var p=j=j||u;if(j.nodeType!==1&&j.nodeType!==9)return[];if(!g||typeof g!=="string")return o;var q=[],t,x,C,P,N=true,R=l.isXML(j),Q=g,L;do{d.exec("");if(t=d.exec(Q)){Q=t[3];q.push(t[1]);if(t[2]){P=t[3];
break}}}while(t);if(q.length>1&&s.exec(g))if(q.length===2&&n.relative[q[0]])x=M(q[0]+q[1],j);else for(x=n.relative[q[0]]?[j]:l(q.shift(),j);q.length;){g=q.shift();if(n.relative[g])g+=q.shift();x=M(g,x)}else{if(!m&&q.length>1&&j.nodeType===9&&!R&&n.match.ID.test(q[0])&&!n.match.ID.test(q[q.length-1])){t=l.find(q.shift(),j,R);j=t.expr?l.filter(t.expr,t.set)[0]:t.set[0]}if(j){t=m?{expr:q.pop(),set:D(m)}:l.find(q.pop(),q.length===1&&(q[0]==="~"||q[0]==="+")&&j.parentNode?j.parentNode:j,R);x=t.expr?l.filter(t.expr,
t.set):t.set;if(q.length>0)C=D(x);else N=false;for(;q.length;){t=L=q.pop();if(n.relative[L])t=q.pop();else L="";if(t==null)t=j;n.relative[L](C,t,R)}}else C=[]}C||(C=x);C||l.error(L||g);if(f.call(C)==="[object Array]")if(N)if(j&&j.nodeType===1)for(g=0;C[g]!=null;g++){if(C[g]&&(C[g]===true||C[g].nodeType===1&&l.contains(j,C[g])))o.push(x[g])}else for(g=0;C[g]!=null;g++)C[g]&&C[g].nodeType===1&&o.push(x[g]);else o.push.apply(o,C);else D(C,o);if(P){l(P,p,o,m);l.uniqueSort(o)}return o};l.uniqueSort=function(g){if(w){h=
k;g.sort(w);if(h)for(var j=1;j<g.length;j++)g[j]===g[j-1]&&g.splice(j--,1)}return g};l.matches=function(g,j){return l(g,null,null,j)};l.matchesSelector=function(g,j){return l(j,null,null,[g]).length>0};l.find=function(g,j,o){var m;if(!g)return[];for(var p=0,q=n.order.length;p<q;p++){var t=n.order[p],x;if(x=n.leftMatch[t].exec(g)){var C=x[1];x.splice(1,1);if(C.substr(C.length-1)!=="\\"){x[1]=(x[1]||"").replace(/\\/g,"");m=n.find[t](x,j,o);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=j.getElementsByTagName("*"));
return{set:m,expr:g}};l.filter=function(g,j,o,m){for(var p=g,q=[],t=j,x,C,P=j&&j[0]&&l.isXML(j[0]);g&&j.length;){for(var N in n.filter)if((x=n.leftMatch[N].exec(g))!=null&&x[2]){var R=n.filter[N],Q,L;L=x[1];C=false;x.splice(1,1);if(L.substr(L.length-1)!=="\\"){if(t===q)q=[];if(n.preFilter[N])if(x=n.preFilter[N](x,t,o,q,m,P)){if(x===true)continue}else C=Q=true;if(x)for(var i=0;(L=t[i])!=null;i++)if(L){Q=R(L,x,i,t);var r=m^!!Q;if(o&&Q!=null)if(r)C=true;else t[i]=false;else if(r){q.push(L);C=true}}if(Q!==
A){o||(t=q);g=g.replace(n.match[N],"");if(!C)return[];break}}}if(g===p)if(C==null)l.error(g);else break;p=g}return t};l.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=l.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/,
POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},relative:{"+":function(g,j){var o=typeof j==="string",m=o&&!/\W/.test(j);o=o&&!m;if(m)j=j.toLowerCase();m=0;for(var p=g.length,q;m<p;m++)if(q=g[m]){for(;(q=q.previousSibling)&&q.nodeType!==1;);g[m]=o||q&&q.nodeName.toLowerCase()===
j?q||false:q===j}o&&l.filter(j,g,true)},">":function(g,j){var o=typeof j==="string",m,p=0,q=g.length;if(o&&!/\W/.test(j))for(j=j.toLowerCase();p<q;p++){if(m=g[p]){o=m.parentNode;g[p]=o.nodeName.toLowerCase()===j?o:false}}else{for(;p<q;p++)if(m=g[p])g[p]=o?m.parentNode:m.parentNode===j;o&&l.filter(j,g,true)}},"":function(g,j,o){var m=e++,p=b,q;if(typeof j==="string"&&!/\W/.test(j)){q=j=j.toLowerCase();p=a}p("parentNode",j,m,g,q,o)},"~":function(g,j,o){var m=e++,p=b,q;if(typeof j==="string"&&!/\W/.test(j)){q=
j=j.toLowerCase();p=a}p("previousSibling",j,m,g,q,o)}},find:{ID:function(g,j,o){if(typeof j.getElementById!=="undefined"&&!o)return(g=j.getElementById(g[1]))&&g.parentNode?[g]:[]},NAME:function(g,j){if(typeof j.getElementsByName!=="undefined"){for(var o=[],m=j.getElementsByName(g[1]),p=0,q=m.length;p<q;p++)m[p].getAttribute("name")===g[1]&&o.push(m[p]);return o.length===0?null:o}},TAG:function(g,j){return j.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,j,o,m,p,q){g=" "+g[1].replace(/\\/g,
"")+" ";if(q)return g;q=0;for(var t;(t=j[q])!=null;q++)if(t)if(p^(t.className&&(" "+t.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))o||m.push(t);else if(o)j[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var j=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=j[1]+(j[2]||1)-0;g[3]=j[3]-0}g[0]=e++;return g},ATTR:function(g,j,o,
m,p,q){j=g[1].replace(/\\/g,"");if(!q&&n.attrMap[j])g[1]=n.attrMap[j];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,j,o,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=l(g[3],null,null,j);else{g=l.filter(g[3],j,o,true^p);o||m.push.apply(m,g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===
true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,j,o){return!!l(o[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===
g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,j){return j===0},last:function(g,j,o,m){return j===m.length-1},even:function(g,j){return j%2===0},odd:function(g,j){return j%2===1},lt:function(g,j,o){return j<o[3]-0},gt:function(g,j,o){return j>o[3]-0},nth:function(g,j,o){return o[3]-
0===j},eq:function(g,j,o){return o[3]-0===j}},filter:{PSEUDO:function(g,j,o,m){var p=j[1],q=n.filters[p];if(q)return q(g,o,j,m);else if(p==="contains")return(g.textContent||g.innerText||l.getText([g])||"").indexOf(j[3])>=0;else if(p==="not"){j=j[3];o=0;for(m=j.length;o<m;o++)if(j[o]===g)return false;return true}else l.error("Syntax error, unrecognized expression: "+p)},CHILD:function(g,j){var o=j[1],m=g;switch(o){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(o===
"first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":o=j[2];var p=j[3];if(o===1&&p===0)return true;var q=j[0],t=g.parentNode;if(t&&(t.sizcache!==q||!g.nodeIndex)){var x=0;for(m=t.firstChild;m;m=m.nextSibling)if(m.nodeType===1)m.nodeIndex=++x;t.sizcache=q}m=g.nodeIndex-p;return o===0?m===0:m%o===0&&m/o>=0}},ID:function(g,j){return g.nodeType===1&&g.getAttribute("id")===j},TAG:function(g,j){return j==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===
j},CLASS:function(g,j){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(j)>-1},ATTR:function(g,j){var o=j[1];o=n.attrHandle[o]?n.attrHandle[o](g):g[o]!=null?g[o]:g.getAttribute(o);var m=o+"",p=j[2],q=j[4];return o==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&o!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,j,o,m){var p=n.setFilters[j[2]];
if(p)return p(g,o,j,m)}}},s=n.match.POS,v=function(g,j){return"\\"+(j-0+1)},B;for(B in n.match){n.match[B]=RegExp(n.match[B].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[B]=RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[B].source.replace(/\\(\d+)/g,v))}var D=function(g,j){g=Array.prototype.slice.call(g,0);if(j){j.push.apply(j,g);return j}return g};try{Array.prototype.slice.call(u.documentElement.childNodes,0)}catch(H){D=function(g,j){var o=j||[],m=0;if(f.call(g)==="[object Array]")Array.prototype.push.apply(o,
g);else if(typeof g.length==="number")for(var p=g.length;m<p;m++)o.push(g[m]);else for(;g[m];m++)o.push(g[m]);return o}}var w,G;if(u.documentElement.compareDocumentPosition)w=function(g,j){if(g===j){h=true;return 0}if(!g.compareDocumentPosition||!j.compareDocumentPosition)return g.compareDocumentPosition?-1:1;return g.compareDocumentPosition(j)&4?-1:1};else{w=function(g,j){var o=[],m=[],p=g.parentNode,q=j.parentNode,t=p;if(g===j){h=true;return 0}else if(p===q)return G(g,j);else if(p){if(!q)return 1}else return-1;
for(;t;){o.unshift(t);t=t.parentNode}for(t=q;t;){m.unshift(t);t=t.parentNode}p=o.length;q=m.length;for(t=0;t<p&&t<q;t++)if(o[t]!==m[t])return G(o[t],m[t]);return t===p?G(g,m[t],-1):G(o[t],j,1)};G=function(g,j,o){if(g===j)return o;for(g=g.nextSibling;g;){if(g===j)return-1;g=g.nextSibling}return 1}}l.getText=function(g){for(var j="",o,m=0;g[m];m++){o=g[m];if(o.nodeType===3||o.nodeType===4)j+=o.nodeValue;else if(o.nodeType!==8)j+=l.getText(o.childNodes)}return j};(function(){var g=u.createElement("div"),
j="script"+(new Date).getTime();g.innerHTML="<a name='"+j+"'/>";var o=u.documentElement;o.insertBefore(g,o.firstChild);if(u.getElementById(j)){n.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:A:[]};n.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}o.removeChild(g);
o=g=null})();(function(){var g=u.createElement("div");g.appendChild(u.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(j,o){var m=o.getElementsByTagName(j[1]);if(j[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML="<a href='#'></a>";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(j){return j.getAttribute("href",2)};g=null})();u.querySelectorAll&&
function(){var g=l,j=u.createElement("div");j.innerHTML="<p class='TEST'></p>";if(!(j.querySelectorAll&&j.querySelectorAll(".TEST").length===0)){l=function(m,p,q,t){p=p||u;if(!t&&!l.isXML(p))if(p.nodeType===9)try{return D(p.querySelectorAll(m),q)}catch(x){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var C=p.id,P=p.id="__sizzle__";try{return D(p.querySelectorAll("#"+P+" "+m),q)}catch(N){}finally{if(C)p.id=C;else p.removeAttribute("id")}}return g(m,p,q,t)};for(var o in g)l[o]=g[o];
j=null}}();(function(){var g=u.documentElement,j=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,o=false;try{j.call(u.documentElement,":sizzle")}catch(m){o=true}if(j)l.matchesSelector=function(p,q){try{if(o||!n.match.PSEUDO.test(q))return j.call(p,q)}catch(t){}return l(q,null,null,[p]).length>0}})();(function(){var g=u.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===
0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(j,o,m){if(typeof o.getElementsByClassName!=="undefined"&&!m)return o.getElementsByClassName(j[1])};g=null}}})();l.contains=u.documentElement.contains?function(g,j){return g!==j&&(g.contains?g.contains(j):true)}:function(g,j){return!!(g.compareDocumentPosition(j)&16)};l.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var M=function(g,
j){for(var o=[],m="",p,q=j.nodeType?[j]:j;p=n.match.PSEUDO.exec(g);){m+=p[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;p=0;for(var t=q.length;p<t;p++)l(g,q[p],o);return l.filter(m,o)};c.find=l;c.expr=l.selectors;c.expr[":"]=c.expr.filters;c.unique=l.uniqueSort;c.text=l.getText;c.isXMLDoc=l.isXML;c.contains=l.contains})();var Wa=/Until$/,Xa=/^(?:parents|prevUntil|prevAll)/,Ya=/,/,Ja=/^.[^:#\[\.,]*$/,Za=Array.prototype.slice,$a=c.expr.match.POS;c.fn.extend({find:function(a){for(var b=this.pushStack("",
"find",a),d=0,e=0,f=this.length;e<f;e++){d=b.length;c.find(a,this[e],b);if(e>0)for(var h=d;h<b.length;h++)for(var k=0;k<d;k++)if(b[k]===b[h]){b.splice(h--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,e=b.length;d<e;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(ka(this,a,false),"not",a)},filter:function(a){return this.pushStack(ka(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,
b){var d=[],e,f,h=this[0];if(c.isArray(a)){var k={},l,n=1;if(h&&a.length){e=0;for(f=a.length;e<f;e++){l=a[e];k[l]||(k[l]=c.expr.match.POS.test(l)?c(l,b||this.context):l)}for(;h&&h.ownerDocument&&h!==b;){for(l in k){e=k[l];if(e.jquery?e.index(h)>-1:c(h).is(e))d.push({selector:l,elem:h,level:n})}h=h.parentNode;n++}}return d}k=$a.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e<f;e++)for(h=this[e];h;)if(k?k.index(h)>-1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h||
!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context):c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}});
c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",
d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Wa.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||Ya.test(e))&&Xa.test(a))f=f.reverse();return this.pushStack(f,a,Za.call(arguments).join(","))}});
c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===A||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&&e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var xa=/ jQuery\d+="(?:\d+|null)"/g,
$=/^\s+/,ya=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,za=/<([\w:]+)/,ab=/<tbody/i,bb=/<|&#?\w+;/,Aa=/<(?:script|object|embed|option|style)/i,Ba=/checked\s*(?:[^=]|=\s*.checked.)/i,cb=/\=([^="'>\s]+\/)>/g,O={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],
area:[1,"<map>","</map>"],_default:[0,"",""]};O.optgroup=O.option;O.tbody=O.tfoot=O.colgroup=O.caption=O.thead;O.th=O.td;if(!c.support.htmlSerialize)O._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==A)return this.empty().append((this[0]&&this[0].ownerDocument||u).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,
d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},
unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=
c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*"));
c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(xa,"").replace(cb,'="$1">').replace($,
"")],e)[0]}else return this.cloneNode(true)});if(a===true){la(this,b);la(this.find("*"),b.find("*"))}return b},html:function(a){if(a===A)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(xa,""):null;else if(typeof a==="string"&&!Aa.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!O[(za.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(ya,"<$1></$2>");try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(e){this.empty().append(a)}}else c.isFunction(a)?
this.each(function(f){var h=c(this);h.html(a.call(this,f,h.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),e=d.html();d.replaceWith(a.call(this,b,e))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,
true)},domManip:function(a,b,d){var e,f,h=a[0],k=[],l;if(!c.support.checkClone&&arguments.length===3&&typeof h==="string"&&Ba.test(h))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(h))return this.each(function(s){var v=c(this);a[0]=h.call(this,s,b?v.html():A);v.domManip(a,b,d)});if(this[0]){e=h&&h.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:c.buildFragment(a,this,k);l=e.fragment;if(f=l.childNodes.length===1?l=l.firstChild:
l.firstChild){b=b&&c.nodeName(f,"tr");f=0;for(var n=this.length;f<n;f++)d.call(b?c.nodeName(this[f],"table")?this[f].getElementsByTagName("tbody")[0]||this[f].appendChild(this[f].ownerDocument.createElement("tbody")):this[f]:this[f],f>0||e.cacheable||this.length>1?l.cloneNode(true):l)}k.length&&c.each(k,Ka)}return this}});c.buildFragment=function(a,b,d){var e,f,h;b=b&&b[0]?b[0].ownerDocument||b[0]:u;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===u&&!Aa.test(a[0])&&(c.support.checkClone||
!Ba.test(a[0]))){f=true;if(h=c.fragments[a[0]])if(h!==1)e=h}if(!e){e=b.createDocumentFragment();c.clean(a,b,e,d)}if(f)c.fragments[a[0]]=h?e:1;return{fragment:e,cacheable:f}};c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var e=[];d=c(d);var f=this.length===1&&this[0].parentNode;if(f&&f.nodeType===11&&f.childNodes.length===1&&d.length===1){d[b](this[0]);return this}else{f=0;for(var h=
d.length;f<h;f++){var k=(f>0?this.clone(true):this).get();c(d[f])[b](k);e=e.concat(k)}return this.pushStack(e,a,d.selector)}}});c.extend({clean:function(a,b,d,e){b=b||u;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||u;for(var f=[],h=0,k;(k=a[h])!=null;h++){if(typeof k==="number")k+="";if(k){if(typeof k==="string"&&!bb.test(k))k=b.createTextNode(k);else if(typeof k==="string"){k=k.replace(ya,"<$1></$2>");var l=(za.exec(k)||["",""])[1].toLowerCase(),n=O[l]||O._default,
s=n[0],v=b.createElement("div");for(v.innerHTML=n[1]+k+n[2];s--;)v=v.lastChild;if(!c.support.tbody){s=ab.test(k);l=l==="table"&&!s?v.firstChild&&v.firstChild.childNodes:n[1]==="<table>"&&!s?v.childNodes:[];for(n=l.length-1;n>=0;--n)c.nodeName(l[n],"tbody")&&!l[n].childNodes.length&&l[n].parentNode.removeChild(l[n])}!c.support.leadingWhitespace&&$.test(k)&&v.insertBefore(b.createTextNode($.exec(k)[0]),v.firstChild);k=v.childNodes}if(k.nodeType)f.push(k);else f=c.merge(f,k)}}if(d)for(h=0;f[h];h++)if(e&&
c.nodeName(f[h],"script")&&(!f[h].type||f[h].type.toLowerCase()==="text/javascript"))e.push(f[h].parentNode?f[h].parentNode.removeChild(f[h]):f[h]);else{f[h].nodeType===1&&f.splice.apply(f,[h+1,0].concat(c.makeArray(f[h].getElementsByTagName("script"))));d.appendChild(f[h])}return f},cleanData:function(a){for(var b,d,e=c.cache,f=c.event.special,h=c.support.deleteExpando,k=0,l;(l=a[k])!=null;k++)if(!(l.nodeName&&c.noData[l.nodeName.toLowerCase()]))if(d=l[c.expando]){if((b=e[d])&&b.events)for(var n in b.events)f[n]?
c.event.remove(l,n):c.removeEvent(l,n,b.handle);if(h)delete l[c.expando];else l.removeAttribute&&l.removeAttribute(c.expando);delete e[d]}}});var Ca=/alpha\([^)]*\)/i,db=/opacity=([^)]*)/,eb=/-([a-z])/ig,fb=/([A-Z])/g,Da=/^-?\d+(?:px)?$/i,gb=/^-?\d/,hb={position:"absolute",visibility:"hidden",display:"block"},La=["Left","Right"],Ma=["Top","Bottom"],W,ib=u.defaultView&&u.defaultView.getComputedStyle,jb=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){if(arguments.length===2&&b===A)return this;
return c.access(this,a,b,true,function(d,e,f){return f!==A?c.style(d,e,f):c.css(d,e)})};c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var d=W(a,"opacity","opacity");return d===""?"1":d}else return a.style.opacity}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true,zoom:true,lineHeight:true},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(!(!a||a.nodeType===3||a.nodeType===8||!a.style)){var f,h=c.camelCase(b),k=a.style,l=c.cssHooks[h];b=c.cssProps[h]||
h;if(d!==A){if(!(typeof d==="number"&&isNaN(d)||d==null)){if(typeof d==="number"&&!c.cssNumber[h])d+="px";if(!l||!("set"in l)||(d=l.set(a,d))!==A)try{k[b]=d}catch(n){}}}else{if(l&&"get"in l&&(f=l.get(a,false,e))!==A)return f;return k[b]}}},css:function(a,b,d){var e,f=c.camelCase(b),h=c.cssHooks[f];b=c.cssProps[f]||f;if(h&&"get"in h&&(e=h.get(a,true,d))!==A)return e;else if(W)return W(a,b,f)},swap:function(a,b,d){var e={},f;for(f in b){e[f]=a.style[f];a.style[f]=b[f]}d.call(a);for(f in b)a.style[f]=
e[f]},camelCase:function(a){return a.replace(eb,jb)}});c.curCSS=c.css;c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(d,e,f){var h;if(e){if(d.offsetWidth!==0)h=ma(d,b,f);else c.swap(d,hb,function(){h=ma(d,b,f)});return h+"px"}},set:function(d,e){if(Da.test(e)){e=parseFloat(e);if(e>=0)return e+"px"}else return e}}});if(!c.support.opacity)c.cssHooks.opacity={get:function(a,b){return db.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":
b?"1":""},set:function(a,b){var d=a.style;d.zoom=1;var e=c.isNaN(b)?"":"alpha(opacity="+b*100+")",f=d.filter||"";d.filter=Ca.test(f)?f.replace(Ca,e):d.filter+" "+e}};if(ib)W=function(a,b,d){var e;d=d.replace(fb,"-$1").toLowerCase();if(!(b=a.ownerDocument.defaultView))return A;if(b=b.getComputedStyle(a,null)){e=b.getPropertyValue(d);if(e===""&&!c.contains(a.ownerDocument.documentElement,a))e=c.style(a,d)}return e};else if(u.documentElement.currentStyle)W=function(a,b){var d,e,f=a.currentStyle&&a.currentStyle[b],
h=a.style;if(!Da.test(f)&&gb.test(f)){d=h.left;e=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;h.left=b==="fontSize"?"1em":f||0;f=h.pixelLeft+"px";h.left=d;a.runtimeStyle.left=e}return f};if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetHeight;return a.offsetWidth===0&&b===0||!c.support.reliableHiddenOffsets&&(a.style.display||c.css(a,"display"))==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var kb=c.now(),lb=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
mb=/^(?:select|textarea)/i,nb=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,ob=/^(?:GET|HEAD|DELETE)$/,Na=/\[\]$/,T=/\=\?(&|$)/,ia=/\?/,pb=/([?&])_=[^&]*/,qb=/^(\w+:)?\/\/([^\/?#]+)/,rb=/%20/g,sb=/#.*$/,Ea=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!=="string"&&Ea)return Ea.apply(this,arguments);else if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var f=a.slice(e,a.length);a=a.slice(0,e)}e="GET";if(b)if(c.isFunction(b)){d=
b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);e="POST"}var h=this;c.ajax({url:a,type:e,dataType:"html",data:b,complete:function(k,l){if(l==="success"||l==="notmodified")h.html(f?c("<div>").append(k.responseText.replace(lb,"")).find(f):k.responseText);d&&h.each(d,[k.responseText,l,k])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&
!this.disabled&&(this.checked||mb.test(this.nodeName)||nb.test(this.type))}).map(function(a,b){var d=c(this).val();return d==null?null:c.isArray(d)?c.map(d,function(e){return{name:b.name,value:e}}):{name:b.name,value:d}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:e})},
getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:e})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return new E.XMLHttpRequest},accepts:{xml:"application/xml, text/xml",html:"text/html",
script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},ajax:function(a){var b=c.extend(true,{},c.ajaxSettings,a),d,e,f,h=b.type.toUpperCase(),k=ob.test(h);b.url=b.url.replace(sb,"");b.context=a&&a.context!=null?a.context:b;if(b.data&&b.processData&&typeof b.data!=="string")b.data=c.param(b.data,b.traditional);if(b.dataType==="jsonp"){if(h==="GET")T.test(b.url)||(b.url+=(ia.test(b.url)?"&":"?")+(b.jsonp||"callback")+"=?");else if(!b.data||
!T.test(b.data))b.data=(b.data?b.data+"&":"")+(b.jsonp||"callback")+"=?";b.dataType="json"}if(b.dataType==="json"&&(b.data&&T.test(b.data)||T.test(b.url))){d=b.jsonpCallback||"jsonp"+kb++;if(b.data)b.data=(b.data+"").replace(T,"="+d+"$1");b.url=b.url.replace(T,"="+d+"$1");b.dataType="script";var l=E[d];E[d]=function(m){f=m;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);if(c.isFunction(l))l(m);else{E[d]=A;try{delete E[d]}catch(p){}}v&&v.removeChild(B)}}if(b.dataType==="script"&&b.cache===null)b.cache=
false;if(b.cache===false&&h==="GET"){var n=c.now(),s=b.url.replace(pb,"$1_="+n);b.url=s+(s===b.url?(ia.test(b.url)?"&":"?")+"_="+n:"")}if(b.data&&h==="GET")b.url+=(ia.test(b.url)?"&":"?")+b.data;b.global&&c.active++===0&&c.event.trigger("ajaxStart");n=(n=qb.exec(b.url))&&(n[1]&&n[1]!==location.protocol||n[2]!==location.host);if(b.dataType==="script"&&h==="GET"&&n){var v=u.getElementsByTagName("head")[0]||u.documentElement,B=u.createElement("script");if(b.scriptCharset)B.charset=b.scriptCharset;B.src=
b.url;if(!d){var D=false;B.onload=B.onreadystatechange=function(){if(!D&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){D=true;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);B.onload=B.onreadystatechange=null;v&&B.parentNode&&v.removeChild(B)}}}v.insertBefore(B,v.firstChild);return A}var H=false,w=b.xhr();if(w){b.username?w.open(h,b.url,b.async,b.username,b.password):w.open(h,b.url,b.async);try{if(b.data!=null&&!k||a&&a.contentType)w.setRequestHeader("Content-Type",
b.contentType);if(b.ifModified){c.lastModified[b.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[b.url]);c.etag[b.url]&&w.setRequestHeader("If-None-Match",c.etag[b.url])}n||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",b.dataType&&b.accepts[b.dataType]?b.accepts[b.dataType]+", */*; q=0.01":b.accepts._default)}catch(G){}if(b.beforeSend&&b.beforeSend.call(b.context,w,b)===false){b.global&&c.active--===1&&c.event.trigger("ajaxStop");w.abort();return false}b.global&&
c.triggerGlobal(b,"ajaxSend",[w,b]);var M=w.onreadystatechange=function(m){if(!w||w.readyState===0||m==="abort"){H||c.handleComplete(b,w,e,f);H=true;if(w)w.onreadystatechange=c.noop}else if(!H&&w&&(w.readyState===4||m==="timeout")){H=true;w.onreadystatechange=c.noop;e=m==="timeout"?"timeout":!c.httpSuccess(w)?"error":b.ifModified&&c.httpNotModified(w,b.url)?"notmodified":"success";var p;if(e==="success")try{f=c.httpData(w,b.dataType,b)}catch(q){e="parsererror";p=q}if(e==="success"||e==="notmodified")d||
c.handleSuccess(b,w,e,f);else c.handleError(b,w,e,p);d||c.handleComplete(b,w,e,f);m==="timeout"&&w.abort();if(b.async)w=null}};try{var g=w.abort;w.abort=function(){w&&g.call&&g.call(w);M("abort")}}catch(j){}b.async&&b.timeout>0&&setTimeout(function(){w&&!H&&M("timeout")},b.timeout);try{w.send(k||b.data==null?null:b.data)}catch(o){c.handleError(b,w,null,o);c.handleComplete(b,w,e,f)}b.async||M();return w}},param:function(a,b){var d=[],e=function(h,k){k=c.isFunction(k)?k():k;d[d.length]=encodeURIComponent(h)+
"="+encodeURIComponent(k)};if(b===A)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){e(this.name,this.value)});else for(var f in a)ca(f,a[f],b,e);return d.join("&").replace(rb,"+")}});c.extend({active:0,lastModified:{},etag:{},handleError:function(a,b,d,e){a.error&&a.error.call(a.context,b,d,e);a.global&&c.triggerGlobal(a,"ajaxError",[b,a,e])},handleSuccess:function(a,b,d,e){a.success&&a.success.call(a.context,e,d,b);a.global&&c.triggerGlobal(a,"ajaxSuccess",[b,a])},handleComplete:function(a,
b,d){a.complete&&a.complete.call(a.context,b,d);a.global&&c.triggerGlobal(a,"ajaxComplete",[b,a]);a.global&&c.active--===1&&c.event.trigger("ajaxStop")},triggerGlobal:function(a,b,d){(a.context&&a.context.url==null?c(a.context):c.event).trigger(b,d)},httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),e=a.getResponseHeader("Etag");
if(d)c.lastModified[b]=d;if(e)c.etag[b]=e;return a.status===304},httpData:function(a,b,d){var e=a.getResponseHeader("content-type")||"",f=b==="xml"||!b&&e.indexOf("xml")>=0;a=f?a.responseXML:a.responseText;f&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&e.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&e.indexOf("javascript")>=0)c.globalEval(a);return a}});if(E.ActiveXObject)c.ajaxSettings.xhr=
function(){if(E.location.protocol!=="file:")try{return new E.XMLHttpRequest}catch(a){}try{return new E.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}};c.support.ajax=!!c.ajaxSettings.xhr();var da={},tb=/^(?:toggle|show|hide)$/,ub=/^([+\-]=)?([\d+.\-]+)(.*)$/,aa,na=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b,d){if(a||a===0)return this.animate(S("show",3),a,b,d);else{a=
0;for(b=this.length;a<b;a++){if(!c.data(this[a],"olddisplay")&&this[a].style.display==="none")this[a].style.display="";this[a].style.display===""&&c.css(this[a],"display")==="none"&&c.data(this[a],"olddisplay",oa(this[a].nodeName))}for(a=0;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b,d){if(a||a===0)return this.animate(S("hide",3),a,b,d);else{a=0;for(b=this.length;a<b;a++){d=c.css(this[a],"display");d!=="none"&&c.data(this[a],"olddisplay",d)}for(a=
0;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b,d){var e=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||e?this.each(function(){var f=e?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(S("toggle",3),a,b,d);return this},fadeTo:function(a,b,d,e){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d,e)},animate:function(a,b,d,e){var f=c.speed(b,d,e);if(c.isEmptyObject(a))return this.each(f.complete);
return this[f.queue===false?"each":"queue"](function(){var h=c.extend({},f),k,l=this.nodeType===1,n=l&&c(this).is(":hidden"),s=this;for(k in a){var v=c.camelCase(k);if(k!==v){a[v]=a[k];delete a[k];k=v}if(a[k]==="hide"&&n||a[k]==="show"&&!n)return h.complete.call(this);if(l&&(k==="height"||k==="width")){h.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(c.css(this,"display")==="inline"&&c.css(this,"float")==="none")if(c.support.inlineBlockNeedsLayout)if(oa(this.nodeName)===
"inline")this.style.display="inline-block";else{this.style.display="inline";this.style.zoom=1}else this.style.display="inline-block"}if(c.isArray(a[k])){(h.specialEasing=h.specialEasing||{})[k]=a[k][1];a[k]=a[k][0]}}if(h.overflow!=null)this.style.overflow="hidden";h.curAnim=c.extend({},a);c.each(a,function(B,D){var H=new c.fx(s,h,B);if(tb.test(D))H[D==="toggle"?n?"show":"hide":D](a);else{var w=ub.exec(D),G=H.cur(true)||0;if(w){var M=parseFloat(w[2]),g=w[3]||"px";if(g!=="px"){c.style(s,B,(M||1)+g);
G=(M||1)/H.cur(true)*G;c.style(s,B,G+g)}if(w[1])M=(w[1]==="-="?-1:1)*M+G;H.custom(G,M,g)}else H.custom(G,D,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);this.each(function(){for(var e=d.length-1;e>=0;e--)if(d[e].elem===this){b&&d[e](true);d.splice(e,1)}});b||this.dequeue();return this}});c.each({slideDown:S("show",1),slideUp:S("hide",1),slideToggle:S("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,e,f){return this.animate(b,
d,e,f)}});c.extend({speed:function(a,b,d){var e=a&&typeof a==="object"?c.extend({},a):{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};e.duration=c.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in c.fx.speeds?c.fx.speeds[e.duration]:c.fx.speeds._default;e.old=e.complete;e.complete=function(){e.queue!==false&&c(this).dequeue();c.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,d,e){return d+e*a},swing:function(a,b,d,e){return(-Math.cos(a*
Math.PI)/2+0.5)*e+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a=parseFloat(c.css(this.elem,this.prop));return a&&a>-1E4?a:0},custom:function(a,b,d){function e(h){return f.step(h)}
this.startTime=c.now();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;var f=this;a=c.fx;e.elem=this.elem;if(e()&&c.timers.push(e)&&!aa)aa=setInterval(a.tick,a.interval)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;
this.custom(this.cur(),0)},step:function(a){var b=c.now(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var e in this.options.curAnim)if(this.options.curAnim[e]!==true)d=false;if(d){if(this.options.overflow!=null&&!c.support.shrinkWrapBlocks){var f=this.elem,h=this.options;c.each(["","X","Y"],function(l,n){f.style["overflow"+n]=h.overflow[l]})}this.options.hide&&c(this.elem).hide();if(this.options.hide||
this.options.show)for(var k in this.options.curAnim)c.style(this.elem,k,this.options.orig[k]);this.options.complete.call(this.elem)}return false}else{a=b-this.startTime;this.state=a/this.options.duration;b=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||b](this.state,a,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=
c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||c.fx.stop()},interval:13,stop:function(){clearInterval(aa);aa=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===
b.elem}).length};var vb=/^t(?:able|d|h)$/i,Fa=/^(?:body|html)$/i;c.fn.offset="getBoundingClientRect"in u.documentElement?function(a){var b=this[0],d;if(a)return this.each(function(k){c.offset.setOffset(this,a,k)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);try{d=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,h=f.documentElement;if(!d||!c.contains(h,b))return d||{top:0,left:0};b=f.body;f=ea(f);return{top:d.top+(f.pageYOffset||c.support.boxModel&&
h.scrollTop||b.scrollTop)-(h.clientTop||b.clientTop||0),left:d.left+(f.pageXOffset||c.support.boxModel&&h.scrollLeft||b.scrollLeft)-(h.clientLeft||b.clientLeft||0)}}:function(a){var b=this[0];if(a)return this.each(function(s){c.offset.setOffset(this,a,s)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,e=b.ownerDocument,f,h=e.documentElement,k=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;
for(var l=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==k&&b!==h;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;f=e?e.getComputedStyle(b,null):b.currentStyle;l-=b.scrollTop;n-=b.scrollLeft;if(b===d){l+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&vb.test(b.nodeName))){l+=parseFloat(f.borderTopWidth)||0;n+=parseFloat(f.borderLeftWidth)||0}d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&f.overflow!=="visible"){l+=
parseFloat(f.borderTopWidth)||0;n+=parseFloat(f.borderLeftWidth)||0}f=f}if(f.position==="relative"||f.position==="static"){l+=k.offsetTop;n+=k.offsetLeft}if(c.offset.supportsFixedPosition&&f.position==="fixed"){l+=Math.max(h.scrollTop,k.scrollTop);n+=Math.max(h.scrollLeft,k.scrollLeft)}return{top:l,left:n}};c.offset={initialize:function(){var a=u.body,b=u.createElement("div"),d,e,f,h=parseFloat(c.css(a,"marginTop"))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",
height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";a.insertBefore(b,a.firstChild);d=b.firstChild;e=d.firstChild;f=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=e.offsetTop!==5;this.doesAddBorderForTableAndCells=
f.offsetTop===5;e.style.position="fixed";e.style.top="20px";this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15;e.style.position=e.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==h;a.removeChild(b);c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.css(a,
"marginTop"))||0;d+=parseFloat(c.css(a,"marginLeft"))||0}return{top:b,left:d}},setOffset:function(a,b,d){var e=c.css(a,"position");if(e==="static")a.style.position="relative";var f=c(a),h=f.offset(),k=c.css(a,"top"),l=c.css(a,"left"),n=e==="absolute"&&c.inArray("auto",[k,l])>-1;e={};var s={};if(n)s=f.position();k=n?s.top:parseInt(k,10)||0;l=n?s.left:parseInt(l,10)||0;if(c.isFunction(b))b=b.call(a,d,h);if(b.top!=null)e.top=b.top-h.top+k;if(b.left!=null)e.left=b.left-h.left+l;"using"in b?b.using.call(a,
e):f.css(e)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),e=Fa.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.css(a,"marginTop"))||0;d.left-=parseFloat(c.css(a,"marginLeft"))||0;e.top+=parseFloat(c.css(b[0],"borderTopWidth"))||0;e.left+=parseFloat(c.css(b[0],"borderLeftWidth"))||0;return{top:d.top-e.top,left:d.left-e.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||u.body;a&&!Fa.test(a.nodeName)&&
c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(e){var f=this[0],h;if(!f)return null;if(e!==A)return this.each(function(){if(h=ea(this))h.scrollTo(!a?e:c(h).scrollLeft(),a?e:c(h).scrollTop());else this[d]=e});else return(h=ea(f))?"pageXOffset"in h?h[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&h.document.documentElement[d]||h.document.body[d]:f[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();
c.fn["inner"+b]=function(){return this[0]?parseFloat(c.css(this[0],d,"padding")):null};c.fn["outer"+b]=function(e){return this[0]?parseFloat(c.css(this[0],d,e?"margin":"border")):null};c.fn[d]=function(e){var f=this[0];if(!f)return e==null?null:this;if(c.isFunction(e))return this.each(function(h){var k=c(this);k[d](e.call(this,h,k[d]()))});return c.isWindow(f)?f.document.compatMode==="CSS1Compat"&&f.document.documentElement["client"+b]||f.document.body["client"+b]:f.nodeType===9?Math.max(f.documentElement["client"+
b],f.body["scroll"+b],f.documentElement["scroll"+b],f.body["offset"+b],f.documentElement["offset"+b]):e===A?parseFloat(c.css(f,d)):this.css(d,typeof e==="string"?e:e+"px")}})})(window);

View File

@ -1,99 +0,0 @@
/*
* jQuery Hotkeys Plugin
* Copyright 2010, John Resig
* Dual licensed under the MIT or GPL Version 2 licenses.
*
* Based upon the plugin by Tzury Bar Yochay:
* http://github.com/tzuryby/hotkeys
*
* Original idea by:
* Binny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/
*/
(function(jQuery){
jQuery.hotkeys = {
version: "0.8",
specialKeys: {
8: "backspace", 9: "tab", 13: "return", 16: "shift", 17: "ctrl", 18: "alt", 19: "pause",
20: "capslock", 27: "esc", 32: "space", 33: "pageup", 34: "pagedown", 35: "end", 36: "home",
37: "left", 38: "up", 39: "right", 40: "down", 45: "insert", 46: "del",
96: "0", 97: "1", 98: "2", 99: "3", 100: "4", 101: "5", 102: "6", 103: "7",
104: "8", 105: "9", 106: "*", 107: "+", 109: "-", 110: ".", 111 : "/",
112: "f1", 113: "f2", 114: "f3", 115: "f4", 116: "f5", 117: "f6", 118: "f7", 119: "f8",
120: "f9", 121: "f10", 122: "f11", 123: "f12", 144: "numlock", 145: "scroll", 191: "/", 224: "meta"
},
shiftNums: {
"`": "~", "1": "!", "2": "@", "3": "#", "4": "$", "5": "%", "6": "^", "7": "&",
"8": "*", "9": "(", "0": ")", "-": "_", "=": "+", ";": ": ", "'": "\"", ",": "<",
".": ">", "/": "?", "\\": "|"
}
};
function keyHandler( handleObj ) {
// Only care when a possible input has been specified
if ( typeof handleObj.data !== "string" ) {
return;
}
var origHandler = handleObj.handler,
keys = handleObj.data.toLowerCase().split(" ");
handleObj.handler = function( event ) {
// Don't fire in text-accepting inputs that we didn't directly bind to
if ( this !== event.target && (/textarea|select/i.test( event.target.nodeName ) ||
event.target.type === "text") ) {
return;
}
// Keypress represents characters, not special keys
var special = event.type !== "keypress" && jQuery.hotkeys.specialKeys[ event.which ],
character = String.fromCharCode( event.which ).toLowerCase(),
key, modif = "", possible = {};
// check combinations (alt|ctrl|shift+anything)
if ( event.altKey && special !== "alt" ) {
modif += "alt+";
}
if ( event.ctrlKey && special !== "ctrl" ) {
modif += "ctrl+";
}
// TODO: Need to make sure this works consistently across platforms
if ( event.metaKey && !event.ctrlKey && special !== "meta" ) {
modif += "meta+";
}
if ( event.shiftKey && special !== "shift" ) {
modif += "shift+";
}
if ( special ) {
possible[ modif + special ] = true;
} else {
possible[ modif + character ] = true;
possible[ modif + jQuery.hotkeys.shiftNums[ character ] ] = true;
// "$" can be triggered as "Shift+4" or "Shift+$" or just "$"
if ( modif === "shift+" ) {
possible[ jQuery.hotkeys.shiftNums[ character ] ] = true;
}
}
for ( var i = 0, l = keys.length; i < l; i++ ) {
if ( possible[ keys[i] ] ) {
return origHandler.apply( this, arguments );
}
}
};
}
jQuery.each([ "keydown", "keyup", "keypress" ], function() {
jQuery.event.special[ this ] = { add: keyHandler };
});
})( jQuery );

View File

@ -1,53 +0,0 @@
/* Copyright (c) 2010
* @author Laurence Wheway
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
*
* @version 1.2.0
*/
(function($) {
jQuery.extend({
isOnScreen: function(box, container) {
//ensure numbers come in as intgers (not strings) and remove 'px' is it's there
for(var i in box){box[i] = parseFloat(box[i])};
for(var i in container){container[i] = parseFloat(container[i])};
if(!container){
container = {
left: $(window).scrollLeft(),
top: $(window).scrollTop(),
width: $(window).width(),
height: $(window).height()
}
}
if( box.left+box.width-container.left > 0 &&
box.left < container.width+container.left &&
box.top+box.height-container.top > 0 &&
box.top < container.height+container.top
) return true;
return false;
}
})
jQuery.fn.isOnScreen = function (container) {
for(var i in container){container[i] = parseFloat(container[i])};
if(!container){
container = {
left: $(window).scrollLeft(),
top: $(window).scrollTop(),
width: $(window).width(),
height: $(window).height()
}
}
if( $(this).offset().left+$(this).width()-container.left > 0 &&
$(this).offset().left < container.width+container.left &&
$(this).offset().top+$(this).height()-container.top > 0 &&
$(this).offset().top < container.height+container.top
) return true;
return false;
}
})(jQuery);

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 264 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 267 B

View File

@ -1,99 +0,0 @@
<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
<title>Coverage for rest_framework/__init__: 100%</title>
<link rel='stylesheet' href='style.css' type='text/css'>
<script type='text/javascript' src='jquery-1.4.3.min.js'></script>
<script type='text/javascript' src='jquery.hotkeys.js'></script>
<script type='text/javascript' src='jquery.isonscreen.js'></script>
<script type='text/javascript' src='coverage_html.js'></script>
<script type='text/javascript' charset='utf-8'>
jQuery(document).ready(coverage.pyfile_ready);
</script>
</head>
<body id='pyfile'>
<div id='header'>
<div class='content'>
<h1>Coverage for <b>rest_framework/__init__</b> :
<span class='pc_cov'>100%</span>
</h1>
<img id='keyboard_icon' src='keybd_closed.png'>
<h2 class='stats'>
4 statements
<span class='run hide_run shortkey_r' onclick='coverage.toggle_lines(this, "run")'>4 run</span>
<span class='mis shortkey_m' onclick='coverage.toggle_lines(this, "mis")'>0 missing</span>
<span class='exc shortkey_x' onclick='coverage.toggle_lines(this, "exc")'>0 excluded</span>
</h2>
</div>
</div>
<div class='help_panel'>
<img id='panel_icon' src='keybd_open.png'>
<p class='legend'>Hot-keys on this page</p>
<div>
<p class='keyhelp'>
<span class='key'>r</span>
<span class='key'>m</span>
<span class='key'>x</span>
<span class='key'>p</span> &nbsp; toggle line displays
</p>
<p class='keyhelp'>
<span class='key'>j</span>
<span class='key'>k</span> &nbsp; next/prev highlighted chunk
</p>
<p class='keyhelp'>
<span class='key'>0</span> &nbsp; (zero) top of page
</p>
<p class='keyhelp'>
<span class='key'>1</span> &nbsp; (one) first highlighted chunk
</p>
</div>
</div>
<div id='source'>
<table cellspacing='0' cellpadding='0'>
<tr>
<td class='linenos' valign='top'>
<p id='n1' class='stm run hide_run'><a href='#n1'>1</a></p>
<p id='n2' class='pln'><a href='#n2'>2</a></p>
<p id='n3' class='stm run hide_run'><a href='#n3'>3</a></p>
<p id='n4' class='pln'><a href='#n4'>4</a></p>
<p id='n5' class='pln'><a href='#n5'>5</a></p>
<p id='n6' class='stm run hide_run'><a href='#n6'>6</a></p>
<p id='n7' class='pln'><a href='#n7'>7</a></p>
<p id='n8' class='pln'><a href='#n8'>8</a></p>
<p id='n9' class='stm run hide_run'><a href='#n9'>9</a></p>
</td>
<td class='text' valign='top'>
<p id='t1' class='stm run hide_run'><span class='nam'>__version__</span> <span class='op'>=</span> <span class='str'>&#39;2.3.5&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t2' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t3' class='stm run hide_run'><span class='nam'>VERSION</span> <span class='op'>=</span> <span class='nam'>__version__</span>&nbsp; <span class='com'># synonym</span><span class='strut'>&nbsp;</span></p>
<p id='t4' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t5' class='pln'><span class='com'># Header encoding (see RFC5987)</span><span class='strut'>&nbsp;</span></p>
<p id='t6' class='stm run hide_run'><span class='nam'>HTTP_HEADER_ENCODING</span> <span class='op'>=</span> <span class='str'>&#39;iso-8859-1&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t7' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t8' class='pln'><span class='com'># Default datetime input and output formats</span><span class='strut'>&nbsp;</span></p>
<p id='t9' class='stm run hide_run'><span class='nam'>ISO_8601</span> <span class='op'>=</span> <span class='str'>&#39;iso-8601&#39;</span><span class='strut'>&nbsp;</span></p>
</td>
</tr>
</table>
</div>
<div id='footer'>
<div class='content'>
<p>
<a class='nav' href='index.html'>&#xab; index</a> &nbsp; &nbsp; <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.5.1</a>
</p>
</div>
</div>
</body>
</html>

View File

@ -1,767 +0,0 @@
<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
<title>Coverage for rest_framework/authentication: 80%</title>
<link rel='stylesheet' href='style.css' type='text/css'>
<script type='text/javascript' src='jquery-1.4.3.min.js'></script>
<script type='text/javascript' src='jquery.hotkeys.js'></script>
<script type='text/javascript' src='jquery.isonscreen.js'></script>
<script type='text/javascript' src='coverage_html.js'></script>
<script type='text/javascript' charset='utf-8'>
jQuery(document).ready(coverage.pyfile_ready);
</script>
</head>
<body id='pyfile'>
<div id='header'>
<div class='content'>
<h1>Coverage for <b>rest_framework/authentication</b> :
<span class='pc_cov'>80%</span>
</h1>
<img id='keyboard_icon' src='keybd_closed.png'>
<h2 class='stats'>
169 statements
<span class='run hide_run shortkey_r' onclick='coverage.toggle_lines(this, "run")'>136 run</span>
<span class='mis shortkey_m' onclick='coverage.toggle_lines(this, "mis")'>33 missing</span>
<span class='exc shortkey_x' onclick='coverage.toggle_lines(this, "exc")'>0 excluded</span>
</h2>
</div>
</div>
<div class='help_panel'>
<img id='panel_icon' src='keybd_open.png'>
<p class='legend'>Hot-keys on this page</p>
<div>
<p class='keyhelp'>
<span class='key'>r</span>
<span class='key'>m</span>
<span class='key'>x</span>
<span class='key'>p</span> &nbsp; toggle line displays
</p>
<p class='keyhelp'>
<span class='key'>j</span>
<span class='key'>k</span> &nbsp; next/prev highlighted chunk
</p>
<p class='keyhelp'>
<span class='key'>0</span> &nbsp; (zero) top of page
</p>
<p class='keyhelp'>
<span class='key'>1</span> &nbsp; (one) first highlighted chunk
</p>
</div>
</div>
<div id='source'>
<table cellspacing='0' cellpadding='0'>
<tr>
<td class='linenos' valign='top'>
<p id='n1' class='pln'><a href='#n1'>1</a></p>
<p id='n2' class='pln'><a href='#n2'>2</a></p>
<p id='n3' class='pln'><a href='#n3'>3</a></p>
<p id='n4' class='stm run hide_run'><a href='#n4'>4</a></p>
<p id='n5' class='stm run hide_run'><a href='#n5'>5</a></p>
<p id='n6' class='stm run hide_run'><a href='#n6'>6</a></p>
<p id='n7' class='pln'><a href='#n7'>7</a></p>
<p id='n8' class='stm run hide_run'><a href='#n8'>8</a></p>
<p id='n9' class='stm run hide_run'><a href='#n9'>9</a></p>
<p id='n10' class='stm run hide_run'><a href='#n10'>10</a></p>
<p id='n11' class='stm run hide_run'><a href='#n11'>11</a></p>
<p id='n12' class='stm run hide_run'><a href='#n12'>12</a></p>
<p id='n13' class='stm run hide_run'><a href='#n13'>13</a></p>
<p id='n14' class='stm run hide_run'><a href='#n14'>14</a></p>
<p id='n15' class='pln'><a href='#n15'>15</a></p>
<p id='n16' class='pln'><a href='#n16'>16</a></p>
<p id='n17' class='stm run hide_run'><a href='#n17'>17</a></p>
<p id='n18' class='pln'><a href='#n18'>18</a></p>
<p id='n19' class='pln'><a href='#n19'>19</a></p>
<p id='n20' class='pln'><a href='#n20'>20</a></p>
<p id='n21' class='pln'><a href='#n21'>21</a></p>
<p id='n22' class='pln'><a href='#n22'>22</a></p>
<p id='n23' class='stm run hide_run'><a href='#n23'>23</a></p>
<p id='n24' class='stm run hide_run'><a href='#n24'>24</a></p>
<p id='n25' class='pln'><a href='#n25'>25</a></p>
<p id='n26' class='stm run hide_run'><a href='#n26'>26</a></p>
<p id='n27' class='stm run hide_run'><a href='#n27'>27</a></p>
<p id='n28' class='pln'><a href='#n28'>28</a></p>
<p id='n29' class='pln'><a href='#n29'>29</a></p>
<p id='n30' class='stm run hide_run'><a href='#n30'>30</a></p>
<p id='n31' class='pln'><a href='#n31'>31</a></p>
<p id='n32' class='pln'><a href='#n32'>32</a></p>
<p id='n33' class='pln'><a href='#n33'>33</a></p>
<p id='n34' class='pln'><a href='#n34'>34</a></p>
<p id='n35' class='stm run hide_run'><a href='#n35'>35</a></p>
<p id='n36' class='pln'><a href='#n36'>36</a></p>
<p id='n37' class='pln'><a href='#n37'>37</a></p>
<p id='n38' class='pln'><a href='#n38'>38</a></p>
<p id='n39' class='stm mis'><a href='#n39'>39</a></p>
<p id='n40' class='pln'><a href='#n40'>40</a></p>
<p id='n41' class='stm run hide_run'><a href='#n41'>41</a></p>
<p id='n42' class='pln'><a href='#n42'>42</a></p>
<p id='n43' class='pln'><a href='#n43'>43</a></p>
<p id='n44' class='pln'><a href='#n44'>44</a></p>
<p id='n45' class='pln'><a href='#n45'>45</a></p>
<p id='n46' class='pln'><a href='#n46'>46</a></p>
<p id='n47' class='stm run hide_run'><a href='#n47'>47</a></p>
<p id='n48' class='pln'><a href='#n48'>48</a></p>
<p id='n49' class='pln'><a href='#n49'>49</a></p>
<p id='n50' class='stm run hide_run'><a href='#n50'>50</a></p>
<p id='n51' class='pln'><a href='#n51'>51</a></p>
<p id='n52' class='pln'><a href='#n52'>52</a></p>
<p id='n53' class='pln'><a href='#n53'>53</a></p>
<p id='n54' class='stm run hide_run'><a href='#n54'>54</a></p>
<p id='n55' class='pln'><a href='#n55'>55</a></p>
<p id='n56' class='stm run hide_run'><a href='#n56'>56</a></p>
<p id='n57' class='pln'><a href='#n57'>57</a></p>
<p id='n58' class='pln'><a href='#n58'>58</a></p>
<p id='n59' class='pln'><a href='#n59'>59</a></p>
<p id='n60' class='pln'><a href='#n60'>60</a></p>
<p id='n61' class='stm run hide_run'><a href='#n61'>61</a></p>
<p id='n62' class='pln'><a href='#n62'>62</a></p>
<p id='n63' class='stm run hide_run'><a href='#n63'>63</a></p>
<p id='n64' class='stm run hide_run'><a href='#n64'>64</a></p>
<p id='n65' class='pln'><a href='#n65'>65</a></p>
<p id='n66' class='stm run hide_run'><a href='#n66'>66</a></p>
<p id='n67' class='stm mis'><a href='#n67'>67</a></p>
<p id='n68' class='stm mis'><a href='#n68'>68</a></p>
<p id='n69' class='stm run hide_run'><a href='#n69'>69</a></p>
<p id='n70' class='stm mis'><a href='#n70'>70</a></p>
<p id='n71' class='stm mis'><a href='#n71'>71</a></p>
<p id='n72' class='pln'><a href='#n72'>72</a></p>
<p id='n73' class='stm run hide_run'><a href='#n73'>73</a></p>
<p id='n74' class='stm run hide_run'><a href='#n74'>74</a></p>
<p id='n75' class='stm mis'><a href='#n75'>75</a></p>
<p id='n76' class='stm mis'><a href='#n76'>76</a></p>
<p id='n77' class='stm mis'><a href='#n77'>77</a></p>
<p id='n78' class='pln'><a href='#n78'>78</a></p>
<p id='n79' class='stm run hide_run'><a href='#n79'>79</a></p>
<p id='n80' class='stm run hide_run'><a href='#n80'>80</a></p>
<p id='n81' class='pln'><a href='#n81'>81</a></p>
<p id='n82' class='stm run hide_run'><a href='#n82'>82</a></p>
<p id='n83' class='pln'><a href='#n83'>83</a></p>
<p id='n84' class='pln'><a href='#n84'>84</a></p>
<p id='n85' class='pln'><a href='#n85'>85</a></p>
<p id='n86' class='stm run hide_run'><a href='#n86'>86</a></p>
<p id='n87' class='stm run hide_run'><a href='#n87'>87</a></p>
<p id='n88' class='stm mis'><a href='#n88'>88</a></p>
<p id='n89' class='stm run hide_run'><a href='#n89'>89</a></p>
<p id='n90' class='pln'><a href='#n90'>90</a></p>
<p id='n91' class='stm run hide_run'><a href='#n91'>91</a></p>
<p id='n92' class='stm run hide_run'><a href='#n92'>92</a></p>
<p id='n93' class='pln'><a href='#n93'>93</a></p>
<p id='n94' class='pln'><a href='#n94'>94</a></p>
<p id='n95' class='stm run hide_run'><a href='#n95'>95</a></p>
<p id='n96' class='pln'><a href='#n96'>96</a></p>
<p id='n97' class='pln'><a href='#n97'>97</a></p>
<p id='n98' class='pln'><a href='#n98'>98</a></p>
<p id='n99' class='pln'><a href='#n99'>99</a></p>
<p id='n100' class='stm run hide_run'><a href='#n100'>100</a></p>
<p id='n101' class='pln'><a href='#n101'>101</a></p>
<p id='n102' class='pln'><a href='#n102'>102</a></p>
<p id='n103' class='pln'><a href='#n103'>103</a></p>
<p id='n104' class='pln'><a href='#n104'>104</a></p>
<p id='n105' class='pln'><a href='#n105'>105</a></p>
<p id='n106' class='pln'><a href='#n106'>106</a></p>
<p id='n107' class='stm run hide_run'><a href='#n107'>107</a></p>
<p id='n108' class='stm run hide_run'><a href='#n108'>108</a></p>
<p id='n109' class='pln'><a href='#n109'>109</a></p>
<p id='n110' class='pln'><a href='#n110'>110</a></p>
<p id='n111' class='stm run hide_run'><a href='#n111'>111</a></p>
<p id='n112' class='stm run hide_run'><a href='#n112'>112</a></p>
<p id='n113' class='pln'><a href='#n113'>113</a></p>
<p id='n114' class='pln'><a href='#n114'>114</a></p>
<p id='n115' class='stm run hide_run'><a href='#n115'>115</a></p>
<p id='n116' class='stm run hide_run'><a href='#n116'>116</a></p>
<p id='n117' class='pln'><a href='#n117'>117</a></p>
<p id='n118' class='stm run hide_run'><a href='#n118'>118</a></p>
<p id='n119' class='pln'><a href='#n119'>119</a></p>
<p id='n120' class='stm run hide_run'><a href='#n120'>120</a></p>
<p id='n121' class='stm run hide_run'><a href='#n121'>121</a></p>
<p id='n122' class='pln'><a href='#n122'>122</a></p>
<p id='n123' class='stm run hide_run'><a href='#n123'>123</a></p>
<p id='n124' class='pln'><a href='#n124'>124</a></p>
<p id='n125' class='pln'><a href='#n125'>125</a></p>
<p id='n126' class='stm run hide_run'><a href='#n126'>126</a></p>
<p id='n127' class='pln'><a href='#n127'>127</a></p>
<p id='n128' class='pln'><a href='#n128'>128</a></p>
<p id='n129' class='stm run hide_run'><a href='#n129'>129</a></p>
<p id='n130' class='pln'><a href='#n130'>130</a></p>
<p id='n131' class='pln'><a href='#n131'>131</a></p>
<p id='n132' class='pln'><a href='#n132'>132</a></p>
<p id='n133' class='pln'><a href='#n133'>133</a></p>
<p id='n134' class='pln'><a href='#n134'>134</a></p>
<p id='n135' class='pln'><a href='#n135'>135</a></p>
<p id='n136' class='pln'><a href='#n136'>136</a></p>
<p id='n137' class='pln'><a href='#n137'>137</a></p>
<p id='n138' class='pln'><a href='#n138'>138</a></p>
<p id='n139' class='stm run hide_run'><a href='#n139'>139</a></p>
<p id='n140' class='pln'><a href='#n140'>140</a></p>
<p id='n141' class='pln'><a href='#n141'>141</a></p>
<p id='n142' class='pln'><a href='#n142'>142</a></p>
<p id='n143' class='pln'><a href='#n143'>143</a></p>
<p id='n144' class='pln'><a href='#n144'>144</a></p>
<p id='n145' class='pln'><a href='#n145'>145</a></p>
<p id='n146' class='pln'><a href='#n146'>146</a></p>
<p id='n147' class='stm run hide_run'><a href='#n147'>147</a></p>
<p id='n148' class='stm run hide_run'><a href='#n148'>148</a></p>
<p id='n149' class='pln'><a href='#n149'>149</a></p>
<p id='n150' class='stm run hide_run'><a href='#n150'>150</a></p>
<p id='n151' class='stm run hide_run'><a href='#n151'>151</a></p>
<p id='n152' class='pln'><a href='#n152'>152</a></p>
<p id='n153' class='stm run hide_run'><a href='#n153'>153</a></p>
<p id='n154' class='stm mis'><a href='#n154'>154</a></p>
<p id='n155' class='stm mis'><a href='#n155'>155</a></p>
<p id='n156' class='stm run hide_run'><a href='#n156'>156</a></p>
<p id='n157' class='stm mis'><a href='#n157'>157</a></p>
<p id='n158' class='stm mis'><a href='#n158'>158</a></p>
<p id='n159' class='pln'><a href='#n159'>159</a></p>
<p id='n160' class='stm run hide_run'><a href='#n160'>160</a></p>
<p id='n161' class='pln'><a href='#n161'>161</a></p>
<p id='n162' class='stm run hide_run'><a href='#n162'>162</a></p>
<p id='n163' class='stm run hide_run'><a href='#n163'>163</a></p>
<p id='n164' class='stm run hide_run'><a href='#n164'>164</a></p>
<p id='n165' class='stm mis'><a href='#n165'>165</a></p>
<p id='n166' class='stm mis'><a href='#n166'>166</a></p>
<p id='n167' class='pln'><a href='#n167'>167</a></p>
<p id='n168' class='stm run hide_run'><a href='#n168'>168</a></p>
<p id='n169' class='stm mis'><a href='#n169'>169</a></p>
<p id='n170' class='pln'><a href='#n170'>170</a></p>
<p id='n171' class='stm run hide_run'><a href='#n171'>171</a></p>
<p id='n172' class='pln'><a href='#n172'>172</a></p>
<p id='n173' class='stm run hide_run'><a href='#n173'>173</a></p>
<p id='n174' class='stm run hide_run'><a href='#n174'>174</a></p>
<p id='n175' class='pln'><a href='#n175'>175</a></p>
<p id='n176' class='pln'><a href='#n176'>176</a></p>
<p id='n177' class='stm run hide_run'><a href='#n177'>177</a></p>
<p id='n178' class='pln'><a href='#n178'>178</a></p>
<p id='n179' class='pln'><a href='#n179'>179</a></p>
<p id='n180' class='pln'><a href='#n180'>180</a></p>
<p id='n181' class='pln'><a href='#n181'>181</a></p>
<p id='n182' class='pln'><a href='#n182'>182</a></p>
<p id='n183' class='pln'><a href='#n183'>183</a></p>
<p id='n184' class='stm run hide_run'><a href='#n184'>184</a></p>
<p id='n185' class='pln'><a href='#n185'>185</a></p>
<p id='n186' class='stm run hide_run'><a href='#n186'>186</a></p>
<p id='n187' class='stm run hide_run'><a href='#n187'>187</a></p>
<p id='n188' class='pln'><a href='#n188'>188</a></p>
<p id='n189' class='stm run hide_run'><a href='#n189'>189</a></p>
<p id='n190' class='stm mis'><a href='#n190'>190</a></p>
<p id='n191' class='pln'><a href='#n191'>191</a></p>
<p id='n192' class='pln'><a href='#n192'>192</a></p>
<p id='n193' class='pln'><a href='#n193'>193</a></p>
<p id='n194' class='stm run hide_run'><a href='#n194'>194</a></p>
<p id='n195' class='stm mis'><a href='#n195'>195</a></p>
<p id='n196' class='pln'><a href='#n196'>196</a></p>
<p id='n197' class='pln'><a href='#n197'>197</a></p>
<p id='n198' class='pln'><a href='#n198'>198</a></p>
<p id='n199' class='stm run hide_run'><a href='#n199'>199</a></p>
<p id='n200' class='pln'><a href='#n200'>200</a></p>
<p id='n201' class='pln'><a href='#n201'>201</a></p>
<p id='n202' class='pln'><a href='#n202'>202</a></p>
<p id='n203' class='pln'><a href='#n203'>203</a></p>
<p id='n204' class='stm run hide_run'><a href='#n204'>204</a></p>
<p id='n205' class='stm run hide_run'><a href='#n205'>205</a></p>
<p id='n206' class='stm mis'><a href='#n206'>206</a></p>
<p id='n207' class='stm mis'><a href='#n207'>207</a></p>
<p id='n208' class='pln'><a href='#n208'>208</a></p>
<p id='n209' class='stm run hide_run'><a href='#n209'>209</a></p>
<p id='n210' class='stm mis'><a href='#n210'>210</a></p>
<p id='n211' class='pln'><a href='#n211'>211</a></p>
<p id='n212' class='stm run hide_run'><a href='#n212'>212</a></p>
<p id='n213' class='pln'><a href='#n213'>213</a></p>
<p id='n214' class='stm run hide_run'><a href='#n214'>214</a></p>
<p id='n215' class='stm run hide_run'><a href='#n215'>215</a></p>
<p id='n216' class='pln'><a href='#n216'>216</a></p>
<p id='n217' class='stm run hide_run'><a href='#n217'>217</a></p>
<p id='n218' class='pln'><a href='#n218'>218</a></p>
<p id='n219' class='stm mis'><a href='#n219'>219</a></p>
<p id='n220' class='pln'><a href='#n220'>220</a></p>
<p id='n221' class='stm run hide_run'><a href='#n221'>221</a></p>
<p id='n222' class='pln'><a href='#n222'>222</a></p>
<p id='n223' class='stm mis'><a href='#n223'>223</a></p>
<p id='n224' class='stm mis'><a href='#n224'>224</a></p>
<p id='n225' class='pln'><a href='#n225'>225</a></p>
<p id='n226' class='stm run hide_run'><a href='#n226'>226</a></p>
<p id='n227' class='stm run hide_run'><a href='#n227'>227</a></p>
<p id='n228' class='stm run hide_run'><a href='#n228'>228</a></p>
<p id='n229' class='pln'><a href='#n229'>229</a></p>
<p id='n230' class='stm run hide_run'><a href='#n230'>230</a></p>
<p id='n231' class='stm run hide_run'><a href='#n231'>231</a></p>
<p id='n232' class='stm run hide_run'><a href='#n232'>232</a></p>
<p id='n233' class='stm run hide_run'><a href='#n233'>233</a></p>
<p id='n234' class='stm run hide_run'><a href='#n234'>234</a></p>
<p id='n235' class='stm run hide_run'><a href='#n235'>235</a></p>
<p id='n236' class='pln'><a href='#n236'>236</a></p>
<p id='n237' class='stm run hide_run'><a href='#n237'>237</a></p>
<p id='n238' class='stm run hide_run'><a href='#n238'>238</a></p>
<p id='n239' class='stm run hide_run'><a href='#n239'>239</a></p>
<p id='n240' class='pln'><a href='#n240'>240</a></p>
<p id='n241' class='stm run hide_run'><a href='#n241'>241</a></p>
<p id='n242' class='stm run hide_run'><a href='#n242'>242</a></p>
<p id='n243' class='stm run hide_run'><a href='#n243'>243</a></p>
<p id='n244' class='stm run hide_run'><a href='#n244'>244</a></p>
<p id='n245' class='stm run hide_run'><a href='#n245'>245</a></p>
<p id='n246' class='stm run hide_run'><a href='#n246'>246</a></p>
<p id='n247' class='pln'><a href='#n247'>247</a></p>
<p id='n248' class='stm run hide_run'><a href='#n248'>248</a></p>
<p id='n249' class='stm run hide_run'><a href='#n249'>249</a></p>
<p id='n250' class='stm mis'><a href='#n250'>250</a></p>
<p id='n251' class='stm mis'><a href='#n251'>251</a></p>
<p id='n252' class='pln'><a href='#n252'>252</a></p>
<p id='n253' class='stm run hide_run'><a href='#n253'>253</a></p>
<p id='n254' class='pln'><a href='#n254'>254</a></p>
<p id='n255' class='stm run hide_run'><a href='#n255'>255</a></p>
<p id='n256' class='stm mis'><a href='#n256'>256</a></p>
<p id='n257' class='stm mis'><a href='#n257'>257</a></p>
<p id='n258' class='pln'><a href='#n258'>258</a></p>
<p id='n259' class='stm run hide_run'><a href='#n259'>259</a></p>
<p id='n260' class='pln'><a href='#n260'>260</a></p>
<p id='n261' class='stm run hide_run'><a href='#n261'>261</a></p>
<p id='n262' class='pln'><a href='#n262'>262</a></p>
<p id='n263' class='pln'><a href='#n263'>263</a></p>
<p id='n264' class='pln'><a href='#n264'>264</a></p>
<p id='n265' class='pln'><a href='#n265'>265</a></p>
<p id='n266' class='stm run hide_run'><a href='#n266'>266</a></p>
<p id='n267' class='pln'><a href='#n267'>267</a></p>
<p id='n268' class='stm run hide_run'><a href='#n268'>268</a></p>
<p id='n269' class='pln'><a href='#n269'>269</a></p>
<p id='n270' class='pln'><a href='#n270'>270</a></p>
<p id='n271' class='pln'><a href='#n271'>271</a></p>
<p id='n272' class='stm run hide_run'><a href='#n272'>272</a></p>
<p id='n273' class='stm run hide_run'><a href='#n273'>273</a></p>
<p id='n274' class='pln'><a href='#n274'>274</a></p>
<p id='n275' class='stm run hide_run'><a href='#n275'>275</a></p>
<p id='n276' class='pln'><a href='#n276'>276</a></p>
<p id='n277' class='pln'><a href='#n277'>277</a></p>
<p id='n278' class='pln'><a href='#n278'>278</a></p>
<p id='n279' class='stm run hide_run'><a href='#n279'>279</a></p>
<p id='n280' class='pln'><a href='#n280'>280</a></p>
<p id='n281' class='pln'><a href='#n281'>281</a></p>
<p id='n282' class='stm run hide_run'><a href='#n282'>282</a></p>
<p id='n283' class='pln'><a href='#n283'>283</a></p>
<p id='n284' class='pln'><a href='#n284'>284</a></p>
<p id='n285' class='pln'><a href='#n285'>285</a></p>
<p id='n286' class='stm run hide_run'><a href='#n286'>286</a></p>
<p id='n287' class='pln'><a href='#n287'>287</a></p>
<p id='n288' class='stm run hide_run'><a href='#n288'>288</a></p>
<p id='n289' class='stm run hide_run'><a href='#n289'>289</a></p>
<p id='n290' class='pln'><a href='#n290'>290</a></p>
<p id='n291' class='stm run hide_run'><a href='#n291'>291</a></p>
<p id='n292' class='stm mis'><a href='#n292'>292</a></p>
<p id='n293' class='pln'><a href='#n293'>293</a></p>
<p id='n294' class='pln'><a href='#n294'>294</a></p>
<p id='n295' class='pln'><a href='#n295'>295</a></p>
<p id='n296' class='stm run hide_run'><a href='#n296'>296</a></p>
<p id='n297' class='pln'><a href='#n297'>297</a></p>
<p id='n298' class='pln'><a href='#n298'>298</a></p>
<p id='n299' class='pln'><a href='#n299'>299</a></p>
<p id='n300' class='pln'><a href='#n300'>300</a></p>
<p id='n301' class='pln'><a href='#n301'>301</a></p>
<p id='n302' class='stm run hide_run'><a href='#n302'>302</a></p>
<p id='n303' class='pln'><a href='#n303'>303</a></p>
<p id='n304' class='stm run hide_run'><a href='#n304'>304</a></p>
<p id='n305' class='stm run hide_run'><a href='#n305'>305</a></p>
<p id='n306' class='pln'><a href='#n306'>306</a></p>
<p id='n307' class='stm run hide_run'><a href='#n307'>307</a></p>
<p id='n308' class='stm mis'><a href='#n308'>308</a></p>
<p id='n309' class='stm mis'><a href='#n309'>309</a></p>
<p id='n310' class='stm run hide_run'><a href='#n310'>310</a></p>
<p id='n311' class='stm run hide_run'><a href='#n311'>311</a></p>
<p id='n312' class='stm run hide_run'><a href='#n312'>312</a></p>
<p id='n313' class='pln'><a href='#n313'>313</a></p>
<p id='n314' class='stm run hide_run'><a href='#n314'>314</a></p>
<p id='n315' class='pln'><a href='#n315'>315</a></p>
<p id='n316' class='stm run hide_run'><a href='#n316'>316</a></p>
<p id='n317' class='pln'><a href='#n317'>317</a></p>
<p id='n318' class='pln'><a href='#n318'>318</a></p>
<p id='n319' class='pln'><a href='#n319'>319</a></p>
<p id='n320' class='pln'><a href='#n320'>320</a></p>
<p id='n321' class='stm run hide_run'><a href='#n321'>321</a></p>
<p id='n322' class='stm run hide_run'><a href='#n322'>322</a></p>
<p id='n323' class='pln'><a href='#n323'>323</a></p>
<p id='n324' class='pln'><a href='#n324'>324</a></p>
<p id='n325' class='stm run hide_run'><a href='#n325'>325</a></p>
<p id='n326' class='stm run hide_run'><a href='#n326'>326</a></p>
<p id='n327' class='stm run hide_run'><a href='#n327'>327</a></p>
<p id='n328' class='pln'><a href='#n328'>328</a></p>
<p id='n329' class='stm run hide_run'><a href='#n329'>329</a></p>
<p id='n330' class='pln'><a href='#n330'>330</a></p>
<p id='n331' class='stm run hide_run'><a href='#n331'>331</a></p>
<p id='n332' class='stm mis'><a href='#n332'>332</a></p>
<p id='n333' class='stm mis'><a href='#n333'>333</a></p>
<p id='n334' class='pln'><a href='#n334'>334</a></p>
<p id='n335' class='stm run hide_run'><a href='#n335'>335</a></p>
<p id='n336' class='pln'><a href='#n336'>336</a></p>
<p id='n337' class='stm run hide_run'><a href='#n337'>337</a></p>
<p id='n338' class='pln'><a href='#n338'>338</a></p>
<p id='n339' class='pln'><a href='#n339'>339</a></p>
<p id='n340' class='pln'><a href='#n340'>340</a></p>
<p id='n341' class='pln'><a href='#n341'>341</a></p>
<p id='n342' class='pln'><a href='#n342'>342</a></p>
<p id='n343' class='stm run hide_run'><a href='#n343'>343</a></p>
</td>
<td class='text' valign='top'>
<p id='t1' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t2' class='pln'><span class='str'>Provides various authentication policies.</span><span class='strut'>&nbsp;</span></p>
<p id='t3' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t4' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>__future__</span> <span class='key'>import</span> <span class='nam'>unicode_literals</span><span class='strut'>&nbsp;</span></p>
<p id='t5' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>base64</span><span class='strut'>&nbsp;</span></p>
<p id='t6' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>datetime</span> <span class='key'>import</span> <span class='nam'>datetime</span><span class='strut'>&nbsp;</span></p>
<p id='t7' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t8' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>django</span><span class='op'>.</span><span class='nam'>contrib</span><span class='op'>.</span><span class='nam'>auth</span> <span class='key'>import</span> <span class='nam'>authenticate</span><span class='strut'>&nbsp;</span></p>
<p id='t9' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>django</span><span class='op'>.</span><span class='nam'>core</span><span class='op'>.</span><span class='nam'>exceptions</span> <span class='key'>import</span> <span class='nam'>ImproperlyConfigured</span><span class='strut'>&nbsp;</span></p>
<p id='t10' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span> <span class='key'>import</span> <span class='nam'>exceptions</span><span class='op'>,</span> <span class='nam'>HTTP_HEADER_ENCODING</span><span class='strut'>&nbsp;</span></p>
<p id='t11' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>compat</span> <span class='key'>import</span> <span class='nam'>CsrfViewMiddleware</span><span class='strut'>&nbsp;</span></p>
<p id='t12' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>compat</span> <span class='key'>import</span> <span class='nam'>oauth</span><span class='op'>,</span> <span class='nam'>oauth_provider</span><span class='op'>,</span> <span class='nam'>oauth_provider_store</span><span class='strut'>&nbsp;</span></p>
<p id='t13' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>compat</span> <span class='key'>import</span> <span class='nam'>oauth2_provider</span><span class='strut'>&nbsp;</span></p>
<p id='t14' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>authtoken</span><span class='op'>.</span><span class='nam'>models</span> <span class='key'>import</span> <span class='nam'>Token</span><span class='strut'>&nbsp;</span></p>
<p id='t15' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t16' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t17' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>get_authorization_header</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t18' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t19' class='pln'><span class='str'>&nbsp; &nbsp; Return request&#39;s &#39;Authorization:&#39; header, as a bytestring.</span><span class='strut'>&nbsp;</span></p>
<p id='t20' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t21' class='pln'><span class='str'>&nbsp; &nbsp; Hide some test client ickyness where the header can be unicode.</span><span class='strut'>&nbsp;</span></p>
<p id='t22' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t23' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>auth</span> <span class='op'>=</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>META</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;HTTP_AUTHORIZATION&#39;</span><span class='op'>,</span> <span class='nam'>b</span><span class='str'>&#39;&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t24' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>type</span><span class='op'>(</span><span class='nam'>auth</span><span class='op'>)</span> <span class='op'>==</span> <span class='nam'>type</span><span class='op'>(</span><span class='str'>&#39;&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t25' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Work around django test client oddness</span><span class='strut'>&nbsp;</span></p>
<p id='t26' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>auth</span> <span class='op'>=</span> <span class='nam'>auth</span><span class='op'>.</span><span class='nam'>encode</span><span class='op'>(</span><span class='nam'>HTTP_HEADER_ENCODING</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t27' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>auth</span><span class='strut'>&nbsp;</span></p>
<p id='t28' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t29' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t30' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>BaseAuthentication</span><span class='op'>(</span><span class='nam'>object</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t31' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t32' class='pln'><span class='str'>&nbsp; &nbsp; All authentication classes should extend BaseAuthentication.</span><span class='strut'>&nbsp;</span></p>
<p id='t33' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t34' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t35' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>authenticate</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t36' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t37' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Authenticate the request and return a two-tuple of (user, token).</span><span class='strut'>&nbsp;</span></p>
<p id='t38' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t39' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>NotImplementedError</span><span class='op'>(</span><span class='str'>&quot;.authenticate() must be overridden.&quot;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t40' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t41' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>authenticate_header</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t42' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t43' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Return a string to be used as the value of the `WWW-Authenticate`</span><span class='strut'>&nbsp;</span></p>
<p id='t44' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; header in a `401 Unauthenticated` response, or `None` if the</span><span class='strut'>&nbsp;</span></p>
<p id='t45' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; authentication scheme should return `403 Permission Denied` responses.</span><span class='strut'>&nbsp;</span></p>
<p id='t46' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t47' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>pass</span><span class='strut'>&nbsp;</span></p>
<p id='t48' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t49' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t50' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>BasicAuthentication</span><span class='op'>(</span><span class='nam'>BaseAuthentication</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t51' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t52' class='pln'><span class='str'>&nbsp; &nbsp; HTTP Basic authentication against username/password.</span><span class='strut'>&nbsp;</span></p>
<p id='t53' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t54' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>www_authenticate_realm</span> <span class='op'>=</span> <span class='str'>&#39;api&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t55' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t56' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>authenticate</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t57' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t58' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Returns a `User` if a correct username and password have been supplied</span><span class='strut'>&nbsp;</span></p>
<p id='t59' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; using HTTP Basic authentication.&nbsp; Otherwise returns `None`.</span><span class='strut'>&nbsp;</span></p>
<p id='t60' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t61' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>auth</span> <span class='op'>=</span> <span class='nam'>get_authorization_header</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t62' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t63' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>auth</span> <span class='key'>or</span> <span class='nam'>auth</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>lower</span><span class='op'>(</span><span class='op'>)</span> <span class='op'>!=</span> <span class='nam'>b</span><span class='str'>&#39;basic&#39;</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t64' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
<p id='t65' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t66' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>auth</span><span class='op'>)</span> <span class='op'>==</span> <span class='num'>1</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t67' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>msg</span> <span class='op'>=</span> <span class='str'>&#39;Invalid basic header. No credentials provided.&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t68' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>exceptions</span><span class='op'>.</span><span class='nam'>AuthenticationFailed</span><span class='op'>(</span><span class='nam'>msg</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t69' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>elif</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>auth</span><span class='op'>)</span> <span class='op'>&gt;</span> <span class='num'>2</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t70' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>msg</span> <span class='op'>=</span> <span class='str'>&#39;Invalid basic header. Credentials string should not contain spaces.&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t71' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>exceptions</span><span class='op'>.</span><span class='nam'>AuthenticationFailed</span><span class='op'>(</span><span class='nam'>msg</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t72' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t73' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t74' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>auth_parts</span> <span class='op'>=</span> <span class='nam'>base64</span><span class='op'>.</span><span class='nam'>b64decode</span><span class='op'>(</span><span class='nam'>auth</span><span class='op'>[</span><span class='num'>1</span><span class='op'>]</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='nam'>HTTP_HEADER_ENCODING</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>partition</span><span class='op'>(</span><span class='str'>&#39;:&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t75' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>TypeError</span><span class='op'>,</span> <span class='nam'>UnicodeDecodeError</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t76' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>msg</span> <span class='op'>=</span> <span class='str'>&#39;Invalid basic header. Credentials not correctly base64 encoded&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t77' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>exceptions</span><span class='op'>.</span><span class='nam'>AuthenticationFailed</span><span class='op'>(</span><span class='nam'>msg</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t78' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t79' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>userid</span><span class='op'>,</span> <span class='nam'>password</span> <span class='op'>=</span> <span class='nam'>auth_parts</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>,</span> <span class='nam'>auth_parts</span><span class='op'>[</span><span class='num'>2</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t80' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>authenticate_credentials</span><span class='op'>(</span><span class='nam'>userid</span><span class='op'>,</span> <span class='nam'>password</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t81' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t82' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>authenticate_credentials</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>userid</span><span class='op'>,</span> <span class='nam'>password</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t83' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t84' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Authenticate the userid and password against username and password.</span><span class='strut'>&nbsp;</span></p>
<p id='t85' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t86' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>user</span> <span class='op'>=</span> <span class='nam'>authenticate</span><span class='op'>(</span><span class='nam'>username</span><span class='op'>=</span><span class='nam'>userid</span><span class='op'>,</span> <span class='nam'>password</span><span class='op'>=</span><span class='nam'>password</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t87' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>user</span> <span class='key'>is</span> <span class='nam'>None</span> <span class='key'>or</span> <span class='key'>not</span> <span class='nam'>user</span><span class='op'>.</span><span class='nam'>is_active</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t88' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>exceptions</span><span class='op'>.</span><span class='nam'>AuthenticationFailed</span><span class='op'>(</span><span class='str'>&#39;Invalid username/password&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t89' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>(</span><span class='nam'>user</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t90' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t91' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>authenticate_header</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t92' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='str'>&#39;Basic realm=&quot;%s&quot;&#39;</span> <span class='op'>%</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>www_authenticate_realm</span><span class='strut'>&nbsp;</span></p>
<p id='t93' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t94' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t95' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>SessionAuthentication</span><span class='op'>(</span><span class='nam'>BaseAuthentication</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t96' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t97' class='pln'><span class='str'>&nbsp; &nbsp; Use Django&#39;s session framework for authentication.</span><span class='strut'>&nbsp;</span></p>
<p id='t98' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t99' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t100' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>authenticate</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t101' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t102' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Returns a `User` if the request session currently has a logged in user.</span><span class='strut'>&nbsp;</span></p>
<p id='t103' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Otherwise returns `None`.</span><span class='strut'>&nbsp;</span></p>
<p id='t104' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t105' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t106' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Get the underlying HttpRequest object</span><span class='strut'>&nbsp;</span></p>
<p id='t107' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>http_request</span> <span class='op'>=</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>_request</span><span class='strut'>&nbsp;</span></p>
<p id='t108' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>user</span> <span class='op'>=</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>http_request</span><span class='op'>,</span> <span class='str'>&#39;user&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t109' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t110' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Unauthenticated, CSRF validation not required</span><span class='strut'>&nbsp;</span></p>
<p id='t111' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>user</span> <span class='key'>or</span> <span class='key'>not</span> <span class='nam'>user</span><span class='op'>.</span><span class='nam'>is_active</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t112' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
<p id='t113' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t114' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Enforce CSRF validation for session based authentication.</span><span class='strut'>&nbsp;</span></p>
<p id='t115' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>class</span> <span class='nam'>CSRFCheck</span><span class='op'>(</span><span class='nam'>CsrfViewMiddleware</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t116' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_reject</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='nam'>reason</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t117' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Return the failure reason instead of an HttpResponse</span><span class='strut'>&nbsp;</span></p>
<p id='t118' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>reason</span><span class='strut'>&nbsp;</span></p>
<p id='t119' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t120' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>reason</span> <span class='op'>=</span> <span class='nam'>CSRFCheck</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>process_view</span><span class='op'>(</span><span class='nam'>http_request</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>)</span><span class='op'>,</span> <span class='op'>{</span><span class='op'>}</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t121' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>reason</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t122' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># CSRF failed, bail with explicit error message</span><span class='strut'>&nbsp;</span></p>
<p id='t123' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>exceptions</span><span class='op'>.</span><span class='nam'>AuthenticationFailed</span><span class='op'>(</span><span class='str'>&#39;CSRF Failed: %s&#39;</span> <span class='op'>%</span> <span class='nam'>reason</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t124' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t125' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># CSRF passed with authenticated user</span><span class='strut'>&nbsp;</span></p>
<p id='t126' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>(</span><span class='nam'>user</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t127' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t128' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t129' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>TokenAuthentication</span><span class='op'>(</span><span class='nam'>BaseAuthentication</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t130' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t131' class='pln'><span class='str'>&nbsp; &nbsp; Simple token based authentication.</span><span class='strut'>&nbsp;</span></p>
<p id='t132' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t133' class='pln'><span class='str'>&nbsp; &nbsp; Clients should authenticate by passing the token key in the &quot;Authorization&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t134' class='pln'><span class='str'>&nbsp; &nbsp; HTTP header, prepended with the string &quot;Token &quot;.&nbsp; For example:</span><span class='strut'>&nbsp;</span></p>
<p id='t135' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t136' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Authorization: Token 401f7ac837da42b97f613d789819ff93537bee6a</span><span class='strut'>&nbsp;</span></p>
<p id='t137' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t138' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t139' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>model</span> <span class='op'>=</span> <span class='nam'>Token</span><span class='strut'>&nbsp;</span></p>
<p id='t140' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t141' class='pln'><span class='str'>&nbsp; &nbsp; A custom token model may be used, but must have the following properties.</span><span class='strut'>&nbsp;</span></p>
<p id='t142' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t143' class='pln'><span class='str'>&nbsp; &nbsp; * key -- The string identifying the token</span><span class='strut'>&nbsp;</span></p>
<p id='t144' class='pln'><span class='str'>&nbsp; &nbsp; * user -- The user to which the token belongs</span><span class='strut'>&nbsp;</span></p>
<p id='t145' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t146' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t147' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>authenticate</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t148' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>auth</span> <span class='op'>=</span> <span class='nam'>get_authorization_header</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t149' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t150' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>auth</span> <span class='key'>or</span> <span class='nam'>auth</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>lower</span><span class='op'>(</span><span class='op'>)</span> <span class='op'>!=</span> <span class='nam'>b</span><span class='str'>&#39;token&#39;</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t151' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
<p id='t152' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t153' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>auth</span><span class='op'>)</span> <span class='op'>==</span> <span class='num'>1</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t154' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>msg</span> <span class='op'>=</span> <span class='str'>&#39;Invalid token header. No credentials provided.&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t155' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>exceptions</span><span class='op'>.</span><span class='nam'>AuthenticationFailed</span><span class='op'>(</span><span class='nam'>msg</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t156' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>elif</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>auth</span><span class='op'>)</span> <span class='op'>&gt;</span> <span class='num'>2</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t157' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>msg</span> <span class='op'>=</span> <span class='str'>&#39;Invalid token header. Token string should not contain spaces.&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t158' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>exceptions</span><span class='op'>.</span><span class='nam'>AuthenticationFailed</span><span class='op'>(</span><span class='nam'>msg</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t159' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t160' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>authenticate_credentials</span><span class='op'>(</span><span class='nam'>auth</span><span class='op'>[</span><span class='num'>1</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t161' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t162' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>authenticate_credentials</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>key</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t163' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t164' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>token</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>model</span><span class='op'>.</span><span class='nam'>objects</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='nam'>key</span><span class='op'>=</span><span class='nam'>key</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t165' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>model</span><span class='op'>.</span><span class='nam'>DoesNotExist</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t166' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>exceptions</span><span class='op'>.</span><span class='nam'>AuthenticationFailed</span><span class='op'>(</span><span class='str'>&#39;Invalid token&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t167' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t168' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>token</span><span class='op'>.</span><span class='nam'>user</span><span class='op'>.</span><span class='nam'>is_active</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t169' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>exceptions</span><span class='op'>.</span><span class='nam'>AuthenticationFailed</span><span class='op'>(</span><span class='str'>&#39;User inactive or deleted&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t170' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t171' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>(</span><span class='nam'>token</span><span class='op'>.</span><span class='nam'>user</span><span class='op'>,</span> <span class='nam'>token</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t172' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t173' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>authenticate_header</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t174' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='str'>&#39;Token&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t175' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t176' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t177' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>OAuthAuthentication</span><span class='op'>(</span><span class='nam'>BaseAuthentication</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t178' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t179' class='pln'><span class='str'>&nbsp; &nbsp; OAuth 1.0a authentication backend using `django-oauth-plus` and `oauth2`.</span><span class='strut'>&nbsp;</span></p>
<p id='t180' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t181' class='pln'><span class='str'>&nbsp; &nbsp; Note: The `oauth2` package actually provides oauth1.0a support.&nbsp; Urg.</span><span class='strut'>&nbsp;</span></p>
<p id='t182' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; We import it from the `compat` module as `oauth`.</span><span class='strut'>&nbsp;</span></p>
<p id='t183' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t184' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>www_authenticate_realm</span> <span class='op'>=</span> <span class='str'>&#39;api&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t185' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t186' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='op'>*</span><span class='nam'>args</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kwargs</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t187' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>super</span><span class='op'>(</span><span class='nam'>OAuthAuthentication</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>__init__</span><span class='op'>(</span><span class='op'>*</span><span class='nam'>args</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kwargs</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t188' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t189' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>oauth</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t190' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>ImproperlyConfigured</span><span class='op'>(</span><span class='strut'>&nbsp;</span></p>
<p id='t191' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;The &#39;oauth2&#39; package could not be imported.&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t192' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;It is required for use with the &#39;OAuthAuthentication&#39; class.&quot;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t193' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t194' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>oauth_provider</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t195' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>ImproperlyConfigured</span><span class='op'>(</span><span class='strut'>&nbsp;</span></p>
<p id='t196' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;The &#39;django-oauth-plus&#39; package could not be imported.&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t197' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;It is required for use with the &#39;OAuthAuthentication&#39; class.&quot;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t198' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t199' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>authenticate</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t200' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t201' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Returns two-tuple of (user, token) if authentication succeeds,</span><span class='strut'>&nbsp;</span></p>
<p id='t202' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; or None otherwise.</span><span class='strut'>&nbsp;</span></p>
<p id='t203' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t204' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t205' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>oauth_request</span> <span class='op'>=</span> <span class='nam'>oauth_provider</span><span class='op'>.</span><span class='nam'>utils</span><span class='op'>.</span><span class='nam'>get_oauth_request</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t206' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='nam'>oauth</span><span class='op'>.</span><span class='nam'>Error</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t207' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>exceptions</span><span class='op'>.</span><span class='nam'>AuthenticationFailed</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>.</span><span class='nam'>message</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t208' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t209' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>oauth_request</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t210' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
<p id='t211' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t212' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>oauth_params</span> <span class='op'>=</span> <span class='nam'>oauth_provider</span><span class='op'>.</span><span class='nam'>consts</span><span class='op'>.</span><span class='nam'>OAUTH_PARAMETERS_NAMES</span><span class='strut'>&nbsp;</span></p>
<p id='t213' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t214' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>found</span> <span class='op'>=</span> <span class='nam'>any</span><span class='op'>(</span><span class='nam'>param</span> <span class='key'>for</span> <span class='nam'>param</span> <span class='key'>in</span> <span class='nam'>oauth_params</span> <span class='key'>if</span> <span class='nam'>param</span> <span class='key'>in</span> <span class='nam'>oauth_request</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t215' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>missing</span> <span class='op'>=</span> <span class='nam'>list</span><span class='op'>(</span><span class='nam'>param</span> <span class='key'>for</span> <span class='nam'>param</span> <span class='key'>in</span> <span class='nam'>oauth_params</span> <span class='key'>if</span> <span class='nam'>param</span> <span class='key'>not</span> <span class='key'>in</span> <span class='nam'>oauth_request</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t216' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t217' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>found</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t218' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># OAuth authentication was not attempted.</span><span class='strut'>&nbsp;</span></p>
<p id='t219' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
<p id='t220' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t221' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>missing</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t222' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># OAuth was attempted but missing parameters.</span><span class='strut'>&nbsp;</span></p>
<p id='t223' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>msg</span> <span class='op'>=</span> <span class='str'>&#39;Missing parameters: %s&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='str'>&#39;, &#39;</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='nam'>missing</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t224' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>exceptions</span><span class='op'>.</span><span class='nam'>AuthenticationFailed</span><span class='op'>(</span><span class='nam'>msg</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t225' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t226' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>check_nonce</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>,</span> <span class='nam'>oauth_request</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t227' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>msg</span> <span class='op'>=</span> <span class='str'>&#39;Nonce check failed&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t228' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>exceptions</span><span class='op'>.</span><span class='nam'>AuthenticationFailed</span><span class='op'>(</span><span class='nam'>msg</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t229' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t230' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t231' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>consumer_key</span> <span class='op'>=</span> <span class='nam'>oauth_request</span><span class='op'>.</span><span class='nam'>get_parameter</span><span class='op'>(</span><span class='str'>&#39;oauth_consumer_key&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t232' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>consumer</span> <span class='op'>=</span> <span class='nam'>oauth_provider_store</span><span class='op'>.</span><span class='nam'>get_consumer</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>,</span> <span class='nam'>oauth_request</span><span class='op'>,</span> <span class='nam'>consumer_key</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t233' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='nam'>oauth_provider</span><span class='op'>.</span><span class='nam'>store</span><span class='op'>.</span><span class='nam'>InvalidConsumerError</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t234' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>msg</span> <span class='op'>=</span> <span class='str'>&#39;Invalid consumer token: %s&#39;</span> <span class='op'>%</span> <span class='nam'>oauth_request</span><span class='op'>.</span><span class='nam'>get_parameter</span><span class='op'>(</span><span class='str'>&#39;oauth_consumer_key&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t235' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>exceptions</span><span class='op'>.</span><span class='nam'>AuthenticationFailed</span><span class='op'>(</span><span class='nam'>msg</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t236' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t237' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>consumer</span><span class='op'>.</span><span class='nam'>status</span> <span class='op'>!=</span> <span class='nam'>oauth_provider</span><span class='op'>.</span><span class='nam'>consts</span><span class='op'>.</span><span class='nam'>ACCEPTED</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t238' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>msg</span> <span class='op'>=</span> <span class='str'>&#39;Invalid consumer key status: %s&#39;</span> <span class='op'>%</span> <span class='nam'>consumer</span><span class='op'>.</span><span class='nam'>get_status_display</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t239' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>exceptions</span><span class='op'>.</span><span class='nam'>AuthenticationFailed</span><span class='op'>(</span><span class='nam'>msg</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t240' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t241' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t242' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>token_param</span> <span class='op'>=</span> <span class='nam'>oauth_request</span><span class='op'>.</span><span class='nam'>get_parameter</span><span class='op'>(</span><span class='str'>&#39;oauth_token&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t243' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>token</span> <span class='op'>=</span> <span class='nam'>oauth_provider_store</span><span class='op'>.</span><span class='nam'>get_access_token</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>,</span> <span class='nam'>oauth_request</span><span class='op'>,</span> <span class='nam'>consumer</span><span class='op'>,</span> <span class='nam'>token_param</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t244' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='nam'>oauth_provider</span><span class='op'>.</span><span class='nam'>store</span><span class='op'>.</span><span class='nam'>InvalidTokenError</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t245' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>msg</span> <span class='op'>=</span> <span class='str'>&#39;Invalid access token: %s&#39;</span> <span class='op'>%</span> <span class='nam'>oauth_request</span><span class='op'>.</span><span class='nam'>get_parameter</span><span class='op'>(</span><span class='str'>&#39;oauth_token&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t246' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>exceptions</span><span class='op'>.</span><span class='nam'>AuthenticationFailed</span><span class='op'>(</span><span class='nam'>msg</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t247' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t248' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t249' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>validate_token</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>,</span> <span class='nam'>consumer</span><span class='op'>,</span> <span class='nam'>token</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t250' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='nam'>oauth</span><span class='op'>.</span><span class='nam'>Error</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t251' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>exceptions</span><span class='op'>.</span><span class='nam'>AuthenticationFailed</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>.</span><span class='nam'>message</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t252' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t253' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>user</span> <span class='op'>=</span> <span class='nam'>token</span><span class='op'>.</span><span class='nam'>user</span><span class='strut'>&nbsp;</span></p>
<p id='t254' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t255' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>user</span><span class='op'>.</span><span class='nam'>is_active</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t256' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>msg</span> <span class='op'>=</span> <span class='str'>&#39;User inactive or deleted: %s&#39;</span> <span class='op'>%</span> <span class='nam'>user</span><span class='op'>.</span><span class='nam'>username</span><span class='strut'>&nbsp;</span></p>
<p id='t257' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>exceptions</span><span class='op'>.</span><span class='nam'>AuthenticationFailed</span><span class='op'>(</span><span class='nam'>msg</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t258' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t259' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>(</span><span class='nam'>token</span><span class='op'>.</span><span class='nam'>user</span><span class='op'>,</span> <span class='nam'>token</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t260' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t261' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>authenticate_header</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t262' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t263' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; If permission is denied, return a &#39;401 Unauthorized&#39; response,</span><span class='strut'>&nbsp;</span></p>
<p id='t264' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; with an appropraite &#39;WWW-Authenticate&#39; header.</span><span class='strut'>&nbsp;</span></p>
<p id='t265' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t266' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='str'>&#39;OAuth realm=&quot;%s&quot;&#39;</span> <span class='op'>%</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>www_authenticate_realm</span><span class='strut'>&nbsp;</span></p>
<p id='t267' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t268' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>validate_token</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='nam'>consumer</span><span class='op'>,</span> <span class='nam'>token</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t269' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t270' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Check the token and raise an `oauth.Error` exception if invalid.</span><span class='strut'>&nbsp;</span></p>
<p id='t271' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t272' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>oauth_server</span><span class='op'>,</span> <span class='nam'>oauth_request</span> <span class='op'>=</span> <span class='nam'>oauth_provider</span><span class='op'>.</span><span class='nam'>utils</span><span class='op'>.</span><span class='nam'>initialize_server_request</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t273' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>oauth_server</span><span class='op'>.</span><span class='nam'>verify_request</span><span class='op'>(</span><span class='nam'>oauth_request</span><span class='op'>,</span> <span class='nam'>consumer</span><span class='op'>,</span> <span class='nam'>token</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t274' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t275' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>check_nonce</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='nam'>oauth_request</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t276' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t277' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Checks nonce of request, and return True if valid.</span><span class='strut'>&nbsp;</span></p>
<p id='t278' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t279' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>oauth_provider_store</span><span class='op'>.</span><span class='nam'>check_nonce</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>,</span> <span class='nam'>oauth_request</span><span class='op'>,</span> <span class='nam'>oauth_request</span><span class='op'>[</span><span class='str'>&#39;oauth_nonce&#39;</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t280' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t281' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t282' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>OAuth2Authentication</span><span class='op'>(</span><span class='nam'>BaseAuthentication</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t283' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t284' class='pln'><span class='str'>&nbsp; &nbsp; OAuth 2 authentication backend using `django-oauth2-provider`</span><span class='strut'>&nbsp;</span></p>
<p id='t285' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t286' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>www_authenticate_realm</span> <span class='op'>=</span> <span class='str'>&#39;api&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t287' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t288' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='op'>*</span><span class='nam'>args</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kwargs</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t289' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>super</span><span class='op'>(</span><span class='nam'>OAuth2Authentication</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>__init__</span><span class='op'>(</span><span class='op'>*</span><span class='nam'>args</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kwargs</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t290' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t291' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>oauth2_provider</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t292' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>ImproperlyConfigured</span><span class='op'>(</span><span class='strut'>&nbsp;</span></p>
<p id='t293' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;The &#39;django-oauth2-provider&#39; package could not be imported. &quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t294' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;It is required for use with the &#39;OAuth2Authentication&#39; class.&quot;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t295' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t296' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>authenticate</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t297' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t298' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Returns two-tuple of (user, token) if authentication succeeds,</span><span class='strut'>&nbsp;</span></p>
<p id='t299' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; or None otherwise.</span><span class='strut'>&nbsp;</span></p>
<p id='t300' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t301' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t302' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>auth</span> <span class='op'>=</span> <span class='nam'>get_authorization_header</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t303' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t304' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>auth</span> <span class='key'>or</span> <span class='nam'>auth</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>lower</span><span class='op'>(</span><span class='op'>)</span> <span class='op'>!=</span> <span class='nam'>b</span><span class='str'>&#39;bearer&#39;</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t305' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
<p id='t306' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t307' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>auth</span><span class='op'>)</span> <span class='op'>==</span> <span class='num'>1</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t308' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>msg</span> <span class='op'>=</span> <span class='str'>&#39;Invalid bearer header. No credentials provided.&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t309' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>exceptions</span><span class='op'>.</span><span class='nam'>AuthenticationFailed</span><span class='op'>(</span><span class='nam'>msg</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t310' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>elif</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>auth</span><span class='op'>)</span> <span class='op'>&gt;</span> <span class='num'>2</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t311' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>msg</span> <span class='op'>=</span> <span class='str'>&#39;Invalid bearer header. Token string should not contain spaces.&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t312' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>exceptions</span><span class='op'>.</span><span class='nam'>AuthenticationFailed</span><span class='op'>(</span><span class='nam'>msg</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t313' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t314' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>authenticate_credentials</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>,</span> <span class='nam'>auth</span><span class='op'>[</span><span class='num'>1</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t315' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t316' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>authenticate_credentials</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='nam'>access_token</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t317' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t318' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Authenticate the request, given the access token.</span><span class='strut'>&nbsp;</span></p>
<p id='t319' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t320' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t321' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t322' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>token</span> <span class='op'>=</span> <span class='nam'>oauth2_provider</span><span class='op'>.</span><span class='nam'>models</span><span class='op'>.</span><span class='nam'>AccessToken</span><span class='op'>.</span><span class='nam'>objects</span><span class='op'>.</span><span class='nam'>select_related</span><span class='op'>(</span><span class='str'>&#39;user&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t323' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># TODO: Change to timezone aware datetime when oauth2_provider add</span><span class='strut'>&nbsp;</span></p>
<p id='t324' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># support to it.</span><span class='strut'>&nbsp;</span></p>
<p id='t325' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>token</span> <span class='op'>=</span> <span class='nam'>token</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='nam'>token</span><span class='op'>=</span><span class='nam'>access_token</span><span class='op'>,</span> <span class='nam'>expires__gt</span><span class='op'>=</span><span class='nam'>datetime</span><span class='op'>.</span><span class='nam'>now</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t326' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='nam'>oauth2_provider</span><span class='op'>.</span><span class='nam'>models</span><span class='op'>.</span><span class='nam'>AccessToken</span><span class='op'>.</span><span class='nam'>DoesNotExist</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t327' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>exceptions</span><span class='op'>.</span><span class='nam'>AuthenticationFailed</span><span class='op'>(</span><span class='str'>&#39;Invalid token&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t328' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t329' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>user</span> <span class='op'>=</span> <span class='nam'>token</span><span class='op'>.</span><span class='nam'>user</span><span class='strut'>&nbsp;</span></p>
<p id='t330' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t331' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>user</span><span class='op'>.</span><span class='nam'>is_active</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t332' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>msg</span> <span class='op'>=</span> <span class='str'>&#39;User inactive or deleted: %s&#39;</span> <span class='op'>%</span> <span class='nam'>user</span><span class='op'>.</span><span class='nam'>username</span><span class='strut'>&nbsp;</span></p>
<p id='t333' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>exceptions</span><span class='op'>.</span><span class='nam'>AuthenticationFailed</span><span class='op'>(</span><span class='nam'>msg</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t334' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t335' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>(</span><span class='nam'>user</span><span class='op'>,</span> <span class='nam'>token</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t336' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t337' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>authenticate_header</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t338' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t339' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Bearer is the only finalized type currently</span><span class='strut'>&nbsp;</span></p>
<p id='t340' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t341' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Check details on the `OAuth2Authentication.authenticate` method</span><span class='strut'>&nbsp;</span></p>
<p id='t342' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t343' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='str'>&#39;Bearer realm=&quot;%s&quot;&#39;</span> <span class='op'>%</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>www_authenticate_realm</span><span class='strut'>&nbsp;</span></p>
</td>
</tr>
</table>
</div>
<div id='footer'>
<div class='content'>
<p>
<a class='nav' href='index.html'>&#xab; index</a> &nbsp; &nbsp; <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.5.1</a>
</p>
</div>
</div>
</body>
</html>

View File

@ -1,81 +0,0 @@
<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
<title>Coverage for rest_framework/authtoken/__init__: 100%</title>
<link rel='stylesheet' href='style.css' type='text/css'>
<script type='text/javascript' src='jquery-1.4.3.min.js'></script>
<script type='text/javascript' src='jquery.hotkeys.js'></script>
<script type='text/javascript' src='jquery.isonscreen.js'></script>
<script type='text/javascript' src='coverage_html.js'></script>
<script type='text/javascript' charset='utf-8'>
jQuery(document).ready(coverage.pyfile_ready);
</script>
</head>
<body id='pyfile'>
<div id='header'>
<div class='content'>
<h1>Coverage for <b>rest_framework/authtoken/__init__</b> :
<span class='pc_cov'>100%</span>
</h1>
<img id='keyboard_icon' src='keybd_closed.png'>
<h2 class='stats'>
0 statements
<span class='run hide_run shortkey_r' onclick='coverage.toggle_lines(this, "run")'>0 run</span>
<span class='mis shortkey_m' onclick='coverage.toggle_lines(this, "mis")'>0 missing</span>
<span class='exc shortkey_x' onclick='coverage.toggle_lines(this, "exc")'>0 excluded</span>
</h2>
</div>
</div>
<div class='help_panel'>
<img id='panel_icon' src='keybd_open.png'>
<p class='legend'>Hot-keys on this page</p>
<div>
<p class='keyhelp'>
<span class='key'>r</span>
<span class='key'>m</span>
<span class='key'>x</span>
<span class='key'>p</span> &nbsp; toggle line displays
</p>
<p class='keyhelp'>
<span class='key'>j</span>
<span class='key'>k</span> &nbsp; next/prev highlighted chunk
</p>
<p class='keyhelp'>
<span class='key'>0</span> &nbsp; (zero) top of page
</p>
<p class='keyhelp'>
<span class='key'>1</span> &nbsp; (one) first highlighted chunk
</p>
</div>
</div>
<div id='source'>
<table cellspacing='0' cellpadding='0'>
<tr>
<td class='linenos' valign='top'>
</td>
<td class='text' valign='top'>
</td>
</tr>
</table>
</div>
<div id='footer'>
<div class='content'>
<p>
<a class='nav' href='index.html'>&#xab; index</a> &nbsp; &nbsp; <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.5.1</a>
</p>
</div>
</div>
</body>
</html>

View File

@ -1,151 +0,0 @@
<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
<title>Coverage for rest_framework/authtoken/models: 95%</title>
<link rel='stylesheet' href='style.css' type='text/css'>
<script type='text/javascript' src='jquery-1.4.3.min.js'></script>
<script type='text/javascript' src='jquery.hotkeys.js'></script>
<script type='text/javascript' src='jquery.isonscreen.js'></script>
<script type='text/javascript' src='coverage_html.js'></script>
<script type='text/javascript' charset='utf-8'>
jQuery(document).ready(coverage.pyfile_ready);
</script>
</head>
<body id='pyfile'>
<div id='header'>
<div class='content'>
<h1>Coverage for <b>rest_framework/authtoken/models</b> :
<span class='pc_cov'>95%</span>
</h1>
<img id='keyboard_icon' src='keybd_closed.png'>
<h2 class='stats'>
21 statements
<span class='run hide_run shortkey_r' onclick='coverage.toggle_lines(this, "run")'>20 run</span>
<span class='mis shortkey_m' onclick='coverage.toggle_lines(this, "mis")'>1 missing</span>
<span class='exc shortkey_x' onclick='coverage.toggle_lines(this, "exc")'>0 excluded</span>
</h2>
</div>
</div>
<div class='help_panel'>
<img id='panel_icon' src='keybd_open.png'>
<p class='legend'>Hot-keys on this page</p>
<div>
<p class='keyhelp'>
<span class='key'>r</span>
<span class='key'>m</span>
<span class='key'>x</span>
<span class='key'>p</span> &nbsp; toggle line displays
</p>
<p class='keyhelp'>
<span class='key'>j</span>
<span class='key'>k</span> &nbsp; next/prev highlighted chunk
</p>
<p class='keyhelp'>
<span class='key'>0</span> &nbsp; (zero) top of page
</p>
<p class='keyhelp'>
<span class='key'>1</span> &nbsp; (one) first highlighted chunk
</p>
</div>
</div>
<div id='source'>
<table cellspacing='0' cellpadding='0'>
<tr>
<td class='linenos' valign='top'>
<p id='n1' class='stm run hide_run'><a href='#n1'>1</a></p>
<p id='n2' class='stm run hide_run'><a href='#n2'>2</a></p>
<p id='n3' class='stm run hide_run'><a href='#n3'>3</a></p>
<p id='n4' class='stm run hide_run'><a href='#n4'>4</a></p>
<p id='n5' class='stm run hide_run'><a href='#n5'>5</a></p>
<p id='n6' class='stm run hide_run'><a href='#n6'>6</a></p>
<p id='n7' class='pln'><a href='#n7'>7</a></p>
<p id='n8' class='pln'><a href='#n8'>8</a></p>
<p id='n9' class='stm run hide_run'><a href='#n9'>9</a></p>
<p id='n10' class='pln'><a href='#n10'>10</a></p>
<p id='n11' class='pln'><a href='#n11'>11</a></p>
<p id='n12' class='pln'><a href='#n12'>12</a></p>
<p id='n13' class='stm run hide_run'><a href='#n13'>13</a></p>
<p id='n14' class='stm run hide_run'><a href='#n14'>14</a></p>
<p id='n15' class='stm run hide_run'><a href='#n15'>15</a></p>
<p id='n16' class='pln'><a href='#n16'>16</a></p>
<p id='n17' class='stm run hide_run'><a href='#n17'>17</a></p>
<p id='n18' class='pln'><a href='#n18'>18</a></p>
<p id='n19' class='pln'><a href='#n19'>19</a></p>
<p id='n20' class='pln'><a href='#n20'>20</a></p>
<p id='n21' class='pln'><a href='#n21'>21</a></p>
<p id='n22' class='pln'><a href='#n22'>22</a></p>
<p id='n23' class='stm run hide_run'><a href='#n23'>23</a></p>
<p id='n24' class='pln'><a href='#n24'>24</a></p>
<p id='n25' class='stm run hide_run'><a href='#n25'>25</a></p>
<p id='n26' class='stm run hide_run'><a href='#n26'>26</a></p>
<p id='n27' class='stm run hide_run'><a href='#n27'>27</a></p>
<p id='n28' class='stm run hide_run'><a href='#n28'>28</a></p>
<p id='n29' class='pln'><a href='#n29'>29</a></p>
<p id='n30' class='stm run hide_run'><a href='#n30'>30</a></p>
<p id='n31' class='stm run hide_run'><a href='#n31'>31</a></p>
<p id='n32' class='stm run hide_run'><a href='#n32'>32</a></p>
<p id='n33' class='pln'><a href='#n33'>33</a></p>
<p id='n34' class='stm run hide_run'><a href='#n34'>34</a></p>
<p id='n35' class='stm mis'><a href='#n35'>35</a></p>
</td>
<td class='text' valign='top'>
<p id='t1' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>uuid</span><span class='strut'>&nbsp;</span></p>
<p id='t2' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>hmac</span><span class='strut'>&nbsp;</span></p>
<p id='t3' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>hashlib</span> <span class='key'>import</span> <span class='nam'>sha1</span><span class='strut'>&nbsp;</span></p>
<p id='t4' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>compat</span> <span class='key'>import</span> <span class='nam'>User</span><span class='strut'>&nbsp;</span></p>
<p id='t5' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>django</span><span class='op'>.</span><span class='nam'>conf</span> <span class='key'>import</span> <span class='nam'>settings</span><span class='strut'>&nbsp;</span></p>
<p id='t6' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>django</span><span class='op'>.</span><span class='nam'>db</span> <span class='key'>import</span> <span class='nam'>models</span><span class='strut'>&nbsp;</span></p>
<p id='t7' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t8' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t9' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>Token</span><span class='op'>(</span><span class='nam'>models</span><span class='op'>.</span><span class='nam'>Model</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t10' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t11' class='pln'><span class='str'>&nbsp; &nbsp; The default authorization token model.</span><span class='strut'>&nbsp;</span></p>
<p id='t12' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t13' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>key</span> <span class='op'>=</span> <span class='nam'>models</span><span class='op'>.</span><span class='nam'>CharField</span><span class='op'>(</span><span class='nam'>max_length</span><span class='op'>=</span><span class='num'>40</span><span class='op'>,</span> <span class='nam'>primary_key</span><span class='op'>=</span><span class='nam'>True</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t14' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>user</span> <span class='op'>=</span> <span class='nam'>models</span><span class='op'>.</span><span class='nam'>OneToOneField</span><span class='op'>(</span><span class='nam'>User</span><span class='op'>,</span> <span class='nam'>related_name</span><span class='op'>=</span><span class='str'>&#39;auth_token&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t15' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>created</span> <span class='op'>=</span> <span class='nam'>models</span><span class='op'>.</span><span class='nam'>DateTimeField</span><span class='op'>(</span><span class='nam'>auto_now_add</span><span class='op'>=</span><span class='nam'>True</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t16' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t17' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>class</span> <span class='nam'>Meta</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t18' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Work around for a bug in Django:</span><span class='strut'>&nbsp;</span></p>
<p id='t19' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># https://code.djangoproject.com/ticket/19422</span><span class='strut'>&nbsp;</span></p>
<p id='t20' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'>#</span><span class='strut'>&nbsp;</span></p>
<p id='t21' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Also see corresponding ticket:</span><span class='strut'>&nbsp;</span></p>
<p id='t22' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># https://github.com/tomchristie/django-rest-framework/issues/705</span><span class='strut'>&nbsp;</span></p>
<p id='t23' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>abstract</span> <span class='op'>=</span> <span class='str'>&#39;rest_framework.authtoken&#39;</span> <span class='key'>not</span> <span class='key'>in</span> <span class='nam'>settings</span><span class='op'>.</span><span class='nam'>INSTALLED_APPS</span><span class='strut'>&nbsp;</span></p>
<p id='t24' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t25' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>save</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='op'>*</span><span class='nam'>args</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kwargs</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t26' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>key</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t27' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>key</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>generate_key</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t28' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>super</span><span class='op'>(</span><span class='nam'>Token</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>save</span><span class='op'>(</span><span class='op'>*</span><span class='nam'>args</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kwargs</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t29' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t30' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>generate_key</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t31' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>unique</span> <span class='op'>=</span> <span class='nam'>uuid</span><span class='op'>.</span><span class='nam'>uuid4</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t32' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>hmac</span><span class='op'>.</span><span class='nam'>new</span><span class='op'>(</span><span class='nam'>unique</span><span class='op'>.</span><span class='nam'>bytes</span><span class='op'>,</span> <span class='nam'>digestmod</span><span class='op'>=</span><span class='nam'>sha1</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>hexdigest</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t33' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t34' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__unicode__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t35' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>key</span><span class='strut'>&nbsp;</span></p>
</td>
</tr>
</table>
</div>
<div id='footer'>
<div class='content'>
<p>
<a class='nav' href='index.html'>&#xab; index</a> &nbsp; &nbsp; <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.5.1</a>
</p>
</div>
</div>
</body>
</html>

View File

@ -1,129 +0,0 @@
<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
<title>Coverage for rest_framework/authtoken/serializers: 88%</title>
<link rel='stylesheet' href='style.css' type='text/css'>
<script type='text/javascript' src='jquery-1.4.3.min.js'></script>
<script type='text/javascript' src='jquery.hotkeys.js'></script>
<script type='text/javascript' src='jquery.isonscreen.js'></script>
<script type='text/javascript' src='coverage_html.js'></script>
<script type='text/javascript' charset='utf-8'>
jQuery(document).ready(coverage.pyfile_ready);
</script>
</head>
<body id='pyfile'>
<div id='header'>
<div class='content'>
<h1>Coverage for <b>rest_framework/authtoken/serializers</b> :
<span class='pc_cov'>88%</span>
</h1>
<img id='keyboard_icon' src='keybd_closed.png'>
<h2 class='stats'>
17 statements
<span class='run hide_run shortkey_r' onclick='coverage.toggle_lines(this, "run")'>15 run</span>
<span class='mis shortkey_m' onclick='coverage.toggle_lines(this, "mis")'>2 missing</span>
<span class='exc shortkey_x' onclick='coverage.toggle_lines(this, "exc")'>0 excluded</span>
</h2>
</div>
</div>
<div class='help_panel'>
<img id='panel_icon' src='keybd_open.png'>
<p class='legend'>Hot-keys on this page</p>
<div>
<p class='keyhelp'>
<span class='key'>r</span>
<span class='key'>m</span>
<span class='key'>x</span>
<span class='key'>p</span> &nbsp; toggle line displays
</p>
<p class='keyhelp'>
<span class='key'>j</span>
<span class='key'>k</span> &nbsp; next/prev highlighted chunk
</p>
<p class='keyhelp'>
<span class='key'>0</span> &nbsp; (zero) top of page
</p>
<p class='keyhelp'>
<span class='key'>1</span> &nbsp; (one) first highlighted chunk
</p>
</div>
</div>
<div id='source'>
<table cellspacing='0' cellpadding='0'>
<tr>
<td class='linenos' valign='top'>
<p id='n1' class='stm run hide_run'><a href='#n1'>1</a></p>
<p id='n2' class='stm run hide_run'><a href='#n2'>2</a></p>
<p id='n3' class='pln'><a href='#n3'>3</a></p>
<p id='n4' class='pln'><a href='#n4'>4</a></p>
<p id='n5' class='stm run hide_run'><a href='#n5'>5</a></p>
<p id='n6' class='stm run hide_run'><a href='#n6'>6</a></p>
<p id='n7' class='stm run hide_run'><a href='#n7'>7</a></p>
<p id='n8' class='pln'><a href='#n8'>8</a></p>
<p id='n9' class='stm run hide_run'><a href='#n9'>9</a></p>
<p id='n10' class='stm run hide_run'><a href='#n10'>10</a></p>
<p id='n11' class='stm run hide_run'><a href='#n11'>11</a></p>
<p id='n12' class='pln'><a href='#n12'>12</a></p>
<p id='n13' class='stm run hide_run'><a href='#n13'>13</a></p>
<p id='n14' class='stm run hide_run'><a href='#n14'>14</a></p>
<p id='n15' class='pln'><a href='#n15'>15</a></p>
<p id='n16' class='stm run hide_run'><a href='#n16'>16</a></p>
<p id='n17' class='stm run hide_run'><a href='#n17'>17</a></p>
<p id='n18' class='stm mis'><a href='#n18'>18</a></p>
<p id='n19' class='stm run hide_run'><a href='#n19'>19</a></p>
<p id='n20' class='stm run hide_run'><a href='#n20'>20</a></p>
<p id='n21' class='pln'><a href='#n21'>21</a></p>
<p id='n22' class='stm run hide_run'><a href='#n22'>22</a></p>
<p id='n23' class='pln'><a href='#n23'>23</a></p>
<p id='n24' class='stm mis'><a href='#n24'>24</a></p>
</td>
<td class='text' valign='top'>
<p id='t1' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>django</span><span class='op'>.</span><span class='nam'>contrib</span><span class='op'>.</span><span class='nam'>auth</span> <span class='key'>import</span> <span class='nam'>authenticate</span><span class='strut'>&nbsp;</span></p>
<p id='t2' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span> <span class='key'>import</span> <span class='nam'>serializers</span><span class='strut'>&nbsp;</span></p>
<p id='t3' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t4' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t5' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>AuthTokenSerializer</span><span class='op'>(</span><span class='nam'>serializers</span><span class='op'>.</span><span class='nam'>Serializer</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t6' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>username</span> <span class='op'>=</span> <span class='nam'>serializers</span><span class='op'>.</span><span class='nam'>CharField</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t7' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>password</span> <span class='op'>=</span> <span class='nam'>serializers</span><span class='op'>.</span><span class='nam'>CharField</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t8' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t9' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>validate</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>attrs</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t10' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>username</span> <span class='op'>=</span> <span class='nam'>attrs</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;username&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t11' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>password</span> <span class='op'>=</span> <span class='nam'>attrs</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;password&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t12' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t13' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>username</span> <span class='key'>and</span> <span class='nam'>password</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t14' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>user</span> <span class='op'>=</span> <span class='nam'>authenticate</span><span class='op'>(</span><span class='nam'>username</span><span class='op'>=</span><span class='nam'>username</span><span class='op'>,</span> <span class='nam'>password</span><span class='op'>=</span><span class='nam'>password</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t15' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t16' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>user</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t17' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>user</span><span class='op'>.</span><span class='nam'>is_active</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t18' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>serializers</span><span class='op'>.</span><span class='nam'>ValidationError</span><span class='op'>(</span><span class='str'>&#39;User account is disabled.&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t19' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>attrs</span><span class='op'>[</span><span class='str'>&#39;user&#39;</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>user</span><span class='strut'>&nbsp;</span></p>
<p id='t20' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>attrs</span><span class='strut'>&nbsp;</span></p>
<p id='t21' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t22' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>serializers</span><span class='op'>.</span><span class='nam'>ValidationError</span><span class='op'>(</span><span class='str'>&#39;Unable to login with provided credentials.&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t23' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t24' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>serializers</span><span class='op'>.</span><span class='nam'>ValidationError</span><span class='op'>(</span><span class='str'>&#39;Must include &quot;username&quot; and &quot;password&quot;&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
</td>
</tr>
</table>
</div>
<div id='footer'>
<div class='content'>
<p>
<a class='nav' href='index.html'>&#xab; index</a> &nbsp; &nbsp; <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.5.1</a>
</p>
</div>
</div>
</body>
</html>

View File

@ -1,133 +0,0 @@
<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
<title>Coverage for rest_framework/authtoken/views: 100%</title>
<link rel='stylesheet' href='style.css' type='text/css'>
<script type='text/javascript' src='jquery-1.4.3.min.js'></script>
<script type='text/javascript' src='jquery.hotkeys.js'></script>
<script type='text/javascript' src='jquery.isonscreen.js'></script>
<script type='text/javascript' src='coverage_html.js'></script>
<script type='text/javascript' charset='utf-8'>
jQuery(document).ready(coverage.pyfile_ready);
</script>
</head>
<body id='pyfile'>
<div id='header'>
<div class='content'>
<h1>Coverage for <b>rest_framework/authtoken/views</b> :
<span class='pc_cov'>100%</span>
</h1>
<img id='keyboard_icon' src='keybd_closed.png'>
<h2 class='stats'>
21 statements
<span class='run hide_run shortkey_r' onclick='coverage.toggle_lines(this, "run")'>21 run</span>
<span class='mis shortkey_m' onclick='coverage.toggle_lines(this, "mis")'>0 missing</span>
<span class='exc shortkey_x' onclick='coverage.toggle_lines(this, "exc")'>0 excluded</span>
</h2>
</div>
</div>
<div class='help_panel'>
<img id='panel_icon' src='keybd_open.png'>
<p class='legend'>Hot-keys on this page</p>
<div>
<p class='keyhelp'>
<span class='key'>r</span>
<span class='key'>m</span>
<span class='key'>x</span>
<span class='key'>p</span> &nbsp; toggle line displays
</p>
<p class='keyhelp'>
<span class='key'>j</span>
<span class='key'>k</span> &nbsp; next/prev highlighted chunk
</p>
<p class='keyhelp'>
<span class='key'>0</span> &nbsp; (zero) top of page
</p>
<p class='keyhelp'>
<span class='key'>1</span> &nbsp; (one) first highlighted chunk
</p>
</div>
</div>
<div id='source'>
<table cellspacing='0' cellpadding='0'>
<tr>
<td class='linenos' valign='top'>
<p id='n1' class='stm run hide_run'><a href='#n1'>1</a></p>
<p id='n2' class='stm run hide_run'><a href='#n2'>2</a></p>
<p id='n3' class='stm run hide_run'><a href='#n3'>3</a></p>
<p id='n4' class='stm run hide_run'><a href='#n4'>4</a></p>
<p id='n5' class='stm run hide_run'><a href='#n5'>5</a></p>
<p id='n6' class='stm run hide_run'><a href='#n6'>6</a></p>
<p id='n7' class='stm run hide_run'><a href='#n7'>7</a></p>
<p id='n8' class='pln'><a href='#n8'>8</a></p>
<p id='n9' class='pln'><a href='#n9'>9</a></p>
<p id='n10' class='stm run hide_run'><a href='#n10'>10</a></p>
<p id='n11' class='stm run hide_run'><a href='#n11'>11</a></p>
<p id='n12' class='stm run hide_run'><a href='#n12'>12</a></p>
<p id='n13' class='stm run hide_run'><a href='#n13'>13</a></p>
<p id='n14' class='stm run hide_run'><a href='#n14'>14</a></p>
<p id='n15' class='stm run hide_run'><a href='#n15'>15</a></p>
<p id='n16' class='stm run hide_run'><a href='#n16'>16</a></p>
<p id='n17' class='pln'><a href='#n17'>17</a></p>
<p id='n18' class='stm run hide_run'><a href='#n18'>18</a></p>
<p id='n19' class='stm run hide_run'><a href='#n19'>19</a></p>
<p id='n20' class='stm run hide_run'><a href='#n20'>20</a></p>
<p id='n21' class='stm run hide_run'><a href='#n21'>21</a></p>
<p id='n22' class='stm run hide_run'><a href='#n22'>22</a></p>
<p id='n23' class='stm run hide_run'><a href='#n23'>23</a></p>
<p id='n24' class='pln'><a href='#n24'>24</a></p>
<p id='n25' class='pln'><a href='#n25'>25</a></p>
<p id='n26' class='stm run hide_run'><a href='#n26'>26</a></p>
</td>
<td class='text' valign='top'>
<p id='t1' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>views</span> <span class='key'>import</span> <span class='nam'>APIView</span><span class='strut'>&nbsp;</span></p>
<p id='t2' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span> <span class='key'>import</span> <span class='nam'>status</span><span class='strut'>&nbsp;</span></p>
<p id='t3' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span> <span class='key'>import</span> <span class='nam'>parsers</span><span class='strut'>&nbsp;</span></p>
<p id='t4' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span> <span class='key'>import</span> <span class='nam'>renderers</span><span class='strut'>&nbsp;</span></p>
<p id='t5' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>response</span> <span class='key'>import</span> <span class='nam'>Response</span><span class='strut'>&nbsp;</span></p>
<p id='t6' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>authtoken</span><span class='op'>.</span><span class='nam'>models</span> <span class='key'>import</span> <span class='nam'>Token</span><span class='strut'>&nbsp;</span></p>
<p id='t7' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>authtoken</span><span class='op'>.</span><span class='nam'>serializers</span> <span class='key'>import</span> <span class='nam'>AuthTokenSerializer</span><span class='strut'>&nbsp;</span></p>
<p id='t8' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t9' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t10' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>ObtainAuthToken</span><span class='op'>(</span><span class='nam'>APIView</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t11' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>throttle_classes</span> <span class='op'>=</span> <span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t12' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>permission_classes</span> <span class='op'>=</span> <span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t13' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>parser_classes</span> <span class='op'>=</span> <span class='op'>(</span><span class='nam'>parsers</span><span class='op'>.</span><span class='nam'>FormParser</span><span class='op'>,</span> <span class='nam'>parsers</span><span class='op'>.</span><span class='nam'>MultiPartParser</span><span class='op'>,</span> <span class='nam'>parsers</span><span class='op'>.</span><span class='nam'>JSONParser</span><span class='op'>,</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t14' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>renderer_classes</span> <span class='op'>=</span> <span class='op'>(</span><span class='nam'>renderers</span><span class='op'>.</span><span class='nam'>JSONRenderer</span><span class='op'>,</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t15' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>serializer_class</span> <span class='op'>=</span> <span class='nam'>AuthTokenSerializer</span><span class='strut'>&nbsp;</span></p>
<p id='t16' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>model</span> <span class='op'>=</span> <span class='nam'>Token</span><span class='strut'>&nbsp;</span></p>
<p id='t17' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t18' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>post</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t19' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>serializer</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>serializer_class</span><span class='op'>(</span><span class='nam'>data</span><span class='op'>=</span><span class='nam'>request</span><span class='op'>.</span><span class='nam'>DATA</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t20' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>serializer</span><span class='op'>.</span><span class='nam'>is_valid</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t21' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>token</span><span class='op'>,</span> <span class='nam'>created</span> <span class='op'>=</span> <span class='nam'>Token</span><span class='op'>.</span><span class='nam'>objects</span><span class='op'>.</span><span class='nam'>get_or_create</span><span class='op'>(</span><span class='nam'>user</span><span class='op'>=</span><span class='nam'>serializer</span><span class='op'>.</span><span class='nam'>object</span><span class='op'>[</span><span class='str'>&#39;user&#39;</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t22' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>Response</span><span class='op'>(</span><span class='op'>{</span><span class='str'>&#39;token&#39;</span><span class='op'>:</span> <span class='nam'>token</span><span class='op'>.</span><span class='nam'>key</span><span class='op'>}</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t23' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>Response</span><span class='op'>(</span><span class='nam'>serializer</span><span class='op'>.</span><span class='nam'>errors</span><span class='op'>,</span> <span class='nam'>status</span><span class='op'>=</span><span class='nam'>status</span><span class='op'>.</span><span class='nam'>HTTP_400_BAD_REQUEST</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t24' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t25' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t26' class='stm run hide_run'><span class='nam'>obtain_auth_token</span> <span class='op'>=</span> <span class='nam'>ObtainAuthToken</span><span class='op'>.</span><span class='nam'>as_view</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
</td>
</tr>
</table>
</div>
<div id='footer'>
<div class='content'>
<p>
<a class='nav' href='index.html'>&#xab; index</a> &nbsp; &nbsp; <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.5.1</a>
</p>
</div>
</div>
</body>
</html>

View File

@ -1,339 +0,0 @@
<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
<title>Coverage for rest_framework/decorators: 100%</title>
<link rel='stylesheet' href='style.css' type='text/css'>
<script type='text/javascript' src='jquery-1.4.3.min.js'></script>
<script type='text/javascript' src='jquery.hotkeys.js'></script>
<script type='text/javascript' src='jquery.isonscreen.js'></script>
<script type='text/javascript' src='coverage_html.js'></script>
<script type='text/javascript' charset='utf-8'>
jQuery(document).ready(coverage.pyfile_ready);
</script>
</head>
<body id='pyfile'>
<div id='header'>
<div class='content'>
<h1>Coverage for <b>rest_framework/decorators</b> :
<span class='pc_cov'>100%</span>
</h1>
<img id='keyboard_icon' src='keybd_closed.png'>
<h2 class='stats'>
60 statements
<span class='run hide_run shortkey_r' onclick='coverage.toggle_lines(this, "run")'>60 run</span>
<span class='mis shortkey_m' onclick='coverage.toggle_lines(this, "mis")'>0 missing</span>
<span class='exc shortkey_x' onclick='coverage.toggle_lines(this, "exc")'>0 excluded</span>
</h2>
</div>
</div>
<div class='help_panel'>
<img id='panel_icon' src='keybd_open.png'>
<p class='legend'>Hot-keys on this page</p>
<div>
<p class='keyhelp'>
<span class='key'>r</span>
<span class='key'>m</span>
<span class='key'>x</span>
<span class='key'>p</span> &nbsp; toggle line displays
</p>
<p class='keyhelp'>
<span class='key'>j</span>
<span class='key'>k</span> &nbsp; next/prev highlighted chunk
</p>
<p class='keyhelp'>
<span class='key'>0</span> &nbsp; (zero) top of page
</p>
<p class='keyhelp'>
<span class='key'>1</span> &nbsp; (one) first highlighted chunk
</p>
</div>
</div>
<div id='source'>
<table cellspacing='0' cellpadding='0'>
<tr>
<td class='linenos' valign='top'>
<p id='n1' class='pln'><a href='#n1'>1</a></p>
<p id='n2' class='pln'><a href='#n2'>2</a></p>
<p id='n3' class='pln'><a href='#n3'>3</a></p>
<p id='n4' class='pln'><a href='#n4'>4</a></p>
<p id='n5' class='pln'><a href='#n5'>5</a></p>
<p id='n6' class='pln'><a href='#n6'>6</a></p>
<p id='n7' class='pln'><a href='#n7'>7</a></p>
<p id='n8' class='pln'><a href='#n8'>8</a></p>
<p id='n9' class='stm run hide_run'><a href='#n9'>9</a></p>
<p id='n10' class='stm run hide_run'><a href='#n10'>10</a></p>
<p id='n11' class='stm run hide_run'><a href='#n11'>11</a></p>
<p id='n12' class='stm run hide_run'><a href='#n12'>12</a></p>
<p id='n13' class='pln'><a href='#n13'>13</a></p>
<p id='n14' class='pln'><a href='#n14'>14</a></p>
<p id='n15' class='stm run hide_run'><a href='#n15'>15</a></p>
<p id='n16' class='pln'><a href='#n16'>16</a></p>
<p id='n17' class='pln'><a href='#n17'>17</a></p>
<p id='n18' class='pln'><a href='#n18'>18</a></p>
<p id='n19' class='pln'><a href='#n19'>19</a></p>
<p id='n20' class='pln'><a href='#n20'>20</a></p>
<p id='n21' class='pln'><a href='#n21'>21</a></p>
<p id='n22' class='stm run hide_run'><a href='#n22'>22</a></p>
<p id='n23' class='pln'><a href='#n23'>23</a></p>
<p id='n24' class='stm run hide_run'><a href='#n24'>24</a></p>
<p id='n25' class='pln'><a href='#n25'>25</a></p>
<p id='n26' class='pln'><a href='#n26'>26</a></p>
<p id='n27' class='pln'><a href='#n27'>27</a></p>
<p id='n28' class='pln'><a href='#n28'>28</a></p>
<p id='n29' class='pln'><a href='#n29'>29</a></p>
<p id='n30' class='pln'><a href='#n30'>30</a></p>
<p id='n31' class='pln'><a href='#n31'>31</a></p>
<p id='n32' class='pln'><a href='#n32'>32</a></p>
<p id='n33' class='pln'><a href='#n33'>33</a></p>
<p id='n34' class='pln'><a href='#n34'>34</a></p>
<p id='n35' class='pln'><a href='#n35'>35</a></p>
<p id='n36' class='pln'><a href='#n36'>36</a></p>
<p id='n37' class='pln'><a href='#n37'>37</a></p>
<p id='n38' class='stm run hide_run'><a href='#n38'>38</a></p>
<p id='n39' class='pln'><a href='#n39'>39</a></p>
<p id='n40' class='pln'><a href='#n40'>40</a></p>
<p id='n41' class='pln'><a href='#n41'>41</a></p>
<p id='n42' class='stm run hide_run'><a href='#n42'>42</a></p>
<p id='n43' class='pln'><a href='#n43'>43</a></p>
<p id='n44' class='pln'><a href='#n44'>44</a></p>
<p id='n45' class='stm run hide_run'><a href='#n45'>45</a></p>
<p id='n46' class='stm run hide_run'><a href='#n46'>46</a></p>
<p id='n47' class='pln'><a href='#n47'>47</a></p>
<p id='n48' class='stm run hide_run'><a href='#n48'>48</a></p>
<p id='n49' class='stm run hide_run'><a href='#n49'>49</a></p>
<p id='n50' class='pln'><a href='#n50'>50</a></p>
<p id='n51' class='stm run hide_run'><a href='#n51'>51</a></p>
<p id='n52' class='stm run hide_run'><a href='#n52'>52</a></p>
<p id='n53' class='pln'><a href='#n53'>53</a></p>
<p id='n54' class='stm run hide_run'><a href='#n54'>54</a></p>
<p id='n55' class='pln'><a href='#n55'>55</a></p>
<p id='n56' class='stm run hide_run'><a href='#n56'>56</a></p>
<p id='n57' class='pln'><a href='#n57'>57</a></p>
<p id='n58' class='pln'><a href='#n58'>58</a></p>
<p id='n59' class='stm run hide_run'><a href='#n59'>59</a></p>
<p id='n60' class='pln'><a href='#n60'>60</a></p>
<p id='n61' class='pln'><a href='#n61'>61</a></p>
<p id='n62' class='stm run hide_run'><a href='#n62'>62</a></p>
<p id='n63' class='pln'><a href='#n63'>63</a></p>
<p id='n64' class='pln'><a href='#n64'>64</a></p>
<p id='n65' class='stm run hide_run'><a href='#n65'>65</a></p>
<p id='n66' class='pln'><a href='#n66'>66</a></p>
<p id='n67' class='pln'><a href='#n67'>67</a></p>
<p id='n68' class='stm run hide_run'><a href='#n68'>68</a></p>
<p id='n69' class='pln'><a href='#n69'>69</a></p>
<p id='n70' class='pln'><a href='#n70'>70</a></p>
<p id='n71' class='stm run hide_run'><a href='#n71'>71</a></p>
<p id='n72' class='stm run hide_run'><a href='#n72'>72</a></p>
<p id='n73' class='pln'><a href='#n73'>73</a></p>
<p id='n74' class='pln'><a href='#n74'>74</a></p>
<p id='n75' class='stm run hide_run'><a href='#n75'>75</a></p>
<p id='n76' class='stm run hide_run'><a href='#n76'>76</a></p>
<p id='n77' class='stm run hide_run'><a href='#n77'>77</a></p>
<p id='n78' class='stm run hide_run'><a href='#n78'>78</a></p>
<p id='n79' class='stm run hide_run'><a href='#n79'>79</a></p>
<p id='n80' class='pln'><a href='#n80'>80</a></p>
<p id='n81' class='pln'><a href='#n81'>81</a></p>
<p id='n82' class='stm run hide_run'><a href='#n82'>82</a></p>
<p id='n83' class='stm run hide_run'><a href='#n83'>83</a></p>
<p id='n84' class='stm run hide_run'><a href='#n84'>84</a></p>
<p id='n85' class='stm run hide_run'><a href='#n85'>85</a></p>
<p id='n86' class='stm run hide_run'><a href='#n86'>86</a></p>
<p id='n87' class='pln'><a href='#n87'>87</a></p>
<p id='n88' class='pln'><a href='#n88'>88</a></p>
<p id='n89' class='stm run hide_run'><a href='#n89'>89</a></p>
<p id='n90' class='stm run hide_run'><a href='#n90'>90</a></p>
<p id='n91' class='stm run hide_run'><a href='#n91'>91</a></p>
<p id='n92' class='stm run hide_run'><a href='#n92'>92</a></p>
<p id='n93' class='stm run hide_run'><a href='#n93'>93</a></p>
<p id='n94' class='pln'><a href='#n94'>94</a></p>
<p id='n95' class='pln'><a href='#n95'>95</a></p>
<p id='n96' class='stm run hide_run'><a href='#n96'>96</a></p>
<p id='n97' class='stm run hide_run'><a href='#n97'>97</a></p>
<p id='n98' class='stm run hide_run'><a href='#n98'>98</a></p>
<p id='n99' class='stm run hide_run'><a href='#n99'>99</a></p>
<p id='n100' class='stm run hide_run'><a href='#n100'>100</a></p>
<p id='n101' class='pln'><a href='#n101'>101</a></p>
<p id='n102' class='pln'><a href='#n102'>102</a></p>
<p id='n103' class='stm run hide_run'><a href='#n103'>103</a></p>
<p id='n104' class='stm run hide_run'><a href='#n104'>104</a></p>
<p id='n105' class='stm run hide_run'><a href='#n105'>105</a></p>
<p id='n106' class='stm run hide_run'><a href='#n106'>106</a></p>
<p id='n107' class='stm run hide_run'><a href='#n107'>107</a></p>
<p id='n108' class='pln'><a href='#n108'>108</a></p>
<p id='n109' class='pln'><a href='#n109'>109</a></p>
<p id='n110' class='stm run hide_run'><a href='#n110'>110</a></p>
<p id='n111' class='pln'><a href='#n111'>111</a></p>
<p id='n112' class='pln'><a href='#n112'>112</a></p>
<p id='n113' class='pln'><a href='#n113'>113</a></p>
<p id='n114' class='stm run hide_run'><a href='#n114'>114</a></p>
<p id='n115' class='stm run hide_run'><a href='#n115'>115</a></p>
<p id='n116' class='stm run hide_run'><a href='#n116'>116</a></p>
<p id='n117' class='stm run hide_run'><a href='#n117'>117</a></p>
<p id='n118' class='stm run hide_run'><a href='#n118'>118</a></p>
<p id='n119' class='pln'><a href='#n119'>119</a></p>
<p id='n120' class='pln'><a href='#n120'>120</a></p>
<p id='n121' class='stm run hide_run'><a href='#n121'>121</a></p>
<p id='n122' class='pln'><a href='#n122'>122</a></p>
<p id='n123' class='pln'><a href='#n123'>123</a></p>
<p id='n124' class='pln'><a href='#n124'>124</a></p>
<p id='n125' class='stm run hide_run'><a href='#n125'>125</a></p>
<p id='n126' class='stm run hide_run'><a href='#n126'>126</a></p>
<p id='n127' class='stm run hide_run'><a href='#n127'>127</a></p>
<p id='n128' class='stm run hide_run'><a href='#n128'>128</a></p>
<p id='n129' class='stm run hide_run'><a href='#n129'>129</a></p>
</td>
<td class='text' valign='top'>
<p id='t1' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t2' class='pln'><span class='str'>The most important decorator in this module is `@api_view`, which is used</span><span class='strut'>&nbsp;</span></p>
<p id='t3' class='pln'><span class='str'>for writing function-based views with REST framework.</span><span class='strut'>&nbsp;</span></p>
<p id='t4' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t5' class='pln'><span class='str'>There are also various decorators for setting the API policies on function</span><span class='strut'>&nbsp;</span></p>
<p id='t6' class='pln'><span class='str'>based views, as well as the `@action` and `@link` decorators, which are</span><span class='strut'>&nbsp;</span></p>
<p id='t7' class='pln'><span class='str'>used to annotate methods on viewsets that should be included by routers.</span><span class='strut'>&nbsp;</span></p>
<p id='t8' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t9' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>__future__</span> <span class='key'>import</span> <span class='nam'>unicode_literals</span><span class='strut'>&nbsp;</span></p>
<p id='t10' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>compat</span> <span class='key'>import</span> <span class='nam'>six</span><span class='strut'>&nbsp;</span></p>
<p id='t11' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>views</span> <span class='key'>import</span> <span class='nam'>APIView</span><span class='strut'>&nbsp;</span></p>
<p id='t12' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>types</span><span class='strut'>&nbsp;</span></p>
<p id='t13' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t14' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t15' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>api_view</span><span class='op'>(</span><span class='nam'>http_method_names</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t16' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t17' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t18' class='pln'><span class='str'>&nbsp; &nbsp; Decorator that converts a function-based view into an APIView subclass.</span><span class='strut'>&nbsp;</span></p>
<p id='t19' class='pln'><span class='str'>&nbsp; &nbsp; Takes a list of allowed methods for the view as an argument.</span><span class='strut'>&nbsp;</span></p>
<p id='t20' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t21' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t22' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>decorator</span><span class='op'>(</span><span class='nam'>func</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t23' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t24' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>WrappedAPIView</span> <span class='op'>=</span> <span class='nam'>type</span><span class='op'>(</span><span class='strut'>&nbsp;</span></p>
<p id='t25' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>six</span><span class='op'>.</span><span class='nam'>PY3</span> <span class='key'>and</span> <span class='str'>&#39;WrappedAPIView&#39;</span> <span class='key'>or</span> <span class='nam'>b</span><span class='str'>&#39;WrappedAPIView&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t26' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>(</span><span class='nam'>APIView</span><span class='op'>,</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t27' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>{</span><span class='str'>&#39;__doc__&#39;</span><span class='op'>:</span> <span class='nam'>func</span><span class='op'>.</span><span class='nam'>__doc__</span><span class='op'>}</span><span class='strut'>&nbsp;</span></p>
<p id='t28' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t29' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t30' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Note, the above allows us to set the docstring.</span><span class='strut'>&nbsp;</span></p>
<p id='t31' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># It is the equivalent of:</span><span class='strut'>&nbsp;</span></p>
<p id='t32' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'>#</span><span class='strut'>&nbsp;</span></p>
<p id='t33' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'>#&nbsp; &nbsp;&nbsp; class WrappedAPIView(APIView):</span><span class='strut'>&nbsp;</span></p>
<p id='t34' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'>#&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; pass</span><span class='strut'>&nbsp;</span></p>
<p id='t35' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'>#&nbsp; &nbsp;&nbsp; WrappedAPIView.__doc__ = func.doc&nbsp; &nbsp; &lt;--- Not possible to do this</span><span class='strut'>&nbsp;</span></p>
<p id='t36' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t37' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># api_view applied without (method_names)</span><span class='strut'>&nbsp;</span></p>
<p id='t38' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>assert</span> <span class='key'>not</span><span class='op'>(</span><span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>http_method_names</span><span class='op'>,</span> <span class='nam'>types</span><span class='op'>.</span><span class='nam'>FunctionType</span><span class='op'>)</span><span class='op'>)</span><span class='op'>,</span> <span class='xx'>\</span><span class='strut'>&nbsp;</span></p>
<p id='t39' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;@api_view missing list of allowed HTTP methods&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t40' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t41' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># api_view applied with eg. string instead of list of strings</span><span class='strut'>&nbsp;</span></p>
<p id='t42' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>assert</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>http_method_names</span><span class='op'>,</span> <span class='op'>(</span><span class='nam'>list</span><span class='op'>,</span> <span class='nam'>tuple</span><span class='op'>)</span><span class='op'>)</span><span class='op'>,</span> <span class='xx'>\</span><span class='strut'>&nbsp;</span></p>
<p id='t43' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;@api_view expected a list of strings, received %s&#39;</span> <span class='op'>%</span> <span class='nam'>type</span><span class='op'>(</span><span class='nam'>http_method_names</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>__name__</span><span class='strut'>&nbsp;</span></p>
<p id='t44' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t45' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>allowed_methods</span> <span class='op'>=</span> <span class='nam'>set</span><span class='op'>(</span><span class='nam'>http_method_names</span><span class='op'>)</span> <span class='op'>|</span> <span class='nam'>set</span><span class='op'>(</span><span class='op'>(</span><span class='str'>&#39;options&#39;</span><span class='op'>,</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t46' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>WrappedAPIView</span><span class='op'>.</span><span class='nam'>http_method_names</span> <span class='op'>=</span> <span class='op'>[</span><span class='nam'>method</span><span class='op'>.</span><span class='nam'>lower</span><span class='op'>(</span><span class='op'>)</span> <span class='key'>for</span> <span class='nam'>method</span> <span class='key'>in</span> <span class='nam'>allowed_methods</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t47' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t48' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>handler</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='op'>*</span><span class='nam'>args</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kwargs</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t49' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>func</span><span class='op'>(</span><span class='op'>*</span><span class='nam'>args</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kwargs</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t50' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t51' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>method</span> <span class='key'>in</span> <span class='nam'>http_method_names</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t52' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>setattr</span><span class='op'>(</span><span class='nam'>WrappedAPIView</span><span class='op'>,</span> <span class='nam'>method</span><span class='op'>.</span><span class='nam'>lower</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>handler</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t53' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t54' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>WrappedAPIView</span><span class='op'>.</span><span class='nam'>__name__</span> <span class='op'>=</span> <span class='nam'>func</span><span class='op'>.</span><span class='nam'>__name__</span><span class='strut'>&nbsp;</span></p>
<p id='t55' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t56' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>WrappedAPIView</span><span class='op'>.</span><span class='nam'>renderer_classes</span> <span class='op'>=</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>func</span><span class='op'>,</span> <span class='str'>&#39;renderer_classes&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t57' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>APIView</span><span class='op'>.</span><span class='nam'>renderer_classes</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t58' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t59' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>WrappedAPIView</span><span class='op'>.</span><span class='nam'>parser_classes</span> <span class='op'>=</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>func</span><span class='op'>,</span> <span class='str'>&#39;parser_classes&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t60' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>APIView</span><span class='op'>.</span><span class='nam'>parser_classes</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t61' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t62' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>WrappedAPIView</span><span class='op'>.</span><span class='nam'>authentication_classes</span> <span class='op'>=</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>func</span><span class='op'>,</span> <span class='str'>&#39;authentication_classes&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t63' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>APIView</span><span class='op'>.</span><span class='nam'>authentication_classes</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t64' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t65' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>WrappedAPIView</span><span class='op'>.</span><span class='nam'>throttle_classes</span> <span class='op'>=</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>func</span><span class='op'>,</span> <span class='str'>&#39;throttle_classes&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t66' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>APIView</span><span class='op'>.</span><span class='nam'>throttle_classes</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t67' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t68' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>WrappedAPIView</span><span class='op'>.</span><span class='nam'>permission_classes</span> <span class='op'>=</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>func</span><span class='op'>,</span> <span class='str'>&#39;permission_classes&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t69' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>APIView</span><span class='op'>.</span><span class='nam'>permission_classes</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t70' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t71' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>WrappedAPIView</span><span class='op'>.</span><span class='nam'>as_view</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t72' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>decorator</span><span class='strut'>&nbsp;</span></p>
<p id='t73' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t74' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t75' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>renderer_classes</span><span class='op'>(</span><span class='nam'>renderer_classes</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t76' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>decorator</span><span class='op'>(</span><span class='nam'>func</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t77' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>func</span><span class='op'>.</span><span class='nam'>renderer_classes</span> <span class='op'>=</span> <span class='nam'>renderer_classes</span><span class='strut'>&nbsp;</span></p>
<p id='t78' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>func</span><span class='strut'>&nbsp;</span></p>
<p id='t79' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>decorator</span><span class='strut'>&nbsp;</span></p>
<p id='t80' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t81' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t82' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>parser_classes</span><span class='op'>(</span><span class='nam'>parser_classes</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t83' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>decorator</span><span class='op'>(</span><span class='nam'>func</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t84' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>func</span><span class='op'>.</span><span class='nam'>parser_classes</span> <span class='op'>=</span> <span class='nam'>parser_classes</span><span class='strut'>&nbsp;</span></p>
<p id='t85' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>func</span><span class='strut'>&nbsp;</span></p>
<p id='t86' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>decorator</span><span class='strut'>&nbsp;</span></p>
<p id='t87' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t88' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t89' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>authentication_classes</span><span class='op'>(</span><span class='nam'>authentication_classes</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t90' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>decorator</span><span class='op'>(</span><span class='nam'>func</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t91' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>func</span><span class='op'>.</span><span class='nam'>authentication_classes</span> <span class='op'>=</span> <span class='nam'>authentication_classes</span><span class='strut'>&nbsp;</span></p>
<p id='t92' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>func</span><span class='strut'>&nbsp;</span></p>
<p id='t93' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>decorator</span><span class='strut'>&nbsp;</span></p>
<p id='t94' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t95' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t96' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>throttle_classes</span><span class='op'>(</span><span class='nam'>throttle_classes</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t97' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>decorator</span><span class='op'>(</span><span class='nam'>func</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t98' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>func</span><span class='op'>.</span><span class='nam'>throttle_classes</span> <span class='op'>=</span> <span class='nam'>throttle_classes</span><span class='strut'>&nbsp;</span></p>
<p id='t99' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>func</span><span class='strut'>&nbsp;</span></p>
<p id='t100' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>decorator</span><span class='strut'>&nbsp;</span></p>
<p id='t101' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t102' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t103' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>permission_classes</span><span class='op'>(</span><span class='nam'>permission_classes</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t104' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>decorator</span><span class='op'>(</span><span class='nam'>func</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t105' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>func</span><span class='op'>.</span><span class='nam'>permission_classes</span> <span class='op'>=</span> <span class='nam'>permission_classes</span><span class='strut'>&nbsp;</span></p>
<p id='t106' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>func</span><span class='strut'>&nbsp;</span></p>
<p id='t107' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>decorator</span><span class='strut'>&nbsp;</span></p>
<p id='t108' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t109' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t110' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>link</span><span class='op'>(</span><span class='op'>**</span><span class='nam'>kwargs</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t111' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t112' class='pln'><span class='str'>&nbsp; &nbsp; Used to mark a method on a ViewSet that should be routed for GET requests.</span><span class='strut'>&nbsp;</span></p>
<p id='t113' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t114' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>decorator</span><span class='op'>(</span><span class='nam'>func</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t115' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>func</span><span class='op'>.</span><span class='nam'>bind_to_methods</span> <span class='op'>=</span> <span class='op'>[</span><span class='str'>&#39;get&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t116' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>func</span><span class='op'>.</span><span class='nam'>kwargs</span> <span class='op'>=</span> <span class='nam'>kwargs</span><span class='strut'>&nbsp;</span></p>
<p id='t117' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>func</span><span class='strut'>&nbsp;</span></p>
<p id='t118' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>decorator</span><span class='strut'>&nbsp;</span></p>
<p id='t119' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t120' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t121' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>action</span><span class='op'>(</span><span class='nam'>methods</span><span class='op'>=</span><span class='op'>[</span><span class='str'>&#39;post&#39;</span><span class='op'>]</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kwargs</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t122' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t123' class='pln'><span class='str'>&nbsp; &nbsp; Used to mark a method on a ViewSet that should be routed for POST requests.</span><span class='strut'>&nbsp;</span></p>
<p id='t124' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t125' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>decorator</span><span class='op'>(</span><span class='nam'>func</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t126' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>func</span><span class='op'>.</span><span class='nam'>bind_to_methods</span> <span class='op'>=</span> <span class='nam'>methods</span><span class='strut'>&nbsp;</span></p>
<p id='t127' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>func</span><span class='op'>.</span><span class='nam'>kwargs</span> <span class='op'>=</span> <span class='nam'>kwargs</span><span class='strut'>&nbsp;</span></p>
<p id='t128' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>func</span><span class='strut'>&nbsp;</span></p>
<p id='t129' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>decorator</span><span class='strut'>&nbsp;</span></p>
</td>
</tr>
</table>
</div>
<div id='footer'>
<div class='content'>
<p>
<a class='nav' href='index.html'>&#xab; index</a> &nbsp; &nbsp; <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.5.1</a>
</p>
</div>
</div>
</body>
</html>

View File

@ -1,257 +0,0 @@
<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
<title>Coverage for rest_framework/exceptions: 96%</title>
<link rel='stylesheet' href='style.css' type='text/css'>
<script type='text/javascript' src='jquery-1.4.3.min.js'></script>
<script type='text/javascript' src='jquery.hotkeys.js'></script>
<script type='text/javascript' src='jquery.isonscreen.js'></script>
<script type='text/javascript' src='coverage_html.js'></script>
<script type='text/javascript' charset='utf-8'>
jQuery(document).ready(coverage.pyfile_ready);
</script>
</head>
<body id='pyfile'>
<div id='header'>
<div class='content'>
<h1>Coverage for <b>rest_framework/exceptions</b> :
<span class='pc_cov'>96%</span>
</h1>
<img id='keyboard_icon' src='keybd_closed.png'>
<h2 class='stats'>
51 statements
<span class='run hide_run shortkey_r' onclick='coverage.toggle_lines(this, "run")'>49 run</span>
<span class='mis shortkey_m' onclick='coverage.toggle_lines(this, "mis")'>2 missing</span>
<span class='exc shortkey_x' onclick='coverage.toggle_lines(this, "exc")'>0 excluded</span>
</h2>
</div>
</div>
<div class='help_panel'>
<img id='panel_icon' src='keybd_open.png'>
<p class='legend'>Hot-keys on this page</p>
<div>
<p class='keyhelp'>
<span class='key'>r</span>
<span class='key'>m</span>
<span class='key'>x</span>
<span class='key'>p</span> &nbsp; toggle line displays
</p>
<p class='keyhelp'>
<span class='key'>j</span>
<span class='key'>k</span> &nbsp; next/prev highlighted chunk
</p>
<p class='keyhelp'>
<span class='key'>0</span> &nbsp; (zero) top of page
</p>
<p class='keyhelp'>
<span class='key'>1</span> &nbsp; (one) first highlighted chunk
</p>
</div>
</div>
<div id='source'>
<table cellspacing='0' cellpadding='0'>
<tr>
<td class='linenos' valign='top'>
<p id='n1' class='pln'><a href='#n1'>1</a></p>
<p id='n2' class='pln'><a href='#n2'>2</a></p>
<p id='n3' class='pln'><a href='#n3'>3</a></p>
<p id='n4' class='pln'><a href='#n4'>4</a></p>
<p id='n5' class='pln'><a href='#n5'>5</a></p>
<p id='n6' class='pln'><a href='#n6'>6</a></p>
<p id='n7' class='stm run hide_run'><a href='#n7'>7</a></p>
<p id='n8' class='stm run hide_run'><a href='#n8'>8</a></p>
<p id='n9' class='pln'><a href='#n9'>9</a></p>
<p id='n10' class='pln'><a href='#n10'>10</a></p>
<p id='n11' class='stm run hide_run'><a href='#n11'>11</a></p>
<p id='n12' class='pln'><a href='#n12'>12</a></p>
<p id='n13' class='pln'><a href='#n13'>13</a></p>
<p id='n14' class='pln'><a href='#n14'>14</a></p>
<p id='n15' class='pln'><a href='#n15'>15</a></p>
<p id='n16' class='stm run hide_run'><a href='#n16'>16</a></p>
<p id='n17' class='pln'><a href='#n17'>17</a></p>
<p id='n18' class='pln'><a href='#n18'>18</a></p>
<p id='n19' class='stm run hide_run'><a href='#n19'>19</a></p>
<p id='n20' class='stm run hide_run'><a href='#n20'>20</a></p>
<p id='n21' class='stm run hide_run'><a href='#n21'>21</a></p>
<p id='n22' class='pln'><a href='#n22'>22</a></p>
<p id='n23' class='stm run hide_run'><a href='#n23'>23</a></p>
<p id='n24' class='stm run hide_run'><a href='#n24'>24</a></p>
<p id='n25' class='pln'><a href='#n25'>25</a></p>
<p id='n26' class='pln'><a href='#n26'>26</a></p>
<p id='n27' class='stm run hide_run'><a href='#n27'>27</a></p>
<p id='n28' class='stm run hide_run'><a href='#n28'>28</a></p>
<p id='n29' class='stm run hide_run'><a href='#n29'>29</a></p>
<p id='n30' class='pln'><a href='#n30'>30</a></p>
<p id='n31' class='stm run hide_run'><a href='#n31'>31</a></p>
<p id='n32' class='stm run hide_run'><a href='#n32'>32</a></p>
<p id='n33' class='pln'><a href='#n33'>33</a></p>
<p id='n34' class='pln'><a href='#n34'>34</a></p>
<p id='n35' class='stm run hide_run'><a href='#n35'>35</a></p>
<p id='n36' class='stm run hide_run'><a href='#n36'>36</a></p>
<p id='n37' class='stm run hide_run'><a href='#n37'>37</a></p>
<p id='n38' class='pln'><a href='#n38'>38</a></p>
<p id='n39' class='stm run hide_run'><a href='#n39'>39</a></p>
<p id='n40' class='stm run hide_run'><a href='#n40'>40</a></p>
<p id='n41' class='pln'><a href='#n41'>41</a></p>
<p id='n42' class='pln'><a href='#n42'>42</a></p>
<p id='n43' class='stm run hide_run'><a href='#n43'>43</a></p>
<p id='n44' class='stm run hide_run'><a href='#n44'>44</a></p>
<p id='n45' class='stm run hide_run'><a href='#n45'>45</a></p>
<p id='n46' class='pln'><a href='#n46'>46</a></p>
<p id='n47' class='stm run hide_run'><a href='#n47'>47</a></p>
<p id='n48' class='stm run hide_run'><a href='#n48'>48</a></p>
<p id='n49' class='pln'><a href='#n49'>49</a></p>
<p id='n50' class='pln'><a href='#n50'>50</a></p>
<p id='n51' class='stm run hide_run'><a href='#n51'>51</a></p>
<p id='n52' class='stm run hide_run'><a href='#n52'>52</a></p>
<p id='n53' class='stm run hide_run'><a href='#n53'>53</a></p>
<p id='n54' class='pln'><a href='#n54'>54</a></p>
<p id='n55' class='stm run hide_run'><a href='#n55'>55</a></p>
<p id='n56' class='stm run hide_run'><a href='#n56'>56</a></p>
<p id='n57' class='pln'><a href='#n57'>57</a></p>
<p id='n58' class='pln'><a href='#n58'>58</a></p>
<p id='n59' class='stm run hide_run'><a href='#n59'>59</a></p>
<p id='n60' class='stm run hide_run'><a href='#n60'>60</a></p>
<p id='n61' class='stm run hide_run'><a href='#n61'>61</a></p>
<p id='n62' class='pln'><a href='#n62'>62</a></p>
<p id='n63' class='stm run hide_run'><a href='#n63'>63</a></p>
<p id='n64' class='stm run hide_run'><a href='#n64'>64</a></p>
<p id='n65' class='stm run hide_run'><a href='#n65'>65</a></p>
<p id='n66' class='pln'><a href='#n66'>66</a></p>
<p id='n67' class='pln'><a href='#n67'>67</a></p>
<p id='n68' class='stm run hide_run'><a href='#n68'>68</a></p>
<p id='n69' class='stm run hide_run'><a href='#n69'>69</a></p>
<p id='n70' class='stm run hide_run'><a href='#n70'>70</a></p>
<p id='n71' class='pln'><a href='#n71'>71</a></p>
<p id='n72' class='stm run hide_run'><a href='#n72'>72</a></p>
<p id='n73' class='stm mis'><a href='#n73'>73</a></p>
<p id='n74' class='pln'><a href='#n74'>74</a></p>
<p id='n75' class='pln'><a href='#n75'>75</a></p>
<p id='n76' class='stm run hide_run'><a href='#n76'>76</a></p>
<p id='n77' class='stm run hide_run'><a href='#n77'>77</a></p>
<p id='n78' class='stm run hide_run'><a href='#n78'>78</a></p>
<p id='n79' class='stm run hide_run'><a href='#n79'>79</a></p>
<p id='n80' class='pln'><a href='#n80'>80</a></p>
<p id='n81' class='stm run hide_run'><a href='#n81'>81</a></p>
<p id='n82' class='stm run hide_run'><a href='#n82'>82</a></p>
<p id='n83' class='stm run hide_run'><a href='#n83'>83</a></p>
<p id='n84' class='stm run hide_run'><a href='#n84'>84</a></p>
<p id='n85' class='stm run hide_run'><a href='#n85'>85</a></p>
<p id='n86' class='stm run hide_run'><a href='#n86'>86</a></p>
<p id='n87' class='pln'><a href='#n87'>87</a></p>
<p id='n88' class='stm mis'><a href='#n88'>88</a></p>
</td>
<td class='text' valign='top'>
<p id='t1' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t2' class='pln'><span class='str'>Handled exceptions raised by REST framework.</span><span class='strut'>&nbsp;</span></p>
<p id='t3' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t4' class='pln'><span class='str'>In addition Django&#39;s built in 403 and 404 exceptions are handled.</span><span class='strut'>&nbsp;</span></p>
<p id='t5' class='pln'><span class='str'>(`django.http.Http404` and `django.core.exceptions.PermissionDenied`)</span><span class='strut'>&nbsp;</span></p>
<p id='t6' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t7' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>__future__</span> <span class='key'>import</span> <span class='nam'>unicode_literals</span><span class='strut'>&nbsp;</span></p>
<p id='t8' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span> <span class='key'>import</span> <span class='nam'>status</span><span class='strut'>&nbsp;</span></p>
<p id='t9' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t10' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t11' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>APIException</span><span class='op'>(</span><span class='nam'>Exception</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t12' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t13' class='pln'><span class='str'>&nbsp; &nbsp; Base class for REST framework exceptions.</span><span class='strut'>&nbsp;</span></p>
<p id='t14' class='pln'><span class='str'>&nbsp; &nbsp; Subclasses should provide `.status_code` and `.detail` properties.</span><span class='strut'>&nbsp;</span></p>
<p id='t15' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t16' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>pass</span><span class='strut'>&nbsp;</span></p>
<p id='t17' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t18' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t19' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>ParseError</span><span class='op'>(</span><span class='nam'>APIException</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t20' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>status_code</span> <span class='op'>=</span> <span class='nam'>status</span><span class='op'>.</span><span class='nam'>HTTP_400_BAD_REQUEST</span><span class='strut'>&nbsp;</span></p>
<p id='t21' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>default_detail</span> <span class='op'>=</span> <span class='str'>&#39;Malformed request.&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t22' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t23' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>detail</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t24' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>detail</span> <span class='op'>=</span> <span class='nam'>detail</span> <span class='key'>or</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>default_detail</span><span class='strut'>&nbsp;</span></p>
<p id='t25' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t26' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t27' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>AuthenticationFailed</span><span class='op'>(</span><span class='nam'>APIException</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t28' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>status_code</span> <span class='op'>=</span> <span class='nam'>status</span><span class='op'>.</span><span class='nam'>HTTP_401_UNAUTHORIZED</span><span class='strut'>&nbsp;</span></p>
<p id='t29' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>default_detail</span> <span class='op'>=</span> <span class='str'>&#39;Incorrect authentication credentials.&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t30' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t31' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>detail</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t32' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>detail</span> <span class='op'>=</span> <span class='nam'>detail</span> <span class='key'>or</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>default_detail</span><span class='strut'>&nbsp;</span></p>
<p id='t33' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t34' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t35' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>NotAuthenticated</span><span class='op'>(</span><span class='nam'>APIException</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t36' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>status_code</span> <span class='op'>=</span> <span class='nam'>status</span><span class='op'>.</span><span class='nam'>HTTP_401_UNAUTHORIZED</span><span class='strut'>&nbsp;</span></p>
<p id='t37' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>default_detail</span> <span class='op'>=</span> <span class='str'>&#39;Authentication credentials were not provided.&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t38' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t39' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>detail</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t40' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>detail</span> <span class='op'>=</span> <span class='nam'>detail</span> <span class='key'>or</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>default_detail</span><span class='strut'>&nbsp;</span></p>
<p id='t41' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t42' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t43' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>PermissionDenied</span><span class='op'>(</span><span class='nam'>APIException</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t44' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>status_code</span> <span class='op'>=</span> <span class='nam'>status</span><span class='op'>.</span><span class='nam'>HTTP_403_FORBIDDEN</span><span class='strut'>&nbsp;</span></p>
<p id='t45' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>default_detail</span> <span class='op'>=</span> <span class='str'>&#39;You do not have permission to perform this action.&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t46' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t47' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>detail</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t48' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>detail</span> <span class='op'>=</span> <span class='nam'>detail</span> <span class='key'>or</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>default_detail</span><span class='strut'>&nbsp;</span></p>
<p id='t49' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t50' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t51' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>MethodNotAllowed</span><span class='op'>(</span><span class='nam'>APIException</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t52' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>status_code</span> <span class='op'>=</span> <span class='nam'>status</span><span class='op'>.</span><span class='nam'>HTTP_405_METHOD_NOT_ALLOWED</span><span class='strut'>&nbsp;</span></p>
<p id='t53' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>default_detail</span> <span class='op'>=</span> <span class='str'>&quot;Method &#39;%s&#39; not allowed.&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t54' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t55' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>method</span><span class='op'>,</span> <span class='nam'>detail</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t56' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>detail</span> <span class='op'>=</span> <span class='op'>(</span><span class='nam'>detail</span> <span class='key'>or</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>default_detail</span><span class='op'>)</span> <span class='op'>%</span> <span class='nam'>method</span><span class='strut'>&nbsp;</span></p>
<p id='t57' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t58' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t59' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>NotAcceptable</span><span class='op'>(</span><span class='nam'>APIException</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t60' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>status_code</span> <span class='op'>=</span> <span class='nam'>status</span><span class='op'>.</span><span class='nam'>HTTP_406_NOT_ACCEPTABLE</span><span class='strut'>&nbsp;</span></p>
<p id='t61' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>default_detail</span> <span class='op'>=</span> <span class='str'>&quot;Could not satisfy the request&#39;s Accept header&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t62' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t63' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>detail</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>available_renderers</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t64' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>detail</span> <span class='op'>=</span> <span class='nam'>detail</span> <span class='key'>or</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>default_detail</span><span class='strut'>&nbsp;</span></p>
<p id='t65' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>available_renderers</span> <span class='op'>=</span> <span class='nam'>available_renderers</span><span class='strut'>&nbsp;</span></p>
<p id='t66' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t67' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t68' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>UnsupportedMediaType</span><span class='op'>(</span><span class='nam'>APIException</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t69' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>status_code</span> <span class='op'>=</span> <span class='nam'>status</span><span class='op'>.</span><span class='nam'>HTTP_415_UNSUPPORTED_MEDIA_TYPE</span><span class='strut'>&nbsp;</span></p>
<p id='t70' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>default_detail</span> <span class='op'>=</span> <span class='str'>&quot;Unsupported media type &#39;%s&#39; in request.&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t71' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t72' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>media_type</span><span class='op'>,</span> <span class='nam'>detail</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t73' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>detail</span> <span class='op'>=</span> <span class='op'>(</span><span class='nam'>detail</span> <span class='key'>or</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>default_detail</span><span class='op'>)</span> <span class='op'>%</span> <span class='nam'>media_type</span><span class='strut'>&nbsp;</span></p>
<p id='t74' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t75' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t76' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>Throttled</span><span class='op'>(</span><span class='nam'>APIException</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t77' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>status_code</span> <span class='op'>=</span> <span class='nam'>status</span><span class='op'>.</span><span class='nam'>HTTP_429_TOO_MANY_REQUESTS</span><span class='strut'>&nbsp;</span></p>
<p id='t78' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>default_detail</span> <span class='op'>=</span> <span class='str'>&quot;Request was throttled.&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t79' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>extra_detail</span> <span class='op'>=</span> <span class='str'>&quot;Expected available in %d second%s.&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t80' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t81' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>wait</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>detail</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t82' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>import</span> <span class='nam'>math</span><span class='strut'>&nbsp;</span></p>
<p id='t83' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>wait</span> <span class='op'>=</span> <span class='nam'>wait</span> <span class='key'>and</span> <span class='nam'>math</span><span class='op'>.</span><span class='nam'>ceil</span><span class='op'>(</span><span class='nam'>wait</span><span class='op'>)</span> <span class='key'>or</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
<p id='t84' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>wait</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t85' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>format</span> <span class='op'>=</span> <span class='nam'>detail</span> <span class='key'>or</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>default_detail</span> <span class='op'>+</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>extra_detail</span><span class='strut'>&nbsp;</span></p>
<p id='t86' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>detail</span> <span class='op'>=</span> <span class='nam'>format</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>wait</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>wait</span> <span class='op'>!=</span> <span class='num'>1</span> <span class='key'>and</span> <span class='str'>&#39;s&#39;</span> <span class='key'>or</span> <span class='str'>&#39;&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t87' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t88' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>detail</span> <span class='op'>=</span> <span class='nam'>detail</span> <span class='key'>or</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>default_detail</span><span class='strut'>&nbsp;</span></p>
</td>
</tr>
</table>
</div>
<div id='footer'>
<div class='content'>
<p>
<a class='nav' href='index.html'>&#xab; index</a> &nbsp; &nbsp; <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.5.1</a>
</p>
</div>
</div>
</body>
</html>

File diff suppressed because it is too large Load Diff

View File

@ -1,367 +0,0 @@
<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
<title>Coverage for rest_framework/filters: 92%</title>
<link rel='stylesheet' href='style.css' type='text/css'>
<script type='text/javascript' src='jquery-1.4.3.min.js'></script>
<script type='text/javascript' src='jquery.hotkeys.js'></script>
<script type='text/javascript' src='jquery.isonscreen.js'></script>
<script type='text/javascript' src='coverage_html.js'></script>
<script type='text/javascript' charset='utf-8'>
jQuery(document).ready(coverage.pyfile_ready);
</script>
</head>
<body id='pyfile'>
<div id='header'>
<div class='content'>
<h1>Coverage for <b>rest_framework/filters</b> :
<span class='pc_cov'>92%</span>
</h1>
<img id='keyboard_icon' src='keybd_closed.png'>
<h2 class='stats'>
77 statements
<span class='run hide_run shortkey_r' onclick='coverage.toggle_lines(this, "run")'>71 run</span>
<span class='mis shortkey_m' onclick='coverage.toggle_lines(this, "mis")'>6 missing</span>
<span class='exc shortkey_x' onclick='coverage.toggle_lines(this, "exc")'>0 excluded</span>
</h2>
</div>
</div>
<div class='help_panel'>
<img id='panel_icon' src='keybd_open.png'>
<p class='legend'>Hot-keys on this page</p>
<div>
<p class='keyhelp'>
<span class='key'>r</span>
<span class='key'>m</span>
<span class='key'>x</span>
<span class='key'>p</span> &nbsp; toggle line displays
</p>
<p class='keyhelp'>
<span class='key'>j</span>
<span class='key'>k</span> &nbsp; next/prev highlighted chunk
</p>
<p class='keyhelp'>
<span class='key'>0</span> &nbsp; (zero) top of page
</p>
<p class='keyhelp'>
<span class='key'>1</span> &nbsp; (one) first highlighted chunk
</p>
</div>
</div>
<div id='source'>
<table cellspacing='0' cellpadding='0'>
<tr>
<td class='linenos' valign='top'>
<p id='n1' class='pln'><a href='#n1'>1</a></p>
<p id='n2' class='pln'><a href='#n2'>2</a></p>
<p id='n3' class='pln'><a href='#n3'>3</a></p>
<p id='n4' class='pln'><a href='#n4'>4</a></p>
<p id='n5' class='stm run hide_run'><a href='#n5'>5</a></p>
<p id='n6' class='stm run hide_run'><a href='#n6'>6</a></p>
<p id='n7' class='stm run hide_run'><a href='#n7'>7</a></p>
<p id='n8' class='stm run hide_run'><a href='#n8'>8</a></p>
<p id='n9' class='stm run hide_run'><a href='#n9'>9</a></p>
<p id='n10' class='pln'><a href='#n10'>10</a></p>
<p id='n11' class='stm run hide_run'><a href='#n11'>11</a></p>
<p id='n12' class='pln'><a href='#n12'>12</a></p>
<p id='n13' class='pln'><a href='#n13'>13</a></p>
<p id='n14' class='stm run hide_run'><a href='#n14'>14</a></p>
<p id='n15' class='pln'><a href='#n15'>15</a></p>
<p id='n16' class='pln'><a href='#n16'>16</a></p>
<p id='n17' class='pln'><a href='#n17'>17</a></p>
<p id='n18' class='pln'><a href='#n18'>18</a></p>
<p id='n19' class='stm run hide_run'><a href='#n19'>19</a></p>
<p id='n20' class='pln'><a href='#n20'>20</a></p>
<p id='n21' class='pln'><a href='#n21'>21</a></p>
<p id='n22' class='pln'><a href='#n22'>22</a></p>
<p id='n23' class='stm mis'><a href='#n23'>23</a></p>
<p id='n24' class='pln'><a href='#n24'>24</a></p>
<p id='n25' class='pln'><a href='#n25'>25</a></p>
<p id='n26' class='stm run hide_run'><a href='#n26'>26</a></p>
<p id='n27' class='pln'><a href='#n27'>27</a></p>
<p id='n28' class='pln'><a href='#n28'>28</a></p>
<p id='n29' class='pln'><a href='#n29'>29</a></p>
<p id='n30' class='stm run hide_run'><a href='#n30'>30</a></p>
<p id='n31' class='pln'><a href='#n31'>31</a></p>
<p id='n32' class='stm run hide_run'><a href='#n32'>32</a></p>
<p id='n33' class='stm run hide_run'><a href='#n33'>33</a></p>
<p id='n34' class='pln'><a href='#n34'>34</a></p>
<p id='n35' class='stm run hide_run'><a href='#n35'>35</a></p>
<p id='n36' class='pln'><a href='#n36'>36</a></p>
<p id='n37' class='pln'><a href='#n37'>37</a></p>
<p id='n38' class='pln'><a href='#n38'>38</a></p>
<p id='n39' class='stm run hide_run'><a href='#n39'>39</a></p>
<p id='n40' class='stm run hide_run'><a href='#n40'>40</a></p>
<p id='n41' class='pln'><a href='#n41'>41</a></p>
<p id='n42' class='stm run hide_run'><a href='#n42'>42</a></p>
<p id='n43' class='stm run hide_run'><a href='#n43'>43</a></p>
<p id='n44' class='pln'><a href='#n44'>44</a></p>
<p id='n45' class='stm run hide_run'><a href='#n45'>45</a></p>
<p id='n46' class='pln'><a href='#n46'>46</a></p>
<p id='n47' class='pln'><a href='#n47'>47</a></p>
<p id='n48' class='pln'><a href='#n48'>48</a></p>
<p id='n49' class='stm run hide_run'><a href='#n49'>49</a></p>
<p id='n50' class='pln'><a href='#n50'>50</a></p>
<p id='n51' class='stm run hide_run'><a href='#n51'>51</a></p>
<p id='n52' class='stm run hide_run'><a href='#n52'>52</a></p>
<p id='n53' class='stm run hide_run'><a href='#n53'>53</a></p>
<p id='n54' class='stm run hide_run'><a href='#n54'>54</a></p>
<p id='n55' class='stm run hide_run'><a href='#n55'>55</a></p>
<p id='n56' class='stm run hide_run'><a href='#n56'>56</a></p>
<p id='n57' class='pln'><a href='#n57'>57</a></p>
<p id='n58' class='stm mis'><a href='#n58'>58</a></p>
<p id='n59' class='pln'><a href='#n59'>59</a></p>
<p id='n60' class='stm run hide_run'><a href='#n60'>60</a></p>
<p id='n61' class='stm run hide_run'><a href='#n61'>61</a></p>
<p id='n62' class='pln'><a href='#n62'>62</a></p>
<p id='n63' class='stm run hide_run'><a href='#n63'>63</a></p>
<p id='n64' class='stm run hide_run'><a href='#n64'>64</a></p>
<p id='n65' class='pln'><a href='#n65'>65</a></p>
<p id='n66' class='stm mis'><a href='#n66'>66</a></p>
<p id='n67' class='pln'><a href='#n67'>67</a></p>
<p id='n68' class='pln'><a href='#n68'>68</a></p>
<p id='n69' class='stm run hide_run'><a href='#n69'>69</a></p>
<p id='n70' class='stm run hide_run'><a href='#n70'>70</a></p>
<p id='n71' class='pln'><a href='#n71'>71</a></p>
<p id='n72' class='stm run hide_run'><a href='#n72'>72</a></p>
<p id='n73' class='pln'><a href='#n73'>73</a></p>
<p id='n74' class='pln'><a href='#n74'>74</a></p>
<p id='n75' class='pln'><a href='#n75'>75</a></p>
<p id='n76' class='pln'><a href='#n76'>76</a></p>
<p id='n77' class='stm run hide_run'><a href='#n77'>77</a></p>
<p id='n78' class='stm run hide_run'><a href='#n78'>78</a></p>
<p id='n79' class='pln'><a href='#n79'>79</a></p>
<p id='n80' class='stm run hide_run'><a href='#n80'>80</a></p>
<p id='n81' class='stm run hide_run'><a href='#n81'>81</a></p>
<p id='n82' class='stm run hide_run'><a href='#n82'>82</a></p>
<p id='n83' class='stm run hide_run'><a href='#n83'>83</a></p>
<p id='n84' class='stm run hide_run'><a href='#n84'>84</a></p>
<p id='n85' class='stm run hide_run'><a href='#n85'>85</a></p>
<p id='n86' class='stm mis'><a href='#n86'>86</a></p>
<p id='n87' class='pln'><a href='#n87'>87</a></p>
<p id='n88' class='stm run hide_run'><a href='#n88'>88</a></p>
<p id='n89' class='pln'><a href='#n89'>89</a></p>
<p id='n90' class='stm run hide_run'><a href='#n90'>90</a></p>
<p id='n91' class='stm run hide_run'><a href='#n91'>91</a></p>
<p id='n92' class='pln'><a href='#n92'>92</a></p>
<p id='n93' class='stm run hide_run'><a href='#n93'>93</a></p>
<p id='n94' class='stm mis'><a href='#n94'>94</a></p>
<p id='n95' class='pln'><a href='#n95'>95</a></p>
<p id='n96' class='stm run hide_run'><a href='#n96'>96</a></p>
<p id='n97' class='pln'><a href='#n97'>97</a></p>
<p id='n98' class='pln'><a href='#n98'>98</a></p>
<p id='n99' class='stm run hide_run'><a href='#n99'>99</a></p>
<p id='n100' class='stm run hide_run'><a href='#n100'>100</a></p>
<p id='n101' class='pln'><a href='#n101'>101</a></p>
<p id='n102' class='stm run hide_run'><a href='#n102'>102</a></p>
<p id='n103' class='pln'><a href='#n103'>103</a></p>
<p id='n104' class='stm run hide_run'><a href='#n104'>104</a></p>
<p id='n105' class='pln'><a href='#n105'>105</a></p>
<p id='n106' class='pln'><a href='#n106'>106</a></p>
<p id='n107' class='stm run hide_run'><a href='#n107'>107</a></p>
<p id='n108' class='stm run hide_run'><a href='#n108'>108</a></p>
<p id='n109' class='pln'><a href='#n109'>109</a></p>
<p id='n110' class='stm run hide_run'><a href='#n110'>110</a></p>
<p id='n111' class='pln'><a href='#n111'>111</a></p>
<p id='n112' class='pln'><a href='#n112'>112</a></p>
<p id='n113' class='pln'><a href='#n113'>113</a></p>
<p id='n114' class='pln'><a href='#n114'>114</a></p>
<p id='n115' class='stm run hide_run'><a href='#n115'>115</a></p>
<p id='n116' class='stm run hide_run'><a href='#n116'>116</a></p>
<p id='n117' class='stm run hide_run'><a href='#n117'>117</a></p>
<p id='n118' class='pln'><a href='#n118'>118</a></p>
<p id='n119' class='stm run hide_run'><a href='#n119'>119</a></p>
<p id='n120' class='stm run hide_run'><a href='#n120'>120</a></p>
<p id='n121' class='stm run hide_run'><a href='#n121'>121</a></p>
<p id='n122' class='stm run hide_run'><a href='#n122'>122</a></p>
<p id='n123' class='stm run hide_run'><a href='#n123'>123</a></p>
<p id='n124' class='pln'><a href='#n124'>124</a></p>
<p id='n125' class='stm run hide_run'><a href='#n125'>125</a></p>
<p id='n126' class='stm run hide_run'><a href='#n126'>126</a></p>
<p id='n127' class='stm run hide_run'><a href='#n127'>127</a></p>
<p id='n128' class='pln'><a href='#n128'>128</a></p>
<p id='n129' class='stm run hide_run'><a href='#n129'>129</a></p>
<p id='n130' class='stm run hide_run'><a href='#n130'>130</a></p>
<p id='n131' class='pln'><a href='#n131'>131</a></p>
<p id='n132' class='stm run hide_run'><a href='#n132'>132</a></p>
<p id='n133' class='pln'><a href='#n133'>133</a></p>
<p id='n134' class='stm run hide_run'><a href='#n134'>134</a></p>
<p id='n135' class='pln'><a href='#n135'>135</a></p>
<p id='n136' class='stm run hide_run'><a href='#n136'>136</a></p>
<p id='n137' class='pln'><a href='#n137'>137</a></p>
<p id='n138' class='stm run hide_run'><a href='#n138'>138</a></p>
<p id='n139' class='pln'><a href='#n139'>139</a></p>
<p id='n140' class='stm run hide_run'><a href='#n140'>140</a></p>
<p id='n141' class='stm run hide_run'><a href='#n141'>141</a></p>
<p id='n142' class='pln'><a href='#n142'>142</a></p>
<p id='n143' class='stm mis'><a href='#n143'>143</a></p>
</td>
<td class='text' valign='top'>
<p id='t1' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t2' class='pln'><span class='str'>Provides generic filtering backends that can be used to filter the results</span><span class='strut'>&nbsp;</span></p>
<p id='t3' class='pln'><span class='str'>returned by list views.</span><span class='strut'>&nbsp;</span></p>
<p id='t4' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t5' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>__future__</span> <span class='key'>import</span> <span class='nam'>unicode_literals</span><span class='strut'>&nbsp;</span></p>
<p id='t6' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>django</span><span class='op'>.</span><span class='nam'>db</span> <span class='key'>import</span> <span class='nam'>models</span><span class='strut'>&nbsp;</span></p>
<p id='t7' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>compat</span> <span class='key'>import</span> <span class='nam'>django_filters</span><span class='op'>,</span> <span class='nam'>six</span><span class='strut'>&nbsp;</span></p>
<p id='t8' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>functools</span> <span class='key'>import</span> <span class='nam'>reduce</span><span class='strut'>&nbsp;</span></p>
<p id='t9' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>operator</span><span class='strut'>&nbsp;</span></p>
<p id='t10' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t11' class='stm run hide_run'><span class='nam'>FilterSet</span> <span class='op'>=</span> <span class='nam'>django_filters</span> <span class='key'>and</span> <span class='nam'>django_filters</span><span class='op'>.</span><span class='nam'>FilterSet</span> <span class='key'>or</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
<p id='t12' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t13' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t14' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>BaseFilterBackend</span><span class='op'>(</span><span class='nam'>object</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t15' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t16' class='pln'><span class='str'>&nbsp; &nbsp; A base class from which all filter backend classes should inherit.</span><span class='strut'>&nbsp;</span></p>
<p id='t17' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t18' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t19' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>filter_queryset</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='nam'>queryset</span><span class='op'>,</span> <span class='nam'>view</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t20' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t21' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Return a filtered queryset.</span><span class='strut'>&nbsp;</span></p>
<p id='t22' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t23' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>NotImplementedError</span><span class='op'>(</span><span class='str'>&quot;.filter_queryset() must be overridden.&quot;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t24' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t25' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t26' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>DjangoFilterBackend</span><span class='op'>(</span><span class='nam'>BaseFilterBackend</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t27' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t28' class='pln'><span class='str'>&nbsp; &nbsp; A filter backend that uses django-filter.</span><span class='strut'>&nbsp;</span></p>
<p id='t29' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t30' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>default_filter_set</span> <span class='op'>=</span> <span class='nam'>FilterSet</span><span class='strut'>&nbsp;</span></p>
<p id='t31' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t32' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t33' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>assert</span> <span class='nam'>django_filters</span><span class='op'>,</span> <span class='str'>&#39;Using DjangoFilterBackend, but django-filter is not installed&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t34' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t35' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>get_filter_class</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>view</span><span class='op'>,</span> <span class='nam'>queryset</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t36' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t37' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Return the django-filters `FilterSet` used to filter the queryset.</span><span class='strut'>&nbsp;</span></p>
<p id='t38' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t39' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>filter_class</span> <span class='op'>=</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>view</span><span class='op'>,</span> <span class='str'>&#39;filter_class&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t40' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>filter_fields</span> <span class='op'>=</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>view</span><span class='op'>,</span> <span class='str'>&#39;filter_fields&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t41' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t42' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>filter_class</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t43' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>filter_model</span> <span class='op'>=</span> <span class='nam'>filter_class</span><span class='op'>.</span><span class='nam'>Meta</span><span class='op'>.</span><span class='nam'>model</span><span class='strut'>&nbsp;</span></p>
<p id='t44' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t45' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>assert</span> <span class='nam'>issubclass</span><span class='op'>(</span><span class='nam'>filter_model</span><span class='op'>,</span> <span class='nam'>queryset</span><span class='op'>.</span><span class='nam'>model</span><span class='op'>)</span><span class='op'>,</span> <span class='xx'>\</span><span class='strut'>&nbsp;</span></p>
<p id='t46' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;FilterSet model %s does not match queryset model %s&#39;</span> <span class='op'>%</span> <span class='xx'>\</span><span class='strut'>&nbsp;</span></p>
<p id='t47' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>(</span><span class='nam'>filter_model</span><span class='op'>,</span> <span class='nam'>queryset</span><span class='op'>.</span><span class='nam'>model</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t48' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t49' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>filter_class</span><span class='strut'>&nbsp;</span></p>
<p id='t50' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t51' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>filter_fields</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t52' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>class</span> <span class='nam'>AutoFilterSet</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>default_filter_set</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t53' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>class</span> <span class='nam'>Meta</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t54' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>model</span> <span class='op'>=</span> <span class='nam'>queryset</span><span class='op'>.</span><span class='nam'>model</span><span class='strut'>&nbsp;</span></p>
<p id='t55' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>fields</span> <span class='op'>=</span> <span class='nam'>filter_fields</span><span class='strut'>&nbsp;</span></p>
<p id='t56' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>AutoFilterSet</span><span class='strut'>&nbsp;</span></p>
<p id='t57' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t58' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
<p id='t59' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t60' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>filter_queryset</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='nam'>queryset</span><span class='op'>,</span> <span class='nam'>view</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t61' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>filter_class</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_filter_class</span><span class='op'>(</span><span class='nam'>view</span><span class='op'>,</span> <span class='nam'>queryset</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t62' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t63' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>filter_class</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t64' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>filter_class</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>.</span><span class='nam'>QUERY_PARAMS</span><span class='op'>,</span> <span class='nam'>queryset</span><span class='op'>=</span><span class='nam'>queryset</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>qs</span><span class='strut'>&nbsp;</span></p>
<p id='t65' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t66' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>queryset</span><span class='strut'>&nbsp;</span></p>
<p id='t67' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t68' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t69' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>SearchFilter</span><span class='op'>(</span><span class='nam'>BaseFilterBackend</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t70' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>search_param</span> <span class='op'>=</span> <span class='str'>&#39;search&#39;</span>&nbsp; <span class='com'># The URL query parameter used for the search.</span><span class='strut'>&nbsp;</span></p>
<p id='t71' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t72' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>get_search_terms</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t73' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t74' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Search terms are set by a ?search=... query parameter,</span><span class='strut'>&nbsp;</span></p>
<p id='t75' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; and may be comma and/or whitespace delimited.</span><span class='strut'>&nbsp;</span></p>
<p id='t76' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t77' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>params</span> <span class='op'>=</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>QUERY_PARAMS</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>search_param</span><span class='op'>,</span> <span class='str'>&#39;&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t78' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>params</span><span class='op'>.</span><span class='nam'>replace</span><span class='op'>(</span><span class='str'>&#39;,&#39;</span><span class='op'>,</span> <span class='str'>&#39; &#39;</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t79' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t80' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>construct_search</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>field_name</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t81' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>field_name</span><span class='op'>.</span><span class='nam'>startswith</span><span class='op'>(</span><span class='str'>&#39;^&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t82' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='str'>&quot;%s__istartswith&quot;</span> <span class='op'>%</span> <span class='nam'>field_name</span><span class='op'>[</span><span class='num'>1</span><span class='op'>:</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t83' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>elif</span> <span class='nam'>field_name</span><span class='op'>.</span><span class='nam'>startswith</span><span class='op'>(</span><span class='str'>&#39;=&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t84' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='str'>&quot;%s__iexact&quot;</span> <span class='op'>%</span> <span class='nam'>field_name</span><span class='op'>[</span><span class='num'>1</span><span class='op'>:</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t85' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>elif</span> <span class='nam'>field_name</span><span class='op'>.</span><span class='nam'>startswith</span><span class='op'>(</span><span class='str'>&#39;@&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t86' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='str'>&quot;%s__search&quot;</span> <span class='op'>%</span> <span class='nam'>field_name</span><span class='op'>[</span><span class='num'>1</span><span class='op'>:</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t87' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t88' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='str'>&quot;%s__icontains&quot;</span> <span class='op'>%</span> <span class='nam'>field_name</span><span class='strut'>&nbsp;</span></p>
<p id='t89' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t90' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>filter_queryset</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='nam'>queryset</span><span class='op'>,</span> <span class='nam'>view</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t91' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>search_fields</span> <span class='op'>=</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>view</span><span class='op'>,</span> <span class='str'>&#39;search_fields&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t92' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t93' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>search_fields</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t94' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>queryset</span><span class='strut'>&nbsp;</span></p>
<p id='t95' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t96' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>orm_lookups</span> <span class='op'>=</span> <span class='op'>[</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>construct_search</span><span class='op'>(</span><span class='nam'>str</span><span class='op'>(</span><span class='nam'>search_field</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t97' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <span class='key'>for</span> <span class='nam'>search_field</span> <span class='key'>in</span> <span class='nam'>search_fields</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t98' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t99' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>search_term</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_search_terms</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t100' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>or_queries</span> <span class='op'>=</span> <span class='op'>[</span><span class='nam'>models</span><span class='op'>.</span><span class='nam'>Q</span><span class='op'>(</span><span class='op'>**</span><span class='op'>{</span><span class='nam'>orm_lookup</span><span class='op'>:</span> <span class='nam'>search_term</span><span class='op'>}</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t101' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>orm_lookup</span> <span class='key'>in</span> <span class='nam'>orm_lookups</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t102' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>queryset</span> <span class='op'>=</span> <span class='nam'>queryset</span><span class='op'>.</span><span class='nam'>filter</span><span class='op'>(</span><span class='nam'>reduce</span><span class='op'>(</span><span class='nam'>operator</span><span class='op'>.</span><span class='nam'>or_</span><span class='op'>,</span> <span class='nam'>or_queries</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t103' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t104' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>queryset</span><span class='strut'>&nbsp;</span></p>
<p id='t105' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t106' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t107' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>OrderingFilter</span><span class='op'>(</span><span class='nam'>BaseFilterBackend</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t108' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>ordering_param</span> <span class='op'>=</span> <span class='str'>&#39;ordering&#39;</span>&nbsp; <span class='com'># The URL query parameter used for the ordering.</span><span class='strut'>&nbsp;</span></p>
<p id='t109' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t110' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>get_ordering</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t111' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t112' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Search terms are set by a ?search=... query parameter,</span><span class='strut'>&nbsp;</span></p>
<p id='t113' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; and may be comma and/or whitespace delimited.</span><span class='strut'>&nbsp;</span></p>
<p id='t114' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t115' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>params</span> <span class='op'>=</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>QUERY_PARAMS</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>ordering_param</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t116' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>params</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t117' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>[</span><span class='nam'>param</span><span class='op'>.</span><span class='nam'>strip</span><span class='op'>(</span><span class='op'>)</span> <span class='key'>for</span> <span class='nam'>param</span> <span class='key'>in</span> <span class='nam'>params</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>&#39;,&#39;</span><span class='op'>)</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t118' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t119' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>get_default_ordering</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>view</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t120' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ordering</span> <span class='op'>=</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>view</span><span class='op'>,</span> <span class='str'>&#39;ordering&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t121' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>ordering</span><span class='op'>,</span> <span class='nam'>six</span><span class='op'>.</span><span class='nam'>string_types</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t122' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>(</span><span class='nam'>ordering</span><span class='op'>,</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t123' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>ordering</span><span class='strut'>&nbsp;</span></p>
<p id='t124' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t125' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>remove_invalid_fields</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>queryset</span><span class='op'>,</span> <span class='nam'>ordering</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t126' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>field_names</span> <span class='op'>=</span> <span class='op'>[</span><span class='nam'>field</span><span class='op'>.</span><span class='nam'>name</span> <span class='key'>for</span> <span class='nam'>field</span> <span class='key'>in</span> <span class='nam'>queryset</span><span class='op'>.</span><span class='nam'>model</span><span class='op'>.</span><span class='nam'>_meta</span><span class='op'>.</span><span class='nam'>fields</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t127' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>[</span><span class='nam'>term</span> <span class='key'>for</span> <span class='nam'>term</span> <span class='key'>in</span> <span class='nam'>ordering</span> <span class='key'>if</span> <span class='nam'>term</span><span class='op'>.</span><span class='nam'>lstrip</span><span class='op'>(</span><span class='str'>&#39;-&#39;</span><span class='op'>)</span> <span class='key'>in</span> <span class='nam'>field_names</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t128' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t129' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>filter_queryset</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='nam'>queryset</span><span class='op'>,</span> <span class='nam'>view</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t130' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ordering</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_ordering</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t131' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t132' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>ordering</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t133' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Skip any incorrect parameters</span><span class='strut'>&nbsp;</span></p>
<p id='t134' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ordering</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>remove_invalid_fields</span><span class='op'>(</span><span class='nam'>queryset</span><span class='op'>,</span> <span class='nam'>ordering</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t135' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t136' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>ordering</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t137' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Use &#39;ordering&#39; attribtue by default</span><span class='strut'>&nbsp;</span></p>
<p id='t138' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ordering</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_default_ordering</span><span class='op'>(</span><span class='nam'>view</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t139' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t140' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>ordering</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t141' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>queryset</span><span class='op'>.</span><span class='nam'>order_by</span><span class='op'>(</span><span class='op'>*</span><span class='nam'>ordering</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t142' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t143' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>queryset</span><span class='strut'>&nbsp;</span></p>
</td>
</tr>
</table>
</div>
<div id='footer'>
<div class='content'>
<p>
<a class='nav' href='index.html'>&#xab; index</a> &nbsp; &nbsp; <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.5.1</a>
</p>
</div>
</div>
</body>
</html>

File diff suppressed because it is too large Load Diff

View File

@ -1,449 +0,0 @@
<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
<title>Coverage for rest_framework/mixins: 93%</title>
<link rel='stylesheet' href='style.css' type='text/css'>
<script type='text/javascript' src='jquery-1.4.3.min.js'></script>
<script type='text/javascript' src='jquery.hotkeys.js'></script>
<script type='text/javascript' src='jquery.isonscreen.js'></script>
<script type='text/javascript' src='coverage_html.js'></script>
<script type='text/javascript' charset='utf-8'>
jQuery(document).ready(coverage.pyfile_ready);
</script>
</head>
<body id='pyfile'>
<div id='header'>
<div class='content'>
<h1>Coverage for <b>rest_framework/mixins</b> :
<span class='pc_cov'>93%</span>
</h1>
<img id='keyboard_icon' src='keybd_closed.png'>
<h2 class='stats'>
97 statements
<span class='run hide_run shortkey_r' onclick='coverage.toggle_lines(this, "run")'>90 run</span>
<span class='mis shortkey_m' onclick='coverage.toggle_lines(this, "mis")'>7 missing</span>
<span class='exc shortkey_x' onclick='coverage.toggle_lines(this, "exc")'>0 excluded</span>
</h2>
</div>
</div>
<div class='help_panel'>
<img id='panel_icon' src='keybd_open.png'>
<p class='legend'>Hot-keys on this page</p>
<div>
<p class='keyhelp'>
<span class='key'>r</span>
<span class='key'>m</span>
<span class='key'>x</span>
<span class='key'>p</span> &nbsp; toggle line displays
</p>
<p class='keyhelp'>
<span class='key'>j</span>
<span class='key'>k</span> &nbsp; next/prev highlighted chunk
</p>
<p class='keyhelp'>
<span class='key'>0</span> &nbsp; (zero) top of page
</p>
<p class='keyhelp'>
<span class='key'>1</span> &nbsp; (one) first highlighted chunk
</p>
</div>
</div>
<div id='source'>
<table cellspacing='0' cellpadding='0'>
<tr>
<td class='linenos' valign='top'>
<p id='n1' class='pln'><a href='#n1'>1</a></p>
<p id='n2' class='pln'><a href='#n2'>2</a></p>
<p id='n3' class='pln'><a href='#n3'>3</a></p>
<p id='n4' class='pln'><a href='#n4'>4</a></p>
<p id='n5' class='pln'><a href='#n5'>5</a></p>
<p id='n6' class='pln'><a href='#n6'>6</a></p>
<p id='n7' class='stm run hide_run'><a href='#n7'>7</a></p>
<p id='n8' class='pln'><a href='#n8'>8</a></p>
<p id='n9' class='stm run hide_run'><a href='#n9'>9</a></p>
<p id='n10' class='stm run hide_run'><a href='#n10'>10</a></p>
<p id='n11' class='stm run hide_run'><a href='#n11'>11</a></p>
<p id='n12' class='stm run hide_run'><a href='#n12'>12</a></p>
<p id='n13' class='stm run hide_run'><a href='#n13'>13</a></p>
<p id='n14' class='pln'><a href='#n14'>14</a></p>
<p id='n15' class='pln'><a href='#n15'>15</a></p>
<p id='n16' class='stm run hide_run'><a href='#n16'>16</a></p>
<p id='n17' class='pln'><a href='#n17'>17</a></p>
<p id='n18' class='pln'><a href='#n18'>18</a></p>
<p id='n19' class='pln'><a href='#n19'>19</a></p>
<p id='n20' class='pln'><a href='#n20'>20</a></p>
<p id='n21' class='pln'><a href='#n21'>21</a></p>
<p id='n22' class='pln'><a href='#n22'>22</a></p>
<p id='n23' class='pln'><a href='#n23'>23</a></p>
<p id='n24' class='stm run hide_run'><a href='#n24'>24</a></p>
<p id='n25' class='pln'><a href='#n25'>25</a></p>
<p id='n26' class='stm run hide_run'><a href='#n26'>26</a></p>
<p id='n27' class='pln'><a href='#n27'>27</a></p>
<p id='n28' class='stm run hide_run'><a href='#n28'>28</a></p>
<p id='n29' class='stm run hide_run'><a href='#n29'>29</a></p>
<p id='n30' class='stm mis'><a href='#n30'>30</a></p>
<p id='n31' class='stm run hide_run'><a href='#n31'>31</a></p>
<p id='n32' class='pln'><a href='#n32'>32</a></p>
<p id='n33' class='stm run hide_run'><a href='#n33'>33</a></p>
<p id='n34' class='pln'><a href='#n34'>34</a></p>
<p id='n35' class='stm run hide_run'><a href='#n35'>35</a></p>
<p id='n36' class='pln'><a href='#n36'>36</a></p>
<p id='n37' class='stm run hide_run'><a href='#n37'>37</a></p>
<p id='n38' class='stm run hide_run'><a href='#n38'>38</a></p>
<p id='n39' class='pln'><a href='#n39'>39</a></p>
<p id='n40' class='stm run hide_run'><a href='#n40'>40</a></p>
<p id='n41' class='pln'><a href='#n41'>41</a></p>
<p id='n42' class='pln'><a href='#n42'>42</a></p>
<p id='n43' class='stm run hide_run'><a href='#n43'>43</a></p>
<p id='n44' class='pln'><a href='#n44'>44</a></p>
<p id='n45' class='pln'><a href='#n45'>45</a></p>
<p id='n46' class='pln'><a href='#n46'>46</a></p>
<p id='n47' class='stm run hide_run'><a href='#n47'>47</a></p>
<p id='n48' class='stm run hide_run'><a href='#n48'>48</a></p>
<p id='n49' class='pln'><a href='#n49'>49</a></p>
<p id='n50' class='stm run hide_run'><a href='#n50'>50</a></p>
<p id='n51' class='stm run hide_run'><a href='#n51'>51</a></p>
<p id='n52' class='stm run hide_run'><a href='#n52'>52</a></p>
<p id='n53' class='stm run hide_run'><a href='#n53'>53</a></p>
<p id='n54' class='stm run hide_run'><a href='#n54'>54</a></p>
<p id='n55' class='stm run hide_run'><a href='#n55'>55</a></p>
<p id='n56' class='pln'><a href='#n56'>56</a></p>
<p id='n57' class='pln'><a href='#n57'>57</a></p>
<p id='n58' class='stm mis'><a href='#n58'>58</a></p>
<p id='n59' class='pln'><a href='#n59'>59</a></p>
<p id='n60' class='stm run hide_run'><a href='#n60'>60</a></p>
<p id='n61' class='stm run hide_run'><a href='#n61'>61</a></p>
<p id='n62' class='stm run hide_run'><a href='#n62'>62</a></p>
<p id='n63' class='stm run hide_run'><a href='#n63'>63</a></p>
<p id='n64' class='stm run hide_run'><a href='#n64'>64</a></p>
<p id='n65' class='pln'><a href='#n65'>65</a></p>
<p id='n66' class='pln'><a href='#n66'>66</a></p>
<p id='n67' class='stm run hide_run'><a href='#n67'>67</a></p>
<p id='n68' class='pln'><a href='#n68'>68</a></p>
<p id='n69' class='pln'><a href='#n69'>69</a></p>
<p id='n70' class='pln'><a href='#n70'>70</a></p>
<p id='n71' class='stm run hide_run'><a href='#n71'>71</a></p>
<p id='n72' class='pln'><a href='#n72'>72</a></p>
<p id='n73' class='stm run hide_run'><a href='#n73'>73</a></p>
<p id='n74' class='stm run hide_run'><a href='#n74'>74</a></p>
<p id='n75' class='pln'><a href='#n75'>75</a></p>
<p id='n76' class='pln'><a href='#n76'>76</a></p>
<p id='n77' class='pln'><a href='#n77'>77</a></p>
<p id='n78' class='stm run hide_run'><a href='#n78'>78</a></p>
<p id='n79' class='stm mis'><a href='#n79'>79</a></p>
<p id='n80' class='pln'><a href='#n80'>80</a></p>
<p id='n81' class='pln'><a href='#n81'>81</a></p>
<p id='n82' class='pln'><a href='#n82'>82</a></p>
<p id='n83' class='pln'><a href='#n83'>83</a></p>
<p id='n84' class='pln'><a href='#n84'>84</a></p>
<p id='n85' class='stm mis'><a href='#n85'>85</a></p>
<p id='n86' class='stm mis'><a href='#n86'>86</a></p>
<p id='n87' class='stm mis'><a href='#n87'>87</a></p>
<p id='n88' class='pln'><a href='#n88'>88</a></p>
<p id='n89' class='pln'><a href='#n89'>89</a></p>
<p id='n90' class='stm run hide_run'><a href='#n90'>90</a></p>
<p id='n91' class='stm run hide_run'><a href='#n91'>91</a></p>
<p id='n92' class='stm run hide_run'><a href='#n92'>92</a></p>
<p id='n93' class='pln'><a href='#n93'>93</a></p>
<p id='n94' class='stm run hide_run'><a href='#n94'>94</a></p>
<p id='n95' class='pln'><a href='#n95'>95</a></p>
<p id='n96' class='stm run hide_run'><a href='#n96'>96</a></p>
<p id='n97' class='pln'><a href='#n97'>97</a></p>
<p id='n98' class='pln'><a href='#n98'>98</a></p>
<p id='n99' class='stm run hide_run'><a href='#n99'>99</a></p>
<p id='n100' class='pln'><a href='#n100'>100</a></p>
<p id='n101' class='pln'><a href='#n101'>101</a></p>
<p id='n102' class='pln'><a href='#n102'>102</a></p>
<p id='n103' class='stm run hide_run'><a href='#n103'>103</a></p>
<p id='n104' class='stm run hide_run'><a href='#n104'>104</a></p>
<p id='n105' class='stm run hide_run'><a href='#n105'>105</a></p>
<p id='n106' class='stm run hide_run'><a href='#n106'>106</a></p>
<p id='n107' class='pln'><a href='#n107'>107</a></p>
<p id='n108' class='pln'><a href='#n108'>108</a></p>
<p id='n109' class='stm run hide_run'><a href='#n109'>109</a></p>
<p id='n110' class='pln'><a href='#n110'>110</a></p>
<p id='n111' class='pln'><a href='#n111'>111</a></p>
<p id='n112' class='pln'><a href='#n112'>112</a></p>
<p id='n113' class='stm run hide_run'><a href='#n113'>113</a></p>
<p id='n114' class='stm run hide_run'><a href='#n114'>114</a></p>
<p id='n115' class='stm run hide_run'><a href='#n115'>115</a></p>
<p id='n116' class='pln'><a href='#n116'>116</a></p>
<p id='n117' class='stm run hide_run'><a href='#n117'>117</a></p>
<p id='n118' class='stm run hide_run'><a href='#n118'>118</a></p>
<p id='n119' class='stm run hide_run'><a href='#n119'>119</a></p>
<p id='n120' class='stm run hide_run'><a href='#n120'>120</a></p>
<p id='n121' class='pln'><a href='#n121'>121</a></p>
<p id='n122' class='stm run hide_run'><a href='#n122'>122</a></p>
<p id='n123' class='stm run hide_run'><a href='#n123'>123</a></p>
<p id='n124' class='stm run hide_run'><a href='#n124'>124</a></p>
<p id='n125' class='pln'><a href='#n125'>125</a></p>
<p id='n126' class='stm run hide_run'><a href='#n126'>126</a></p>
<p id='n127' class='pln'><a href='#n127'>127</a></p>
<p id='n128' class='pln'><a href='#n128'>128</a></p>
<p id='n129' class='stm run hide_run'><a href='#n129'>129</a></p>
<p id='n130' class='stm run hide_run'><a href='#n130'>130</a></p>
<p id='n131' class='stm run hide_run'><a href='#n131'>131</a></p>
<p id='n132' class='stm run hide_run'><a href='#n132'>132</a></p>
<p id='n133' class='stm run hide_run'><a href='#n133'>133</a></p>
<p id='n134' class='pln'><a href='#n134'>134</a></p>
<p id='n135' class='stm mis'><a href='#n135'>135</a></p>
<p id='n136' class='pln'><a href='#n136'>136</a></p>
<p id='n137' class='stm run hide_run'><a href='#n137'>137</a></p>
<p id='n138' class='stm run hide_run'><a href='#n138'>138</a></p>
<p id='n139' class='stm run hide_run'><a href='#n139'>139</a></p>
<p id='n140' class='pln'><a href='#n140'>140</a></p>
<p id='n141' class='stm run hide_run'><a href='#n141'>141</a></p>
<p id='n142' class='stm run hide_run'><a href='#n142'>142</a></p>
<p id='n143' class='stm run hide_run'><a href='#n143'>143</a></p>
<p id='n144' class='stm run hide_run'><a href='#n144'>144</a></p>
<p id='n145' class='pln'><a href='#n145'>145</a></p>
<p id='n146' class='pln'><a href='#n146'>146</a></p>
<p id='n147' class='pln'><a href='#n147'>147</a></p>
<p id='n148' class='pln'><a href='#n148'>148</a></p>
<p id='n149' class='stm run hide_run'><a href='#n149'>149</a></p>
<p id='n150' class='pln'><a href='#n150'>150</a></p>
<p id='n151' class='stm run hide_run'><a href='#n151'>151</a></p>
<p id='n152' class='pln'><a href='#n152'>152</a></p>
<p id='n153' class='pln'><a href='#n153'>153</a></p>
<p id='n154' class='pln'><a href='#n154'>154</a></p>
<p id='n155' class='pln'><a href='#n155'>155</a></p>
<p id='n156' class='stm run hide_run'><a href='#n156'>156</a></p>
<p id='n157' class='stm run hide_run'><a href='#n157'>157</a></p>
<p id='n158' class='stm run hide_run'><a href='#n158'>158</a></p>
<p id='n159' class='stm run hide_run'><a href='#n159'>159</a></p>
<p id='n160' class='pln'><a href='#n160'>160</a></p>
<p id='n161' class='stm run hide_run'><a href='#n161'>161</a></p>
<p id='n162' class='stm run hide_run'><a href='#n162'>162</a></p>
<p id='n163' class='pln'><a href='#n163'>163</a></p>
<p id='n164' class='stm run hide_run'><a href='#n164'>164</a></p>
<p id='n165' class='stm run hide_run'><a href='#n165'>165</a></p>
<p id='n166' class='pln'><a href='#n166'>166</a></p>
<p id='n167' class='stm run hide_run'><a href='#n167'>167</a></p>
<p id='n168' class='stm run hide_run'><a href='#n168'>168</a></p>
<p id='n169' class='pln'><a href='#n169'>169</a></p>
<p id='n170' class='pln'><a href='#n170'>170</a></p>
<p id='n171' class='pln'><a href='#n171'>171</a></p>
<p id='n172' class='stm run hide_run'><a href='#n172'>172</a></p>
<p id='n173' class='stm run hide_run'><a href='#n173'>173</a></p>
<p id='n174' class='stm run hide_run'><a href='#n174'>174</a></p>
<p id='n175' class='pln'><a href='#n175'>175</a></p>
<p id='n176' class='pln'><a href='#n176'>176</a></p>
<p id='n177' class='stm run hide_run'><a href='#n177'>177</a></p>
<p id='n178' class='pln'><a href='#n178'>178</a></p>
<p id='n179' class='pln'><a href='#n179'>179</a></p>
<p id='n180' class='pln'><a href='#n180'>180</a></p>
<p id='n181' class='stm run hide_run'><a href='#n181'>181</a></p>
<p id='n182' class='stm run hide_run'><a href='#n182'>182</a></p>
<p id='n183' class='stm run hide_run'><a href='#n183'>183</a></p>
<p id='n184' class='stm run hide_run'><a href='#n184'>184</a></p>
</td>
<td class='text' valign='top'>
<p id='t1' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t2' class='pln'><span class='str'>Basic building blocks for generic class based views.</span><span class='strut'>&nbsp;</span></p>
<p id='t3' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t4' class='pln'><span class='str'>We don&#39;t bind behaviour to http method handlers yet,</span><span class='strut'>&nbsp;</span></p>
<p id='t5' class='pln'><span class='str'>which allows mixin classes to be composed in interesting ways.</span><span class='strut'>&nbsp;</span></p>
<p id='t6' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t7' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>__future__</span> <span class='key'>import</span> <span class='nam'>unicode_literals</span><span class='strut'>&nbsp;</span></p>
<p id='t8' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t9' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>django</span><span class='op'>.</span><span class='nam'>http</span> <span class='key'>import</span> <span class='nam'>Http404</span><span class='strut'>&nbsp;</span></p>
<p id='t10' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span> <span class='key'>import</span> <span class='nam'>status</span><span class='strut'>&nbsp;</span></p>
<p id='t11' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>response</span> <span class='key'>import</span> <span class='nam'>Response</span><span class='strut'>&nbsp;</span></p>
<p id='t12' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>request</span> <span class='key'>import</span> <span class='nam'>clone_request</span><span class='strut'>&nbsp;</span></p>
<p id='t13' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>warnings</span><span class='strut'>&nbsp;</span></p>
<p id='t14' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t15' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t16' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>_get_validation_exclusions</span><span class='op'>(</span><span class='nam'>obj</span><span class='op'>,</span> <span class='nam'>pk</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>slug_field</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>lookup_field</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t17' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t18' class='pln'><span class='str'>&nbsp; &nbsp; Given a model instance, and an optional pk and slug field,</span><span class='strut'>&nbsp;</span></p>
<p id='t19' class='pln'><span class='str'>&nbsp; &nbsp; return the full list of all other field names on that model.</span><span class='strut'>&nbsp;</span></p>
<p id='t20' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t21' class='pln'><span class='str'>&nbsp; &nbsp; For use when performing full_clean on a model instance,</span><span class='strut'>&nbsp;</span></p>
<p id='t22' class='pln'><span class='str'>&nbsp; &nbsp; so we only clean the required fields.</span><span class='strut'>&nbsp;</span></p>
<p id='t23' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t24' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>include</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t25' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t26' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>pk</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t27' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Pending deprecation</span><span class='strut'>&nbsp;</span></p>
<p id='t28' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>pk_field</span> <span class='op'>=</span> <span class='nam'>obj</span><span class='op'>.</span><span class='nam'>_meta</span><span class='op'>.</span><span class='nam'>pk</span><span class='strut'>&nbsp;</span></p>
<p id='t29' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>while</span> <span class='nam'>pk_field</span><span class='op'>.</span><span class='nam'>rel</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t30' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>pk_field</span> <span class='op'>=</span> <span class='nam'>pk_field</span><span class='op'>.</span><span class='nam'>rel</span><span class='op'>.</span><span class='nam'>to</span><span class='op'>.</span><span class='nam'>_meta</span><span class='op'>.</span><span class='nam'>pk</span><span class='strut'>&nbsp;</span></p>
<p id='t31' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>include</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='nam'>pk_field</span><span class='op'>.</span><span class='nam'>name</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t32' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t33' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>slug_field</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t34' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Pending deprecation</span><span class='strut'>&nbsp;</span></p>
<p id='t35' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>include</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='nam'>slug_field</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t36' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t37' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>lookup_field</span> <span class='key'>and</span> <span class='nam'>lookup_field</span> <span class='op'>!=</span> <span class='str'>&#39;pk&#39;</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t38' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>include</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='nam'>lookup_field</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t39' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t40' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>return</span> <span class='op'>[</span><span class='nam'>field</span><span class='op'>.</span><span class='nam'>name</span> <span class='key'>for</span> <span class='nam'>field</span> <span class='key'>in</span> <span class='nam'>obj</span><span class='op'>.</span><span class='nam'>_meta</span><span class='op'>.</span><span class='nam'>fields</span> <span class='key'>if</span> <span class='nam'>field</span><span class='op'>.</span><span class='nam'>name</span> <span class='key'>not</span> <span class='key'>in</span> <span class='nam'>include</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t41' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t42' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t43' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>CreateModelMixin</span><span class='op'>(</span><span class='nam'>object</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t44' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t45' class='pln'><span class='str'>&nbsp; &nbsp; Create a model instance.</span><span class='strut'>&nbsp;</span></p>
<p id='t46' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t47' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>create</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='op'>*</span><span class='nam'>args</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kwargs</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t48' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>serializer</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_serializer</span><span class='op'>(</span><span class='nam'>data</span><span class='op'>=</span><span class='nam'>request</span><span class='op'>.</span><span class='nam'>DATA</span><span class='op'>,</span> <span class='nam'>files</span><span class='op'>=</span><span class='nam'>request</span><span class='op'>.</span><span class='nam'>FILES</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t49' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t50' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>serializer</span><span class='op'>.</span><span class='nam'>is_valid</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t51' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>pre_save</span><span class='op'>(</span><span class='nam'>serializer</span><span class='op'>.</span><span class='nam'>object</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t52' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>object</span> <span class='op'>=</span> <span class='nam'>serializer</span><span class='op'>.</span><span class='nam'>save</span><span class='op'>(</span><span class='nam'>force_insert</span><span class='op'>=</span><span class='nam'>True</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t53' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>post_save</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>object</span><span class='op'>,</span> <span class='nam'>created</span><span class='op'>=</span><span class='nam'>True</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t54' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>headers</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_success_headers</span><span class='op'>(</span><span class='nam'>serializer</span><span class='op'>.</span><span class='nam'>data</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t55' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>Response</span><span class='op'>(</span><span class='nam'>serializer</span><span class='op'>.</span><span class='nam'>data</span><span class='op'>,</span> <span class='nam'>status</span><span class='op'>=</span><span class='nam'>status</span><span class='op'>.</span><span class='nam'>HTTP_201_CREATED</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t56' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>headers</span><span class='op'>=</span><span class='nam'>headers</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t57' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t58' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>Response</span><span class='op'>(</span><span class='nam'>serializer</span><span class='op'>.</span><span class='nam'>errors</span><span class='op'>,</span> <span class='nam'>status</span><span class='op'>=</span><span class='nam'>status</span><span class='op'>.</span><span class='nam'>HTTP_400_BAD_REQUEST</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t59' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t60' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>get_success_headers</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>data</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t61' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t62' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>{</span><span class='str'>&#39;Location&#39;</span><span class='op'>:</span> <span class='nam'>data</span><span class='op'>[</span><span class='str'>&#39;url&#39;</span><span class='op'>]</span><span class='op'>}</span><span class='strut'>&nbsp;</span></p>
<p id='t63' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>TypeError</span><span class='op'>,</span> <span class='nam'>KeyError</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t64' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>{</span><span class='op'>}</span><span class='strut'>&nbsp;</span></p>
<p id='t65' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t66' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t67' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>ListModelMixin</span><span class='op'>(</span><span class='nam'>object</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t68' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t69' class='pln'><span class='str'>&nbsp; &nbsp; List a queryset.</span><span class='strut'>&nbsp;</span></p>
<p id='t70' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t71' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>empty_error</span> <span class='op'>=</span> <span class='str'>&quot;Empty list and &#39;%(class_name)s.allow_empty&#39; is False.&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t72' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t73' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>list</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='op'>*</span><span class='nam'>args</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kwargs</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t74' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>object_list</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>filter_queryset</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_queryset</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t75' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t76' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Default is to allow empty querysets.&nbsp; This can be altered by setting</span><span class='strut'>&nbsp;</span></p>
<p id='t77' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># `.allow_empty = False`, to raise 404 errors on empty querysets.</span><span class='strut'>&nbsp;</span></p>
<p id='t78' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>allow_empty</span> <span class='key'>and</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>object_list</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t79' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>warnings</span><span class='op'>.</span><span class='nam'>warn</span><span class='op'>(</span><span class='strut'>&nbsp;</span></p>
<p id='t80' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;The `allow_empty` parameter is due to be deprecated. &#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t81' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;To use `allow_empty=False` style behavior, You should override &#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t82' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;`get_queryset()` and explicitly raise a 404 on empty querysets.&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t83' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>PendingDeprecationWarning</span><span class='strut'>&nbsp;</span></p>
<p id='t84' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t85' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>class_name</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>__class__</span><span class='op'>.</span><span class='nam'>__name__</span><span class='strut'>&nbsp;</span></p>
<p id='t86' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>error_msg</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>empty_error</span> <span class='op'>%</span> <span class='op'>{</span><span class='str'>&#39;class_name&#39;</span><span class='op'>:</span> <span class='nam'>class_name</span><span class='op'>}</span><span class='strut'>&nbsp;</span></p>
<p id='t87' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>Http404</span><span class='op'>(</span><span class='nam'>error_msg</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t88' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t89' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Switch between paginated or standard style responses</span><span class='strut'>&nbsp;</span></p>
<p id='t90' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>page</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>paginate_queryset</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>object_list</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t91' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>page</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t92' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>serializer</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_pagination_serializer</span><span class='op'>(</span><span class='nam'>page</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t93' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t94' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>serializer</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_serializer</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>object_list</span><span class='op'>,</span> <span class='nam'>many</span><span class='op'>=</span><span class='nam'>True</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t95' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t96' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>Response</span><span class='op'>(</span><span class='nam'>serializer</span><span class='op'>.</span><span class='nam'>data</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t97' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t98' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t99' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>RetrieveModelMixin</span><span class='op'>(</span><span class='nam'>object</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t100' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t101' class='pln'><span class='str'>&nbsp; &nbsp; Retrieve a model instance.</span><span class='strut'>&nbsp;</span></p>
<p id='t102' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t103' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>retrieve</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='op'>*</span><span class='nam'>args</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kwargs</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t104' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>object</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_object</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t105' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>serializer</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_serializer</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>object</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t106' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>Response</span><span class='op'>(</span><span class='nam'>serializer</span><span class='op'>.</span><span class='nam'>data</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t107' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t108' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t109' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>UpdateModelMixin</span><span class='op'>(</span><span class='nam'>object</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t110' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t111' class='pln'><span class='str'>&nbsp; &nbsp; Update a model instance.</span><span class='strut'>&nbsp;</span></p>
<p id='t112' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t113' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>update</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='op'>*</span><span class='nam'>args</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kwargs</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t114' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>partial</span> <span class='op'>=</span> <span class='nam'>kwargs</span><span class='op'>.</span><span class='nam'>pop</span><span class='op'>(</span><span class='str'>&#39;partial&#39;</span><span class='op'>,</span> <span class='nam'>False</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t115' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>object</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_object_or_none</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t116' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t117' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>object</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t118' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>created</span> <span class='op'>=</span> <span class='nam'>True</span><span class='strut'>&nbsp;</span></p>
<p id='t119' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>save_kwargs</span> <span class='op'>=</span> <span class='op'>{</span><span class='str'>&#39;force_insert&#39;</span><span class='op'>:</span> <span class='nam'>True</span><span class='op'>}</span><span class='strut'>&nbsp;</span></p>
<p id='t120' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>success_status_code</span> <span class='op'>=</span> <span class='nam'>status</span><span class='op'>.</span><span class='nam'>HTTP_201_CREATED</span><span class='strut'>&nbsp;</span></p>
<p id='t121' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t122' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>created</span> <span class='op'>=</span> <span class='nam'>False</span><span class='strut'>&nbsp;</span></p>
<p id='t123' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>save_kwargs</span> <span class='op'>=</span> <span class='op'>{</span><span class='str'>&#39;force_update&#39;</span><span class='op'>:</span> <span class='nam'>True</span><span class='op'>}</span><span class='strut'>&nbsp;</span></p>
<p id='t124' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>success_status_code</span> <span class='op'>=</span> <span class='nam'>status</span><span class='op'>.</span><span class='nam'>HTTP_200_OK</span><span class='strut'>&nbsp;</span></p>
<p id='t125' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t126' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>serializer</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_serializer</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>object</span><span class='op'>,</span> <span class='nam'>data</span><span class='op'>=</span><span class='nam'>request</span><span class='op'>.</span><span class='nam'>DATA</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t127' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <span class='nam'>files</span><span class='op'>=</span><span class='nam'>request</span><span class='op'>.</span><span class='nam'>FILES</span><span class='op'>,</span> <span class='nam'>partial</span><span class='op'>=</span><span class='nam'>partial</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t128' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t129' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>serializer</span><span class='op'>.</span><span class='nam'>is_valid</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t130' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>pre_save</span><span class='op'>(</span><span class='nam'>serializer</span><span class='op'>.</span><span class='nam'>object</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t131' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>object</span> <span class='op'>=</span> <span class='nam'>serializer</span><span class='op'>.</span><span class='nam'>save</span><span class='op'>(</span><span class='op'>**</span><span class='nam'>save_kwargs</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t132' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>post_save</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>object</span><span class='op'>,</span> <span class='nam'>created</span><span class='op'>=</span><span class='nam'>created</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t133' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>Response</span><span class='op'>(</span><span class='nam'>serializer</span><span class='op'>.</span><span class='nam'>data</span><span class='op'>,</span> <span class='nam'>status</span><span class='op'>=</span><span class='nam'>success_status_code</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t134' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t135' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>Response</span><span class='op'>(</span><span class='nam'>serializer</span><span class='op'>.</span><span class='nam'>errors</span><span class='op'>,</span> <span class='nam'>status</span><span class='op'>=</span><span class='nam'>status</span><span class='op'>.</span><span class='nam'>HTTP_400_BAD_REQUEST</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t136' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t137' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>partial_update</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='op'>*</span><span class='nam'>args</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kwargs</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t138' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>kwargs</span><span class='op'>[</span><span class='str'>&#39;partial&#39;</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>True</span><span class='strut'>&nbsp;</span></p>
<p id='t139' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>update</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>,</span> <span class='op'>*</span><span class='nam'>args</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kwargs</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t140' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t141' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>get_object_or_none</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t142' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t143' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_object</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t144' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='nam'>Http404</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t145' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># If this is a PUT-as-create operation, we need to ensure that</span><span class='strut'>&nbsp;</span></p>
<p id='t146' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># we have relevant permissions, as if this was a POST request.</span><span class='strut'>&nbsp;</span></p>
<p id='t147' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># This will either raise a PermissionDenied exception,</span><span class='strut'>&nbsp;</span></p>
<p id='t148' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># or simply return None</span><span class='strut'>&nbsp;</span></p>
<p id='t149' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>check_permissions</span><span class='op'>(</span><span class='nam'>clone_request</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>request</span><span class='op'>,</span> <span class='str'>&#39;POST&#39;</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t150' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t151' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>pre_save</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>obj</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t152' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t153' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Set any attributes on the object that are implicit in the request.</span><span class='strut'>&nbsp;</span></p>
<p id='t154' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t155' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># pk and/or slug attributes are implicit in the URL.</span><span class='strut'>&nbsp;</span></p>
<p id='t156' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>lookup</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>kwargs</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>lookup_field</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t157' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>pk</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>kwargs</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>pk_url_kwarg</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t158' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>slug</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>kwargs</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>slug_url_kwarg</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t159' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>slug_field</span> <span class='op'>=</span> <span class='nam'>slug</span> <span class='key'>and</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>slug_field</span> <span class='key'>or</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
<p id='t160' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t161' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>lookup</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t162' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>setattr</span><span class='op'>(</span><span class='nam'>obj</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>lookup_field</span><span class='op'>,</span> <span class='nam'>lookup</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t163' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t164' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>pk</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t165' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>setattr</span><span class='op'>(</span><span class='nam'>obj</span><span class='op'>,</span> <span class='str'>&#39;pk&#39;</span><span class='op'>,</span> <span class='nam'>pk</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t166' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t167' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>slug</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t168' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>setattr</span><span class='op'>(</span><span class='nam'>obj</span><span class='op'>,</span> <span class='nam'>slug_field</span><span class='op'>,</span> <span class='nam'>slug</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t169' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t170' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Ensure we clean the attributes so that we don&#39;t eg return integer</span><span class='strut'>&nbsp;</span></p>
<p id='t171' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># pk using a string representation, as provided by the url conf kwarg.</span><span class='strut'>&nbsp;</span></p>
<p id='t172' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>obj</span><span class='op'>,</span> <span class='str'>&#39;full_clean&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t173' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>exclude</span> <span class='op'>=</span> <span class='nam'>_get_validation_exclusions</span><span class='op'>(</span><span class='nam'>obj</span><span class='op'>,</span> <span class='nam'>pk</span><span class='op'>,</span> <span class='nam'>slug_field</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>lookup_field</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t174' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>obj</span><span class='op'>.</span><span class='nam'>full_clean</span><span class='op'>(</span><span class='nam'>exclude</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t175' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t176' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t177' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>DestroyModelMixin</span><span class='op'>(</span><span class='nam'>object</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t178' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t179' class='pln'><span class='str'>&nbsp; &nbsp; Destroy a model instance.</span><span class='strut'>&nbsp;</span></p>
<p id='t180' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t181' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>destroy</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='op'>*</span><span class='nam'>args</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kwargs</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t182' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>obj</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_object</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t183' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>obj</span><span class='op'>.</span><span class='nam'>delete</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t184' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>Response</span><span class='op'>(</span><span class='nam'>status</span><span class='op'>=</span><span class='nam'>status</span><span class='op'>.</span><span class='nam'>HTTP_204_NO_CONTENT</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
</td>
</tr>
</table>
</div>
<div id='footer'>
<div class='content'>
<p>
<a class='nav' href='index.html'>&#xab; index</a> &nbsp; &nbsp; <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.5.1</a>
</p>
</div>
</div>
</body>
</html>

View File

@ -1,83 +0,0 @@
<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
<title>Coverage for rest_framework/models: 100%</title>
<link rel='stylesheet' href='style.css' type='text/css'>
<script type='text/javascript' src='jquery-1.4.3.min.js'></script>
<script type='text/javascript' src='jquery.hotkeys.js'></script>
<script type='text/javascript' src='jquery.isonscreen.js'></script>
<script type='text/javascript' src='coverage_html.js'></script>
<script type='text/javascript' charset='utf-8'>
jQuery(document).ready(coverage.pyfile_ready);
</script>
</head>
<body id='pyfile'>
<div id='header'>
<div class='content'>
<h1>Coverage for <b>rest_framework/models</b> :
<span class='pc_cov'>100%</span>
</h1>
<img id='keyboard_icon' src='keybd_closed.png'>
<h2 class='stats'>
0 statements
<span class='run hide_run shortkey_r' onclick='coverage.toggle_lines(this, "run")'>0 run</span>
<span class='mis shortkey_m' onclick='coverage.toggle_lines(this, "mis")'>0 missing</span>
<span class='exc shortkey_x' onclick='coverage.toggle_lines(this, "exc")'>0 excluded</span>
</h2>
</div>
</div>
<div class='help_panel'>
<img id='panel_icon' src='keybd_open.png'>
<p class='legend'>Hot-keys on this page</p>
<div>
<p class='keyhelp'>
<span class='key'>r</span>
<span class='key'>m</span>
<span class='key'>x</span>
<span class='key'>p</span> &nbsp; toggle line displays
</p>
<p class='keyhelp'>
<span class='key'>j</span>
<span class='key'>k</span> &nbsp; next/prev highlighted chunk
</p>
<p class='keyhelp'>
<span class='key'>0</span> &nbsp; (zero) top of page
</p>
<p class='keyhelp'>
<span class='key'>1</span> &nbsp; (one) first highlighted chunk
</p>
</div>
</div>
<div id='source'>
<table cellspacing='0' cellpadding='0'>
<tr>
<td class='linenos' valign='top'>
<p id='n1' class='pln'><a href='#n1'>1</a></p>
</td>
<td class='text' valign='top'>
<p id='t1' class='pln'><span class='com'># Just to keep things like ./manage.py test happy</span><span class='strut'>&nbsp;</span></p>
</td>
</tr>
</table>
</div>
<div id='footer'>
<div class='content'>
<p>
<a class='nav' href='index.html'>&#xab; index</a> &nbsp; &nbsp; <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.5.1</a>
</p>
</div>
</div>
</body>
</html>

View File

@ -1,259 +0,0 @@
<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
<title>Coverage for rest_framework/negotiation: 90%</title>
<link rel='stylesheet' href='style.css' type='text/css'>
<script type='text/javascript' src='jquery-1.4.3.min.js'></script>
<script type='text/javascript' src='jquery.hotkeys.js'></script>
<script type='text/javascript' src='jquery.isonscreen.js'></script>
<script type='text/javascript' src='coverage_html.js'></script>
<script type='text/javascript' charset='utf-8'>
jQuery(document).ready(coverage.pyfile_ready);
</script>
</head>
<body id='pyfile'>
<div id='header'>
<div class='content'>
<h1>Coverage for <b>rest_framework/negotiation</b> :
<span class='pc_cov'>90%</span>
</h1>
<img id='keyboard_icon' src='keybd_closed.png'>
<h2 class='stats'>
41 statements
<span class='run hide_run shortkey_r' onclick='coverage.toggle_lines(this, "run")'>37 run</span>
<span class='mis shortkey_m' onclick='coverage.toggle_lines(this, "mis")'>4 missing</span>
<span class='exc shortkey_x' onclick='coverage.toggle_lines(this, "exc")'>0 excluded</span>
</h2>
</div>
</div>
<div class='help_panel'>
<img id='panel_icon' src='keybd_open.png'>
<p class='legend'>Hot-keys on this page</p>
<div>
<p class='keyhelp'>
<span class='key'>r</span>
<span class='key'>m</span>
<span class='key'>x</span>
<span class='key'>p</span> &nbsp; toggle line displays
</p>
<p class='keyhelp'>
<span class='key'>j</span>
<span class='key'>k</span> &nbsp; next/prev highlighted chunk
</p>
<p class='keyhelp'>
<span class='key'>0</span> &nbsp; (zero) top of page
</p>
<p class='keyhelp'>
<span class='key'>1</span> &nbsp; (one) first highlighted chunk
</p>
</div>
</div>
<div id='source'>
<table cellspacing='0' cellpadding='0'>
<tr>
<td class='linenos' valign='top'>
<p id='n1' class='pln'><a href='#n1'>1</a></p>
<p id='n2' class='pln'><a href='#n2'>2</a></p>
<p id='n3' class='pln'><a href='#n3'>3</a></p>
<p id='n4' class='pln'><a href='#n4'>4</a></p>
<p id='n5' class='stm run hide_run'><a href='#n5'>5</a></p>
<p id='n6' class='stm run hide_run'><a href='#n6'>6</a></p>
<p id='n7' class='stm run hide_run'><a href='#n7'>7</a></p>
<p id='n8' class='stm run hide_run'><a href='#n8'>8</a></p>
<p id='n9' class='stm run hide_run'><a href='#n9'>9</a></p>
<p id='n10' class='stm run hide_run'><a href='#n10'>10</a></p>
<p id='n11' class='pln'><a href='#n11'>11</a></p>
<p id='n12' class='pln'><a href='#n12'>12</a></p>
<p id='n13' class='stm run hide_run'><a href='#n13'>13</a></p>
<p id='n14' class='stm run hide_run'><a href='#n14'>14</a></p>
<p id='n15' class='stm mis'><a href='#n15'>15</a></p>
<p id='n16' class='pln'><a href='#n16'>16</a></p>
<p id='n17' class='stm run hide_run'><a href='#n17'>17</a></p>
<p id='n18' class='stm mis'><a href='#n18'>18</a></p>
<p id='n19' class='pln'><a href='#n19'>19</a></p>
<p id='n20' class='pln'><a href='#n20'>20</a></p>
<p id='n21' class='stm run hide_run'><a href='#n21'>21</a></p>
<p id='n22' class='stm run hide_run'><a href='#n22'>22</a></p>
<p id='n23' class='pln'><a href='#n23'>23</a></p>
<p id='n24' class='stm run hide_run'><a href='#n24'>24</a></p>
<p id='n25' class='pln'><a href='#n25'>25</a></p>
<p id='n26' class='pln'><a href='#n26'>26</a></p>
<p id='n27' class='pln'><a href='#n27'>27</a></p>
<p id='n28' class='pln'><a href='#n28'>28</a></p>
<p id='n29' class='stm run hide_run'><a href='#n29'>29</a></p>
<p id='n30' class='stm run hide_run'><a href='#n30'>30</a></p>
<p id='n31' class='stm run hide_run'><a href='#n31'>31</a></p>
<p id='n32' class='stm mis'><a href='#n32'>32</a></p>
<p id='n33' class='pln'><a href='#n33'>33</a></p>
<p id='n34' class='stm run hide_run'><a href='#n34'>34</a></p>
<p id='n35' class='pln'><a href='#n35'>35</a></p>
<p id='n36' class='pln'><a href='#n36'>36</a></p>
<p id='n37' class='pln'><a href='#n37'>37</a></p>
<p id='n38' class='pln'><a href='#n38'>38</a></p>
<p id='n39' class='pln'><a href='#n39'>39</a></p>
<p id='n40' class='stm run hide_run'><a href='#n40'>40</a></p>
<p id='n41' class='stm run hide_run'><a href='#n41'>41</a></p>
<p id='n42' class='pln'><a href='#n42'>42</a></p>
<p id='n43' class='stm run hide_run'><a href='#n43'>43</a></p>
<p id='n44' class='stm run hide_run'><a href='#n44'>44</a></p>
<p id='n45' class='pln'><a href='#n45'>45</a></p>
<p id='n46' class='stm run hide_run'><a href='#n46'>46</a></p>
<p id='n47' class='pln'><a href='#n47'>47</a></p>
<p id='n48' class='pln'><a href='#n48'>48</a></p>
<p id='n49' class='pln'><a href='#n49'>49</a></p>
<p id='n50' class='pln'><a href='#n50'>50</a></p>
<p id='n51' class='pln'><a href='#n51'>51</a></p>
<p id='n52' class='stm run hide_run'><a href='#n52'>52</a></p>
<p id='n53' class='stm run hide_run'><a href='#n53'>53</a></p>
<p id='n54' class='stm run hide_run'><a href='#n54'>54</a></p>
<p id='n55' class='stm run hide_run'><a href='#n55'>55</a></p>
<p id='n56' class='pln'><a href='#n56'>56</a></p>
<p id='n57' class='stm run hide_run'><a href='#n57'>57</a></p>
<p id='n58' class='pln'><a href='#n58'>58</a></p>
<p id='n59' class='pln'><a href='#n59'>59</a></p>
<p id='n60' class='pln'><a href='#n60'>60</a></p>
<p id='n61' class='stm run hide_run'><a href='#n61'>61</a></p>
<p id='n62' class='pln'><a href='#n62'>62</a></p>
<p id='n63' class='pln'><a href='#n63'>63</a></p>
<p id='n64' class='pln'><a href='#n64'>64</a></p>
<p id='n65' class='stm run hide_run'><a href='#n65'>65</a></p>
<p id='n66' class='pln'><a href='#n66'>66</a></p>
<p id='n67' class='stm run hide_run'><a href='#n67'>67</a></p>
<p id='n68' class='pln'><a href='#n68'>68</a></p>
<p id='n69' class='stm run hide_run'><a href='#n69'>69</a></p>
<p id='n70' class='pln'><a href='#n70'>70</a></p>
<p id='n71' class='pln'><a href='#n71'>71</a></p>
<p id='n72' class='pln'><a href='#n72'>72</a></p>
<p id='n73' class='pln'><a href='#n73'>73</a></p>
<p id='n74' class='stm run hide_run'><a href='#n74'>74</a></p>
<p id='n75' class='pln'><a href='#n75'>75</a></p>
<p id='n76' class='stm run hide_run'><a href='#n76'>76</a></p>
<p id='n77' class='stm mis'><a href='#n77'>77</a></p>
<p id='n78' class='stm run hide_run'><a href='#n78'>78</a></p>
<p id='n79' class='pln'><a href='#n79'>79</a></p>
<p id='n80' class='stm run hide_run'><a href='#n80'>80</a></p>
<p id='n81' class='pln'><a href='#n81'>81</a></p>
<p id='n82' class='pln'><a href='#n82'>82</a></p>
<p id='n83' class='pln'><a href='#n83'>83</a></p>
<p id='n84' class='pln'><a href='#n84'>84</a></p>
<p id='n85' class='pln'><a href='#n85'>85</a></p>
<p id='n86' class='pln'><a href='#n86'>86</a></p>
<p id='n87' class='stm run hide_run'><a href='#n87'>87</a></p>
<p id='n88' class='stm run hide_run'><a href='#n88'>88</a></p>
<p id='n89' class='stm run hide_run'><a href='#n89'>89</a></p>
</td>
<td class='text' valign='top'>
<p id='t1' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t2' class='pln'><span class='str'>Content negotiation deals with selecting an appropriate renderer given the</span><span class='strut'>&nbsp;</span></p>
<p id='t3' class='pln'><span class='str'>incoming request.&nbsp; Typically this will be based on the request&#39;s Accept header.</span><span class='strut'>&nbsp;</span></p>
<p id='t4' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t5' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>__future__</span> <span class='key'>import</span> <span class='nam'>unicode_literals</span><span class='strut'>&nbsp;</span></p>
<p id='t6' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>django</span><span class='op'>.</span><span class='nam'>http</span> <span class='key'>import</span> <span class='nam'>Http404</span><span class='strut'>&nbsp;</span></p>
<p id='t7' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span> <span class='key'>import</span> <span class='nam'>exceptions</span><span class='strut'>&nbsp;</span></p>
<p id='t8' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>settings</span> <span class='key'>import</span> <span class='nam'>api_settings</span><span class='strut'>&nbsp;</span></p>
<p id='t9' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>utils</span><span class='op'>.</span><span class='nam'>mediatypes</span> <span class='key'>import</span> <span class='nam'>order_by_precedence</span><span class='op'>,</span> <span class='nam'>media_type_matches</span><span class='strut'>&nbsp;</span></p>
<p id='t10' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>utils</span><span class='op'>.</span><span class='nam'>mediatypes</span> <span class='key'>import</span> <span class='nam'>_MediaType</span><span class='strut'>&nbsp;</span></p>
<p id='t11' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t12' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t13' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>BaseContentNegotiation</span><span class='op'>(</span><span class='nam'>object</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t14' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>select_parser</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='nam'>parsers</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t15' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>NotImplementedError</span><span class='op'>(</span><span class='str'>&#39;.select_parser() must be implemented&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t16' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t17' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>select_renderer</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='nam'>renderers</span><span class='op'>,</span> <span class='nam'>format_suffix</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t18' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>NotImplementedError</span><span class='op'>(</span><span class='str'>&#39;.select_renderer() must be implemented&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t19' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t20' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t21' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>DefaultContentNegotiation</span><span class='op'>(</span><span class='nam'>BaseContentNegotiation</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t22' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>settings</span> <span class='op'>=</span> <span class='nam'>api_settings</span><span class='strut'>&nbsp;</span></p>
<p id='t23' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t24' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>select_parser</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='nam'>parsers</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t25' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t26' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Given a list of parsers and a media type, return the appropriate</span><span class='strut'>&nbsp;</span></p>
<p id='t27' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; parser to handle the incoming request.</span><span class='strut'>&nbsp;</span></p>
<p id='t28' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t29' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>parser</span> <span class='key'>in</span> <span class='nam'>parsers</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t30' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>media_type_matches</span><span class='op'>(</span><span class='nam'>parser</span><span class='op'>.</span><span class='nam'>media_type</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>content_type</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t31' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>parser</span><span class='strut'>&nbsp;</span></p>
<p id='t32' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
<p id='t33' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t34' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>select_renderer</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='nam'>renderers</span><span class='op'>,</span> <span class='nam'>format_suffix</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t35' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t36' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Given a request and a list of renderers, return a two-tuple of:</span><span class='strut'>&nbsp;</span></p>
<p id='t37' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; (renderer, media type).</span><span class='strut'>&nbsp;</span></p>
<p id='t38' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t39' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Allow URL style format override.&nbsp; eg. &quot;?format=json</span><span class='strut'>&nbsp;</span></p>
<p id='t40' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>format_query_param</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>settings</span><span class='op'>.</span><span class='nam'>URL_FORMAT_OVERRIDE</span><span class='strut'>&nbsp;</span></p>
<p id='t41' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>format</span> <span class='op'>=</span> <span class='nam'>format_suffix</span> <span class='key'>or</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>QUERY_PARAMS</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='nam'>format_query_param</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t42' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t43' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>format</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t44' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>renderers</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>filter_renderers</span><span class='op'>(</span><span class='nam'>renderers</span><span class='op'>,</span> <span class='nam'>format</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t45' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t46' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>accepts</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_accept_list</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t47' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t48' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Check the acceptable media types against each renderer,</span><span class='strut'>&nbsp;</span></p>
<p id='t49' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># attempting more specific media types first</span><span class='strut'>&nbsp;</span></p>
<p id='t50' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># NB. The inner loop here isn&#39;t as bad as it first looks :)</span><span class='strut'>&nbsp;</span></p>
<p id='t51' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'>#&nbsp; &nbsp;&nbsp; Worst case is we&#39;re looping over len(accept_list) * len(self.renderers)</span><span class='strut'>&nbsp;</span></p>
<p id='t52' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>media_type_set</span> <span class='key'>in</span> <span class='nam'>order_by_precedence</span><span class='op'>(</span><span class='nam'>accepts</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t53' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>renderer</span> <span class='key'>in</span> <span class='nam'>renderers</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t54' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>media_type</span> <span class='key'>in</span> <span class='nam'>media_type_set</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t55' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>media_type_matches</span><span class='op'>(</span><span class='nam'>renderer</span><span class='op'>.</span><span class='nam'>media_type</span><span class='op'>,</span> <span class='nam'>media_type</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t56' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Return the most specific media type as accepted.</span><span class='strut'>&nbsp;</span></p>
<p id='t57' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='op'>(</span><span class='nam'>_MediaType</span><span class='op'>(</span><span class='nam'>renderer</span><span class='op'>.</span><span class='nam'>media_type</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>precedence</span> <span class='op'>&gt;</span><span class='strut'>&nbsp;</span></p>
<p id='t58' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>_MediaType</span><span class='op'>(</span><span class='nam'>media_type</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>precedence</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t59' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Eg client requests &#39;*/*&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t60' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Accepted media type is &#39;application/json&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t61' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>renderer</span><span class='op'>,</span> <span class='nam'>renderer</span><span class='op'>.</span><span class='nam'>media_type</span><span class='strut'>&nbsp;</span></p>
<p id='t62' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t63' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Eg client requests &#39;application/json; indent=8&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t64' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Accepted media type is &#39;application/json; indent=8&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t65' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>renderer</span><span class='op'>,</span> <span class='nam'>media_type</span><span class='strut'>&nbsp;</span></p>
<p id='t66' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t67' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>exceptions</span><span class='op'>.</span><span class='nam'>NotAcceptable</span><span class='op'>(</span><span class='nam'>available_renderers</span><span class='op'>=</span><span class='nam'>renderers</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t68' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t69' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>filter_renderers</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>renderers</span><span class='op'>,</span> <span class='nam'>format</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t70' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t71' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; If there is a &#39;.json&#39; style format suffix, filter the renderers</span><span class='strut'>&nbsp;</span></p>
<p id='t72' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; so that we only negotiation against those that accept that format.</span><span class='strut'>&nbsp;</span></p>
<p id='t73' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t74' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>renderers</span> <span class='op'>=</span> <span class='op'>[</span><span class='nam'>renderer</span> <span class='key'>for</span> <span class='nam'>renderer</span> <span class='key'>in</span> <span class='nam'>renderers</span><span class='strut'>&nbsp;</span></p>
<p id='t75' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <span class='key'>if</span> <span class='nam'>renderer</span><span class='op'>.</span><span class='nam'>format</span> <span class='op'>==</span> <span class='nam'>format</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t76' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>renderers</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t77' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>Http404</span><span class='strut'>&nbsp;</span></p>
<p id='t78' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>renderers</span><span class='strut'>&nbsp;</span></p>
<p id='t79' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t80' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>get_accept_list</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t81' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t82' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Given the incoming request, return a tokenised list of media</span><span class='strut'>&nbsp;</span></p>
<p id='t83' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; type strings.</span><span class='strut'>&nbsp;</span></p>
<p id='t84' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t85' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Allows URL style accept override.&nbsp; eg. &quot;?accept=application/json&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t86' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t87' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>header</span> <span class='op'>=</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>META</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;HTTP_ACCEPT&#39;</span><span class='op'>,</span> <span class='str'>&#39;*/*&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t88' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>header</span> <span class='op'>=</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>QUERY_PARAMS</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>settings</span><span class='op'>.</span><span class='nam'>URL_ACCEPT_OVERRIDE</span><span class='op'>,</span> <span class='nam'>header</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t89' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>[</span><span class='nam'>token</span><span class='op'>.</span><span class='nam'>strip</span><span class='op'>(</span><span class='op'>)</span> <span class='key'>for</span> <span class='nam'>token</span> <span class='key'>in</span> <span class='nam'>header</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>&#39;,&#39;</span><span class='op'>)</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
</td>
</tr>
</table>
</div>
<div id='footer'>
<div class='content'>
<p>
<a class='nav' href='index.html'>&#xab; index</a> &nbsp; &nbsp; <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.5.1</a>
</p>
</div>
</div>
</body>
</html>

View File

@ -1,269 +0,0 @@
<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
<title>Coverage for rest_framework/pagination: 100%</title>
<link rel='stylesheet' href='style.css' type='text/css'>
<script type='text/javascript' src='jquery-1.4.3.min.js'></script>
<script type='text/javascript' src='jquery.hotkeys.js'></script>
<script type='text/javascript' src='jquery.isonscreen.js'></script>
<script type='text/javascript' src='coverage_html.js'></script>
<script type='text/javascript' charset='utf-8'>
jQuery(document).ready(coverage.pyfile_ready);
</script>
</head>
<body id='pyfile'>
<div id='header'>
<div class='content'>
<h1>Coverage for <b>rest_framework/pagination</b> :
<span class='pc_cov'>100%</span>
</h1>
<img id='keyboard_icon' src='keybd_closed.png'>
<h2 class='stats'>
43 statements
<span class='run hide_run shortkey_r' onclick='coverage.toggle_lines(this, "run")'>43 run</span>
<span class='mis shortkey_m' onclick='coverage.toggle_lines(this, "mis")'>0 missing</span>
<span class='exc shortkey_x' onclick='coverage.toggle_lines(this, "exc")'>0 excluded</span>
</h2>
</div>
</div>
<div class='help_panel'>
<img id='panel_icon' src='keybd_open.png'>
<p class='legend'>Hot-keys on this page</p>
<div>
<p class='keyhelp'>
<span class='key'>r</span>
<span class='key'>m</span>
<span class='key'>x</span>
<span class='key'>p</span> &nbsp; toggle line displays
</p>
<p class='keyhelp'>
<span class='key'>j</span>
<span class='key'>k</span> &nbsp; next/prev highlighted chunk
</p>
<p class='keyhelp'>
<span class='key'>0</span> &nbsp; (zero) top of page
</p>
<p class='keyhelp'>
<span class='key'>1</span> &nbsp; (one) first highlighted chunk
</p>
</div>
</div>
<div id='source'>
<table cellspacing='0' cellpadding='0'>
<tr>
<td class='linenos' valign='top'>
<p id='n1' class='pln'><a href='#n1'>1</a></p>
<p id='n2' class='pln'><a href='#n2'>2</a></p>
<p id='n3' class='pln'><a href='#n3'>3</a></p>
<p id='n4' class='pln'><a href='#n4'>4</a></p>
<p id='n5' class='stm run hide_run'><a href='#n5'>5</a></p>
<p id='n6' class='stm run hide_run'><a href='#n6'>6</a></p>
<p id='n7' class='stm run hide_run'><a href='#n7'>7</a></p>
<p id='n8' class='pln'><a href='#n8'>8</a></p>
<p id='n9' class='pln'><a href='#n9'>9</a></p>
<p id='n10' class='stm run hide_run'><a href='#n10'>10</a></p>
<p id='n11' class='pln'><a href='#n11'>11</a></p>
<p id='n12' class='pln'><a href='#n12'>12</a></p>
<p id='n13' class='pln'><a href='#n13'>13</a></p>
<p id='n14' class='stm run hide_run'><a href='#n14'>14</a></p>
<p id='n15' class='pln'><a href='#n15'>15</a></p>
<p id='n16' class='stm run hide_run'><a href='#n16'>16</a></p>
<p id='n17' class='stm run hide_run'><a href='#n17'>17</a></p>
<p id='n18' class='stm run hide_run'><a href='#n18'>18</a></p>
<p id='n19' class='stm run hide_run'><a href='#n19'>19</a></p>
<p id='n20' class='stm run hide_run'><a href='#n20'>20</a></p>
<p id='n21' class='stm run hide_run'><a href='#n21'>21</a></p>
<p id='n22' class='stm run hide_run'><a href='#n22'>22</a></p>
<p id='n23' class='pln'><a href='#n23'>23</a></p>
<p id='n24' class='pln'><a href='#n24'>24</a></p>
<p id='n25' class='stm run hide_run'><a href='#n25'>25</a></p>
<p id='n26' class='pln'><a href='#n26'>26</a></p>
<p id='n27' class='pln'><a href='#n27'>27</a></p>
<p id='n28' class='pln'><a href='#n28'>28</a></p>
<p id='n29' class='stm run hide_run'><a href='#n29'>29</a></p>
<p id='n30' class='pln'><a href='#n30'>30</a></p>
<p id='n31' class='stm run hide_run'><a href='#n31'>31</a></p>
<p id='n32' class='stm run hide_run'><a href='#n32'>32</a></p>
<p id='n33' class='stm run hide_run'><a href='#n33'>33</a></p>
<p id='n34' class='stm run hide_run'><a href='#n34'>34</a></p>
<p id='n35' class='stm run hide_run'><a href='#n35'>35</a></p>
<p id='n36' class='stm run hide_run'><a href='#n36'>36</a></p>
<p id='n37' class='stm run hide_run'><a href='#n37'>37</a></p>
<p id='n38' class='pln'><a href='#n38'>38</a></p>
<p id='n39' class='pln'><a href='#n39'>39</a></p>
<p id='n40' class='stm run hide_run'><a href='#n40'>40</a></p>
<p id='n41' class='pln'><a href='#n41'>41</a></p>
<p id='n42' class='pln'><a href='#n42'>42</a></p>
<p id='n43' class='pln'><a href='#n43'>43</a></p>
<p id='n44' class='pln'><a href='#n44'>44</a></p>
<p id='n45' class='pln'><a href='#n45'>45</a></p>
<p id='n46' class='stm run hide_run'><a href='#n46'>46</a></p>
<p id='n47' class='pln'><a href='#n47'>47</a></p>
<p id='n48' class='stm run hide_run'><a href='#n48'>48</a></p>
<p id='n49' class='pln'><a href='#n49'>49</a></p>
<p id='n50' class='pln'><a href='#n50'>50</a></p>
<p id='n51' class='stm run hide_run'><a href='#n51'>51</a></p>
<p id='n52' class='pln'><a href='#n52'>52</a></p>
<p id='n53' class='pln'><a href='#n53'>53</a></p>
<p id='n54' class='pln'><a href='#n54'>54</a></p>
<p id='n55' class='pln'><a href='#n55'>55</a></p>
<p id='n56' class='pln'><a href='#n56'>56</a></p>
<p id='n57' class='pln'><a href='#n57'>57</a></p>
<p id='n58' class='stm run hide_run'><a href='#n58'>58</a></p>
<p id='n59' class='stm run hide_run'><a href='#n59'>59</a></p>
<p id='n60' class='stm run hide_run'><a href='#n60'>60</a></p>
<p id='n61' class='pln'><a href='#n61'>61</a></p>
<p id='n62' class='pln'><a href='#n62'>62</a></p>
<p id='n63' class='pln'><a href='#n63'>63</a></p>
<p id='n64' class='stm run hide_run'><a href='#n64'>64</a></p>
<p id='n65' class='pln'><a href='#n65'>65</a></p>
<p id='n66' class='pln'><a href='#n66'>66</a></p>
<p id='n67' class='pln'><a href='#n67'>67</a></p>
<p id='n68' class='pln'><a href='#n68'>68</a></p>
<p id='n69' class='stm run hide_run'><a href='#n69'>69</a></p>
<p id='n70' class='stm run hide_run'><a href='#n70'>70</a></p>
<p id='n71' class='pln'><a href='#n71'>71</a></p>
<p id='n72' class='stm run hide_run'><a href='#n72'>72</a></p>
<p id='n73' class='pln'><a href='#n73'>73</a></p>
<p id='n74' class='pln'><a href='#n74'>74</a></p>
<p id='n75' class='pln'><a href='#n75'>75</a></p>
<p id='n76' class='stm run hide_run'><a href='#n76'>76</a></p>
<p id='n77' class='stm run hide_run'><a href='#n77'>77</a></p>
<p id='n78' class='stm run hide_run'><a href='#n78'>78</a></p>
<p id='n79' class='pln'><a href='#n79'>79</a></p>
<p id='n80' class='stm run hide_run'><a href='#n80'>80</a></p>
<p id='n81' class='stm run hide_run'><a href='#n81'>81</a></p>
<p id='n82' class='pln'><a href='#n82'>82</a></p>
<p id='n83' class='stm run hide_run'><a href='#n83'>83</a></p>
<p id='n84' class='pln'><a href='#n84'>84</a></p>
<p id='n85' class='stm run hide_run'><a href='#n85'>85</a></p>
<p id='n86' class='pln'><a href='#n86'>86</a></p>
<p id='n87' class='pln'><a href='#n87'>87</a></p>
<p id='n88' class='stm run hide_run'><a href='#n88'>88</a></p>
<p id='n89' class='pln'><a href='#n89'>89</a></p>
<p id='n90' class='pln'><a href='#n90'>90</a></p>
<p id='n91' class='pln'><a href='#n91'>91</a></p>
<p id='n92' class='stm run hide_run'><a href='#n92'>92</a></p>
<p id='n93' class='stm run hide_run'><a href='#n93'>93</a></p>
<p id='n94' class='stm run hide_run'><a href='#n94'>94</a></p>
</td>
<td class='text' valign='top'>
<p id='t1' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t2' class='pln'><span class='str'>Pagination serializers determine the structure of the output that should</span><span class='strut'>&nbsp;</span></p>
<p id='t3' class='pln'><span class='str'>be used for paginated responses.</span><span class='strut'>&nbsp;</span></p>
<p id='t4' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t5' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>__future__</span> <span class='key'>import</span> <span class='nam'>unicode_literals</span><span class='strut'>&nbsp;</span></p>
<p id='t6' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span> <span class='key'>import</span> <span class='nam'>serializers</span><span class='strut'>&nbsp;</span></p>
<p id='t7' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>templatetags</span><span class='op'>.</span><span class='nam'>rest_framework</span> <span class='key'>import</span> <span class='nam'>replace_query_param</span><span class='strut'>&nbsp;</span></p>
<p id='t8' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t9' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t10' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>NextPageField</span><span class='op'>(</span><span class='nam'>serializers</span><span class='op'>.</span><span class='nam'>Field</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t11' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t12' class='pln'><span class='str'>&nbsp; &nbsp; Field that returns a link to the next page in paginated results.</span><span class='strut'>&nbsp;</span></p>
<p id='t13' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t14' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>page_field</span> <span class='op'>=</span> <span class='str'>&#39;page&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t15' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t16' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>to_native</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>value</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t17' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>value</span><span class='op'>.</span><span class='nam'>has_next</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t18' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
<p id='t19' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>page</span> <span class='op'>=</span> <span class='nam'>value</span><span class='op'>.</span><span class='nam'>next_page_number</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t20' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>context</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;request&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t21' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>url</span> <span class='op'>=</span> <span class='nam'>request</span> <span class='key'>and</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>build_absolute_uri</span><span class='op'>(</span><span class='op'>)</span> <span class='key'>or</span> <span class='str'>&#39;&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t22' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>replace_query_param</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>page_field</span><span class='op'>,</span> <span class='nam'>page</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t23' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t24' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t25' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>PreviousPageField</span><span class='op'>(</span><span class='nam'>serializers</span><span class='op'>.</span><span class='nam'>Field</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t26' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t27' class='pln'><span class='str'>&nbsp; &nbsp; Field that returns a link to the previous page in paginated results.</span><span class='strut'>&nbsp;</span></p>
<p id='t28' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t29' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>page_field</span> <span class='op'>=</span> <span class='str'>&#39;page&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t30' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t31' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>to_native</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>value</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t32' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>value</span><span class='op'>.</span><span class='nam'>has_previous</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t33' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
<p id='t34' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>page</span> <span class='op'>=</span> <span class='nam'>value</span><span class='op'>.</span><span class='nam'>previous_page_number</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t35' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>context</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;request&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t36' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>url</span> <span class='op'>=</span> <span class='nam'>request</span> <span class='key'>and</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>build_absolute_uri</span><span class='op'>(</span><span class='op'>)</span> <span class='key'>or</span> <span class='str'>&#39;&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t37' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>replace_query_param</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>page_field</span><span class='op'>,</span> <span class='nam'>page</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t38' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t39' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t40' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>DefaultObjectSerializer</span><span class='op'>(</span><span class='nam'>serializers</span><span class='op'>.</span><span class='nam'>Field</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t41' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t42' class='pln'><span class='str'>&nbsp; &nbsp; If no object serializer is specified, then this serializer will be applied</span><span class='strut'>&nbsp;</span></p>
<p id='t43' class='pln'><span class='str'>&nbsp; &nbsp; as the default.</span><span class='strut'>&nbsp;</span></p>
<p id='t44' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t45' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t46' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>source</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>context</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t47' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Note: Swallow context kwarg - only required for eg. ModelSerializer.</span><span class='strut'>&nbsp;</span></p>
<p id='t48' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>super</span><span class='op'>(</span><span class='nam'>DefaultObjectSerializer</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>source</span><span class='op'>=</span><span class='nam'>source</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t49' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t50' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t51' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>PaginationSerializerOptions</span><span class='op'>(</span><span class='nam'>serializers</span><span class='op'>.</span><span class='nam'>SerializerOptions</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t52' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t53' class='pln'><span class='str'>&nbsp; &nbsp; An object that stores the options that may be provided to a</span><span class='strut'>&nbsp;</span></p>
<p id='t54' class='pln'><span class='str'>&nbsp; &nbsp; pagination serializer by using the inner `Meta` class.</span><span class='strut'>&nbsp;</span></p>
<p id='t55' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t56' class='pln'><span class='str'>&nbsp; &nbsp; Accessible on the instance as `serializer.opts`.</span><span class='strut'>&nbsp;</span></p>
<p id='t57' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t58' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>meta</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t59' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>super</span><span class='op'>(</span><span class='nam'>PaginationSerializerOptions</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>meta</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t60' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>object_serializer_class</span> <span class='op'>=</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>meta</span><span class='op'>,</span> <span class='str'>&#39;object_serializer_class&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t61' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <span class='nam'>DefaultObjectSerializer</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t62' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t63' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t64' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>BasePaginationSerializer</span><span class='op'>(</span><span class='nam'>serializers</span><span class='op'>.</span><span class='nam'>Serializer</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t65' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t66' class='pln'><span class='str'>&nbsp; &nbsp; A base class for pagination serializers to inherit from,</span><span class='strut'>&nbsp;</span></p>
<p id='t67' class='pln'><span class='str'>&nbsp; &nbsp; to make implementing custom serializers more easy.</span><span class='strut'>&nbsp;</span></p>
<p id='t68' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t69' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_options_class</span> <span class='op'>=</span> <span class='nam'>PaginationSerializerOptions</span><span class='strut'>&nbsp;</span></p>
<p id='t70' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>results_field</span> <span class='op'>=</span> <span class='str'>&#39;results&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t71' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t72' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='op'>*</span><span class='nam'>args</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kwargs</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t73' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t74' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Override init to add in the object serializer field on-the-fly.</span><span class='strut'>&nbsp;</span></p>
<p id='t75' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t76' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>super</span><span class='op'>(</span><span class='nam'>BasePaginationSerializer</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>__init__</span><span class='op'>(</span><span class='op'>*</span><span class='nam'>args</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kwargs</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t77' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>results_field</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>results_field</span><span class='strut'>&nbsp;</span></p>
<p id='t78' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>object_serializer</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>opts</span><span class='op'>.</span><span class='nam'>object_serializer_class</span><span class='strut'>&nbsp;</span></p>
<p id='t79' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t80' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='str'>&#39;context&#39;</span> <span class='key'>in</span> <span class='nam'>kwargs</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t81' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>context_kwarg</span> <span class='op'>=</span> <span class='op'>{</span><span class='str'>&#39;context&#39;</span><span class='op'>:</span> <span class='nam'>kwargs</span><span class='op'>[</span><span class='str'>&#39;context&#39;</span><span class='op'>]</span><span class='op'>}</span><span class='strut'>&nbsp;</span></p>
<p id='t82' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t83' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>context_kwarg</span> <span class='op'>=</span> <span class='op'>{</span><span class='op'>}</span><span class='strut'>&nbsp;</span></p>
<p id='t84' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t85' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>fields</span><span class='op'>[</span><span class='nam'>results_field</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>object_serializer</span><span class='op'>(</span><span class='nam'>source</span><span class='op'>=</span><span class='str'>&#39;object_list&#39;</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>context_kwarg</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t86' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t87' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t88' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>PaginationSerializer</span><span class='op'>(</span><span class='nam'>BasePaginationSerializer</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t89' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t90' class='pln'><span class='str'>&nbsp; &nbsp; A default implementation of a pagination serializer.</span><span class='strut'>&nbsp;</span></p>
<p id='t91' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t92' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>count</span> <span class='op'>=</span> <span class='nam'>serializers</span><span class='op'>.</span><span class='nam'>Field</span><span class='op'>(</span><span class='nam'>source</span><span class='op'>=</span><span class='str'>&#39;paginator.count&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t93' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>next</span> <span class='op'>=</span> <span class='nam'>NextPageField</span><span class='op'>(</span><span class='nam'>source</span><span class='op'>=</span><span class='str'>&#39;*&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t94' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>previous</span> <span class='op'>=</span> <span class='nam'>PreviousPageField</span><span class='op'>(</span><span class='nam'>source</span><span class='op'>=</span><span class='str'>&#39;*&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
</td>
</tr>
</table>
</div>
<div id='footer'>
<div class='content'>
<p>
<a class='nav' href='index.html'>&#xab; index</a> &nbsp; &nbsp; <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.5.1</a>
</p>
</div>
</div>
</body>
</html>

View File

@ -1,671 +0,0 @@
<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
<title>Coverage for rest_framework/parsers: 92%</title>
<link rel='stylesheet' href='style.css' type='text/css'>
<script type='text/javascript' src='jquery-1.4.3.min.js'></script>
<script type='text/javascript' src='jquery.hotkeys.js'></script>
<script type='text/javascript' src='jquery.isonscreen.js'></script>
<script type='text/javascript' src='coverage_html.js'></script>
<script type='text/javascript' charset='utf-8'>
jQuery(document).ready(coverage.pyfile_ready);
</script>
</head>
<body id='pyfile'>
<div id='header'>
<div class='content'>
<h1>Coverage for <b>rest_framework/parsers</b> :
<span class='pc_cov'>92%</span>
</h1>
<img id='keyboard_icon' src='keybd_closed.png'>
<h2 class='stats'>
153 statements
<span class='run hide_run shortkey_r' onclick='coverage.toggle_lines(this, "run")'>140 run</span>
<span class='mis shortkey_m' onclick='coverage.toggle_lines(this, "mis")'>13 missing</span>
<span class='exc shortkey_x' onclick='coverage.toggle_lines(this, "exc")'>0 excluded</span>
</h2>
</div>
</div>
<div class='help_panel'>
<img id='panel_icon' src='keybd_open.png'>
<p class='legend'>Hot-keys on this page</p>
<div>
<p class='keyhelp'>
<span class='key'>r</span>
<span class='key'>m</span>
<span class='key'>x</span>
<span class='key'>p</span> &nbsp; toggle line displays
</p>
<p class='keyhelp'>
<span class='key'>j</span>
<span class='key'>k</span> &nbsp; next/prev highlighted chunk
</p>
<p class='keyhelp'>
<span class='key'>0</span> &nbsp; (zero) top of page
</p>
<p class='keyhelp'>
<span class='key'>1</span> &nbsp; (one) first highlighted chunk
</p>
</div>
</div>
<div id='source'>
<table cellspacing='0' cellpadding='0'>
<tr>
<td class='linenos' valign='top'>
<p id='n1' class='pln'><a href='#n1'>1</a></p>
<p id='n2' class='pln'><a href='#n2'>2</a></p>
<p id='n3' class='pln'><a href='#n3'>3</a></p>
<p id='n4' class='pln'><a href='#n4'>4</a></p>
<p id='n5' class='pln'><a href='#n5'>5</a></p>
<p id='n6' class='pln'><a href='#n6'>6</a></p>
<p id='n7' class='stm run hide_run'><a href='#n7'>7</a></p>
<p id='n8' class='stm run hide_run'><a href='#n8'>8</a></p>
<p id='n9' class='stm run hide_run'><a href='#n9'>9</a></p>
<p id='n10' class='stm run hide_run'><a href='#n10'>10</a></p>
<p id='n11' class='stm run hide_run'><a href='#n11'>11</a></p>
<p id='n12' class='stm run hide_run'><a href='#n12'>12</a></p>
<p id='n13' class='stm run hide_run'><a href='#n13'>13</a></p>
<p id='n14' class='stm run hide_run'><a href='#n14'>14</a></p>
<p id='n15' class='stm run hide_run'><a href='#n15'>15</a></p>
<p id='n16' class='stm run hide_run'><a href='#n16'>16</a></p>
<p id='n17' class='stm run hide_run'><a href='#n17'>17</a></p>
<p id='n18' class='stm run hide_run'><a href='#n18'>18</a></p>
<p id='n19' class='pln'><a href='#n19'>19</a></p>
<p id='n20' class='pln'><a href='#n20'>20</a></p>
<p id='n21' class='stm run hide_run'><a href='#n21'>21</a></p>
<p id='n22' class='stm run hide_run'><a href='#n22'>22</a></p>
<p id='n23' class='stm run hide_run'><a href='#n23'>23</a></p>
<p id='n24' class='stm run hide_run'><a href='#n24'>24</a></p>
<p id='n25' class='pln'><a href='#n25'>25</a></p>
<p id='n26' class='pln'><a href='#n26'>26</a></p>
<p id='n27' class='stm run hide_run'><a href='#n27'>27</a></p>
<p id='n28' class='pln'><a href='#n28'>28</a></p>
<p id='n29' class='pln'><a href='#n29'>29</a></p>
<p id='n30' class='pln'><a href='#n30'>30</a></p>
<p id='n31' class='pln'><a href='#n31'>31</a></p>
<p id='n32' class='pln'><a href='#n32'>32</a></p>
<p id='n33' class='stm run hide_run'><a href='#n33'>33</a></p>
<p id='n34' class='pln'><a href='#n34'>34</a></p>
<p id='n35' class='stm run hide_run'><a href='#n35'>35</a></p>
<p id='n36' class='pln'><a href='#n36'>36</a></p>
<p id='n37' class='pln'><a href='#n37'>37</a></p>
<p id='n38' class='pln'><a href='#n38'>38</a></p>
<p id='n39' class='pln'><a href='#n39'>39</a></p>
<p id='n40' class='pln'><a href='#n40'>40</a></p>
<p id='n41' class='stm mis'><a href='#n41'>41</a></p>
<p id='n42' class='pln'><a href='#n42'>42</a></p>
<p id='n43' class='pln'><a href='#n43'>43</a></p>
<p id='n44' class='stm run hide_run'><a href='#n44'>44</a></p>
<p id='n45' class='pln'><a href='#n45'>45</a></p>
<p id='n46' class='pln'><a href='#n46'>46</a></p>
<p id='n47' class='pln'><a href='#n47'>47</a></p>
<p id='n48' class='pln'><a href='#n48'>48</a></p>
<p id='n49' class='stm run hide_run'><a href='#n49'>49</a></p>
<p id='n50' class='pln'><a href='#n50'>50</a></p>
<p id='n51' class='stm run hide_run'><a href='#n51'>51</a></p>
<p id='n52' class='pln'><a href='#n52'>52</a></p>
<p id='n53' class='pln'><a href='#n53'>53</a></p>
<p id='n54' class='pln'><a href='#n54'>54</a></p>
<p id='n55' class='pln'><a href='#n55'>55</a></p>
<p id='n56' class='pln'><a href='#n56'>56</a></p>
<p id='n57' class='pln'><a href='#n57'>57</a></p>
<p id='n58' class='stm run hide_run'><a href='#n58'>58</a></p>
<p id='n59' class='stm run hide_run'><a href='#n59'>59</a></p>
<p id='n60' class='pln'><a href='#n60'>60</a></p>
<p id='n61' class='stm run hide_run'><a href='#n61'>61</a></p>
<p id='n62' class='stm run hide_run'><a href='#n62'>62</a></p>
<p id='n63' class='stm run hide_run'><a href='#n63'>63</a></p>
<p id='n64' class='stm run hide_run'><a href='#n64'>64</a></p>
<p id='n65' class='stm run hide_run'><a href='#n65'>65</a></p>
<p id='n66' class='pln'><a href='#n66'>66</a></p>
<p id='n67' class='pln'><a href='#n67'>67</a></p>
<p id='n68' class='stm run hide_run'><a href='#n68'>68</a></p>
<p id='n69' class='pln'><a href='#n69'>69</a></p>
<p id='n70' class='pln'><a href='#n70'>70</a></p>
<p id='n71' class='pln'><a href='#n71'>71</a></p>
<p id='n72' class='pln'><a href='#n72'>72</a></p>
<p id='n73' class='stm run hide_run'><a href='#n73'>73</a></p>
<p id='n74' class='pln'><a href='#n74'>74</a></p>
<p id='n75' class='stm run hide_run'><a href='#n75'>75</a></p>
<p id='n76' class='pln'><a href='#n76'>76</a></p>
<p id='n77' class='pln'><a href='#n77'>77</a></p>
<p id='n78' class='pln'><a href='#n78'>78</a></p>
<p id='n79' class='pln'><a href='#n79'>79</a></p>
<p id='n80' class='pln'><a href='#n80'>80</a></p>
<p id='n81' class='pln'><a href='#n81'>81</a></p>
<p id='n82' class='stm run hide_run'><a href='#n82'>82</a></p>
<p id='n83' class='pln'><a href='#n83'>83</a></p>
<p id='n84' class='stm run hide_run'><a href='#n84'>84</a></p>
<p id='n85' class='stm run hide_run'><a href='#n85'>85</a></p>
<p id='n86' class='pln'><a href='#n86'>86</a></p>
<p id='n87' class='stm run hide_run'><a href='#n87'>87</a></p>
<p id='n88' class='stm run hide_run'><a href='#n88'>88</a></p>
<p id='n89' class='stm run hide_run'><a href='#n89'>89</a></p>
<p id='n90' class='stm mis'><a href='#n90'>90</a></p>
<p id='n91' class='stm mis'><a href='#n91'>91</a></p>
<p id='n92' class='pln'><a href='#n92'>92</a></p>
<p id='n93' class='pln'><a href='#n93'>93</a></p>
<p id='n94' class='stm run hide_run'><a href='#n94'>94</a></p>
<p id='n95' class='pln'><a href='#n95'>95</a></p>
<p id='n96' class='pln'><a href='#n96'>96</a></p>
<p id='n97' class='pln'><a href='#n97'>97</a></p>
<p id='n98' class='pln'><a href='#n98'>98</a></p>
<p id='n99' class='stm run hide_run'><a href='#n99'>99</a></p>
<p id='n100' class='pln'><a href='#n100'>100</a></p>
<p id='n101' class='stm run hide_run'><a href='#n101'>101</a></p>
<p id='n102' class='pln'><a href='#n102'>102</a></p>
<p id='n103' class='pln'><a href='#n103'>103</a></p>
<p id='n104' class='pln'><a href='#n104'>104</a></p>
<p id='n105' class='pln'><a href='#n105'>105</a></p>
<p id='n106' class='pln'><a href='#n106'>106</a></p>
<p id='n107' class='pln'><a href='#n107'>107</a></p>
<p id='n108' class='stm run hide_run'><a href='#n108'>108</a></p>
<p id='n109' class='stm run hide_run'><a href='#n109'>109</a></p>
<p id='n110' class='stm run hide_run'><a href='#n110'>110</a></p>
<p id='n111' class='stm run hide_run'><a href='#n111'>111</a></p>
<p id='n112' class='pln'><a href='#n112'>112</a></p>
<p id='n113' class='pln'><a href='#n113'>113</a></p>
<p id='n114' class='stm run hide_run'><a href='#n114'>114</a></p>
<p id='n115' class='pln'><a href='#n115'>115</a></p>
<p id='n116' class='pln'><a href='#n116'>116</a></p>
<p id='n117' class='pln'><a href='#n117'>117</a></p>
<p id='n118' class='pln'><a href='#n118'>118</a></p>
<p id='n119' class='stm run hide_run'><a href='#n119'>119</a></p>
<p id='n120' class='pln'><a href='#n120'>120</a></p>
<p id='n121' class='stm run hide_run'><a href='#n121'>121</a></p>
<p id='n122' class='pln'><a href='#n122'>122</a></p>
<p id='n123' class='pln'><a href='#n123'>123</a></p>
<p id='n124' class='pln'><a href='#n124'>124</a></p>
<p id='n125' class='pln'><a href='#n125'>125</a></p>
<p id='n126' class='pln'><a href='#n126'>126</a></p>
<p id='n127' class='pln'><a href='#n127'>127</a></p>
<p id='n128' class='stm run hide_run'><a href='#n128'>128</a></p>
<p id='n129' class='stm run hide_run'><a href='#n129'>129</a></p>
<p id='n130' class='stm run hide_run'><a href='#n130'>130</a></p>
<p id='n131' class='stm run hide_run'><a href='#n131'>131</a></p>
<p id='n132' class='stm run hide_run'><a href='#n132'>132</a></p>
<p id='n133' class='pln'><a href='#n133'>133</a></p>
<p id='n134' class='stm run hide_run'><a href='#n134'>134</a></p>
<p id='n135' class='stm run hide_run'><a href='#n135'>135</a></p>
<p id='n136' class='stm run hide_run'><a href='#n136'>136</a></p>
<p id='n137' class='stm run hide_run'><a href='#n137'>137</a></p>
<p id='n138' class='stm mis'><a href='#n138'>138</a></p>
<p id='n139' class='stm mis'><a href='#n139'>139</a></p>
<p id='n140' class='pln'><a href='#n140'>140</a></p>
<p id='n141' class='pln'><a href='#n141'>141</a></p>
<p id='n142' class='stm run hide_run'><a href='#n142'>142</a></p>
<p id='n143' class='pln'><a href='#n143'>143</a></p>
<p id='n144' class='pln'><a href='#n144'>144</a></p>
<p id='n145' class='pln'><a href='#n145'>145</a></p>
<p id='n146' class='pln'><a href='#n146'>146</a></p>
<p id='n147' class='stm run hide_run'><a href='#n147'>147</a></p>
<p id='n148' class='pln'><a href='#n148'>148</a></p>
<p id='n149' class='stm run hide_run'><a href='#n149'>149</a></p>
<p id='n150' class='stm run hide_run'><a href='#n150'>150</a></p>
<p id='n151' class='pln'><a href='#n151'>151</a></p>
<p id='n152' class='stm run hide_run'><a href='#n152'>152</a></p>
<p id='n153' class='stm run hide_run'><a href='#n153'>153</a></p>
<p id='n154' class='stm run hide_run'><a href='#n154'>154</a></p>
<p id='n155' class='stm run hide_run'><a href='#n155'>155</a></p>
<p id='n156' class='stm run hide_run'><a href='#n156'>156</a></p>
<p id='n157' class='stm mis'><a href='#n157'>157</a></p>
<p id='n158' class='stm mis'><a href='#n158'>158</a></p>
<p id='n159' class='stm run hide_run'><a href='#n159'>159</a></p>
<p id='n160' class='pln'><a href='#n160'>160</a></p>
<p id='n161' class='stm run hide_run'><a href='#n161'>161</a></p>
<p id='n162' class='pln'><a href='#n162'>162</a></p>
<p id='n163' class='stm run hide_run'><a href='#n163'>163</a></p>
<p id='n164' class='pln'><a href='#n164'>164</a></p>
<p id='n165' class='pln'><a href='#n165'>165</a></p>
<p id='n166' class='pln'><a href='#n166'>166</a></p>
<p id='n167' class='pln'><a href='#n167'>167</a></p>
<p id='n168' class='stm run hide_run'><a href='#n168'>168</a></p>
<p id='n169' class='pln'><a href='#n169'>169</a></p>
<p id='n170' class='stm run hide_run'><a href='#n170'>170</a></p>
<p id='n171' class='stm run hide_run'><a href='#n171'>171</a></p>
<p id='n172' class='pln'><a href='#n172'>172</a></p>
<p id='n173' class='pln'><a href='#n173'>173</a></p>
<p id='n174' class='stm run hide_run'><a href='#n174'>174</a></p>
<p id='n175' class='stm run hide_run'><a href='#n175'>175</a></p>
<p id='n176' class='stm run hide_run'><a href='#n176'>176</a></p>
<p id='n177' class='stm run hide_run'><a href='#n177'>177</a></p>
<p id='n178' class='pln'><a href='#n178'>178</a></p>
<p id='n179' class='stm run hide_run'><a href='#n179'>179</a></p>
<p id='n180' class='stm run hide_run'><a href='#n180'>180</a></p>
<p id='n181' class='stm run hide_run'><a href='#n181'>181</a></p>
<p id='n182' class='pln'><a href='#n182'>182</a></p>
<p id='n183' class='stm run hide_run'><a href='#n183'>183</a></p>
<p id='n184' class='pln'><a href='#n184'>184</a></p>
<p id='n185' class='stm run hide_run'><a href='#n185'>185</a></p>
<p id='n186' class='pln'><a href='#n186'>186</a></p>
<p id='n187' class='pln'><a href='#n187'>187</a></p>
<p id='n188' class='pln'><a href='#n188'>188</a></p>
<p id='n189' class='pln'><a href='#n189'>189</a></p>
<p id='n190' class='stm run hide_run'><a href='#n190'>190</a></p>
<p id='n191' class='stm run hide_run'><a href='#n191'>191</a></p>
<p id='n192' class='pln'><a href='#n192'>192</a></p>
<p id='n193' class='stm run hide_run'><a href='#n193'>193</a></p>
<p id='n194' class='stm run hide_run'><a href='#n194'>194</a></p>
<p id='n195' class='stm run hide_run'><a href='#n195'>195</a></p>
<p id='n196' class='stm run hide_run'><a href='#n196'>196</a></p>
<p id='n197' class='pln'><a href='#n197'>197</a></p>
<p id='n198' class='stm run hide_run'><a href='#n198'>198</a></p>
<p id='n199' class='stm run hide_run'><a href='#n199'>199</a></p>
<p id='n200' class='stm run hide_run'><a href='#n200'>200</a></p>
<p id='n201' class='stm run hide_run'><a href='#n201'>201</a></p>
<p id='n202' class='pln'><a href='#n202'>202</a></p>
<p id='n203' class='stm run hide_run'><a href='#n203'>203</a></p>
<p id='n204' class='stm run hide_run'><a href='#n204'>204</a></p>
<p id='n205' class='stm run hide_run'><a href='#n205'>205</a></p>
<p id='n206' class='stm run hide_run'><a href='#n206'>206</a></p>
<p id='n207' class='pln'><a href='#n207'>207</a></p>
<p id='n208' class='stm run hide_run'><a href='#n208'>208</a></p>
<p id='n209' class='pln'><a href='#n209'>209</a></p>
<p id='n210' class='pln'><a href='#n210'>210</a></p>
<p id='n211' class='stm run hide_run'><a href='#n211'>211</a></p>
<p id='n212' class='pln'><a href='#n212'>212</a></p>
<p id='n213' class='pln'><a href='#n213'>213</a></p>
<p id='n214' class='pln'><a href='#n214'>214</a></p>
<p id='n215' class='stm run hide_run'><a href='#n215'>215</a></p>
<p id='n216' class='pln'><a href='#n216'>216</a></p>
<p id='n217' class='stm run hide_run'><a href='#n217'>217</a></p>
<p id='n218' class='pln'><a href='#n218'>218</a></p>
<p id='n219' class='pln'><a href='#n219'>219</a></p>
<p id='n220' class='pln'><a href='#n220'>220</a></p>
<p id='n221' class='pln'><a href='#n221'>221</a></p>
<p id='n222' class='pln'><a href='#n222'>222</a></p>
<p id='n223' class='pln'><a href='#n223'>223</a></p>
<p id='n224' class='pln'><a href='#n224'>224</a></p>
<p id='n225' class='stm run hide_run'><a href='#n225'>225</a></p>
<p id='n226' class='stm run hide_run'><a href='#n226'>226</a></p>
<p id='n227' class='stm run hide_run'><a href='#n227'>227</a></p>
<p id='n228' class='stm run hide_run'><a href='#n228'>228</a></p>
<p id='n229' class='stm run hide_run'><a href='#n229'>229</a></p>
<p id='n230' class='stm run hide_run'><a href='#n230'>230</a></p>
<p id='n231' class='pln'><a href='#n231'>231</a></p>
<p id='n232' class='pln'><a href='#n232'>232</a></p>
<p id='n233' class='pln'><a href='#n233'>233</a></p>
<p id='n234' class='stm run hide_run'><a href='#n234'>234</a></p>
<p id='n235' class='pln'><a href='#n235'>235</a></p>
<p id='n236' class='stm run hide_run'><a href='#n236'>236</a></p>
<p id='n237' class='stm run hide_run'><a href='#n237'>237</a></p>
<p id='n238' class='pln'><a href='#n238'>238</a></p>
<p id='n239' class='stm mis'><a href='#n239'>239</a></p>
<p id='n240' class='stm mis'><a href='#n240'>240</a></p>
<p id='n241' class='pln'><a href='#n241'>241</a></p>
<p id='n242' class='pln'><a href='#n242'>242</a></p>
<p id='n243' class='stm run hide_run'><a href='#n243'>243</a></p>
<p id='n244' class='stm run hide_run'><a href='#n244'>244</a></p>
<p id='n245' class='pln'><a href='#n245'>245</a></p>
<p id='n246' class='pln'><a href='#n246'>246</a></p>
<p id='n247' class='pln'><a href='#n247'>247</a></p>
<p id='n248' class='pln'><a href='#n248'>248</a></p>
<p id='n249' class='stm run hide_run'><a href='#n249'>249</a></p>
<p id='n250' class='stm mis'><a href='#n250'>250</a></p>
<p id='n251' class='pln'><a href='#n251'>251</a></p>
<p id='n252' class='pln'><a href='#n252'>252</a></p>
<p id='n253' class='stm run hide_run'><a href='#n253'>253</a></p>
<p id='n254' class='stm run hide_run'><a href='#n254'>254</a></p>
<p id='n255' class='stm run hide_run'><a href='#n255'>255</a></p>
<p id='n256' class='stm run hide_run'><a href='#n256'>256</a></p>
<p id='n257' class='pln'><a href='#n257'>257</a></p>
<p id='n258' class='stm run hide_run'><a href='#n258'>258</a></p>
<p id='n259' class='stm run hide_run'><a href='#n259'>259</a></p>
<p id='n260' class='stm run hide_run'><a href='#n260'>260</a></p>
<p id='n261' class='pln'><a href='#n261'>261</a></p>
<p id='n262' class='stm run hide_run'><a href='#n262'>262</a></p>
<p id='n263' class='stm run hide_run'><a href='#n263'>263</a></p>
<p id='n264' class='pln'><a href='#n264'>264</a></p>
<p id='n265' class='stm run hide_run'><a href='#n265'>265</a></p>
<p id='n266' class='stm run hide_run'><a href='#n266'>266</a></p>
<p id='n267' class='stm run hide_run'><a href='#n267'>267</a></p>
<p id='n268' class='stm run hide_run'><a href='#n268'>268</a></p>
<p id='n269' class='stm run hide_run'><a href='#n269'>269</a></p>
<p id='n270' class='stm run hide_run'><a href='#n270'>270</a></p>
<p id='n271' class='stm run hide_run'><a href='#n271'>271</a></p>
<p id='n272' class='pln'><a href='#n272'>272</a></p>
<p id='n273' class='stm run hide_run'><a href='#n273'>273</a></p>
<p id='n274' class='stm run hide_run'><a href='#n274'>274</a></p>
<p id='n275' class='stm run hide_run'><a href='#n275'>275</a></p>
<p id='n276' class='stm run hide_run'><a href='#n276'>276</a></p>
<p id='n277' class='stm mis'><a href='#n277'>277</a></p>
<p id='n278' class='pln'><a href='#n278'>278</a></p>
<p id='n279' class='pln'><a href='#n279'>279</a></p>
<p id='n280' class='stm run hide_run'><a href='#n280'>280</a></p>
<p id='n281' class='pln'><a href='#n281'>281</a></p>
<p id='n282' class='pln'><a href='#n282'>282</a></p>
<p id='n283' class='pln'><a href='#n283'>283</a></p>
<p id='n284' class='pln'><a href='#n284'>284</a></p>
<p id='n285' class='stm run hide_run'><a href='#n285'>285</a></p>
<p id='n286' class='stm run hide_run'><a href='#n286'>286</a></p>
<p id='n287' class='stm run hide_run'><a href='#n287'>287</a></p>
<p id='n288' class='stm run hide_run'><a href='#n288'>288</a></p>
<p id='n289' class='pln'><a href='#n289'>289</a></p>
<p id='n290' class='stm run hide_run'><a href='#n290'>290</a></p>
<p id='n291' class='stm run hide_run'><a href='#n291'>291</a></p>
<p id='n292' class='stm run hide_run'><a href='#n292'>292</a></p>
<p id='n293' class='stm run hide_run'><a href='#n293'>293</a></p>
<p id='n294' class='stm mis'><a href='#n294'>294</a></p>
<p id='n295' class='stm mis'><a href='#n295'>295</a></p>
</td>
<td class='text' valign='top'>
<p id='t1' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t2' class='pln'><span class='str'>Parsers are used to parse the content of incoming HTTP requests.</span><span class='strut'>&nbsp;</span></p>
<p id='t3' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t4' class='pln'><span class='str'>They give us a generic way of being able to handle various media types</span><span class='strut'>&nbsp;</span></p>
<p id='t5' class='pln'><span class='str'>on the request, such as form content or json encoded data.</span><span class='strut'>&nbsp;</span></p>
<p id='t6' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t7' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>__future__</span> <span class='key'>import</span> <span class='nam'>unicode_literals</span><span class='strut'>&nbsp;</span></p>
<p id='t8' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>django</span><span class='op'>.</span><span class='nam'>conf</span> <span class='key'>import</span> <span class='nam'>settings</span><span class='strut'>&nbsp;</span></p>
<p id='t9' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>django</span><span class='op'>.</span><span class='nam'>core</span><span class='op'>.</span><span class='nam'>files</span><span class='op'>.</span><span class='nam'>uploadhandler</span> <span class='key'>import</span> <span class='nam'>StopFutureHandlers</span><span class='strut'>&nbsp;</span></p>
<p id='t10' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>django</span><span class='op'>.</span><span class='nam'>http</span> <span class='key'>import</span> <span class='nam'>QueryDict</span><span class='strut'>&nbsp;</span></p>
<p id='t11' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>django</span><span class='op'>.</span><span class='nam'>http</span><span class='op'>.</span><span class='nam'>multipartparser</span> <span class='key'>import</span> <span class='nam'>MultiPartParser</span> <span class='key'>as</span> <span class='nam'>DjangoMultiPartParser</span><span class='strut'>&nbsp;</span></p>
<p id='t12' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>django</span><span class='op'>.</span><span class='nam'>http</span><span class='op'>.</span><span class='nam'>multipartparser</span> <span class='key'>import</span> <span class='nam'>MultiPartParserError</span><span class='op'>,</span> <span class='nam'>parse_header</span><span class='op'>,</span> <span class='nam'>ChunkIter</span><span class='strut'>&nbsp;</span></p>
<p id='t13' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>compat</span> <span class='key'>import</span> <span class='nam'>yaml</span><span class='op'>,</span> <span class='nam'>etree</span><span class='strut'>&nbsp;</span></p>
<p id='t14' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>exceptions</span> <span class='key'>import</span> <span class='nam'>ParseError</span><span class='strut'>&nbsp;</span></p>
<p id='t15' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>compat</span> <span class='key'>import</span> <span class='nam'>six</span><span class='strut'>&nbsp;</span></p>
<p id='t16' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>json</span><span class='strut'>&nbsp;</span></p>
<p id='t17' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>datetime</span><span class='strut'>&nbsp;</span></p>
<p id='t18' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>decimal</span><span class='strut'>&nbsp;</span></p>
<p id='t19' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t20' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t21' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>DataAndFiles</span><span class='op'>(</span><span class='nam'>object</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t22' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>data</span><span class='op'>,</span> <span class='nam'>files</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t23' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>data</span> <span class='op'>=</span> <span class='nam'>data</span><span class='strut'>&nbsp;</span></p>
<p id='t24' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>files</span> <span class='op'>=</span> <span class='nam'>files</span><span class='strut'>&nbsp;</span></p>
<p id='t25' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t26' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t27' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>BaseParser</span><span class='op'>(</span><span class='nam'>object</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t28' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t29' class='pln'><span class='str'>&nbsp; &nbsp; All parsers should extend `BaseParser`, specifying a `media_type`</span><span class='strut'>&nbsp;</span></p>
<p id='t30' class='pln'><span class='str'>&nbsp; &nbsp; attribute, and overriding the `.parse()` method.</span><span class='strut'>&nbsp;</span></p>
<p id='t31' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t32' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t33' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>media_type</span> <span class='op'>=</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
<p id='t34' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t35' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>parse</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>stream</span><span class='op'>,</span> <span class='nam'>media_type</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>parser_context</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t36' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t37' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Given a stream to read from, return the parsed representation.</span><span class='strut'>&nbsp;</span></p>
<p id='t38' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Should return parsed data, or a `DataAndFiles` object consisting of the</span><span class='strut'>&nbsp;</span></p>
<p id='t39' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; parsed data and files.</span><span class='strut'>&nbsp;</span></p>
<p id='t40' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t41' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>NotImplementedError</span><span class='op'>(</span><span class='str'>&quot;.parse() must be overridden.&quot;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t42' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t43' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t44' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>JSONParser</span><span class='op'>(</span><span class='nam'>BaseParser</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t45' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t46' class='pln'><span class='str'>&nbsp; &nbsp; Parses JSON-serialized data.</span><span class='strut'>&nbsp;</span></p>
<p id='t47' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t48' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t49' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>media_type</span> <span class='op'>=</span> <span class='str'>&#39;application/json&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t50' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t51' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>parse</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>stream</span><span class='op'>,</span> <span class='nam'>media_type</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>parser_context</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t52' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t53' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Returns a 2-tuple of `(data, files)`.</span><span class='strut'>&nbsp;</span></p>
<p id='t54' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t55' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; `data` will be an object which is the parsed content of the response.</span><span class='strut'>&nbsp;</span></p>
<p id='t56' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; `files` will always be `None`.</span><span class='strut'>&nbsp;</span></p>
<p id='t57' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t58' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>parser_context</span> <span class='op'>=</span> <span class='nam'>parser_context</span> <span class='key'>or</span> <span class='op'>{</span><span class='op'>}</span><span class='strut'>&nbsp;</span></p>
<p id='t59' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>encoding</span> <span class='op'>=</span> <span class='nam'>parser_context</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;encoding&#39;</span><span class='op'>,</span> <span class='nam'>settings</span><span class='op'>.</span><span class='nam'>DEFAULT_CHARSET</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t60' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t61' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t62' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>data</span> <span class='op'>=</span> <span class='nam'>stream</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='nam'>encoding</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t63' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>json</span><span class='op'>.</span><span class='nam'>loads</span><span class='op'>(</span><span class='nam'>data</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t64' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='nam'>ValueError</span> <span class='key'>as</span> <span class='nam'>exc</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t65' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>ParseError</span><span class='op'>(</span><span class='str'>&#39;JSON parse error - %s&#39;</span> <span class='op'>%</span> <span class='nam'>six</span><span class='op'>.</span><span class='nam'>text_type</span><span class='op'>(</span><span class='nam'>exc</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t66' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t67' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t68' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>YAMLParser</span><span class='op'>(</span><span class='nam'>BaseParser</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t69' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t70' class='pln'><span class='str'>&nbsp; &nbsp; Parses YAML-serialized data.</span><span class='strut'>&nbsp;</span></p>
<p id='t71' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t72' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t73' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>media_type</span> <span class='op'>=</span> <span class='str'>&#39;application/yaml&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t74' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t75' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>parse</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>stream</span><span class='op'>,</span> <span class='nam'>media_type</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>parser_context</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t76' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t77' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Returns a 2-tuple of `(data, files)`.</span><span class='strut'>&nbsp;</span></p>
<p id='t78' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t79' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; `data` will be an object which is the parsed content of the response.</span><span class='strut'>&nbsp;</span></p>
<p id='t80' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; `files` will always be `None`.</span><span class='strut'>&nbsp;</span></p>
<p id='t81' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t82' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>assert</span> <span class='nam'>yaml</span><span class='op'>,</span> <span class='str'>&#39;YAMLParser requires pyyaml to be installed&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t83' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t84' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>parser_context</span> <span class='op'>=</span> <span class='nam'>parser_context</span> <span class='key'>or</span> <span class='op'>{</span><span class='op'>}</span><span class='strut'>&nbsp;</span></p>
<p id='t85' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>encoding</span> <span class='op'>=</span> <span class='nam'>parser_context</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;encoding&#39;</span><span class='op'>,</span> <span class='nam'>settings</span><span class='op'>.</span><span class='nam'>DEFAULT_CHARSET</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t86' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t87' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t88' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>data</span> <span class='op'>=</span> <span class='nam'>stream</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='nam'>encoding</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t89' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>yaml</span><span class='op'>.</span><span class='nam'>safe_load</span><span class='op'>(</span><span class='nam'>data</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t90' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>ValueError</span><span class='op'>,</span> <span class='nam'>yaml</span><span class='op'>.</span><span class='nam'>parser</span><span class='op'>.</span><span class='nam'>ParserError</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>exc</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t91' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>ParseError</span><span class='op'>(</span><span class='str'>&#39;YAML parse error - %s&#39;</span> <span class='op'>%</span> <span class='nam'>six</span><span class='op'>.</span><span class='nam'>u</span><span class='op'>(</span><span class='nam'>exc</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t92' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t93' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t94' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>FormParser</span><span class='op'>(</span><span class='nam'>BaseParser</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t95' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t96' class='pln'><span class='str'>&nbsp; &nbsp; Parser for form data.</span><span class='strut'>&nbsp;</span></p>
<p id='t97' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t98' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t99' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>media_type</span> <span class='op'>=</span> <span class='str'>&#39;application/x-www-form-urlencoded&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t100' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t101' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>parse</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>stream</span><span class='op'>,</span> <span class='nam'>media_type</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>parser_context</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t102' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t103' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Returns a 2-tuple of `(data, files)`.</span><span class='strut'>&nbsp;</span></p>
<p id='t104' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t105' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; `data` will be a :class:`QueryDict` containing all the form parameters.</span><span class='strut'>&nbsp;</span></p>
<p id='t106' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; `files` will always be :const:`None`.</span><span class='strut'>&nbsp;</span></p>
<p id='t107' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t108' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>parser_context</span> <span class='op'>=</span> <span class='nam'>parser_context</span> <span class='key'>or</span> <span class='op'>{</span><span class='op'>}</span><span class='strut'>&nbsp;</span></p>
<p id='t109' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>encoding</span> <span class='op'>=</span> <span class='nam'>parser_context</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;encoding&#39;</span><span class='op'>,</span> <span class='nam'>settings</span><span class='op'>.</span><span class='nam'>DEFAULT_CHARSET</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t110' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>data</span> <span class='op'>=</span> <span class='nam'>QueryDict</span><span class='op'>(</span><span class='nam'>stream</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>encoding</span><span class='op'>=</span><span class='nam'>encoding</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t111' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>data</span><span class='strut'>&nbsp;</span></p>
<p id='t112' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t113' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t114' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>MultiPartParser</span><span class='op'>(</span><span class='nam'>BaseParser</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t115' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t116' class='pln'><span class='str'>&nbsp; &nbsp; Parser for multipart form data, which may include file data.</span><span class='strut'>&nbsp;</span></p>
<p id='t117' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t118' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t119' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>media_type</span> <span class='op'>=</span> <span class='str'>&#39;multipart/form-data&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t120' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t121' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>parse</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>stream</span><span class='op'>,</span> <span class='nam'>media_type</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>parser_context</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t122' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t123' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Returns a DataAndFiles object.</span><span class='strut'>&nbsp;</span></p>
<p id='t124' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t125' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; `.data` will be a `QueryDict` containing all the form parameters.</span><span class='strut'>&nbsp;</span></p>
<p id='t126' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; `.files` will be a `QueryDict` containing all the form files.</span><span class='strut'>&nbsp;</span></p>
<p id='t127' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t128' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>parser_context</span> <span class='op'>=</span> <span class='nam'>parser_context</span> <span class='key'>or</span> <span class='op'>{</span><span class='op'>}</span><span class='strut'>&nbsp;</span></p>
<p id='t129' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>parser_context</span><span class='op'>[</span><span class='str'>&#39;request&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t130' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>encoding</span> <span class='op'>=</span> <span class='nam'>parser_context</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;encoding&#39;</span><span class='op'>,</span> <span class='nam'>settings</span><span class='op'>.</span><span class='nam'>DEFAULT_CHARSET</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t131' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>meta</span> <span class='op'>=</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>META</span><span class='strut'>&nbsp;</span></p>
<p id='t132' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>upload_handlers</span> <span class='op'>=</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>upload_handlers</span><span class='strut'>&nbsp;</span></p>
<p id='t133' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t134' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t135' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>parser</span> <span class='op'>=</span> <span class='nam'>DjangoMultiPartParser</span><span class='op'>(</span><span class='nam'>meta</span><span class='op'>,</span> <span class='nam'>stream</span><span class='op'>,</span> <span class='nam'>upload_handlers</span><span class='op'>,</span> <span class='nam'>encoding</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t136' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>data</span><span class='op'>,</span> <span class='nam'>files</span> <span class='op'>=</span> <span class='nam'>parser</span><span class='op'>.</span><span class='nam'>parse</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t137' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>DataAndFiles</span><span class='op'>(</span><span class='nam'>data</span><span class='op'>,</span> <span class='nam'>files</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t138' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='nam'>MultiPartParserError</span> <span class='key'>as</span> <span class='nam'>exc</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t139' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>ParseError</span><span class='op'>(</span><span class='str'>&#39;Multipart form parse error - %s&#39;</span> <span class='op'>%</span> <span class='nam'>six</span><span class='op'>.</span><span class='nam'>u</span><span class='op'>(</span><span class='nam'>exc</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t140' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t141' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t142' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>XMLParser</span><span class='op'>(</span><span class='nam'>BaseParser</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t143' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t144' class='pln'><span class='str'>&nbsp; &nbsp; XML parser.</span><span class='strut'>&nbsp;</span></p>
<p id='t145' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t146' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t147' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>media_type</span> <span class='op'>=</span> <span class='str'>&#39;application/xml&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t148' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t149' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>parse</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>stream</span><span class='op'>,</span> <span class='nam'>media_type</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>parser_context</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t150' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>assert</span> <span class='nam'>etree</span><span class='op'>,</span> <span class='str'>&#39;XMLParser requires defusedxml to be installed&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t151' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t152' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>parser_context</span> <span class='op'>=</span> <span class='nam'>parser_context</span> <span class='key'>or</span> <span class='op'>{</span><span class='op'>}</span><span class='strut'>&nbsp;</span></p>
<p id='t153' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>encoding</span> <span class='op'>=</span> <span class='nam'>parser_context</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;encoding&#39;</span><span class='op'>,</span> <span class='nam'>settings</span><span class='op'>.</span><span class='nam'>DEFAULT_CHARSET</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t154' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>parser</span> <span class='op'>=</span> <span class='nam'>etree</span><span class='op'>.</span><span class='nam'>DefusedXMLParser</span><span class='op'>(</span><span class='nam'>encoding</span><span class='op'>=</span><span class='nam'>encoding</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t155' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t156' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>tree</span> <span class='op'>=</span> <span class='nam'>etree</span><span class='op'>.</span><span class='nam'>parse</span><span class='op'>(</span><span class='nam'>stream</span><span class='op'>,</span> <span class='nam'>parser</span><span class='op'>=</span><span class='nam'>parser</span><span class='op'>,</span> <span class='nam'>forbid_dtd</span><span class='op'>=</span><span class='nam'>True</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t157' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>etree</span><span class='op'>.</span><span class='nam'>ParseError</span><span class='op'>,</span> <span class='nam'>ValueError</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>exc</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t158' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>ParseError</span><span class='op'>(</span><span class='str'>&#39;XML parse error - %s&#39;</span> <span class='op'>%</span> <span class='nam'>six</span><span class='op'>.</span><span class='nam'>u</span><span class='op'>(</span><span class='nam'>exc</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t159' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>data</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_xml_convert</span><span class='op'>(</span><span class='nam'>tree</span><span class='op'>.</span><span class='nam'>getroot</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t160' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t161' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>data</span><span class='strut'>&nbsp;</span></p>
<p id='t162' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t163' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_xml_convert</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>element</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t164' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t165' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; convert the xml `element` into the corresponding python object</span><span class='strut'>&nbsp;</span></p>
<p id='t166' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t167' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t168' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>children</span> <span class='op'>=</span> <span class='nam'>list</span><span class='op'>(</span><span class='nam'>element</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t169' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t170' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>children</span><span class='op'>)</span> <span class='op'>==</span> <span class='num'>0</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t171' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_type_convert</span><span class='op'>(</span><span class='nam'>element</span><span class='op'>.</span><span class='nam'>text</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t172' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t173' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># if the fist child tag is list-item means all children are list-item</span><span class='strut'>&nbsp;</span></p>
<p id='t174' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>children</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>tag</span> <span class='op'>==</span> <span class='str'>&quot;list-item&quot;</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t175' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>data</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t176' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>child</span> <span class='key'>in</span> <span class='nam'>children</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t177' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>data</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_xml_convert</span><span class='op'>(</span><span class='nam'>child</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t178' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t179' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>data</span> <span class='op'>=</span> <span class='op'>{</span><span class='op'>}</span><span class='strut'>&nbsp;</span></p>
<p id='t180' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>child</span> <span class='key'>in</span> <span class='nam'>children</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t181' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>data</span><span class='op'>[</span><span class='nam'>child</span><span class='op'>.</span><span class='nam'>tag</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_xml_convert</span><span class='op'>(</span><span class='nam'>child</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t182' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t183' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>data</span><span class='strut'>&nbsp;</span></p>
<p id='t184' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t185' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_type_convert</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>value</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t186' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t187' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Converts the value returned by the XMl parse into the equivalent</span><span class='strut'>&nbsp;</span></p>
<p id='t188' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Python type</span><span class='strut'>&nbsp;</span></p>
<p id='t189' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t190' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>value</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t191' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>value</span><span class='strut'>&nbsp;</span></p>
<p id='t192' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t193' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t194' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>datetime</span><span class='op'>.</span><span class='nam'>datetime</span><span class='op'>.</span><span class='nam'>strptime</span><span class='op'>(</span><span class='nam'>value</span><span class='op'>,</span> <span class='str'>&#39;%Y-%m-%d %H:%M:%S&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t195' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='nam'>ValueError</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t196' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>pass</span><span class='strut'>&nbsp;</span></p>
<p id='t197' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t198' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t199' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>int</span><span class='op'>(</span><span class='nam'>value</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t200' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='nam'>ValueError</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t201' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>pass</span><span class='strut'>&nbsp;</span></p>
<p id='t202' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t203' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t204' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>decimal</span><span class='op'>.</span><span class='nam'>Decimal</span><span class='op'>(</span><span class='nam'>value</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t205' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='nam'>decimal</span><span class='op'>.</span><span class='nam'>InvalidOperation</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t206' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>pass</span><span class='strut'>&nbsp;</span></p>
<p id='t207' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t208' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>value</span><span class='strut'>&nbsp;</span></p>
<p id='t209' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t210' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t211' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>FileUploadParser</span><span class='op'>(</span><span class='nam'>BaseParser</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t212' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t213' class='pln'><span class='str'>&nbsp; &nbsp; Parser for file upload data.</span><span class='strut'>&nbsp;</span></p>
<p id='t214' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t215' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>media_type</span> <span class='op'>=</span> <span class='str'>&#39;*/*&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t216' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t217' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>parse</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>stream</span><span class='op'>,</span> <span class='nam'>media_type</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>parser_context</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t218' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t219' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Returns a DataAndFiles object.</span><span class='strut'>&nbsp;</span></p>
<p id='t220' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t221' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; `.data` will be None (we expect request body to be a file content).</span><span class='strut'>&nbsp;</span></p>
<p id='t222' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; `.files` will be a `QueryDict` containing one &#39;file&#39; element.</span><span class='strut'>&nbsp;</span></p>
<p id='t223' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t224' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t225' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>parser_context</span> <span class='op'>=</span> <span class='nam'>parser_context</span> <span class='key'>or</span> <span class='op'>{</span><span class='op'>}</span><span class='strut'>&nbsp;</span></p>
<p id='t226' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>parser_context</span><span class='op'>[</span><span class='str'>&#39;request&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t227' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>encoding</span> <span class='op'>=</span> <span class='nam'>parser_context</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;encoding&#39;</span><span class='op'>,</span> <span class='nam'>settings</span><span class='op'>.</span><span class='nam'>DEFAULT_CHARSET</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t228' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>meta</span> <span class='op'>=</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>META</span><span class='strut'>&nbsp;</span></p>
<p id='t229' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>upload_handlers</span> <span class='op'>=</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>upload_handlers</span><span class='strut'>&nbsp;</span></p>
<p id='t230' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>filename</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_filename</span><span class='op'>(</span><span class='nam'>stream</span><span class='op'>,</span> <span class='nam'>media_type</span><span class='op'>,</span> <span class='nam'>parser_context</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t231' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t232' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Note that this code is extracted from Django&#39;s handling of</span><span class='strut'>&nbsp;</span></p>
<p id='t233' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># file uploads in MultiPartParser.</span><span class='strut'>&nbsp;</span></p>
<p id='t234' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>content_type</span> <span class='op'>=</span> <span class='nam'>meta</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;HTTP_CONTENT_TYPE&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t235' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>meta</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;CONTENT_TYPE&#39;</span><span class='op'>,</span> <span class='str'>&#39;&#39;</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t236' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t237' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>content_length</span> <span class='op'>=</span> <span class='nam'>int</span><span class='op'>(</span><span class='nam'>meta</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;HTTP_CONTENT_LENGTH&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t238' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>meta</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;CONTENT_LENGTH&#39;</span><span class='op'>,</span> <span class='num'>0</span><span class='op'>)</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t239' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>ValueError</span><span class='op'>,</span> <span class='nam'>TypeError</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t240' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>content_length</span> <span class='op'>=</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
<p id='t241' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t242' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># See if the handler will want to take care of the parsing.</span><span class='strut'>&nbsp;</span></p>
<p id='t243' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>handler</span> <span class='key'>in</span> <span class='nam'>upload_handlers</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t244' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>result</span> <span class='op'>=</span> <span class='nam'>handler</span><span class='op'>.</span><span class='nam'>handle_raw_input</span><span class='op'>(</span><span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t245' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>meta</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t246' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>content_length</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t247' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t248' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>encoding</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t249' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>result</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t250' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>DataAndFiles</span><span class='op'>(</span><span class='nam'>None</span><span class='op'>,</span> <span class='op'>{</span><span class='str'>&#39;file&#39;</span><span class='op'>:</span> <span class='nam'>result</span><span class='op'>[</span><span class='num'>1</span><span class='op'>]</span><span class='op'>}</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t251' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t252' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># This is the standard case.</span><span class='strut'>&nbsp;</span></p>
<p id='t253' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>possible_sizes</span> <span class='op'>=</span> <span class='op'>[</span><span class='nam'>x</span><span class='op'>.</span><span class='nam'>chunk_size</span> <span class='key'>for</span> <span class='nam'>x</span> <span class='key'>in</span> <span class='nam'>upload_handlers</span> <span class='key'>if</span> <span class='nam'>x</span><span class='op'>.</span><span class='nam'>chunk_size</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t254' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>chunk_size</span> <span class='op'>=</span> <span class='nam'>min</span><span class='op'>(</span><span class='op'>[</span><span class='num'>2</span> <span class='op'>**</span> <span class='num'>31</span> <span class='op'>-</span> <span class='num'>4</span><span class='op'>]</span> <span class='op'>+</span> <span class='nam'>possible_sizes</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t255' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>chunks</span> <span class='op'>=</span> <span class='nam'>ChunkIter</span><span class='op'>(</span><span class='nam'>stream</span><span class='op'>,</span> <span class='nam'>chunk_size</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t256' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>counters</span> <span class='op'>=</span> <span class='op'>[</span><span class='num'>0</span><span class='op'>]</span> <span class='op'>*</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>upload_handlers</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t257' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t258' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>handler</span> <span class='key'>in</span> <span class='nam'>upload_handlers</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t259' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t260' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>handler</span><span class='op'>.</span><span class='nam'>new_file</span><span class='op'>(</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>filename</span><span class='op'>,</span> <span class='nam'>content_type</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t261' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <span class='nam'>content_length</span><span class='op'>,</span> <span class='nam'>encoding</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t262' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='nam'>StopFutureHandlers</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t263' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>break</span><span class='strut'>&nbsp;</span></p>
<p id='t264' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t265' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>chunk</span> <span class='key'>in</span> <span class='nam'>chunks</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t266' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>i</span><span class='op'>,</span> <span class='nam'>handler</span> <span class='key'>in</span> <span class='nam'>enumerate</span><span class='op'>(</span><span class='nam'>upload_handlers</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t267' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>chunk_length</span> <span class='op'>=</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>chunk</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t268' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>chunk</span> <span class='op'>=</span> <span class='nam'>handler</span><span class='op'>.</span><span class='nam'>receive_data_chunk</span><span class='op'>(</span><span class='nam'>chunk</span><span class='op'>,</span> <span class='nam'>counters</span><span class='op'>[</span><span class='nam'>i</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t269' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>counters</span><span class='op'>[</span><span class='nam'>i</span><span class='op'>]</span> <span class='op'>+=</span> <span class='nam'>chunk_length</span><span class='strut'>&nbsp;</span></p>
<p id='t270' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>chunk</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t271' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>break</span><span class='strut'>&nbsp;</span></p>
<p id='t272' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t273' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>i</span><span class='op'>,</span> <span class='nam'>handler</span> <span class='key'>in</span> <span class='nam'>enumerate</span><span class='op'>(</span><span class='nam'>upload_handlers</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t274' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>file_obj</span> <span class='op'>=</span> <span class='nam'>handler</span><span class='op'>.</span><span class='nam'>file_complete</span><span class='op'>(</span><span class='nam'>counters</span><span class='op'>[</span><span class='nam'>i</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t275' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>file_obj</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t276' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>DataAndFiles</span><span class='op'>(</span><span class='nam'>None</span><span class='op'>,</span> <span class='op'>{</span><span class='str'>&#39;file&#39;</span><span class='op'>:</span> <span class='nam'>file_obj</span><span class='op'>}</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t277' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>ParseError</span><span class='op'>(</span><span class='str'>&quot;FileUpload parse error - &quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t278' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <span class='str'>&quot;none of upload handlers can handle the stream&quot;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t279' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t280' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>get_filename</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>stream</span><span class='op'>,</span> <span class='nam'>media_type</span><span class='op'>,</span> <span class='nam'>parser_context</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t281' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t282' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Detects the uploaded file name. First searches a &#39;filename&#39; url kwarg.</span><span class='strut'>&nbsp;</span></p>
<p id='t283' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Then tries to parse Content-Disposition header.</span><span class='strut'>&nbsp;</span></p>
<p id='t284' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t285' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t286' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>parser_context</span><span class='op'>[</span><span class='str'>&#39;kwargs&#39;</span><span class='op'>]</span><span class='op'>[</span><span class='str'>&#39;filename&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t287' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='nam'>KeyError</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t288' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>pass</span><span class='strut'>&nbsp;</span></p>
<p id='t289' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t290' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t291' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>meta</span> <span class='op'>=</span> <span class='nam'>parser_context</span><span class='op'>[</span><span class='str'>&#39;request&#39;</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>META</span><span class='strut'>&nbsp;</span></p>
<p id='t292' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>disposition</span> <span class='op'>=</span> <span class='nam'>parse_header</span><span class='op'>(</span><span class='nam'>meta</span><span class='op'>[</span><span class='str'>&#39;HTTP_CONTENT_DISPOSITION&#39;</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t293' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>disposition</span><span class='op'>[</span><span class='num'>1</span><span class='op'>]</span><span class='op'>[</span><span class='str'>&#39;filename&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t294' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>AttributeError</span><span class='op'>,</span> <span class='nam'>KeyError</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t295' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>pass</span><span class='strut'>&nbsp;</span></p>
</td>
</tr>
</table>
</div>
<div id='footer'>
<div class='content'>
<p>
<a class='nav' href='index.html'>&#xab; index</a> &nbsp; &nbsp; <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.5.1</a>
</p>
</div>
</div>
</body>
</html>

View File

@ -1,429 +0,0 @@
<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
<title>Coverage for rest_framework/permissions: 81%</title>
<link rel='stylesheet' href='style.css' type='text/css'>
<script type='text/javascript' src='jquery-1.4.3.min.js'></script>
<script type='text/javascript' src='jquery.hotkeys.js'></script>
<script type='text/javascript' src='jquery.isonscreen.js'></script>
<script type='text/javascript' src='coverage_html.js'></script>
<script type='text/javascript' charset='utf-8'>
jQuery(document).ready(coverage.pyfile_ready);
</script>
</head>
<body id='pyfile'>
<div id='header'>
<div class='content'>
<h1>Coverage for <b>rest_framework/permissions</b> :
<span class='pc_cov'>81%</span>
</h1>
<img id='keyboard_icon' src='keybd_closed.png'>
<h2 class='stats'>
63 statements
<span class='run hide_run shortkey_r' onclick='coverage.toggle_lines(this, "run")'>51 run</span>
<span class='mis shortkey_m' onclick='coverage.toggle_lines(this, "mis")'>12 missing</span>
<span class='exc shortkey_x' onclick='coverage.toggle_lines(this, "exc")'>0 excluded</span>
</h2>
</div>
</div>
<div class='help_panel'>
<img id='panel_icon' src='keybd_open.png'>
<p class='legend'>Hot-keys on this page</p>
<div>
<p class='keyhelp'>
<span class='key'>r</span>
<span class='key'>m</span>
<span class='key'>x</span>
<span class='key'>p</span> &nbsp; toggle line displays
</p>
<p class='keyhelp'>
<span class='key'>j</span>
<span class='key'>k</span> &nbsp; next/prev highlighted chunk
</p>
<p class='keyhelp'>
<span class='key'>0</span> &nbsp; (zero) top of page
</p>
<p class='keyhelp'>
<span class='key'>1</span> &nbsp; (one) first highlighted chunk
</p>
</div>
</div>
<div id='source'>
<table cellspacing='0' cellpadding='0'>
<tr>
<td class='linenos' valign='top'>
<p id='n1' class='pln'><a href='#n1'>1</a></p>
<p id='n2' class='pln'><a href='#n2'>2</a></p>
<p id='n3' class='pln'><a href='#n3'>3</a></p>
<p id='n4' class='stm run hide_run'><a href='#n4'>4</a></p>
<p id='n5' class='stm run hide_run'><a href='#n5'>5</a></p>
<p id='n6' class='stm run hide_run'><a href='#n6'>6</a></p>
<p id='n7' class='pln'><a href='#n7'>7</a></p>
<p id='n8' class='stm run hide_run'><a href='#n8'>8</a></p>
<p id='n9' class='pln'><a href='#n9'>9</a></p>
<p id='n10' class='stm run hide_run'><a href='#n10'>10</a></p>
<p id='n11' class='pln'><a href='#n11'>11</a></p>
<p id='n12' class='pln'><a href='#n12'>12</a></p>
<p id='n13' class='stm run hide_run'><a href='#n13'>13</a></p>
<p id='n14' class='pln'><a href='#n14'>14</a></p>
<p id='n15' class='pln'><a href='#n15'>15</a></p>
<p id='n16' class='pln'><a href='#n16'>16</a></p>
<p id='n17' class='pln'><a href='#n17'>17</a></p>
<p id='n18' class='stm run hide_run'><a href='#n18'>18</a></p>
<p id='n19' class='pln'><a href='#n19'>19</a></p>
<p id='n20' class='pln'><a href='#n20'>20</a></p>
<p id='n21' class='pln'><a href='#n21'>21</a></p>
<p id='n22' class='stm run hide_run'><a href='#n22'>22</a></p>
<p id='n23' class='pln'><a href='#n23'>23</a></p>
<p id='n24' class='stm run hide_run'><a href='#n24'>24</a></p>
<p id='n25' class='pln'><a href='#n25'>25</a></p>
<p id='n26' class='pln'><a href='#n26'>26</a></p>
<p id='n27' class='pln'><a href='#n27'>27</a></p>
<p id='n28' class='stm run hide_run'><a href='#n28'>28</a></p>
<p id='n29' class='stm mis'><a href='#n29'>29</a></p>
<p id='n30' class='pln'><a href='#n30'>30</a></p>
<p id='n31' class='pln'><a href='#n31'>31</a></p>
<p id='n32' class='pln'><a href='#n32'>32</a></p>
<p id='n33' class='pln'><a href='#n33'>33</a></p>
<p id='n34' class='stm mis'><a href='#n34'>34</a></p>
<p id='n35' class='stm run hide_run'><a href='#n35'>35</a></p>
<p id='n36' class='pln'><a href='#n36'>36</a></p>
<p id='n37' class='pln'><a href='#n37'>37</a></p>
<p id='n38' class='stm run hide_run'><a href='#n38'>38</a></p>
<p id='n39' class='pln'><a href='#n39'>39</a></p>
<p id='n40' class='pln'><a href='#n40'>40</a></p>
<p id='n41' class='pln'><a href='#n41'>41</a></p>
<p id='n42' class='pln'><a href='#n42'>42</a></p>
<p id='n43' class='pln'><a href='#n43'>43</a></p>
<p id='n44' class='pln'><a href='#n44'>44</a></p>
<p id='n45' class='stm run hide_run'><a href='#n45'>45</a></p>
<p id='n46' class='stm run hide_run'><a href='#n46'>46</a></p>
<p id='n47' class='pln'><a href='#n47'>47</a></p>
<p id='n48' class='pln'><a href='#n48'>48</a></p>
<p id='n49' class='stm run hide_run'><a href='#n49'>49</a></p>
<p id='n50' class='pln'><a href='#n50'>50</a></p>
<p id='n51' class='pln'><a href='#n51'>51</a></p>
<p id='n52' class='pln'><a href='#n52'>52</a></p>
<p id='n53' class='pln'><a href='#n53'>53</a></p>
<p id='n54' class='stm run hide_run'><a href='#n54'>54</a></p>
<p id='n55' class='stm run hide_run'><a href='#n55'>55</a></p>
<p id='n56' class='stm run hide_run'><a href='#n56'>56</a></p>
<p id='n57' class='stm run hide_run'><a href='#n57'>57</a></p>
<p id='n58' class='pln'><a href='#n58'>58</a></p>
<p id='n59' class='pln'><a href='#n59'>59</a></p>
<p id='n60' class='stm run hide_run'><a href='#n60'>60</a></p>
<p id='n61' class='pln'><a href='#n61'>61</a></p>
<p id='n62' class='pln'><a href='#n62'>62</a></p>
<p id='n63' class='pln'><a href='#n63'>63</a></p>
<p id='n64' class='pln'><a href='#n64'>64</a></p>
<p id='n65' class='stm run hide_run'><a href='#n65'>65</a></p>
<p id='n66' class='stm mis'><a href='#n66'>66</a></p>
<p id='n67' class='stm mis'><a href='#n67'>67</a></p>
<p id='n68' class='stm mis'><a href='#n68'>68</a></p>
<p id='n69' class='pln'><a href='#n69'>69</a></p>
<p id='n70' class='pln'><a href='#n70'>70</a></p>
<p id='n71' class='stm run hide_run'><a href='#n71'>71</a></p>
<p id='n72' class='pln'><a href='#n72'>72</a></p>
<p id='n73' class='pln'><a href='#n73'>73</a></p>
<p id='n74' class='pln'><a href='#n74'>74</a></p>
<p id='n75' class='pln'><a href='#n75'>75</a></p>
<p id='n76' class='stm run hide_run'><a href='#n76'>76</a></p>
<p id='n77' class='stm mis'><a href='#n77'>77</a></p>
<p id='n78' class='pln'><a href='#n78'>78</a></p>
<p id='n79' class='pln'><a href='#n79'>79</a></p>
<p id='n80' class='stm mis'><a href='#n80'>80</a></p>
<p id='n81' class='stm mis'><a href='#n81'>81</a></p>
<p id='n82' class='pln'><a href='#n82'>82</a></p>
<p id='n83' class='pln'><a href='#n83'>83</a></p>
<p id='n84' class='stm run hide_run'><a href='#n84'>84</a></p>
<p id='n85' class='pln'><a href='#n85'>85</a></p>
<p id='n86' class='pln'><a href='#n86'>86</a></p>
<p id='n87' class='pln'><a href='#n87'>87</a></p>
<p id='n88' class='pln'><a href='#n88'>88</a></p>
<p id='n89' class='pln'><a href='#n89'>89</a></p>
<p id='n90' class='pln'><a href='#n90'>90</a></p>
<p id='n91' class='pln'><a href='#n91'>91</a></p>
<p id='n92' class='pln'><a href='#n92'>92</a></p>
<p id='n93' class='pln'><a href='#n93'>93</a></p>
<p id='n94' class='pln'><a href='#n94'>94</a></p>
<p id='n95' class='pln'><a href='#n95'>95</a></p>
<p id='n96' class='pln'><a href='#n96'>96</a></p>
<p id='n97' class='pln'><a href='#n97'>97</a></p>
<p id='n98' class='pln'><a href='#n98'>98</a></p>
<p id='n99' class='stm run hide_run'><a href='#n99'>99</a></p>
<p id='n100' class='pln'><a href='#n100'>100</a></p>
<p id='n101' class='pln'><a href='#n101'>101</a></p>
<p id='n102' class='pln'><a href='#n102'>102</a></p>
<p id='n103' class='pln'><a href='#n103'>103</a></p>
<p id='n104' class='pln'><a href='#n104'>104</a></p>
<p id='n105' class='pln'><a href='#n105'>105</a></p>
<p id='n106' class='pln'><a href='#n106'>106</a></p>
<p id='n107' class='pln'><a href='#n107'>107</a></p>
<p id='n108' class='pln'><a href='#n108'>108</a></p>
<p id='n109' class='stm run hide_run'><a href='#n109'>109</a></p>
<p id='n110' class='pln'><a href='#n110'>110</a></p>
<p id='n111' class='stm run hide_run'><a href='#n111'>111</a></p>
<p id='n112' class='pln'><a href='#n112'>112</a></p>
<p id='n113' class='pln'><a href='#n113'>113</a></p>
<p id='n114' class='pln'><a href='#n114'>114</a></p>
<p id='n115' class='pln'><a href='#n115'>115</a></p>
<p id='n116' class='stm run hide_run'><a href='#n116'>116</a></p>
<p id='n117' class='pln'><a href='#n117'>117</a></p>
<p id='n118' class='pln'><a href='#n118'>118</a></p>
<p id='n119' class='pln'><a href='#n119'>119</a></p>
<p id='n120' class='stm run hide_run'><a href='#n120'>120</a></p>
<p id='n121' class='pln'><a href='#n121'>121</a></p>
<p id='n122' class='stm run hide_run'><a href='#n122'>122</a></p>
<p id='n123' class='stm run hide_run'><a href='#n123'>123</a></p>
<p id='n124' class='stm run hide_run'><a href='#n124'>124</a></p>
<p id='n125' class='pln'><a href='#n125'>125</a></p>
<p id='n126' class='stm run hide_run'><a href='#n126'>126</a></p>
<p id='n127' class='stm mis'><a href='#n127'>127</a></p>
<p id='n128' class='pln'><a href='#n128'>128</a></p>
<p id='n129' class='pln'><a href='#n129'>129</a></p>
<p id='n130' class='pln'><a href='#n130'>130</a></p>
<p id='n131' class='stm run hide_run'><a href='#n131'>131</a></p>
<p id='n132' class='stm mis'><a href='#n132'>132</a></p>
<p id='n133' class='pln'><a href='#n133'>133</a></p>
<p id='n134' class='stm run hide_run'><a href='#n134'>134</a></p>
<p id='n135' class='pln'><a href='#n135'>135</a></p>
<p id='n136' class='pln'><a href='#n136'>136</a></p>
<p id='n137' class='stm run hide_run'><a href='#n137'>137</a></p>
<p id='n138' class='pln'><a href='#n138'>138</a></p>
<p id='n139' class='stm run hide_run'><a href='#n139'>139</a></p>
<p id='n140' class='pln'><a href='#n140'>140</a></p>
<p id='n141' class='pln'><a href='#n141'>141</a></p>
<p id='n142' class='stm run hide_run'><a href='#n142'>142</a></p>
<p id='n143' class='stm run hide_run'><a href='#n143'>143</a></p>
<p id='n144' class='pln'><a href='#n144'>144</a></p>
<p id='n145' class='pln'><a href='#n145'>145</a></p>
<p id='n146' class='stm run hide_run'><a href='#n146'>146</a></p>
<p id='n147' class='pln'><a href='#n147'>147</a></p>
<p id='n148' class='pln'><a href='#n148'>148</a></p>
<p id='n149' class='pln'><a href='#n149'>149</a></p>
<p id='n150' class='pln'><a href='#n150'>150</a></p>
<p id='n151' class='stm run hide_run'><a href='#n151'>151</a></p>
<p id='n152' class='pln'><a href='#n152'>152</a></p>
<p id='n153' class='pln'><a href='#n153'>153</a></p>
<p id='n154' class='stm run hide_run'><a href='#n154'>154</a></p>
<p id='n155' class='pln'><a href='#n155'>155</a></p>
<p id='n156' class='pln'><a href='#n156'>156</a></p>
<p id='n157' class='pln'><a href='#n157'>157</a></p>
<p id='n158' class='pln'><a href='#n158'>158</a></p>
<p id='n159' class='stm run hide_run'><a href='#n159'>159</a></p>
<p id='n160' class='stm run hide_run'><a href='#n160'>160</a></p>
<p id='n161' class='stm run hide_run'><a href='#n161'>161</a></p>
<p id='n162' class='pln'><a href='#n162'>162</a></p>
<p id='n163' class='stm run hide_run'><a href='#n163'>163</a></p>
<p id='n164' class='stm mis'><a href='#n164'>164</a></p>
<p id='n165' class='pln'><a href='#n165'>165</a></p>
<p id='n166' class='stm run hide_run'><a href='#n166'>166</a></p>
<p id='n167' class='stm run hide_run'><a href='#n167'>167</a></p>
<p id='n168' class='stm run hide_run'><a href='#n168'>168</a></p>
<p id='n169' class='stm run hide_run'><a href='#n169'>169</a></p>
<p id='n170' class='stm run hide_run'><a href='#n170'>170</a></p>
<p id='n171' class='pln'><a href='#n171'>171</a></p>
<p id='n172' class='stm mis'><a href='#n172'>172</a></p>
<p id='n173' class='pln'><a href='#n173'>173</a></p>
<p id='n174' class='pln'><a href='#n174'>174</a></p>
</td>
<td class='text' valign='top'>
<p id='t1' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t2' class='pln'><span class='str'>Provides a set of pluggable permission policies.</span><span class='strut'>&nbsp;</span></p>
<p id='t3' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t4' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>__future__</span> <span class='key'>import</span> <span class='nam'>unicode_literals</span><span class='strut'>&nbsp;</span></p>
<p id='t5' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>inspect</span><span class='strut'>&nbsp;</span></p>
<p id='t6' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>warnings</span><span class='strut'>&nbsp;</span></p>
<p id='t7' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t8' class='stm run hide_run'><span class='nam'>SAFE_METHODS</span> <span class='op'>=</span> <span class='op'>[</span><span class='str'>&#39;GET&#39;</span><span class='op'>,</span> <span class='str'>&#39;HEAD&#39;</span><span class='op'>,</span> <span class='str'>&#39;OPTIONS&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t9' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t10' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>compat</span> <span class='key'>import</span> <span class='nam'>oauth2_provider_scope</span><span class='op'>,</span> <span class='nam'>oauth2_constants</span><span class='strut'>&nbsp;</span></p>
<p id='t11' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t12' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t13' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>BasePermission</span><span class='op'>(</span><span class='nam'>object</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t14' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t15' class='pln'><span class='str'>&nbsp; &nbsp; A base class from which all permission classes should inherit.</span><span class='strut'>&nbsp;</span></p>
<p id='t16' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t17' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t18' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>has_permission</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='nam'>view</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t19' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t20' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Return `True` if permission is granted, `False` otherwise.</span><span class='strut'>&nbsp;</span></p>
<p id='t21' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t22' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>True</span><span class='strut'>&nbsp;</span></p>
<p id='t23' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t24' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>has_object_permission</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='nam'>view</span><span class='op'>,</span> <span class='nam'>obj</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t25' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t26' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Return `True` if permission is granted, `False` otherwise.</span><span class='strut'>&nbsp;</span></p>
<p id='t27' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t28' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>inspect</span><span class='op'>.</span><span class='nam'>getargspec</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>has_permission</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>args</span><span class='op'>)</span> <span class='op'>==</span> <span class='num'>4</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t29' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>warnings</span><span class='op'>.</span><span class='nam'>warn</span><span class='op'>(</span><span class='strut'>&nbsp;</span></p>
<p id='t30' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;The `obj` argument in `has_permission` is deprecated. &#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t31' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;Use `has_object_permission()` instead for object permissions.&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t32' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>DeprecationWarning</span><span class='op'>,</span> <span class='nam'>stacklevel</span><span class='op'>=</span><span class='num'>2</span><span class='strut'>&nbsp;</span></p>
<p id='t33' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t34' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>has_permission</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>,</span> <span class='nam'>view</span><span class='op'>,</span> <span class='nam'>obj</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t35' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>True</span><span class='strut'>&nbsp;</span></p>
<p id='t36' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t37' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t38' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>AllowAny</span><span class='op'>(</span><span class='nam'>BasePermission</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t39' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t40' class='pln'><span class='str'>&nbsp; &nbsp; Allow any access.</span><span class='strut'>&nbsp;</span></p>
<p id='t41' class='pln'><span class='str'>&nbsp; &nbsp; This isn&#39;t strictly required, since you could use an empty</span><span class='strut'>&nbsp;</span></p>
<p id='t42' class='pln'><span class='str'>&nbsp; &nbsp; permission_classes list, but it&#39;s useful because it makes the intention</span><span class='strut'>&nbsp;</span></p>
<p id='t43' class='pln'><span class='str'>&nbsp; &nbsp; more explicit.</span><span class='strut'>&nbsp;</span></p>
<p id='t44' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t45' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>has_permission</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='nam'>view</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t46' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>True</span><span class='strut'>&nbsp;</span></p>
<p id='t47' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t48' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t49' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>IsAuthenticated</span><span class='op'>(</span><span class='nam'>BasePermission</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t50' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t51' class='pln'><span class='str'>&nbsp; &nbsp; Allows access only to authenticated users.</span><span class='strut'>&nbsp;</span></p>
<p id='t52' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t53' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t54' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>has_permission</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='nam'>view</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t55' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>user</span> <span class='key'>and</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>user</span><span class='op'>.</span><span class='nam'>is_authenticated</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t56' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>True</span><span class='strut'>&nbsp;</span></p>
<p id='t57' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>False</span><span class='strut'>&nbsp;</span></p>
<p id='t58' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t59' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t60' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>IsAdminUser</span><span class='op'>(</span><span class='nam'>BasePermission</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t61' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t62' class='pln'><span class='str'>&nbsp; &nbsp; Allows access only to admin users.</span><span class='strut'>&nbsp;</span></p>
<p id='t63' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t64' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t65' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>has_permission</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='nam'>view</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t66' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>user</span> <span class='key'>and</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>user</span><span class='op'>.</span><span class='nam'>is_staff</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t67' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>True</span><span class='strut'>&nbsp;</span></p>
<p id='t68' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>False</span><span class='strut'>&nbsp;</span></p>
<p id='t69' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t70' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t71' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>IsAuthenticatedOrReadOnly</span><span class='op'>(</span><span class='nam'>BasePermission</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t72' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t73' class='pln'><span class='str'>&nbsp; &nbsp; The request is authenticated as a user, or is a read-only request.</span><span class='strut'>&nbsp;</span></p>
<p id='t74' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t75' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t76' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>has_permission</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='nam'>view</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t77' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='op'>(</span><span class='nam'>request</span><span class='op'>.</span><span class='nam'>method</span> <span class='key'>in</span> <span class='nam'>SAFE_METHODS</span> <span class='key'>or</span><span class='strut'>&nbsp;</span></p>
<p id='t78' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span><span class='op'>.</span><span class='nam'>user</span> <span class='key'>and</span><span class='strut'>&nbsp;</span></p>
<p id='t79' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span><span class='op'>.</span><span class='nam'>user</span><span class='op'>.</span><span class='nam'>is_authenticated</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t80' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>True</span><span class='strut'>&nbsp;</span></p>
<p id='t81' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>False</span><span class='strut'>&nbsp;</span></p>
<p id='t82' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t83' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t84' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>DjangoModelPermissions</span><span class='op'>(</span><span class='nam'>BasePermission</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t85' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t86' class='pln'><span class='str'>&nbsp; &nbsp; The request is authenticated using `django.contrib.auth` permissions.</span><span class='strut'>&nbsp;</span></p>
<p id='t87' class='pln'><span class='str'>&nbsp; &nbsp; See: https://docs.djangoproject.com/en/dev/topics/auth/#permissions</span><span class='strut'>&nbsp;</span></p>
<p id='t88' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t89' class='pln'><span class='str'>&nbsp; &nbsp; It ensures that the user is authenticated, and has the appropriate</span><span class='strut'>&nbsp;</span></p>
<p id='t90' class='pln'><span class='str'>&nbsp; &nbsp; `add`/`change`/`delete` permissions on the model.</span><span class='strut'>&nbsp;</span></p>
<p id='t91' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t92' class='pln'><span class='str'>&nbsp; &nbsp; This permission can only be applied against view classes that</span><span class='strut'>&nbsp;</span></p>
<p id='t93' class='pln'><span class='str'>&nbsp; &nbsp; provide a `.model` or `.queryset` attribute.</span><span class='strut'>&nbsp;</span></p>
<p id='t94' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t95' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t96' class='pln'>&nbsp; &nbsp; <span class='com'># Map methods into required permission codes.</span><span class='strut'>&nbsp;</span></p>
<p id='t97' class='pln'>&nbsp; &nbsp; <span class='com'># Override this if you need to also provide &#39;view&#39; permissions,</span><span class='strut'>&nbsp;</span></p>
<p id='t98' class='pln'>&nbsp; &nbsp; <span class='com'># or if you want to provide custom permission codes.</span><span class='strut'>&nbsp;</span></p>
<p id='t99' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>perms_map</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
<p id='t100' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;GET&#39;</span><span class='op'>:</span> <span class='op'>[</span><span class='op'>]</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t101' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;OPTIONS&#39;</span><span class='op'>:</span> <span class='op'>[</span><span class='op'>]</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t102' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;HEAD&#39;</span><span class='op'>:</span> <span class='op'>[</span><span class='op'>]</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t103' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;POST&#39;</span><span class='op'>:</span> <span class='op'>[</span><span class='str'>&#39;%(app_label)s.add_%(model_name)s&#39;</span><span class='op'>]</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t104' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;PUT&#39;</span><span class='op'>:</span> <span class='op'>[</span><span class='str'>&#39;%(app_label)s.change_%(model_name)s&#39;</span><span class='op'>]</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t105' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;PATCH&#39;</span><span class='op'>:</span> <span class='op'>[</span><span class='str'>&#39;%(app_label)s.change_%(model_name)s&#39;</span><span class='op'>]</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t106' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;DELETE&#39;</span><span class='op'>:</span> <span class='op'>[</span><span class='str'>&#39;%(app_label)s.delete_%(model_name)s&#39;</span><span class='op'>]</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t107' class='pln'>&nbsp; &nbsp; <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
<p id='t108' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t109' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>authenticated_users_only</span> <span class='op'>=</span> <span class='nam'>True</span><span class='strut'>&nbsp;</span></p>
<p id='t110' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t111' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>get_required_permissions</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>method</span><span class='op'>,</span> <span class='nam'>model_cls</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t112' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t113' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Given a model and an HTTP method, return the list of permission</span><span class='strut'>&nbsp;</span></p>
<p id='t114' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; codes that the user is required to have.</span><span class='strut'>&nbsp;</span></p>
<p id='t115' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t116' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>kwargs</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
<p id='t117' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;app_label&#39;</span><span class='op'>:</span> <span class='nam'>model_cls</span><span class='op'>.</span><span class='nam'>_meta</span><span class='op'>.</span><span class='nam'>app_label</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t118' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;model_name&#39;</span><span class='op'>:</span> <span class='nam'>model_cls</span><span class='op'>.</span><span class='nam'>_meta</span><span class='op'>.</span><span class='nam'>module_name</span><span class='strut'>&nbsp;</span></p>
<p id='t119' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
<p id='t120' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>[</span><span class='nam'>perm</span> <span class='op'>%</span> <span class='nam'>kwargs</span> <span class='key'>for</span> <span class='nam'>perm</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>perms_map</span><span class='op'>[</span><span class='nam'>method</span><span class='op'>]</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t121' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t122' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>has_permission</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='nam'>view</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t123' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>model_cls</span> <span class='op'>=</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>view</span><span class='op'>,</span> <span class='str'>&#39;model&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t124' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>queryset</span> <span class='op'>=</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>view</span><span class='op'>,</span> <span class='str'>&#39;queryset&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t125' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t126' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>model_cls</span> <span class='key'>is</span> <span class='nam'>None</span> <span class='key'>and</span> <span class='nam'>queryset</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t127' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>model_cls</span> <span class='op'>=</span> <span class='nam'>queryset</span><span class='op'>.</span><span class='nam'>model</span><span class='strut'>&nbsp;</span></p>
<p id='t128' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t129' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Workaround to ensure DjangoModelPermissions are not applied</span><span class='strut'>&nbsp;</span></p>
<p id='t130' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># to the root view when using DefaultRouter.</span><span class='strut'>&nbsp;</span></p>
<p id='t131' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>model_cls</span> <span class='key'>is</span> <span class='nam'>None</span> <span class='key'>and</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>view</span><span class='op'>,</span> <span class='str'>&#39;_ignore_model_permissions&#39;</span><span class='op'>,</span> <span class='nam'>False</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t132' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>True</span><span class='strut'>&nbsp;</span></p>
<p id='t133' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t134' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>assert</span> <span class='nam'>model_cls</span><span class='op'>,</span> <span class='op'>(</span><span class='str'>&#39;Cannot apply DjangoModelPermissions on a view that&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t135' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <span class='str'>&#39; does not have `.model` or `.queryset` property.&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t136' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t137' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>perms</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_required_permissions</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>.</span><span class='nam'>method</span><span class='op'>,</span> <span class='nam'>model_cls</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t138' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t139' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='op'>(</span><span class='nam'>request</span><span class='op'>.</span><span class='nam'>user</span> <span class='key'>and</span><span class='strut'>&nbsp;</span></p>
<p id='t140' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>(</span><span class='nam'>request</span><span class='op'>.</span><span class='nam'>user</span><span class='op'>.</span><span class='nam'>is_authenticated</span><span class='op'>(</span><span class='op'>)</span> <span class='key'>or</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>authenticated_users_only</span><span class='op'>)</span> <span class='key'>and</span><span class='strut'>&nbsp;</span></p>
<p id='t141' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span><span class='op'>.</span><span class='nam'>user</span><span class='op'>.</span><span class='nam'>has_perms</span><span class='op'>(</span><span class='nam'>perms</span><span class='op'>)</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t142' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>True</span><span class='strut'>&nbsp;</span></p>
<p id='t143' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>False</span><span class='strut'>&nbsp;</span></p>
<p id='t144' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t145' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t146' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>DjangoModelPermissionsOrAnonReadOnly</span><span class='op'>(</span><span class='nam'>DjangoModelPermissions</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t147' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t148' class='pln'><span class='str'>&nbsp; &nbsp; Similar to DjangoModelPermissions, except that anonymous users are</span><span class='strut'>&nbsp;</span></p>
<p id='t149' class='pln'><span class='str'>&nbsp; &nbsp; allowed read-only access.</span><span class='strut'>&nbsp;</span></p>
<p id='t150' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t151' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>authenticated_users_only</span> <span class='op'>=</span> <span class='nam'>False</span><span class='strut'>&nbsp;</span></p>
<p id='t152' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t153' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t154' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>TokenHasReadWriteScope</span><span class='op'>(</span><span class='nam'>BasePermission</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t155' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t156' class='pln'><span class='str'>&nbsp; &nbsp; The request is authenticated as a user and the token used has the right scope</span><span class='strut'>&nbsp;</span></p>
<p id='t157' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t158' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t159' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>has_permission</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='nam'>view</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t160' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>token</span> <span class='op'>=</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>auth</span><span class='strut'>&nbsp;</span></p>
<p id='t161' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>read_only</span> <span class='op'>=</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>method</span> <span class='key'>in</span> <span class='nam'>SAFE_METHODS</span><span class='strut'>&nbsp;</span></p>
<p id='t162' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t163' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>token</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t164' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>False</span><span class='strut'>&nbsp;</span></p>
<p id='t165' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t166' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>token</span><span class='op'>,</span> <span class='str'>&#39;resource&#39;</span><span class='op'>)</span><span class='op'>:</span>&nbsp; <span class='com'># OAuth 1</span><span class='strut'>&nbsp;</span></p>
<p id='t167' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>read_only</span> <span class='key'>or</span> <span class='key'>not</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>auth</span><span class='op'>.</span><span class='nam'>resource</span><span class='op'>.</span><span class='nam'>is_readonly</span><span class='strut'>&nbsp;</span></p>
<p id='t168' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>elif</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>token</span><span class='op'>,</span> <span class='str'>&#39;scope&#39;</span><span class='op'>)</span><span class='op'>:</span>&nbsp; <span class='com'># OAuth 2</span><span class='strut'>&nbsp;</span></p>
<p id='t169' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>required</span> <span class='op'>=</span> <span class='nam'>oauth2_constants</span><span class='op'>.</span><span class='nam'>READ</span> <span class='key'>if</span> <span class='nam'>read_only</span> <span class='key'>else</span> <span class='nam'>oauth2_constants</span><span class='op'>.</span><span class='nam'>WRITE</span><span class='strut'>&nbsp;</span></p>
<p id='t170' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>oauth2_provider_scope</span><span class='op'>.</span><span class='nam'>check</span><span class='op'>(</span><span class='nam'>required</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>auth</span><span class='op'>.</span><span class='nam'>scope</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t171' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t172' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>assert</span> <span class='nam'>False</span><span class='op'>,</span> <span class='op'>(</span><span class='str'>&#39;TokenHasReadWriteScope requires either the&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t173' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;`OAuthAuthentication` or `OAuth2Authentication` authentication &#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t174' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;class to be used.&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
</td>
</tr>
</table>
</div>
<div id='footer'>
<div class='content'>
<p>
<a class='nav' href='index.html'>&#xab; index</a> &nbsp; &nbsp; <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.5.1</a>
</p>
</div>
</div>
</body>
</html>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,819 +0,0 @@
<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
<title>Coverage for rest_framework/request: 95%</title>
<link rel='stylesheet' href='style.css' type='text/css'>
<script type='text/javascript' src='jquery-1.4.3.min.js'></script>
<script type='text/javascript' src='jquery.hotkeys.js'></script>
<script type='text/javascript' src='jquery.isonscreen.js'></script>
<script type='text/javascript' src='coverage_html.js'></script>
<script type='text/javascript' charset='utf-8'>
jQuery(document).ready(coverage.pyfile_ready);
</script>
</head>
<body id='pyfile'>
<div id='header'>
<div class='content'>
<h1>Coverage for <b>rest_framework/request</b> :
<span class='pc_cov'>95%</span>
</h1>
<img id='keyboard_icon' src='keybd_closed.png'>
<h2 class='stats'>
161 statements
<span class='run hide_run shortkey_r' onclick='coverage.toggle_lines(this, "run")'>153 run</span>
<span class='mis shortkey_m' onclick='coverage.toggle_lines(this, "mis")'>8 missing</span>
<span class='exc shortkey_x' onclick='coverage.toggle_lines(this, "exc")'>0 excluded</span>
</h2>
</div>
</div>
<div class='help_panel'>
<img id='panel_icon' src='keybd_open.png'>
<p class='legend'>Hot-keys on this page</p>
<div>
<p class='keyhelp'>
<span class='key'>r</span>
<span class='key'>m</span>
<span class='key'>x</span>
<span class='key'>p</span> &nbsp; toggle line displays
</p>
<p class='keyhelp'>
<span class='key'>j</span>
<span class='key'>k</span> &nbsp; next/prev highlighted chunk
</p>
<p class='keyhelp'>
<span class='key'>0</span> &nbsp; (zero) top of page
</p>
<p class='keyhelp'>
<span class='key'>1</span> &nbsp; (one) first highlighted chunk
</p>
</div>
</div>
<div id='source'>
<table cellspacing='0' cellpadding='0'>
<tr>
<td class='linenos' valign='top'>
<p id='n1' class='pln'><a href='#n1'>1</a></p>
<p id='n2' class='pln'><a href='#n2'>2</a></p>
<p id='n3' class='pln'><a href='#n3'>3</a></p>
<p id='n4' class='pln'><a href='#n4'>4</a></p>
<p id='n5' class='pln'><a href='#n5'>5</a></p>
<p id='n6' class='pln'><a href='#n6'>6</a></p>
<p id='n7' class='pln'><a href='#n7'>7</a></p>
<p id='n8' class='pln'><a href='#n8'>8</a></p>
<p id='n9' class='pln'><a href='#n9'>9</a></p>
<p id='n10' class='pln'><a href='#n10'>10</a></p>
<p id='n11' class='stm run hide_run'><a href='#n11'>11</a></p>
<p id='n12' class='stm run hide_run'><a href='#n12'>12</a></p>
<p id='n13' class='stm run hide_run'><a href='#n13'>13</a></p>
<p id='n14' class='stm run hide_run'><a href='#n14'>14</a></p>
<p id='n15' class='stm run hide_run'><a href='#n15'>15</a></p>
<p id='n16' class='stm run hide_run'><a href='#n16'>16</a></p>
<p id='n17' class='stm run hide_run'><a href='#n17'>17</a></p>
<p id='n18' class='stm run hide_run'><a href='#n18'>18</a></p>
<p id='n19' class='stm run hide_run'><a href='#n19'>19</a></p>
<p id='n20' class='pln'><a href='#n20'>20</a></p>
<p id='n21' class='pln'><a href='#n21'>21</a></p>
<p id='n22' class='stm run hide_run'><a href='#n22'>22</a></p>
<p id='n23' class='pln'><a href='#n23'>23</a></p>
<p id='n24' class='pln'><a href='#n24'>24</a></p>
<p id='n25' class='pln'><a href='#n25'>25</a></p>
<p id='n26' class='stm run hide_run'><a href='#n26'>26</a></p>
<p id='n27' class='stm run hide_run'><a href='#n27'>27</a></p>
<p id='n28' class='pln'><a href='#n28'>28</a></p>
<p id='n29' class='pln'><a href='#n29'>29</a></p>
<p id='n30' class='pln'><a href='#n30'>30</a></p>
<p id='n31' class='stm run hide_run'><a href='#n31'>31</a></p>
<p id='n32' class='pln'><a href='#n32'>32</a></p>
<p id='n33' class='pln'><a href='#n33'>33</a></p>
<p id='n34' class='pln'><a href='#n34'>34</a></p>
<p id='n35' class='pln'><a href='#n35'>35</a></p>
<p id='n36' class='stm run hide_run'><a href='#n36'>36</a></p>
<p id='n37' class='pln'><a href='#n37'>37</a></p>
<p id='n38' class='pln'><a href='#n38'>38</a></p>
<p id='n39' class='stm run hide_run'><a href='#n39'>39</a></p>
<p id='n40' class='stm run hide_run'><a href='#n40'>40</a></p>
<p id='n41' class='pln'><a href='#n41'>41</a></p>
<p id='n42' class='pln'><a href='#n42'>42</a></p>
<p id='n43' class='stm run hide_run'><a href='#n43'>43</a></p>
<p id='n44' class='pln'><a href='#n44'>44</a></p>
<p id='n45' class='pln'><a href='#n45'>45</a></p>
<p id='n46' class='pln'><a href='#n46'>46</a></p>
<p id='n47' class='pln'><a href='#n47'>47</a></p>
<p id='n48' class='stm run hide_run'><a href='#n48'>48</a></p>
<p id='n49' class='pln'><a href='#n49'>49</a></p>
<p id='n50' class='pln'><a href='#n50'>50</a></p>
<p id='n51' class='pln'><a href='#n51'>51</a></p>
<p id='n52' class='pln'><a href='#n52'>52</a></p>
<p id='n53' class='stm run hide_run'><a href='#n53'>53</a></p>
<p id='n54' class='stm run hide_run'><a href='#n54'>54</a></p>
<p id='n55' class='stm run hide_run'><a href='#n55'>55</a></p>
<p id='n56' class='stm run hide_run'><a href='#n56'>56</a></p>
<p id='n57' class='stm run hide_run'><a href='#n57'>57</a></p>
<p id='n58' class='stm run hide_run'><a href='#n58'>58</a></p>
<p id='n59' class='stm run hide_run'><a href='#n59'>59</a></p>
<p id='n60' class='stm run hide_run'><a href='#n60'>60</a></p>
<p id='n61' class='stm run hide_run'><a href='#n61'>61</a></p>
<p id='n62' class='stm run hide_run'><a href='#n62'>62</a></p>
<p id='n63' class='stm run hide_run'><a href='#n63'>63</a></p>
<p id='n64' class='stm run hide_run'><a href='#n64'>64</a></p>
<p id='n65' class='pln'><a href='#n65'>65</a></p>
<p id='n66' class='pln'><a href='#n66'>66</a></p>
<p id='n67' class='stm run hide_run'><a href='#n67'>67</a></p>
<p id='n68' class='pln'><a href='#n68'>68</a></p>
<p id='n69' class='pln'><a href='#n69'>69</a></p>
<p id='n70' class='pln'><a href='#n70'>70</a></p>
<p id='n71' class='pln'><a href='#n71'>71</a></p>
<p id='n72' class='pln'><a href='#n72'>72</a></p>
<p id='n73' class='pln'><a href='#n73'>73</a></p>
<p id='n74' class='pln'><a href='#n74'>74</a></p>
<p id='n75' class='pln'><a href='#n75'>75</a></p>
<p id='n76' class='pln'><a href='#n76'>76</a></p>
<p id='n77' class='pln'><a href='#n77'>77</a></p>
<p id='n78' class='pln'><a href='#n78'>78</a></p>
<p id='n79' class='stm run hide_run'><a href='#n79'>79</a></p>
<p id='n80' class='stm run hide_run'><a href='#n80'>80</a></p>
<p id='n81' class='stm run hide_run'><a href='#n81'>81</a></p>
<p id='n82' class='pln'><a href='#n82'>82</a></p>
<p id='n83' class='stm run hide_run'><a href='#n83'>83</a></p>
<p id='n84' class='pln'><a href='#n84'>84</a></p>
<p id='n85' class='stm run hide_run'><a href='#n85'>85</a></p>
<p id='n86' class='stm run hide_run'><a href='#n86'>86</a></p>
<p id='n87' class='stm run hide_run'><a href='#n87'>87</a></p>
<p id='n88' class='stm run hide_run'><a href='#n88'>88</a></p>
<p id='n89' class='stm run hide_run'><a href='#n89'>89</a></p>
<p id='n90' class='stm run hide_run'><a href='#n90'>90</a></p>
<p id='n91' class='stm run hide_run'><a href='#n91'>91</a></p>
<p id='n92' class='stm run hide_run'><a href='#n92'>92</a></p>
<p id='n93' class='stm run hide_run'><a href='#n93'>93</a></p>
<p id='n94' class='stm run hide_run'><a href='#n94'>94</a></p>
<p id='n95' class='pln'><a href='#n95'>95</a></p>
<p id='n96' class='stm run hide_run'><a href='#n96'>96</a></p>
<p id='n97' class='stm run hide_run'><a href='#n97'>97</a></p>
<p id='n98' class='stm run hide_run'><a href='#n98'>98</a></p>
<p id='n99' class='stm run hide_run'><a href='#n99'>99</a></p>
<p id='n100' class='pln'><a href='#n100'>100</a></p>
<p id='n101' class='stm run hide_run'><a href='#n101'>101</a></p>
<p id='n102' class='stm run hide_run'><a href='#n102'>102</a></p>
<p id='n103' class='pln'><a href='#n103'>103</a></p>
<p id='n104' class='stm run hide_run'><a href='#n104'>104</a></p>
<p id='n105' class='pln'><a href='#n105'>105</a></p>
<p id='n106' class='pln'><a href='#n106'>106</a></p>
<p id='n107' class='pln'><a href='#n107'>107</a></p>
<p id='n108' class='pln'><a href='#n108'>108</a></p>
<p id='n109' class='pln'><a href='#n109'>109</a></p>
<p id='n110' class='pln'><a href='#n110'>110</a></p>
<p id='n111' class='pln'><a href='#n111'>111</a></p>
<p id='n112' class='stm run hide_run'><a href='#n112'>112</a></p>
<p id='n113' class='stm run hide_run'><a href='#n113'>113</a></p>
<p id='n114' class='stm run hide_run'><a href='#n114'>114</a></p>
<p id='n115' class='pln'><a href='#n115'>115</a></p>
<p id='n116' class='stm run hide_run'><a href='#n116'>116</a></p>
<p id='n117' class='pln'><a href='#n117'>117</a></p>
<p id='n118' class='pln'><a href='#n118'>118</a></p>
<p id='n119' class='pln'><a href='#n119'>119</a></p>
<p id='n120' class='pln'><a href='#n120'>120</a></p>
<p id='n121' class='pln'><a href='#n121'>121</a></p>
<p id='n122' class='pln'><a href='#n122'>122</a></p>
<p id='n123' class='pln'><a href='#n123'>123</a></p>
<p id='n124' class='pln'><a href='#n124'>124</a></p>
<p id='n125' class='stm run hide_run'><a href='#n125'>125</a></p>
<p id='n126' class='stm mis'><a href='#n126'>126</a></p>
<p id='n127' class='stm run hide_run'><a href='#n127'>127</a></p>
<p id='n128' class='pln'><a href='#n128'>128</a></p>
<p id='n129' class='stm run hide_run'><a href='#n129'>129</a></p>
<p id='n130' class='pln'><a href='#n130'>130</a></p>
<p id='n131' class='pln'><a href='#n131'>131</a></p>
<p id='n132' class='pln'><a href='#n132'>132</a></p>
<p id='n133' class='pln'><a href='#n133'>133</a></p>
<p id='n134' class='stm run hide_run'><a href='#n134'>134</a></p>
<p id='n135' class='stm run hide_run'><a href='#n135'>135</a></p>
<p id='n136' class='stm run hide_run'><a href='#n136'>136</a></p>
<p id='n137' class='pln'><a href='#n137'>137</a></p>
<p id='n138' class='stm run hide_run'><a href='#n138'>138</a></p>
<p id='n139' class='pln'><a href='#n139'>139</a></p>
<p id='n140' class='pln'><a href='#n140'>140</a></p>
<p id='n141' class='pln'><a href='#n141'>141</a></p>
<p id='n142' class='pln'><a href='#n142'>142</a></p>
<p id='n143' class='stm run hide_run'><a href='#n143'>143</a></p>
<p id='n144' class='pln'><a href='#n144'>144</a></p>
<p id='n145' class='stm run hide_run'><a href='#n145'>145</a></p>
<p id='n146' class='pln'><a href='#n146'>146</a></p>
<p id='n147' class='pln'><a href='#n147'>147</a></p>
<p id='n148' class='pln'><a href='#n148'>148</a></p>
<p id='n149' class='pln'><a href='#n149'>149</a></p>
<p id='n150' class='pln'><a href='#n150'>150</a></p>
<p id='n151' class='pln'><a href='#n151'>151</a></p>
<p id='n152' class='pln'><a href='#n152'>152</a></p>
<p id='n153' class='stm run hide_run'><a href='#n153'>153</a></p>
<p id='n154' class='stm run hide_run'><a href='#n154'>154</a></p>
<p id='n155' class='stm run hide_run'><a href='#n155'>155</a></p>
<p id='n156' class='pln'><a href='#n156'>156</a></p>
<p id='n157' class='stm run hide_run'><a href='#n157'>157</a></p>
<p id='n158' class='pln'><a href='#n158'>158</a></p>
<p id='n159' class='pln'><a href='#n159'>159</a></p>
<p id='n160' class='pln'><a href='#n160'>160</a></p>
<p id='n161' class='pln'><a href='#n161'>161</a></p>
<p id='n162' class='pln'><a href='#n162'>162</a></p>
<p id='n163' class='pln'><a href='#n163'>163</a></p>
<p id='n164' class='pln'><a href='#n164'>164</a></p>
<p id='n165' class='stm run hide_run'><a href='#n165'>165</a></p>
<p id='n166' class='stm mis'><a href='#n166'>166</a></p>
<p id='n167' class='stm run hide_run'><a href='#n167'>167</a></p>
<p id='n168' class='pln'><a href='#n168'>168</a></p>
<p id='n169' class='stm run hide_run'><a href='#n169'>169</a></p>
<p id='n170' class='pln'><a href='#n170'>170</a></p>
<p id='n171' class='pln'><a href='#n171'>171</a></p>
<p id='n172' class='pln'><a href='#n172'>172</a></p>
<p id='n173' class='pln'><a href='#n173'>173</a></p>
<p id='n174' class='pln'><a href='#n174'>174</a></p>
<p id='n175' class='stm run hide_run'><a href='#n175'>175</a></p>
<p id='n176' class='stm run hide_run'><a href='#n176'>176</a></p>
<p id='n177' class='stm run hide_run'><a href='#n177'>177</a></p>
<p id='n178' class='pln'><a href='#n178'>178</a></p>
<p id='n179' class='stm run hide_run'><a href='#n179'>179</a></p>
<p id='n180' class='pln'><a href='#n180'>180</a></p>
<p id='n181' class='pln'><a href='#n181'>181</a></p>
<p id='n182' class='pln'><a href='#n182'>182</a></p>
<p id='n183' class='pln'><a href='#n183'>183</a></p>
<p id='n184' class='pln'><a href='#n184'>184</a></p>
<p id='n185' class='pln'><a href='#n185'>185</a></p>
<p id='n186' class='stm run hide_run'><a href='#n186'>186</a></p>
<p id='n187' class='pln'><a href='#n187'>187</a></p>
<p id='n188' class='stm run hide_run'><a href='#n188'>188</a></p>
<p id='n189' class='pln'><a href='#n189'>189</a></p>
<p id='n190' class='pln'><a href='#n190'>190</a></p>
<p id='n191' class='pln'><a href='#n191'>191</a></p>
<p id='n192' class='pln'><a href='#n192'>192</a></p>
<p id='n193' class='pln'><a href='#n193'>193</a></p>
<p id='n194' class='stm run hide_run'><a href='#n194'>194</a></p>
<p id='n195' class='stm mis'><a href='#n195'>195</a></p>
<p id='n196' class='stm run hide_run'><a href='#n196'>196</a></p>
<p id='n197' class='pln'><a href='#n197'>197</a></p>
<p id='n198' class='stm run hide_run'><a href='#n198'>198</a></p>
<p id='n199' class='pln'><a href='#n199'>199</a></p>
<p id='n200' class='pln'><a href='#n200'>200</a></p>
<p id='n201' class='pln'><a href='#n201'>201</a></p>
<p id='n202' class='pln'><a href='#n202'>202</a></p>
<p id='n203' class='pln'><a href='#n203'>203</a></p>
<p id='n204' class='stm run hide_run'><a href='#n204'>204</a></p>
<p id='n205' class='pln'><a href='#n205'>205</a></p>
<p id='n206' class='stm run hide_run'><a href='#n206'>206</a></p>
<p id='n207' class='pln'><a href='#n207'>207</a></p>
<p id='n208' class='pln'><a href='#n208'>208</a></p>
<p id='n209' class='pln'><a href='#n209'>209</a></p>
<p id='n210' class='pln'><a href='#n210'>210</a></p>
<p id='n211' class='pln'><a href='#n211'>211</a></p>
<p id='n212' class='stm run hide_run'><a href='#n212'>212</a></p>
<p id='n213' class='stm mis'><a href='#n213'>213</a></p>
<p id='n214' class='stm run hide_run'><a href='#n214'>214</a></p>
<p id='n215' class='pln'><a href='#n215'>215</a></p>
<p id='n216' class='stm run hide_run'><a href='#n216'>216</a></p>
<p id='n217' class='pln'><a href='#n217'>217</a></p>
<p id='n218' class='pln'><a href='#n218'>218</a></p>
<p id='n219' class='pln'><a href='#n219'>219</a></p>
<p id='n220' class='stm run hide_run'><a href='#n220'>220</a></p>
<p id='n221' class='stm run hide_run'><a href='#n221'>221</a></p>
<p id='n222' class='pln'><a href='#n222'>222</a></p>
<p id='n223' class='stm run hide_run'><a href='#n223'>223</a></p>
<p id='n224' class='stm run hide_run'><a href='#n224'>224</a></p>
<p id='n225' class='pln'><a href='#n225'>225</a></p>
<p id='n226' class='stm run hide_run'><a href='#n226'>226</a></p>
<p id='n227' class='pln'><a href='#n227'>227</a></p>
<p id='n228' class='pln'><a href='#n228'>228</a></p>
<p id='n229' class='pln'><a href='#n229'>229</a></p>
<p id='n230' class='pln'><a href='#n230'>230</a></p>
<p id='n231' class='stm run hide_run'><a href='#n231'>231</a></p>
<p id='n232' class='pln'><a href='#n232'>232</a></p>
<p id='n233' class='pln'><a href='#n233'>233</a></p>
<p id='n234' class='stm run hide_run'><a href='#n234'>234</a></p>
<p id='n235' class='pln'><a href='#n235'>235</a></p>
<p id='n236' class='stm run hide_run'><a href='#n236'>236</a></p>
<p id='n237' class='stm run hide_run'><a href='#n237'>237</a></p>
<p id='n238' class='pln'><a href='#n238'>238</a></p>
<p id='n239' class='stm run hide_run'><a href='#n239'>239</a></p>
<p id='n240' class='pln'><a href='#n240'>240</a></p>
<p id='n241' class='stm run hide_run'><a href='#n241'>241</a></p>
<p id='n242' class='pln'><a href='#n242'>242</a></p>
<p id='n243' class='pln'><a href='#n243'>243</a></p>
<p id='n244' class='stm run hide_run'><a href='#n244'>244</a></p>
<p id='n245' class='pln'><a href='#n245'>245</a></p>
<p id='n246' class='pln'><a href='#n246'>246</a></p>
<p id='n247' class='pln'><a href='#n247'>247</a></p>
<p id='n248' class='stm run hide_run'><a href='#n248'>248</a></p>
<p id='n249' class='stm run hide_run'><a href='#n249'>249</a></p>
<p id='n250' class='pln'><a href='#n250'>250</a></p>
<p id='n251' class='stm run hide_run'><a href='#n251'>251</a></p>
<p id='n252' class='stm run hide_run'><a href='#n252'>252</a></p>
<p id='n253' class='pln'><a href='#n253'>253</a></p>
<p id='n254' class='stm run hide_run'><a href='#n254'>254</a></p>
<p id='n255' class='stm run hide_run'><a href='#n255'>255</a></p>
<p id='n256' class='stm run hide_run'><a href='#n256'>256</a></p>
<p id='n257' class='stm run hide_run'><a href='#n257'>257</a></p>
<p id='n258' class='pln'><a href='#n258'>258</a></p>
<p id='n259' class='stm mis'><a href='#n259'>259</a></p>
<p id='n260' class='pln'><a href='#n260'>260</a></p>
<p id='n261' class='stm run hide_run'><a href='#n261'>261</a></p>
<p id='n262' class='pln'><a href='#n262'>262</a></p>
<p id='n263' class='pln'><a href='#n263'>263</a></p>
<p id='n264' class='pln'><a href='#n264'>264</a></p>
<p id='n265' class='pln'><a href='#n265'>265</a></p>
<p id='n266' class='pln'><a href='#n266'>266</a></p>
<p id='n267' class='pln'><a href='#n267'>267</a></p>
<p id='n268' class='stm run hide_run'><a href='#n268'>268</a></p>
<p id='n269' class='pln'><a href='#n269'>269</a></p>
<p id='n270' class='pln'><a href='#n270'>270</a></p>
<p id='n271' class='pln'><a href='#n271'>271</a></p>
<p id='n272' class='pln'><a href='#n272'>272</a></p>
<p id='n273' class='pln'><a href='#n273'>273</a></p>
<p id='n274' class='stm run hide_run'><a href='#n274'>274</a></p>
<p id='n275' class='pln'><a href='#n275'>275</a></p>
<p id='n276' class='pln'><a href='#n276'>276</a></p>
<p id='n277' class='stm run hide_run'><a href='#n277'>277</a></p>
<p id='n278' class='pln'><a href='#n278'>278</a></p>
<p id='n279' class='pln'><a href='#n279'>279</a></p>
<p id='n280' class='stm run hide_run'><a href='#n280'>280</a></p>
<p id='n281' class='stm run hide_run'><a href='#n281'>281</a></p>
<p id='n282' class='pln'><a href='#n282'>282</a></p>
<p id='n283' class='pln'><a href='#n283'>283</a></p>
<p id='n284' class='stm run hide_run'><a href='#n284'>284</a></p>
<p id='n285' class='pln'><a href='#n285'>285</a></p>
<p id='n286' class='stm run hide_run'><a href='#n286'>286</a></p>
<p id='n287' class='pln'><a href='#n287'>287</a></p>
<p id='n288' class='pln'><a href='#n288'>288</a></p>
<p id='n289' class='stm run hide_run'><a href='#n289'>289</a></p>
<p id='n290' class='pln'><a href='#n290'>290</a></p>
<p id='n291' class='pln'><a href='#n291'>291</a></p>
<p id='n292' class='pln'><a href='#n292'>292</a></p>
<p id='n293' class='stm run hide_run'><a href='#n293'>293</a></p>
<p id='n294' class='stm run hide_run'><a href='#n294'>294</a></p>
<p id='n295' class='stm run hide_run'><a href='#n295'>295</a></p>
<p id='n296' class='pln'><a href='#n296'>296</a></p>
<p id='n297' class='stm run hide_run'><a href='#n297'>297</a></p>
<p id='n298' class='pln'><a href='#n298'>298</a></p>
<p id='n299' class='pln'><a href='#n299'>299</a></p>
<p id='n300' class='pln'><a href='#n300'>300</a></p>
<p id='n301' class='pln'><a href='#n301'>301</a></p>
<p id='n302' class='pln'><a href='#n302'>302</a></p>
<p id='n303' class='stm run hide_run'><a href='#n303'>303</a></p>
<p id='n304' class='stm run hide_run'><a href='#n304'>304</a></p>
<p id='n305' class='pln'><a href='#n305'>305</a></p>
<p id='n306' class='stm run hide_run'><a href='#n306'>306</a></p>
<p id='n307' class='stm run hide_run'><a href='#n307'>307</a></p>
<p id='n308' class='stm run hide_run'><a href='#n308'>308</a></p>
<p id='n309' class='stm run hide_run'><a href='#n309'>309</a></p>
<p id='n310' class='pln'><a href='#n310'>310</a></p>
<p id='n311' class='stm run hide_run'><a href='#n311'>311</a></p>
<p id='n312' class='pln'><a href='#n312'>312</a></p>
<p id='n313' class='stm run hide_run'><a href='#n313'>313</a></p>
<p id='n314' class='stm mis'><a href='#n314'>314</a></p>
<p id='n315' class='pln'><a href='#n315'>315</a></p>
<p id='n316' class='stm run hide_run'><a href='#n316'>316</a></p>
<p id='n317' class='pln'><a href='#n317'>317</a></p>
<p id='n318' class='pln'><a href='#n318'>318</a></p>
<p id='n319' class='pln'><a href='#n319'>319</a></p>
<p id='n320' class='stm run hide_run'><a href='#n320'>320</a></p>
<p id='n321' class='stm run hide_run'><a href='#n321'>321</a></p>
<p id='n322' class='stm run hide_run'><a href='#n322'>322</a></p>
<p id='n323' class='stm run hide_run'><a href='#n323'>323</a></p>
<p id='n324' class='stm run hide_run'><a href='#n324'>324</a></p>
<p id='n325' class='pln'><a href='#n325'>325</a></p>
<p id='n326' class='stm run hide_run'><a href='#n326'>326</a></p>
<p id='n327' class='pln'><a href='#n327'>327</a></p>
<p id='n328' class='pln'><a href='#n328'>328</a></p>
<p id='n329' class='pln'><a href='#n329'>329</a></p>
<p id='n330' class='pln'><a href='#n330'>330</a></p>
<p id='n331' class='pln'><a href='#n331'>331</a></p>
<p id='n332' class='stm run hide_run'><a href='#n332'>332</a></p>
<p id='n333' class='stm run hide_run'><a href='#n333'>333</a></p>
<p id='n334' class='stm run hide_run'><a href='#n334'>334</a></p>
<p id='n335' class='stm run hide_run'><a href='#n335'>335</a></p>
<p id='n336' class='stm run hide_run'><a href='#n336'>336</a></p>
<p id='n337' class='stm run hide_run'><a href='#n337'>337</a></p>
<p id='n338' class='pln'><a href='#n338'>338</a></p>
<p id='n339' class='stm run hide_run'><a href='#n339'>339</a></p>
<p id='n340' class='stm run hide_run'><a href='#n340'>340</a></p>
<p id='n341' class='stm run hide_run'><a href='#n341'>341</a></p>
<p id='n342' class='stm run hide_run'><a href='#n342'>342</a></p>
<p id='n343' class='pln'><a href='#n343'>343</a></p>
<p id='n344' class='stm run hide_run'><a href='#n344'>344</a></p>
<p id='n345' class='pln'><a href='#n345'>345</a></p>
<p id='n346' class='stm run hide_run'><a href='#n346'>346</a></p>
<p id='n347' class='pln'><a href='#n347'>347</a></p>
<p id='n348' class='pln'><a href='#n348'>348</a></p>
<p id='n349' class='pln'><a href='#n349'>349</a></p>
<p id='n350' class='pln'><a href='#n350'>350</a></p>
<p id='n351' class='pln'><a href='#n351'>351</a></p>
<p id='n352' class='pln'><a href='#n352'>352</a></p>
<p id='n353' class='stm run hide_run'><a href='#n353'>353</a></p>
<p id='n354' class='pln'><a href='#n354'>354</a></p>
<p id='n355' class='stm run hide_run'><a href='#n355'>355</a></p>
<p id='n356' class='stm run hide_run'><a href='#n356'>356</a></p>
<p id='n357' class='pln'><a href='#n357'>357</a></p>
<p id='n358' class='stm mis'><a href='#n358'>358</a></p>
<p id='n359' class='pln'><a href='#n359'>359</a></p>
<p id='n360' class='stm run hide_run'><a href='#n360'>360</a></p>
<p id='n361' class='stm mis'><a href='#n361'>361</a></p>
<p id='n362' class='pln'><a href='#n362'>362</a></p>
<p id='n363' class='stm run hide_run'><a href='#n363'>363</a></p>
<p id='n364' class='pln'><a href='#n364'>364</a></p>
<p id='n365' class='stm run hide_run'><a href='#n365'>365</a></p>
<p id='n366' class='pln'><a href='#n366'>366</a></p>
<p id='n367' class='pln'><a href='#n367'>367</a></p>
<p id='n368' class='pln'><a href='#n368'>368</a></p>
<p id='n369' class='stm run hide_run'><a href='#n369'>369</a></p>
</td>
<td class='text' valign='top'>
<p id='t1' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t2' class='pln'><span class='str'>The Request class is used as a wrapper around the standard request object.</span><span class='strut'>&nbsp;</span></p>
<p id='t3' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t4' class='pln'><span class='str'>The wrapped request then offers a richer API, in particular :</span><span class='strut'>&nbsp;</span></p>
<p id='t5' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t6' class='pln'><span class='str'>&nbsp; &nbsp; - content automatically parsed according to `Content-Type` header,</span><span class='strut'>&nbsp;</span></p>
<p id='t7' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; and available as `request.DATA`</span><span class='strut'>&nbsp;</span></p>
<p id='t8' class='pln'><span class='str'>&nbsp; &nbsp; - full support of PUT method, including support for file uploads</span><span class='strut'>&nbsp;</span></p>
<p id='t9' class='pln'><span class='str'>&nbsp; &nbsp; - form overloading of HTTP method, content type and content</span><span class='strut'>&nbsp;</span></p>
<p id='t10' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t11' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>__future__</span> <span class='key'>import</span> <span class='nam'>unicode_literals</span><span class='strut'>&nbsp;</span></p>
<p id='t12' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>django</span><span class='op'>.</span><span class='nam'>conf</span> <span class='key'>import</span> <span class='nam'>settings</span><span class='strut'>&nbsp;</span></p>
<p id='t13' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>django</span><span class='op'>.</span><span class='nam'>http</span> <span class='key'>import</span> <span class='nam'>QueryDict</span><span class='strut'>&nbsp;</span></p>
<p id='t14' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>django</span><span class='op'>.</span><span class='nam'>http</span><span class='op'>.</span><span class='nam'>multipartparser</span> <span class='key'>import</span> <span class='nam'>parse_header</span><span class='strut'>&nbsp;</span></p>
<p id='t15' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>django</span><span class='op'>.</span><span class='nam'>utils</span><span class='op'>.</span><span class='nam'>datastructures</span> <span class='key'>import</span> <span class='nam'>MultiValueDict</span><span class='strut'>&nbsp;</span></p>
<p id='t16' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span> <span class='key'>import</span> <span class='nam'>HTTP_HEADER_ENCODING</span><span class='strut'>&nbsp;</span></p>
<p id='t17' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span> <span class='key'>import</span> <span class='nam'>exceptions</span><span class='strut'>&nbsp;</span></p>
<p id='t18' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>compat</span> <span class='key'>import</span> <span class='nam'>BytesIO</span><span class='strut'>&nbsp;</span></p>
<p id='t19' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>settings</span> <span class='key'>import</span> <span class='nam'>api_settings</span><span class='strut'>&nbsp;</span></p>
<p id='t20' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t21' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t22' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>is_form_media_type</span><span class='op'>(</span><span class='nam'>media_type</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t23' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t24' class='pln'><span class='str'>&nbsp; &nbsp; Return True if the media type is a valid form media type.</span><span class='strut'>&nbsp;</span></p>
<p id='t25' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t26' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>base_media_type</span><span class='op'>,</span> <span class='nam'>params</span> <span class='op'>=</span> <span class='nam'>parse_header</span><span class='op'>(</span><span class='nam'>media_type</span><span class='op'>.</span><span class='nam'>encode</span><span class='op'>(</span><span class='nam'>HTTP_HEADER_ENCODING</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t27' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>return</span> <span class='op'>(</span><span class='nam'>base_media_type</span> <span class='op'>==</span> <span class='str'>&#39;application/x-www-form-urlencoded&#39;</span> <span class='key'>or</span><span class='strut'>&nbsp;</span></p>
<p id='t28' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>base_media_type</span> <span class='op'>==</span> <span class='str'>&#39;multipart/form-data&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t29' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t30' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t31' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>Empty</span><span class='op'>(</span><span class='nam'>object</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t32' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t33' class='pln'><span class='str'>&nbsp; &nbsp; Placeholder for unset attributes.</span><span class='strut'>&nbsp;</span></p>
<p id='t34' class='pln'><span class='str'>&nbsp; &nbsp; Cannot use `None`, as that may be a valid value.</span><span class='strut'>&nbsp;</span></p>
<p id='t35' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t36' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>pass</span><span class='strut'>&nbsp;</span></p>
<p id='t37' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t38' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t39' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>_hasattr</span><span class='op'>(</span><span class='nam'>obj</span><span class='op'>,</span> <span class='nam'>name</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t40' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>return</span> <span class='key'>not</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>obj</span><span class='op'>,</span> <span class='nam'>name</span><span class='op'>)</span> <span class='key'>is</span> <span class='nam'>Empty</span><span class='strut'>&nbsp;</span></p>
<p id='t41' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t42' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t43' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>clone_request</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>,</span> <span class='nam'>method</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t44' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t45' class='pln'><span class='str'>&nbsp; &nbsp; Internal helper method to clone a request, replacing with a different</span><span class='strut'>&nbsp;</span></p>
<p id='t46' class='pln'><span class='str'>&nbsp; &nbsp; HTTP method.&nbsp; Used for checking permissions against other methods.</span><span class='strut'>&nbsp;</span></p>
<p id='t47' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t48' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>ret</span> <span class='op'>=</span> <span class='nam'>Request</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>=</span><span class='nam'>request</span><span class='op'>.</span><span class='nam'>_request</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t49' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>parsers</span><span class='op'>=</span><span class='nam'>request</span><span class='op'>.</span><span class='nam'>parsers</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t50' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>authenticators</span><span class='op'>=</span><span class='nam'>request</span><span class='op'>.</span><span class='nam'>authenticators</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t51' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>negotiator</span><span class='op'>=</span><span class='nam'>request</span><span class='op'>.</span><span class='nam'>negotiator</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t52' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>parser_context</span><span class='op'>=</span><span class='nam'>request</span><span class='op'>.</span><span class='nam'>parser_context</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t53' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>ret</span><span class='op'>.</span><span class='nam'>_data</span> <span class='op'>=</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>_data</span><span class='strut'>&nbsp;</span></p>
<p id='t54' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>ret</span><span class='op'>.</span><span class='nam'>_files</span> <span class='op'>=</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>_files</span><span class='strut'>&nbsp;</span></p>
<p id='t55' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>ret</span><span class='op'>.</span><span class='nam'>_content_type</span> <span class='op'>=</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>_content_type</span><span class='strut'>&nbsp;</span></p>
<p id='t56' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>ret</span><span class='op'>.</span><span class='nam'>_stream</span> <span class='op'>=</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>_stream</span><span class='strut'>&nbsp;</span></p>
<p id='t57' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>ret</span><span class='op'>.</span><span class='nam'>_method</span> <span class='op'>=</span> <span class='nam'>method</span><span class='strut'>&nbsp;</span></p>
<p id='t58' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>,</span> <span class='str'>&#39;_user&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t59' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ret</span><span class='op'>.</span><span class='nam'>_user</span> <span class='op'>=</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>_user</span><span class='strut'>&nbsp;</span></p>
<p id='t60' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>,</span> <span class='str'>&#39;_auth&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t61' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ret</span><span class='op'>.</span><span class='nam'>_auth</span> <span class='op'>=</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>_auth</span><span class='strut'>&nbsp;</span></p>
<p id='t62' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>,</span> <span class='str'>&#39;_authenticator&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t63' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ret</span><span class='op'>.</span><span class='nam'>_authenticator</span> <span class='op'>=</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>_authenticator</span><span class='strut'>&nbsp;</span></p>
<p id='t64' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>ret</span><span class='strut'>&nbsp;</span></p>
<p id='t65' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t66' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t67' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>Request</span><span class='op'>(</span><span class='nam'>object</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t68' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t69' class='pln'><span class='str'>&nbsp; &nbsp; Wrapper allowing to enhance a standard `HttpRequest` instance.</span><span class='strut'>&nbsp;</span></p>
<p id='t70' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t71' class='pln'><span class='str'>&nbsp; &nbsp; Kwargs:</span><span class='strut'>&nbsp;</span></p>
<p id='t72' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; - request(HttpRequest). The original request instance.</span><span class='strut'>&nbsp;</span></p>
<p id='t73' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; - parsers_classes(list/tuple). The parsers to use for parsing the</span><span class='strut'>&nbsp;</span></p>
<p id='t74' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; request content.</span><span class='strut'>&nbsp;</span></p>
<p id='t75' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; - authentication_classes(list/tuple). The authentications used to try</span><span class='strut'>&nbsp;</span></p>
<p id='t76' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; authenticating the request&#39;s user.</span><span class='strut'>&nbsp;</span></p>
<p id='t77' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t78' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t79' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_METHOD_PARAM</span> <span class='op'>=</span> <span class='nam'>api_settings</span><span class='op'>.</span><span class='nam'>FORM_METHOD_OVERRIDE</span><span class='strut'>&nbsp;</span></p>
<p id='t80' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_CONTENT_PARAM</span> <span class='op'>=</span> <span class='nam'>api_settings</span><span class='op'>.</span><span class='nam'>FORM_CONTENT_OVERRIDE</span><span class='strut'>&nbsp;</span></p>
<p id='t81' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_CONTENTTYPE_PARAM</span> <span class='op'>=</span> <span class='nam'>api_settings</span><span class='op'>.</span><span class='nam'>FORM_CONTENTTYPE_OVERRIDE</span><span class='strut'>&nbsp;</span></p>
<p id='t82' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t83' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='nam'>parsers</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>authenticators</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t84' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <span class='nam'>negotiator</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>parser_context</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t85' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_request</span> <span class='op'>=</span> <span class='nam'>request</span><span class='strut'>&nbsp;</span></p>
<p id='t86' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>parsers</span> <span class='op'>=</span> <span class='nam'>parsers</span> <span class='key'>or</span> <span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t87' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>authenticators</span> <span class='op'>=</span> <span class='nam'>authenticators</span> <span class='key'>or</span> <span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t88' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>negotiator</span> <span class='op'>=</span> <span class='nam'>negotiator</span> <span class='key'>or</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_default_negotiator</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t89' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>parser_context</span> <span class='op'>=</span> <span class='nam'>parser_context</span><span class='strut'>&nbsp;</span></p>
<p id='t90' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_data</span> <span class='op'>=</span> <span class='nam'>Empty</span><span class='strut'>&nbsp;</span></p>
<p id='t91' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_files</span> <span class='op'>=</span> <span class='nam'>Empty</span><span class='strut'>&nbsp;</span></p>
<p id='t92' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_method</span> <span class='op'>=</span> <span class='nam'>Empty</span><span class='strut'>&nbsp;</span></p>
<p id='t93' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_content_type</span> <span class='op'>=</span> <span class='nam'>Empty</span><span class='strut'>&nbsp;</span></p>
<p id='t94' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_stream</span> <span class='op'>=</span> <span class='nam'>Empty</span><span class='strut'>&nbsp;</span></p>
<p id='t95' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t96' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>parser_context</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t97' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>parser_context</span> <span class='op'>=</span> <span class='op'>{</span><span class='op'>}</span><span class='strut'>&nbsp;</span></p>
<p id='t98' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>parser_context</span><span class='op'>[</span><span class='str'>&#39;request&#39;</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>self</span><span class='strut'>&nbsp;</span></p>
<p id='t99' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>parser_context</span><span class='op'>[</span><span class='str'>&#39;encoding&#39;</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>encoding</span> <span class='key'>or</span> <span class='nam'>settings</span><span class='op'>.</span><span class='nam'>DEFAULT_CHARSET</span><span class='strut'>&nbsp;</span></p>
<p id='t100' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t101' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_default_negotiator</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t102' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>api_settings</span><span class='op'>.</span><span class='nam'>DEFAULT_CONTENT_NEGOTIATION_CLASS</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t103' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t104' class='stm run hide_run'>&nbsp; &nbsp; <span class='op'>@</span><span class='nam'>property</span><span class='strut'>&nbsp;</span></p>
<p id='t105' class='pln'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>method</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t106' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t107' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Returns the HTTP method.</span><span class='strut'>&nbsp;</span></p>
<p id='t108' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t109' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; This allows the `method` to be overridden by using a hidden `form`</span><span class='strut'>&nbsp;</span></p>
<p id='t110' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; field on a form POST request.</span><span class='strut'>&nbsp;</span></p>
<p id='t111' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t112' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>_hasattr</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='str'>&#39;_method&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t113' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_load_method_and_content_type</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t114' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_method</span><span class='strut'>&nbsp;</span></p>
<p id='t115' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t116' class='stm run hide_run'>&nbsp; &nbsp; <span class='op'>@</span><span class='nam'>property</span><span class='strut'>&nbsp;</span></p>
<p id='t117' class='pln'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>content_type</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t118' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t119' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Returns the content type header.</span><span class='strut'>&nbsp;</span></p>
<p id='t120' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t121' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; This should be used instead of `request.META.get(&#39;HTTP_CONTENT_TYPE&#39;)`,</span><span class='strut'>&nbsp;</span></p>
<p id='t122' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; as it allows the content type to be overridden by using a hidden form</span><span class='strut'>&nbsp;</span></p>
<p id='t123' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; field on a form POST request.</span><span class='strut'>&nbsp;</span></p>
<p id='t124' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t125' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>_hasattr</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='str'>&#39;_content_type&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t126' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_load_method_and_content_type</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t127' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_content_type</span><span class='strut'>&nbsp;</span></p>
<p id='t128' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t129' class='stm run hide_run'>&nbsp; &nbsp; <span class='op'>@</span><span class='nam'>property</span><span class='strut'>&nbsp;</span></p>
<p id='t130' class='pln'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>stream</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t131' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t132' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Returns an object that may be used to stream the request content.</span><span class='strut'>&nbsp;</span></p>
<p id='t133' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t134' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>_hasattr</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='str'>&#39;_stream&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t135' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_load_stream</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t136' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_stream</span><span class='strut'>&nbsp;</span></p>
<p id='t137' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t138' class='stm run hide_run'>&nbsp; &nbsp; <span class='op'>@</span><span class='nam'>property</span><span class='strut'>&nbsp;</span></p>
<p id='t139' class='pln'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>QUERY_PARAMS</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t140' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t141' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; More semantically correct name for request.GET.</span><span class='strut'>&nbsp;</span></p>
<p id='t142' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t143' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_request</span><span class='op'>.</span><span class='nam'>GET</span><span class='strut'>&nbsp;</span></p>
<p id='t144' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t145' class='stm run hide_run'>&nbsp; &nbsp; <span class='op'>@</span><span class='nam'>property</span><span class='strut'>&nbsp;</span></p>
<p id='t146' class='pln'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>DATA</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t147' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t148' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Parses the request body and returns the data.</span><span class='strut'>&nbsp;</span></p>
<p id='t149' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t150' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Similar to usual behaviour of `request.POST`, except that it handles</span><span class='strut'>&nbsp;</span></p>
<p id='t151' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; arbitrary parsers, and also works on methods other than POST (eg PUT).</span><span class='strut'>&nbsp;</span></p>
<p id='t152' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t153' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>_hasattr</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='str'>&#39;_data&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t154' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_load_data_and_files</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t155' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_data</span><span class='strut'>&nbsp;</span></p>
<p id='t156' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t157' class='stm run hide_run'>&nbsp; &nbsp; <span class='op'>@</span><span class='nam'>property</span><span class='strut'>&nbsp;</span></p>
<p id='t158' class='pln'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>FILES</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t159' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t160' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Parses the request body and returns any files uploaded in the request.</span><span class='strut'>&nbsp;</span></p>
<p id='t161' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t162' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Similar to usual behaviour of `request.FILES`, except that it handles</span><span class='strut'>&nbsp;</span></p>
<p id='t163' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; arbitrary parsers, and also works on methods other than POST (eg PUT).</span><span class='strut'>&nbsp;</span></p>
<p id='t164' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t165' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>_hasattr</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='str'>&#39;_files&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t166' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_load_data_and_files</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t167' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_files</span><span class='strut'>&nbsp;</span></p>
<p id='t168' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t169' class='stm run hide_run'>&nbsp; &nbsp; <span class='op'>@</span><span class='nam'>property</span><span class='strut'>&nbsp;</span></p>
<p id='t170' class='pln'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>user</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t171' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t172' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Returns the user associated with the current request, as authenticated</span><span class='strut'>&nbsp;</span></p>
<p id='t173' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; by the authentication classes provided to the request.</span><span class='strut'>&nbsp;</span></p>
<p id='t174' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t175' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='str'>&#39;_user&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t176' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_authenticate</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t177' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_user</span><span class='strut'>&nbsp;</span></p>
<p id='t178' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t179' class='stm run hide_run'>&nbsp; &nbsp; <span class='op'>@</span><span class='nam'>user</span><span class='op'>.</span><span class='nam'>setter</span><span class='strut'>&nbsp;</span></p>
<p id='t180' class='pln'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>user</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>value</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t181' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t182' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Sets the user on the current request. This is necessary to maintain</span><span class='strut'>&nbsp;</span></p>
<p id='t183' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; compatilbility with django.contrib.auth where the user proprety is</span><span class='strut'>&nbsp;</span></p>
<p id='t184' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; set in the login and logout functions.</span><span class='strut'>&nbsp;</span></p>
<p id='t185' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t186' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_user</span> <span class='op'>=</span> <span class='nam'>value</span><span class='strut'>&nbsp;</span></p>
<p id='t187' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t188' class='stm run hide_run'>&nbsp; &nbsp; <span class='op'>@</span><span class='nam'>property</span><span class='strut'>&nbsp;</span></p>
<p id='t189' class='pln'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>auth</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t190' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t191' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Returns any non-user authentication information associated with the</span><span class='strut'>&nbsp;</span></p>
<p id='t192' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; request, such as an authentication token.</span><span class='strut'>&nbsp;</span></p>
<p id='t193' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t194' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='str'>&#39;_auth&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t195' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_authenticate</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t196' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_auth</span><span class='strut'>&nbsp;</span></p>
<p id='t197' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t198' class='stm run hide_run'>&nbsp; &nbsp; <span class='op'>@</span><span class='nam'>auth</span><span class='op'>.</span><span class='nam'>setter</span><span class='strut'>&nbsp;</span></p>
<p id='t199' class='pln'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>auth</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>value</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t200' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t201' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Sets any non-user authentication information associated with the</span><span class='strut'>&nbsp;</span></p>
<p id='t202' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; request, such as an authentication token.</span><span class='strut'>&nbsp;</span></p>
<p id='t203' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t204' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_auth</span> <span class='op'>=</span> <span class='nam'>value</span><span class='strut'>&nbsp;</span></p>
<p id='t205' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t206' class='stm run hide_run'>&nbsp; &nbsp; <span class='op'>@</span><span class='nam'>property</span><span class='strut'>&nbsp;</span></p>
<p id='t207' class='pln'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>successful_authenticator</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t208' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t209' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Return the instance of the authentication instance class that was used</span><span class='strut'>&nbsp;</span></p>
<p id='t210' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; to authenticate the request, or `None`.</span><span class='strut'>&nbsp;</span></p>
<p id='t211' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t212' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='str'>&#39;_authenticator&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t213' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_authenticate</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t214' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_authenticator</span><span class='strut'>&nbsp;</span></p>
<p id='t215' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t216' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_load_data_and_files</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t217' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t218' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Parses the request content into self.DATA and self.FILES.</span><span class='strut'>&nbsp;</span></p>
<p id='t219' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t220' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>_hasattr</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='str'>&#39;_content_type&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t221' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_load_method_and_content_type</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t222' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t223' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>_hasattr</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='str'>&#39;_data&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t224' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_data</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_files</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_parse</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t225' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t226' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_load_method_and_content_type</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t227' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t228' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Sets the method and content_type, and then check if they&#39;ve</span><span class='strut'>&nbsp;</span></p>
<p id='t229' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; been overridden.</span><span class='strut'>&nbsp;</span></p>
<p id='t230' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t231' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_content_type</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>META</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;HTTP_CONTENT_TYPE&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t232' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>META</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;CONTENT_TYPE&#39;</span><span class='op'>,</span> <span class='str'>&#39;&#39;</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t233' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t234' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_perform_form_overloading</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t235' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t236' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>_hasattr</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='str'>&#39;_method&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t237' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_method</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_request</span><span class='op'>.</span><span class='nam'>method</span><span class='strut'>&nbsp;</span></p>
<p id='t238' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t239' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_method</span> <span class='op'>==</span> <span class='str'>&#39;POST&#39;</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t240' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Allow X-HTTP-METHOD-OVERRIDE header</span><span class='strut'>&nbsp;</span></p>
<p id='t241' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_method</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>META</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;HTTP_X_HTTP_METHOD_OVERRIDE&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t242' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_method</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t243' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t244' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_load_stream</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t245' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t246' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Return the content body of the request, as a stream.</span><span class='strut'>&nbsp;</span></p>
<p id='t247' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t248' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t249' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>content_length</span> <span class='op'>=</span> <span class='nam'>int</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>META</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;CONTENT_LENGTH&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t250' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>META</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;HTTP_CONTENT_LENGTH&#39;</span><span class='op'>)</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t251' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>ValueError</span><span class='op'>,</span> <span class='nam'>TypeError</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t252' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>content_length</span> <span class='op'>=</span> <span class='num'>0</span><span class='strut'>&nbsp;</span></p>
<p id='t253' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t254' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>content_length</span> <span class='op'>==</span> <span class='num'>0</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t255' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_stream</span> <span class='op'>=</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
<p id='t256' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>elif</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_request</span><span class='op'>,</span> <span class='str'>&#39;read&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t257' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_stream</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_request</span><span class='strut'>&nbsp;</span></p>
<p id='t258' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t259' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_stream</span> <span class='op'>=</span> <span class='nam'>BytesIO</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>raw_post_data</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t260' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t261' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_perform_form_overloading</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t262' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t263' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; If this is a form POST request, then we need to check if the method and</span><span class='strut'>&nbsp;</span></p>
<p id='t264' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; content/content_type have been overridden by setting them in hidden</span><span class='strut'>&nbsp;</span></p>
<p id='t265' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; form fields or not.</span><span class='strut'>&nbsp;</span></p>
<p id='t266' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t267' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t268' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>USE_FORM_OVERLOADING</span> <span class='op'>=</span> <span class='op'>(</span><span class='strut'>&nbsp;</span></p>
<p id='t269' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_METHOD_PARAM</span> <span class='key'>or</span><span class='strut'>&nbsp;</span></p>
<p id='t270' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_CONTENT_PARAM</span> <span class='key'>and</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_CONTENTTYPE_PARAM</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t271' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t272' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t273' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># We only need to use form overloading on form POST requests.</span><span class='strut'>&nbsp;</span></p>
<p id='t274' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='op'>(</span><span class='key'>not</span> <span class='nam'>USE_FORM_OVERLOADING</span><span class='strut'>&nbsp;</span></p>
<p id='t275' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>or</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_request</span><span class='op'>.</span><span class='nam'>method</span> <span class='op'>!=</span> <span class='str'>&#39;POST&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t276' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>or</span> <span class='key'>not</span> <span class='nam'>is_form_media_type</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_content_type</span><span class='op'>)</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t277' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
<p id='t278' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t279' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># At this point we&#39;re committed to parsing the request as form data.</span><span class='strut'>&nbsp;</span></p>
<p id='t280' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_data</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_request</span><span class='op'>.</span><span class='nam'>POST</span><span class='strut'>&nbsp;</span></p>
<p id='t281' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_files</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_request</span><span class='op'>.</span><span class='nam'>FILES</span><span class='strut'>&nbsp;</span></p>
<p id='t282' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t283' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Method overloading - change the method and remove the param from the content.</span><span class='strut'>&nbsp;</span></p>
<p id='t284' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_METHOD_PARAM</span> <span class='key'>and</span><span class='strut'>&nbsp;</span></p>
<p id='t285' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_METHOD_PARAM</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_data</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t286' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_method</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_data</span><span class='op'>[</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_METHOD_PARAM</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>upper</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t287' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t288' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Content overloading - modify the content type, and force re-parse.</span><span class='strut'>&nbsp;</span></p>
<p id='t289' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_CONTENT_PARAM</span> <span class='key'>and</span><span class='strut'>&nbsp;</span></p>
<p id='t290' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_CONTENTTYPE_PARAM</span> <span class='key'>and</span><span class='strut'>&nbsp;</span></p>
<p id='t291' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_CONTENT_PARAM</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_data</span> <span class='key'>and</span><span class='strut'>&nbsp;</span></p>
<p id='t292' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_CONTENTTYPE_PARAM</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_data</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t293' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_content_type</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_data</span><span class='op'>[</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_CONTENTTYPE_PARAM</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t294' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_stream</span> <span class='op'>=</span> <span class='nam'>BytesIO</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_data</span><span class='op'>[</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_CONTENT_PARAM</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>encode</span><span class='op'>(</span><span class='nam'>HTTP_HEADER_ENCODING</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t295' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_data</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_files</span> <span class='op'>=</span> <span class='op'>(</span><span class='nam'>Empty</span><span class='op'>,</span> <span class='nam'>Empty</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t296' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t297' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_parse</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t298' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t299' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Parse the request content, returning a two-tuple of (data, files)</span><span class='strut'>&nbsp;</span></p>
<p id='t300' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t301' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; May raise an `UnsupportedMediaType`, or `ParseError` exception.</span><span class='strut'>&nbsp;</span></p>
<p id='t302' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t303' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>stream</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>stream</span><span class='strut'>&nbsp;</span></p>
<p id='t304' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>media_type</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>content_type</span><span class='strut'>&nbsp;</span></p>
<p id='t305' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t306' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>stream</span> <span class='key'>is</span> <span class='nam'>None</span> <span class='key'>or</span> <span class='nam'>media_type</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t307' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>empty_data</span> <span class='op'>=</span> <span class='nam'>QueryDict</span><span class='op'>(</span><span class='str'>&#39;&#39;</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_request</span><span class='op'>.</span><span class='nam'>_encoding</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t308' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>empty_files</span> <span class='op'>=</span> <span class='nam'>MultiValueDict</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t309' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>(</span><span class='nam'>empty_data</span><span class='op'>,</span> <span class='nam'>empty_files</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t310' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t311' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>parser</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>negotiator</span><span class='op'>.</span><span class='nam'>select_parser</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>parsers</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t312' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t313' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>parser</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t314' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>exceptions</span><span class='op'>.</span><span class='nam'>UnsupportedMediaType</span><span class='op'>(</span><span class='nam'>media_type</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t315' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t316' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>parsed</span> <span class='op'>=</span> <span class='nam'>parser</span><span class='op'>.</span><span class='nam'>parse</span><span class='op'>(</span><span class='nam'>stream</span><span class='op'>,</span> <span class='nam'>media_type</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>parser_context</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t317' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t318' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Parser classes may return the raw data, or a</span><span class='strut'>&nbsp;</span></p>
<p id='t319' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># DataAndFiles object.&nbsp; Unpack the result as required.</span><span class='strut'>&nbsp;</span></p>
<p id='t320' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t321' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>(</span><span class='nam'>parsed</span><span class='op'>.</span><span class='nam'>data</span><span class='op'>,</span> <span class='nam'>parsed</span><span class='op'>.</span><span class='nam'>files</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t322' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='nam'>AttributeError</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t323' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>empty_files</span> <span class='op'>=</span> <span class='nam'>MultiValueDict</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t324' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>(</span><span class='nam'>parsed</span><span class='op'>,</span> <span class='nam'>empty_files</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t325' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t326' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_authenticate</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t327' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t328' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Attempt to authenticate the request using each authentication instance</span><span class='strut'>&nbsp;</span></p>
<p id='t329' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; in turn.</span><span class='strut'>&nbsp;</span></p>
<p id='t330' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Returns a three-tuple of (authenticator, user, authtoken).</span><span class='strut'>&nbsp;</span></p>
<p id='t331' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t332' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>authenticator</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>authenticators</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t333' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t334' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>user_auth_tuple</span> <span class='op'>=</span> <span class='nam'>authenticator</span><span class='op'>.</span><span class='nam'>authenticate</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t335' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='nam'>exceptions</span><span class='op'>.</span><span class='nam'>APIException</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t336' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_not_authenticated</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t337' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span><span class='strut'>&nbsp;</span></p>
<p id='t338' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t339' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>user_auth_tuple</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t340' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_authenticator</span> <span class='op'>=</span> <span class='nam'>authenticator</span><span class='strut'>&nbsp;</span></p>
<p id='t341' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_user</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_auth</span> <span class='op'>=</span> <span class='nam'>user_auth_tuple</span><span class='strut'>&nbsp;</span></p>
<p id='t342' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
<p id='t343' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t344' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_not_authenticated</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t345' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t346' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_not_authenticated</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t347' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t348' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Return a three-tuple of (authenticator, user, authtoken), representing</span><span class='strut'>&nbsp;</span></p>
<p id='t349' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; an unauthenticated request.</span><span class='strut'>&nbsp;</span></p>
<p id='t350' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t351' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; By default this will be (None, AnonymousUser, None).</span><span class='strut'>&nbsp;</span></p>
<p id='t352' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t353' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_authenticator</span> <span class='op'>=</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
<p id='t354' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t355' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>api_settings</span><span class='op'>.</span><span class='nam'>UNAUTHENTICATED_USER</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t356' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_user</span> <span class='op'>=</span> <span class='nam'>api_settings</span><span class='op'>.</span><span class='nam'>UNAUTHENTICATED_USER</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t357' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t358' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_user</span> <span class='op'>=</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
<p id='t359' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t360' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>api_settings</span><span class='op'>.</span><span class='nam'>UNAUTHENTICATED_TOKEN</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t361' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_auth</span> <span class='op'>=</span> <span class='nam'>api_settings</span><span class='op'>.</span><span class='nam'>UNAUTHENTICATED_TOKEN</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t362' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t363' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_auth</span> <span class='op'>=</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
<p id='t364' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t365' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__getattr__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>attr</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t366' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t367' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Proxy other attributes to the underlying HttpRequest object.</span><span class='strut'>&nbsp;</span></p>
<p id='t368' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t369' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_request</span><span class='op'>,</span> <span class='nam'>attr</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
</td>
</tr>
</table>
</div>
<div id='footer'>
<div class='content'>
<p>
<a class='nav' href='index.html'>&#xab; index</a> &nbsp; &nbsp; <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.5.1</a>
</p>
</div>
</div>
</body>
</html>

View File

@ -1,249 +0,0 @@
<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
<title>Coverage for rest_framework/response: 98%</title>
<link rel='stylesheet' href='style.css' type='text/css'>
<script type='text/javascript' src='jquery-1.4.3.min.js'></script>
<script type='text/javascript' src='jquery.hotkeys.js'></script>
<script type='text/javascript' src='jquery.isonscreen.js'></script>
<script type='text/javascript' src='coverage_html.js'></script>
<script type='text/javascript' charset='utf-8'>
jQuery(document).ready(coverage.pyfile_ready);
</script>
</head>
<body id='pyfile'>
<div id='header'>
<div class='content'>
<h1>Coverage for <b>rest_framework/response</b> :
<span class='pc_cov'>98%</span>
</h1>
<img id='keyboard_icon' src='keybd_closed.png'>
<h2 class='stats'>
42 statements
<span class='run hide_run shortkey_r' onclick='coverage.toggle_lines(this, "run")'>41 run</span>
<span class='mis shortkey_m' onclick='coverage.toggle_lines(this, "mis")'>1 missing</span>
<span class='exc shortkey_x' onclick='coverage.toggle_lines(this, "exc")'>0 excluded</span>
</h2>
</div>
</div>
<div class='help_panel'>
<img id='panel_icon' src='keybd_open.png'>
<p class='legend'>Hot-keys on this page</p>
<div>
<p class='keyhelp'>
<span class='key'>r</span>
<span class='key'>m</span>
<span class='key'>x</span>
<span class='key'>p</span> &nbsp; toggle line displays
</p>
<p class='keyhelp'>
<span class='key'>j</span>
<span class='key'>k</span> &nbsp; next/prev highlighted chunk
</p>
<p class='keyhelp'>
<span class='key'>0</span> &nbsp; (zero) top of page
</p>
<p class='keyhelp'>
<span class='key'>1</span> &nbsp; (one) first highlighted chunk
</p>
</div>
</div>
<div id='source'>
<table cellspacing='0' cellpadding='0'>
<tr>
<td class='linenos' valign='top'>
<p id='n1' class='pln'><a href='#n1'>1</a></p>
<p id='n2' class='pln'><a href='#n2'>2</a></p>
<p id='n3' class='pln'><a href='#n3'>3</a></p>
<p id='n4' class='pln'><a href='#n4'>4</a></p>
<p id='n5' class='pln'><a href='#n5'>5</a></p>
<p id='n6' class='pln'><a href='#n6'>6</a></p>
<p id='n7' class='stm run hide_run'><a href='#n7'>7</a></p>
<p id='n8' class='stm run hide_run'><a href='#n8'>8</a></p>
<p id='n9' class='stm run hide_run'><a href='#n9'>9</a></p>
<p id='n10' class='stm run hide_run'><a href='#n10'>10</a></p>
<p id='n11' class='pln'><a href='#n11'>11</a></p>
<p id='n12' class='pln'><a href='#n12'>12</a></p>
<p id='n13' class='stm run hide_run'><a href='#n13'>13</a></p>
<p id='n14' class='pln'><a href='#n14'>14</a></p>
<p id='n15' class='pln'><a href='#n15'>15</a></p>
<p id='n16' class='pln'><a href='#n16'>16</a></p>
<p id='n17' class='pln'><a href='#n17'>17</a></p>
<p id='n18' class='pln'><a href='#n18'>18</a></p>
<p id='n19' class='stm run hide_run'><a href='#n19'>19</a></p>
<p id='n20' class='pln'><a href='#n20'>20</a></p>
<p id='n21' class='pln'><a href='#n21'>21</a></p>
<p id='n22' class='pln'><a href='#n22'>22</a></p>
<p id='n23' class='pln'><a href='#n23'>23</a></p>
<p id='n24' class='pln'><a href='#n24'>24</a></p>
<p id='n25' class='pln'><a href='#n25'>25</a></p>
<p id='n26' class='pln'><a href='#n26'>26</a></p>
<p id='n27' class='pln'><a href='#n27'>27</a></p>
<p id='n28' class='pln'><a href='#n28'>28</a></p>
<p id='n29' class='stm run hide_run'><a href='#n29'>29</a></p>
<p id='n30' class='stm run hide_run'><a href='#n30'>30</a></p>
<p id='n31' class='stm run hide_run'><a href='#n31'>31</a></p>
<p id='n32' class='stm run hide_run'><a href='#n32'>32</a></p>
<p id='n33' class='stm run hide_run'><a href='#n33'>33</a></p>
<p id='n34' class='pln'><a href='#n34'>34</a></p>
<p id='n35' class='stm run hide_run'><a href='#n35'>35</a></p>
<p id='n36' class='stm run hide_run'><a href='#n36'>36</a></p>
<p id='n37' class='stm run hide_run'><a href='#n37'>37</a></p>
<p id='n38' class='pln'><a href='#n38'>38</a></p>
<p id='n39' class='stm run hide_run'><a href='#n39'>39</a></p>
<p id='n40' class='pln'><a href='#n40'>40</a></p>
<p id='n41' class='stm run hide_run'><a href='#n41'>41</a></p>
<p id='n42' class='stm run hide_run'><a href='#n42'>42</a></p>
<p id='n43' class='stm run hide_run'><a href='#n43'>43</a></p>
<p id='n44' class='pln'><a href='#n44'>44</a></p>
<p id='n45' class='stm run hide_run'><a href='#n45'>45</a></p>
<p id='n46' class='stm run hide_run'><a href='#n46'>46</a></p>
<p id='n47' class='stm run hide_run'><a href='#n47'>47</a></p>
<p id='n48' class='stm run hide_run'><a href='#n48'>48</a></p>
<p id='n49' class='pln'><a href='#n49'>49</a></p>
<p id='n50' class='stm run hide_run'><a href='#n50'>50</a></p>
<p id='n51' class='stm run hide_run'><a href='#n51'>51</a></p>
<p id='n52' class='pln'><a href='#n52'>52</a></p>
<p id='n53' class='stm run hide_run'><a href='#n53'>53</a></p>
<p id='n54' class='stm run hide_run'><a href='#n54'>54</a></p>
<p id='n55' class='stm run hide_run'><a href='#n55'>55</a></p>
<p id='n56' class='stm mis'><a href='#n56'>56</a></p>
<p id='n57' class='stm run hide_run'><a href='#n57'>57</a></p>
<p id='n58' class='pln'><a href='#n58'>58</a></p>
<p id='n59' class='stm run hide_run'><a href='#n59'>59</a></p>
<p id='n60' class='stm run hide_run'><a href='#n60'>60</a></p>
<p id='n61' class='stm run hide_run'><a href='#n61'>61</a></p>
<p id='n62' class='pln'><a href='#n62'>62</a></p>
<p id='n63' class='stm run hide_run'><a href='#n63'>63</a></p>
<p id='n64' class='stm run hide_run'><a href='#n64'>64</a></p>
<p id='n65' class='pln'><a href='#n65'>65</a></p>
<p id='n66' class='stm run hide_run'><a href='#n66'>66</a></p>
<p id='n67' class='pln'><a href='#n67'>67</a></p>
<p id='n68' class='pln'><a href='#n68'>68</a></p>
<p id='n69' class='pln'><a href='#n69'>69</a></p>
<p id='n70' class='pln'><a href='#n70'>70</a></p>
<p id='n71' class='pln'><a href='#n71'>71</a></p>
<p id='n72' class='pln'><a href='#n72'>72</a></p>
<p id='n73' class='pln'><a href='#n73'>73</a></p>
<p id='n74' class='stm run hide_run'><a href='#n74'>74</a></p>
<p id='n75' class='pln'><a href='#n75'>75</a></p>
<p id='n76' class='stm run hide_run'><a href='#n76'>76</a></p>
<p id='n77' class='pln'><a href='#n77'>77</a></p>
<p id='n78' class='pln'><a href='#n78'>78</a></p>
<p id='n79' class='pln'><a href='#n79'>79</a></p>
<p id='n80' class='stm run hide_run'><a href='#n80'>80</a></p>
<p id='n81' class='stm run hide_run'><a href='#n81'>81</a></p>
<p id='n82' class='stm run hide_run'><a href='#n82'>82</a></p>
<p id='n83' class='stm run hide_run'><a href='#n83'>83</a></p>
<p id='n84' class='stm run hide_run'><a href='#n84'>84</a></p>
</td>
<td class='text' valign='top'>
<p id='t1' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t2' class='pln'><span class='str'>The Response class in REST framework is similar to HTTPResponse, except that</span><span class='strut'>&nbsp;</span></p>
<p id='t3' class='pln'><span class='str'>it is initialized with unrendered data, instead of a pre-rendered string.</span><span class='strut'>&nbsp;</span></p>
<p id='t4' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t5' class='pln'><span class='str'>The appropriate renderer is called during Django&#39;s template response rendering.</span><span class='strut'>&nbsp;</span></p>
<p id='t6' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t7' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>__future__</span> <span class='key'>import</span> <span class='nam'>unicode_literals</span><span class='strut'>&nbsp;</span></p>
<p id='t8' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>django</span><span class='op'>.</span><span class='nam'>core</span><span class='op'>.</span><span class='nam'>handlers</span><span class='op'>.</span><span class='nam'>wsgi</span> <span class='key'>import</span> <span class='nam'>STATUS_CODE_TEXT</span><span class='strut'>&nbsp;</span></p>
<p id='t9' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>django</span><span class='op'>.</span><span class='nam'>template</span><span class='op'>.</span><span class='nam'>response</span> <span class='key'>import</span> <span class='nam'>SimpleTemplateResponse</span><span class='strut'>&nbsp;</span></p>
<p id='t10' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>compat</span> <span class='key'>import</span> <span class='nam'>six</span><span class='strut'>&nbsp;</span></p>
<p id='t11' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t12' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t13' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>Response</span><span class='op'>(</span><span class='nam'>SimpleTemplateResponse</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t14' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t15' class='pln'><span class='str'>&nbsp; &nbsp; An HttpResponse that allows its data to be rendered into</span><span class='strut'>&nbsp;</span></p>
<p id='t16' class='pln'><span class='str'>&nbsp; &nbsp; arbitrary media types.</span><span class='strut'>&nbsp;</span></p>
<p id='t17' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t18' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t19' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>data</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>status</span><span class='op'>=</span><span class='num'>200</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t20' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <span class='nam'>template_name</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>headers</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t21' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <span class='nam'>exception</span><span class='op'>=</span><span class='nam'>False</span><span class='op'>,</span> <span class='nam'>content_type</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t22' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t23' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Alters the init arguments slightly.</span><span class='strut'>&nbsp;</span></p>
<p id='t24' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; For example, drop &#39;template_name&#39;, and instead use &#39;data&#39;.</span><span class='strut'>&nbsp;</span></p>
<p id='t25' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t26' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Setting &#39;renderer&#39; and &#39;media_type&#39; will typically be deferred,</span><span class='strut'>&nbsp;</span></p>
<p id='t27' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; For example being set automatically by the `APIView`.</span><span class='strut'>&nbsp;</span></p>
<p id='t28' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t29' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>super</span><span class='op'>(</span><span class='nam'>Response</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>status</span><span class='op'>=</span><span class='nam'>status</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t30' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>data</span> <span class='op'>=</span> <span class='nam'>data</span><span class='strut'>&nbsp;</span></p>
<p id='t31' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>template_name</span> <span class='op'>=</span> <span class='nam'>template_name</span><span class='strut'>&nbsp;</span></p>
<p id='t32' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>exception</span> <span class='op'>=</span> <span class='nam'>exception</span><span class='strut'>&nbsp;</span></p>
<p id='t33' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>content_type</span> <span class='op'>=</span> <span class='nam'>content_type</span><span class='strut'>&nbsp;</span></p>
<p id='t34' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t35' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>headers</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t36' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>name</span><span class='op'>,</span> <span class='nam'>value</span> <span class='key'>in</span> <span class='nam'>six</span><span class='op'>.</span><span class='nam'>iteritems</span><span class='op'>(</span><span class='nam'>headers</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t37' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>[</span><span class='nam'>name</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>value</span><span class='strut'>&nbsp;</span></p>
<p id='t38' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t39' class='stm run hide_run'>&nbsp; &nbsp; <span class='op'>@</span><span class='nam'>property</span><span class='strut'>&nbsp;</span></p>
<p id='t40' class='pln'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>rendered_content</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t41' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>renderer</span> <span class='op'>=</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='str'>&#39;accepted_renderer&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t42' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>media_type</span> <span class='op'>=</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='str'>&#39;accepted_media_type&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t43' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>context</span> <span class='op'>=</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='str'>&#39;renderer_context&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t44' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t45' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>assert</span> <span class='nam'>renderer</span><span class='op'>,</span> <span class='str'>&quot;.accepted_renderer not set on Response&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t46' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>assert</span> <span class='nam'>media_type</span><span class='op'>,</span> <span class='str'>&quot;.accepted_media_type not set on Response&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t47' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>assert</span> <span class='nam'>context</span><span class='op'>,</span> <span class='str'>&quot;.renderer_context not set on Response&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t48' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>context</span><span class='op'>[</span><span class='str'>&#39;response&#39;</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>self</span><span class='strut'>&nbsp;</span></p>
<p id='t49' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t50' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>charset</span> <span class='op'>=</span> <span class='nam'>renderer</span><span class='op'>.</span><span class='nam'>charset</span><span class='strut'>&nbsp;</span></p>
<p id='t51' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>content_type</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>content_type</span><span class='strut'>&nbsp;</span></p>
<p id='t52' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t53' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>content_type</span> <span class='key'>is</span> <span class='nam'>None</span> <span class='key'>and</span> <span class='nam'>charset</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t54' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>content_type</span> <span class='op'>=</span> <span class='str'>&quot;{0}; charset={1}&quot;</span><span class='op'>.</span><span class='nam'>format</span><span class='op'>(</span><span class='nam'>media_type</span><span class='op'>,</span> <span class='nam'>charset</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t55' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>elif</span> <span class='nam'>content_type</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t56' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>content_type</span> <span class='op'>=</span> <span class='nam'>media_type</span><span class='strut'>&nbsp;</span></p>
<p id='t57' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>[</span><span class='str'>&#39;Content-Type&#39;</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>content_type</span><span class='strut'>&nbsp;</span></p>
<p id='t58' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t59' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ret</span> <span class='op'>=</span> <span class='nam'>renderer</span><span class='op'>.</span><span class='nam'>render</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>data</span><span class='op'>,</span> <span class='nam'>media_type</span><span class='op'>,</span> <span class='nam'>context</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t60' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>ret</span><span class='op'>,</span> <span class='nam'>six</span><span class='op'>.</span><span class='nam'>text_type</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t61' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>assert</span> <span class='nam'>charset</span><span class='op'>,</span> <span class='str'>&#39;renderer returned unicode, and did not specify &#39;</span> <span class='xx'>\</span><span class='strut'>&nbsp;</span></p>
<p id='t62' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;a charset value.&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t63' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>bytes</span><span class='op'>(</span><span class='nam'>ret</span><span class='op'>.</span><span class='nam'>encode</span><span class='op'>(</span><span class='nam'>charset</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t64' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>ret</span><span class='strut'>&nbsp;</span></p>
<p id='t65' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t66' class='stm run hide_run'>&nbsp; &nbsp; <span class='op'>@</span><span class='nam'>property</span><span class='strut'>&nbsp;</span></p>
<p id='t67' class='pln'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>status_text</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t68' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t69' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Returns reason text corresponding to our HTTP response status code.</span><span class='strut'>&nbsp;</span></p>
<p id='t70' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Provided for convenience.</span><span class='strut'>&nbsp;</span></p>
<p id='t71' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t72' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># TODO: Deprecate and use a template tag instead</span><span class='strut'>&nbsp;</span></p>
<p id='t73' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># TODO: Status code text for RFC 6585 status codes</span><span class='strut'>&nbsp;</span></p>
<p id='t74' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>STATUS_CODE_TEXT</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>status_code</span><span class='op'>,</span> <span class='str'>&#39;&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t75' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t76' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__getstate__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t77' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t78' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Remove attributes from the response that shouldn&#39;t be cached</span><span class='strut'>&nbsp;</span></p>
<p id='t79' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t80' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>state</span> <span class='op'>=</span> <span class='nam'>super</span><span class='op'>(</span><span class='nam'>Response</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>__getstate__</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t81' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>key</span> <span class='key'>in</span> <span class='op'>(</span><span class='str'>&#39;accepted_renderer&#39;</span><span class='op'>,</span> <span class='str'>&#39;renderer_context&#39;</span><span class='op'>,</span> <span class='str'>&#39;data&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t82' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>key</span> <span class='key'>in</span> <span class='nam'>state</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t83' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>del</span> <span class='nam'>state</span><span class='op'>[</span><span class='nam'>key</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t84' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>state</span><span class='strut'>&nbsp;</span></p>
</td>
</tr>
</table>
</div>
<div id='footer'>
<div class='content'>
<p>
<a class='nav' href='index.html'>&#xab; index</a> &nbsp; &nbsp; <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.5.1</a>
</p>
</div>
</div>
</body>
</html>

View File

@ -1,127 +0,0 @@
<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
<title>Coverage for rest_framework/reverse: 75%</title>
<link rel='stylesheet' href='style.css' type='text/css'>
<script type='text/javascript' src='jquery-1.4.3.min.js'></script>
<script type='text/javascript' src='jquery.hotkeys.js'></script>
<script type='text/javascript' src='jquery.isonscreen.js'></script>
<script type='text/javascript' src='coverage_html.js'></script>
<script type='text/javascript' charset='utf-8'>
jQuery(document).ready(coverage.pyfile_ready);
</script>
</head>
<body id='pyfile'>
<div id='header'>
<div class='content'>
<h1>Coverage for <b>rest_framework/reverse</b> :
<span class='pc_cov'>75%</span>
</h1>
<img id='keyboard_icon' src='keybd_closed.png'>
<h2 class='stats'>
12 statements
<span class='run hide_run shortkey_r' onclick='coverage.toggle_lines(this, "run")'>9 run</span>
<span class='mis shortkey_m' onclick='coverage.toggle_lines(this, "mis")'>3 missing</span>
<span class='exc shortkey_x' onclick='coverage.toggle_lines(this, "exc")'>0 excluded</span>
</h2>
</div>
</div>
<div class='help_panel'>
<img id='panel_icon' src='keybd_open.png'>
<p class='legend'>Hot-keys on this page</p>
<div>
<p class='keyhelp'>
<span class='key'>r</span>
<span class='key'>m</span>
<span class='key'>x</span>
<span class='key'>p</span> &nbsp; toggle line displays
</p>
<p class='keyhelp'>
<span class='key'>j</span>
<span class='key'>k</span> &nbsp; next/prev highlighted chunk
</p>
<p class='keyhelp'>
<span class='key'>0</span> &nbsp; (zero) top of page
</p>
<p class='keyhelp'>
<span class='key'>1</span> &nbsp; (one) first highlighted chunk
</p>
</div>
</div>
<div id='source'>
<table cellspacing='0' cellpadding='0'>
<tr>
<td class='linenos' valign='top'>
<p id='n1' class='pln'><a href='#n1'>1</a></p>
<p id='n2' class='pln'><a href='#n2'>2</a></p>
<p id='n3' class='pln'><a href='#n3'>3</a></p>
<p id='n4' class='stm run hide_run'><a href='#n4'>4</a></p>
<p id='n5' class='stm run hide_run'><a href='#n5'>5</a></p>
<p id='n6' class='stm run hide_run'><a href='#n6'>6</a></p>
<p id='n7' class='pln'><a href='#n7'>7</a></p>
<p id='n8' class='pln'><a href='#n8'>8</a></p>
<p id='n9' class='stm run hide_run'><a href='#n9'>9</a></p>
<p id='n10' class='pln'><a href='#n10'>10</a></p>
<p id='n11' class='pln'><a href='#n11'>11</a></p>
<p id='n12' class='pln'><a href='#n12'>12</a></p>
<p id='n13' class='pln'><a href='#n13'>13</a></p>
<p id='n14' class='stm run hide_run'><a href='#n14'>14</a></p>
<p id='n15' class='stm mis'><a href='#n15'>15</a></p>
<p id='n16' class='stm mis'><a href='#n16'>16</a></p>
<p id='n17' class='stm run hide_run'><a href='#n17'>17</a></p>
<p id='n18' class='stm run hide_run'><a href='#n18'>18</a></p>
<p id='n19' class='stm run hide_run'><a href='#n19'>19</a></p>
<p id='n20' class='stm mis'><a href='#n20'>20</a></p>
<p id='n21' class='pln'><a href='#n21'>21</a></p>
<p id='n22' class='pln'><a href='#n22'>22</a></p>
<p id='n23' class='stm run hide_run'><a href='#n23'>23</a></p>
</td>
<td class='text' valign='top'>
<p id='t1' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t2' class='pln'><span class='str'>Provide reverse functions that return fully qualified URLs</span><span class='strut'>&nbsp;</span></p>
<p id='t3' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t4' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>__future__</span> <span class='key'>import</span> <span class='nam'>unicode_literals</span><span class='strut'>&nbsp;</span></p>
<p id='t5' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>django</span><span class='op'>.</span><span class='nam'>core</span><span class='op'>.</span><span class='nam'>urlresolvers</span> <span class='key'>import</span> <span class='nam'>reverse</span> <span class='key'>as</span> <span class='nam'>django_reverse</span><span class='strut'>&nbsp;</span></p>
<p id='t6' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>django</span><span class='op'>.</span><span class='nam'>utils</span><span class='op'>.</span><span class='nam'>functional</span> <span class='key'>import</span> <span class='nam'>lazy</span><span class='strut'>&nbsp;</span></p>
<p id='t7' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t8' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t9' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>reverse</span><span class='op'>(</span><span class='nam'>viewname</span><span class='op'>,</span> <span class='nam'>args</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>kwargs</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>format</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>extra</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t10' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t11' class='pln'><span class='str'>&nbsp; &nbsp; Same as `django.core.urlresolvers.reverse`, but optionally takes a request</span><span class='strut'>&nbsp;</span></p>
<p id='t12' class='pln'><span class='str'>&nbsp; &nbsp; and returns a fully qualified URL, using the request to get the base URL.</span><span class='strut'>&nbsp;</span></p>
<p id='t13' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t14' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>format</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t15' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>kwargs</span> <span class='op'>=</span> <span class='nam'>kwargs</span> <span class='key'>or</span> <span class='op'>{</span><span class='op'>}</span><span class='strut'>&nbsp;</span></p>
<p id='t16' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>kwargs</span><span class='op'>[</span><span class='str'>&#39;format&#39;</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>format</span><span class='strut'>&nbsp;</span></p>
<p id='t17' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>url</span> <span class='op'>=</span> <span class='nam'>django_reverse</span><span class='op'>(</span><span class='nam'>viewname</span><span class='op'>,</span> <span class='nam'>args</span><span class='op'>=</span><span class='nam'>args</span><span class='op'>,</span> <span class='nam'>kwargs</span><span class='op'>=</span><span class='nam'>kwargs</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>extra</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t18' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>request</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t19' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>build_absolute_uri</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t20' class='stm mis'>&nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>url</span><span class='strut'>&nbsp;</span></p>
<p id='t21' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t22' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t23' class='stm run hide_run'><span class='nam'>reverse_lazy</span> <span class='op'>=</span> <span class='nam'>lazy</span><span class='op'>(</span><span class='nam'>reverse</span><span class='op'>,</span> <span class='nam'>str</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
</td>
</tr>
</table>
</div>
<div id='footer'>
<div class='content'>
<p>
<a class='nav' href='index.html'>&#xab; index</a> &nbsp; &nbsp; <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.5.1</a>
</p>
</div>
</div>
</body>
</html>

View File

@ -1,595 +0,0 @@
<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
<title>Coverage for rest_framework/routers: 94%</title>
<link rel='stylesheet' href='style.css' type='text/css'>
<script type='text/javascript' src='jquery-1.4.3.min.js'></script>
<script type='text/javascript' src='jquery.hotkeys.js'></script>
<script type='text/javascript' src='jquery.isonscreen.js'></script>
<script type='text/javascript' src='coverage_html.js'></script>
<script type='text/javascript' charset='utf-8'>
jQuery(document).ready(coverage.pyfile_ready);
</script>
</head>
<body id='pyfile'>
<div id='header'>
<div class='content'>
<h1>Coverage for <b>rest_framework/routers</b> :
<span class='pc_cov'>94%</span>
</h1>
<img id='keyboard_icon' src='keybd_closed.png'>
<h2 class='stats'>
108 statements
<span class='run hide_run shortkey_r' onclick='coverage.toggle_lines(this, "run")'>101 run</span>
<span class='mis shortkey_m' onclick='coverage.toggle_lines(this, "mis")'>7 missing</span>
<span class='exc shortkey_x' onclick='coverage.toggle_lines(this, "exc")'>0 excluded</span>
</h2>
</div>
</div>
<div class='help_panel'>
<img id='panel_icon' src='keybd_open.png'>
<p class='legend'>Hot-keys on this page</p>
<div>
<p class='keyhelp'>
<span class='key'>r</span>
<span class='key'>m</span>
<span class='key'>x</span>
<span class='key'>p</span> &nbsp; toggle line displays
</p>
<p class='keyhelp'>
<span class='key'>j</span>
<span class='key'>k</span> &nbsp; next/prev highlighted chunk
</p>
<p class='keyhelp'>
<span class='key'>0</span> &nbsp; (zero) top of page
</p>
<p class='keyhelp'>
<span class='key'>1</span> &nbsp; (one) first highlighted chunk
</p>
</div>
</div>
<div id='source'>
<table cellspacing='0' cellpadding='0'>
<tr>
<td class='linenos' valign='top'>
<p id='n1' class='pln'><a href='#n1'>1</a></p>
<p id='n2' class='pln'><a href='#n2'>2</a></p>
<p id='n3' class='pln'><a href='#n3'>3</a></p>
<p id='n4' class='pln'><a href='#n4'>4</a></p>
<p id='n5' class='pln'><a href='#n5'>5</a></p>
<p id='n6' class='pln'><a href='#n6'>6</a></p>
<p id='n7' class='pln'><a href='#n7'>7</a></p>
<p id='n8' class='pln'><a href='#n8'>8</a></p>
<p id='n9' class='pln'><a href='#n9'>9</a></p>
<p id='n10' class='pln'><a href='#n10'>10</a></p>
<p id='n11' class='pln'><a href='#n11'>11</a></p>
<p id='n12' class='pln'><a href='#n12'>12</a></p>
<p id='n13' class='pln'><a href='#n13'>13</a></p>
<p id='n14' class='pln'><a href='#n14'>14</a></p>
<p id='n15' class='pln'><a href='#n15'>15</a></p>
<p id='n16' class='stm run hide_run'><a href='#n16'>16</a></p>
<p id='n17' class='pln'><a href='#n17'>17</a></p>
<p id='n18' class='stm run hide_run'><a href='#n18'>18</a></p>
<p id='n19' class='stm run hide_run'><a href='#n19'>19</a></p>
<p id='n20' class='stm run hide_run'><a href='#n20'>20</a></p>
<p id='n21' class='stm run hide_run'><a href='#n21'>21</a></p>
<p id='n22' class='stm run hide_run'><a href='#n22'>22</a></p>
<p id='n23' class='stm run hide_run'><a href='#n23'>23</a></p>
<p id='n24' class='pln'><a href='#n24'>24</a></p>
<p id='n25' class='pln'><a href='#n25'>25</a></p>
<p id='n26' class='stm run hide_run'><a href='#n26'>26</a></p>
<p id='n27' class='pln'><a href='#n27'>27</a></p>
<p id='n28' class='pln'><a href='#n28'>28</a></p>
<p id='n29' class='stm run hide_run'><a href='#n29'>29</a></p>
<p id='n30' class='pln'><a href='#n30'>30</a></p>
<p id='n31' class='pln'><a href='#n31'>31</a></p>
<p id='n32' class='pln'><a href='#n32'>32</a></p>
<p id='n33' class='pln'><a href='#n33'>33</a></p>
<p id='n34' class='stm run hide_run'><a href='#n34'>34</a></p>
<p id='n35' class='stm run hide_run'><a href='#n35'>35</a></p>
<p id='n36' class='stm run hide_run'><a href='#n36'>36</a></p>
<p id='n37' class='stm run hide_run'><a href='#n37'>37</a></p>
<p id='n38' class='stm run hide_run'><a href='#n38'>38</a></p>
<p id='n39' class='pln'><a href='#n39'>39</a></p>
<p id='n40' class='pln'><a href='#n40'>40</a></p>
<p id='n41' class='stm run hide_run'><a href='#n41'>41</a></p>
<p id='n42' class='stm run hide_run'><a href='#n42'>42</a></p>
<p id='n43' class='stm run hide_run'><a href='#n43'>43</a></p>
<p id='n44' class='pln'><a href='#n44'>44</a></p>
<p id='n45' class='stm run hide_run'><a href='#n45'>45</a></p>
<p id='n46' class='stm run hide_run'><a href='#n46'>46</a></p>
<p id='n47' class='stm run hide_run'><a href='#n47'>47</a></p>
<p id='n48' class='stm run hide_run'><a href='#n48'>48</a></p>
<p id='n49' class='pln'><a href='#n49'>49</a></p>
<p id='n50' class='stm run hide_run'><a href='#n50'>50</a></p>
<p id='n51' class='pln'><a href='#n51'>51</a></p>
<p id='n52' class='pln'><a href='#n52'>52</a></p>
<p id='n53' class='pln'><a href='#n53'>53</a></p>
<p id='n54' class='pln'><a href='#n54'>54</a></p>
<p id='n55' class='stm mis'><a href='#n55'>55</a></p>
<p id='n56' class='pln'><a href='#n56'>56</a></p>
<p id='n57' class='stm run hide_run'><a href='#n57'>57</a></p>
<p id='n58' class='pln'><a href='#n58'>58</a></p>
<p id='n59' class='pln'><a href='#n59'>59</a></p>
<p id='n60' class='pln'><a href='#n60'>60</a></p>
<p id='n61' class='stm mis'><a href='#n61'>61</a></p>
<p id='n62' class='pln'><a href='#n62'>62</a></p>
<p id='n63' class='stm run hide_run'><a href='#n63'>63</a></p>
<p id='n64' class='pln'><a href='#n64'>64</a></p>
<p id='n65' class='stm run hide_run'><a href='#n65'>65</a></p>
<p id='n66' class='stm run hide_run'><a href='#n66'>66</a></p>
<p id='n67' class='stm run hide_run'><a href='#n67'>67</a></p>
<p id='n68' class='pln'><a href='#n68'>68</a></p>
<p id='n69' class='pln'><a href='#n69'>69</a></p>
<p id='n70' class='stm run hide_run'><a href='#n70'>70</a></p>
<p id='n71' class='stm run hide_run'><a href='#n71'>71</a></p>
<p id='n72' class='pln'><a href='#n72'>72</a></p>
<p id='n73' class='pln'><a href='#n73'>73</a></p>
<p id='n74' class='pln'><a href='#n74'>74</a></p>
<p id='n75' class='pln'><a href='#n75'>75</a></p>
<p id='n76' class='pln'><a href='#n76'>76</a></p>
<p id='n77' class='pln'><a href='#n77'>77</a></p>
<p id='n78' class='pln'><a href='#n78'>78</a></p>
<p id='n79' class='pln'><a href='#n79'>79</a></p>
<p id='n80' class='pln'><a href='#n80'>80</a></p>
<p id='n81' class='pln'><a href='#n81'>81</a></p>
<p id='n82' class='pln'><a href='#n82'>82</a></p>
<p id='n83' class='pln'><a href='#n83'>83</a></p>
<p id='n84' class='pln'><a href='#n84'>84</a></p>
<p id='n85' class='pln'><a href='#n85'>85</a></p>
<p id='n86' class='pln'><a href='#n86'>86</a></p>
<p id='n87' class='pln'><a href='#n87'>87</a></p>
<p id='n88' class='pln'><a href='#n88'>88</a></p>
<p id='n89' class='pln'><a href='#n89'>89</a></p>
<p id='n90' class='pln'><a href='#n90'>90</a></p>
<p id='n91' class='pln'><a href='#n91'>91</a></p>
<p id='n92' class='pln'><a href='#n92'>92</a></p>
<p id='n93' class='pln'><a href='#n93'>93</a></p>
<p id='n94' class='pln'><a href='#n94'>94</a></p>
<p id='n95' class='pln'><a href='#n95'>95</a></p>
<p id='n96' class='pln'><a href='#n96'>96</a></p>
<p id='n97' class='pln'><a href='#n97'>97</a></p>
<p id='n98' class='pln'><a href='#n98'>98</a></p>
<p id='n99' class='pln'><a href='#n99'>99</a></p>
<p id='n100' class='pln'><a href='#n100'>100</a></p>
<p id='n101' class='pln'><a href='#n101'>101</a></p>
<p id='n102' class='pln'><a href='#n102'>102</a></p>
<p id='n103' class='pln'><a href='#n103'>103</a></p>
<p id='n104' class='pln'><a href='#n104'>104</a></p>
<p id='n105' class='pln'><a href='#n105'>105</a></p>
<p id='n106' class='stm run hide_run'><a href='#n106'>106</a></p>
<p id='n107' class='stm run hide_run'><a href='#n107'>107</a></p>
<p id='n108' class='stm run hide_run'><a href='#n108'>108</a></p>
<p id='n109' class='pln'><a href='#n109'>109</a></p>
<p id='n110' class='stm run hide_run'><a href='#n110'>110</a></p>
<p id='n111' class='pln'><a href='#n111'>111</a></p>
<p id='n112' class='pln'><a href='#n112'>112</a></p>
<p id='n113' class='pln'><a href='#n113'>113</a></p>
<p id='n114' class='pln'><a href='#n114'>114</a></p>
<p id='n115' class='stm run hide_run'><a href='#n115'>115</a></p>
<p id='n116' class='stm run hide_run'><a href='#n116'>116</a></p>
<p id='n117' class='stm run hide_run'><a href='#n117'>117</a></p>
<p id='n118' class='stm run hide_run'><a href='#n118'>118</a></p>
<p id='n119' class='pln'><a href='#n119'>119</a></p>
<p id='n120' class='stm run hide_run'><a href='#n120'>120</a></p>
<p id='n121' class='pln'><a href='#n121'>121</a></p>
<p id='n122' class='pln'><a href='#n122'>122</a></p>
<p id='n123' class='pln'><a href='#n123'>123</a></p>
<p id='n124' class='stm run hide_run'><a href='#n124'>124</a></p>
<p id='n125' class='pln'><a href='#n125'>125</a></p>
<p id='n126' class='stm run hide_run'><a href='#n126'>126</a></p>
<p id='n127' class='pln'><a href='#n127'>127</a></p>
<p id='n128' class='pln'><a href='#n128'>128</a></p>
<p id='n129' class='pln'><a href='#n129'>129</a></p>
<p id='n130' class='pln'><a href='#n130'>130</a></p>
<p id='n131' class='pln'><a href='#n131'>131</a></p>
<p id='n132' class='pln'><a href='#n132'>132</a></p>
<p id='n133' class='pln'><a href='#n133'>133</a></p>
<p id='n134' class='stm run hide_run'><a href='#n134'>134</a></p>
<p id='n135' class='stm run hide_run'><a href='#n135'>135</a></p>
<p id='n136' class='stm run hide_run'><a href='#n136'>136</a></p>
<p id='n137' class='stm run hide_run'><a href='#n137'>137</a></p>
<p id='n138' class='stm run hide_run'><a href='#n138'>138</a></p>
<p id='n139' class='stm run hide_run'><a href='#n139'>139</a></p>
<p id='n140' class='pln'><a href='#n140'>140</a></p>
<p id='n141' class='stm run hide_run'><a href='#n141'>141</a></p>
<p id='n142' class='stm run hide_run'><a href='#n142'>142</a></p>
<p id='n143' class='stm run hide_run'><a href='#n143'>143</a></p>
<p id='n144' class='pln'><a href='#n144'>144</a></p>
<p id='n145' class='stm run hide_run'><a href='#n145'>145</a></p>
<p id='n146' class='stm run hide_run'><a href='#n146'>146</a></p>
<p id='n147' class='stm run hide_run'><a href='#n147'>147</a></p>
<p id='n148' class='stm run hide_run'><a href='#n148'>148</a></p>
<p id='n149' class='pln'><a href='#n149'>149</a></p>
<p id='n150' class='pln'><a href='#n150'>150</a></p>
<p id='n151' class='pln'><a href='#n151'>151</a></p>
<p id='n152' class='pln'><a href='#n152'>152</a></p>
<p id='n153' class='pln'><a href='#n153'>153</a></p>
<p id='n154' class='pln'><a href='#n154'>154</a></p>
<p id='n155' class='pln'><a href='#n155'>155</a></p>
<p id='n156' class='stm run hide_run'><a href='#n156'>156</a></p>
<p id='n157' class='pln'><a href='#n157'>157</a></p>
<p id='n158' class='stm run hide_run'><a href='#n158'>158</a></p>
<p id='n159' class='pln'><a href='#n159'>159</a></p>
<p id='n160' class='stm run hide_run'><a href='#n160'>160</a></p>
<p id='n161' class='pln'><a href='#n161'>161</a></p>
<p id='n162' class='pln'><a href='#n162'>162</a></p>
<p id='n163' class='pln'><a href='#n163'>163</a></p>
<p id='n164' class='pln'><a href='#n164'>164</a></p>
<p id='n165' class='pln'><a href='#n165'>165</a></p>
<p id='n166' class='stm run hide_run'><a href='#n166'>166</a></p>
<p id='n167' class='stm run hide_run'><a href='#n167'>167</a></p>
<p id='n168' class='stm run hide_run'><a href='#n168'>168</a></p>
<p id='n169' class='stm run hide_run'><a href='#n169'>169</a></p>
<p id='n170' class='stm run hide_run'><a href='#n170'>170</a></p>
<p id='n171' class='pln'><a href='#n171'>171</a></p>
<p id='n172' class='stm run hide_run'><a href='#n172'>172</a></p>
<p id='n173' class='pln'><a href='#n173'>173</a></p>
<p id='n174' class='pln'><a href='#n174'>174</a></p>
<p id='n175' class='pln'><a href='#n175'>175</a></p>
<p id='n176' class='pln'><a href='#n176'>176</a></p>
<p id='n177' class='stm run hide_run'><a href='#n177'>177</a></p>
<p id='n178' class='stm run hide_run'><a href='#n178'>178</a></p>
<p id='n179' class='stm run hide_run'><a href='#n179'>179</a></p>
<p id='n180' class='pln'><a href='#n180'>180</a></p>
<p id='n181' class='stm run hide_run'><a href='#n181'>181</a></p>
<p id='n182' class='pln'><a href='#n182'>182</a></p>
<p id='n183' class='pln'><a href='#n183'>183</a></p>
<p id='n184' class='pln'><a href='#n184'>184</a></p>
<p id='n185' class='stm run hide_run'><a href='#n185'>185</a></p>
<p id='n186' class='pln'><a href='#n186'>186</a></p>
<p id='n187' class='stm run hide_run'><a href='#n187'>187</a></p>
<p id='n188' class='stm run hide_run'><a href='#n188'>188</a></p>
<p id='n189' class='stm run hide_run'><a href='#n189'>189</a></p>
<p id='n190' class='pln'><a href='#n190'>190</a></p>
<p id='n191' class='stm run hide_run'><a href='#n191'>191</a></p>
<p id='n192' class='pln'><a href='#n192'>192</a></p>
<p id='n193' class='pln'><a href='#n193'>193</a></p>
<p id='n194' class='stm run hide_run'><a href='#n194'>194</a></p>
<p id='n195' class='stm run hide_run'><a href='#n195'>195</a></p>
<p id='n196' class='stm mis'><a href='#n196'>196</a></p>
<p id='n197' class='pln'><a href='#n197'>197</a></p>
<p id='n198' class='pln'><a href='#n198'>198</a></p>
<p id='n199' class='stm run hide_run'><a href='#n199'>199</a></p>
<p id='n200' class='pln'><a href='#n200'>200</a></p>
<p id='n201' class='pln'><a href='#n201'>201</a></p>
<p id='n202' class='pln'><a href='#n202'>202</a></p>
<p id='n203' class='pln'><a href='#n203'>203</a></p>
<p id='n204' class='stm run hide_run'><a href='#n204'>204</a></p>
<p id='n205' class='stm run hide_run'><a href='#n205'>205</a></p>
<p id='n206' class='stm run hide_run'><a href='#n206'>206</a></p>
<p id='n207' class='pln'><a href='#n207'>207</a></p>
<p id='n208' class='stm run hide_run'><a href='#n208'>208</a></p>
<p id='n209' class='pln'><a href='#n209'>209</a></p>
<p id='n210' class='pln'><a href='#n210'>210</a></p>
<p id='n211' class='stm run hide_run'><a href='#n211'>211</a></p>
<p id='n212' class='pln'><a href='#n212'>212</a></p>
<p id='n213' class='pln'><a href='#n213'>213</a></p>
<p id='n214' class='pln'><a href='#n214'>214</a></p>
<p id='n215' class='pln'><a href='#n215'>215</a></p>
<p id='n216' class='stm run hide_run'><a href='#n216'>216</a></p>
<p id='n217' class='stm run hide_run'><a href='#n217'>217</a></p>
<p id='n218' class='stm run hide_run'><a href='#n218'>218</a></p>
<p id='n219' class='pln'><a href='#n219'>219</a></p>
<p id='n220' class='stm run hide_run'><a href='#n220'>220</a></p>
<p id='n221' class='pln'><a href='#n221'>221</a></p>
<p id='n222' class='pln'><a href='#n222'>222</a></p>
<p id='n223' class='pln'><a href='#n223'>223</a></p>
<p id='n224' class='stm run hide_run'><a href='#n224'>224</a></p>
<p id='n225' class='stm run hide_run'><a href='#n225'>225</a></p>
<p id='n226' class='stm run hide_run'><a href='#n226'>226</a></p>
<p id='n227' class='stm run hide_run'><a href='#n227'>227</a></p>
<p id='n228' class='pln'><a href='#n228'>228</a></p>
<p id='n229' class='stm run hide_run'><a href='#n229'>229</a></p>
<p id='n230' class='stm run hide_run'><a href='#n230'>230</a></p>
<p id='n231' class='pln'><a href='#n231'>231</a></p>
<p id='n232' class='stm run hide_run'><a href='#n232'>232</a></p>
<p id='n233' class='stm mis'><a href='#n233'>233</a></p>
<p id='n234' class='stm mis'><a href='#n234'>234</a></p>
<p id='n235' class='stm mis'><a href='#n235'>235</a></p>
<p id='n236' class='stm mis'><a href='#n236'>236</a></p>
<p id='n237' class='pln'><a href='#n237'>237</a></p>
<p id='n238' class='stm run hide_run'><a href='#n238'>238</a></p>
<p id='n239' class='pln'><a href='#n239'>239</a></p>
<p id='n240' class='stm run hide_run'><a href='#n240'>240</a></p>
<p id='n241' class='pln'><a href='#n241'>241</a></p>
<p id='n242' class='pln'><a href='#n242'>242</a></p>
<p id='n243' class='pln'><a href='#n243'>243</a></p>
<p id='n244' class='pln'><a href='#n244'>244</a></p>
<p id='n245' class='stm run hide_run'><a href='#n245'>245</a></p>
<p id='n246' class='pln'><a href='#n246'>246</a></p>
<p id='n247' class='stm run hide_run'><a href='#n247'>247</a></p>
<p id='n248' class='stm run hide_run'><a href='#n248'>248</a></p>
<p id='n249' class='stm run hide_run'><a href='#n249'>249</a></p>
<p id='n250' class='pln'><a href='#n250'>250</a></p>
<p id='n251' class='stm run hide_run'><a href='#n251'>251</a></p>
<p id='n252' class='stm run hide_run'><a href='#n252'>252</a></p>
<p id='n253' class='pln'><a href='#n253'>253</a></p>
<p id='n254' class='stm run hide_run'><a href='#n254'>254</a></p>
<p id='n255' class='stm run hide_run'><a href='#n255'>255</a></p>
<p id='n256' class='pln'><a href='#n256'>256</a></p>
<p id='n257' class='stm run hide_run'><a href='#n257'>257</a></p>
</td>
<td class='text' valign='top'>
<p id='t1' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t2' class='pln'><span class='str'>Routers provide a convenient and consistent way of automatically</span><span class='strut'>&nbsp;</span></p>
<p id='t3' class='pln'><span class='str'>determining the URL conf for your API.</span><span class='strut'>&nbsp;</span></p>
<p id='t4' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t5' class='pln'><span class='str'>They are used by simply instantiating a Router class, and then registering</span><span class='strut'>&nbsp;</span></p>
<p id='t6' class='pln'><span class='str'>all the required ViewSets with that router.</span><span class='strut'>&nbsp;</span></p>
<p id='t7' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t8' class='pln'><span class='str'>For example, you might have a `urls.py` that looks something like this:</span><span class='strut'>&nbsp;</span></p>
<p id='t9' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t10' class='pln'><span class='str'>&nbsp; &nbsp; router = routers.DefaultRouter()</span><span class='strut'>&nbsp;</span></p>
<p id='t11' class='pln'><span class='str'>&nbsp; &nbsp; router.register(&#39;users&#39;, UserViewSet, &#39;user&#39;)</span><span class='strut'>&nbsp;</span></p>
<p id='t12' class='pln'><span class='str'>&nbsp; &nbsp; router.register(&#39;accounts&#39;, AccountViewSet, &#39;account&#39;)</span><span class='strut'>&nbsp;</span></p>
<p id='t13' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t14' class='pln'><span class='str'>&nbsp; &nbsp; urlpatterns = router.urls</span><span class='strut'>&nbsp;</span></p>
<p id='t15' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t16' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>__future__</span> <span class='key'>import</span> <span class='nam'>unicode_literals</span><span class='strut'>&nbsp;</span></p>
<p id='t17' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t18' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>collections</span> <span class='key'>import</span> <span class='nam'>namedtuple</span><span class='strut'>&nbsp;</span></p>
<p id='t19' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span> <span class='key'>import</span> <span class='nam'>views</span><span class='strut'>&nbsp;</span></p>
<p id='t20' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>compat</span> <span class='key'>import</span> <span class='nam'>patterns</span><span class='op'>,</span> <span class='nam'>url</span><span class='strut'>&nbsp;</span></p>
<p id='t21' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>response</span> <span class='key'>import</span> <span class='nam'>Response</span><span class='strut'>&nbsp;</span></p>
<p id='t22' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>reverse</span> <span class='key'>import</span> <span class='nam'>reverse</span><span class='strut'>&nbsp;</span></p>
<p id='t23' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>urlpatterns</span> <span class='key'>import</span> <span class='nam'>format_suffix_patterns</span><span class='strut'>&nbsp;</span></p>
<p id='t24' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t25' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t26' class='stm run hide_run'><span class='nam'>Route</span> <span class='op'>=</span> <span class='nam'>namedtuple</span><span class='op'>(</span><span class='str'>&#39;Route&#39;</span><span class='op'>,</span> <span class='op'>[</span><span class='str'>&#39;url&#39;</span><span class='op'>,</span> <span class='str'>&#39;mapping&#39;</span><span class='op'>,</span> <span class='str'>&#39;name&#39;</span><span class='op'>,</span> <span class='str'>&#39;initkwargs&#39;</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t27' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t28' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t29' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>replace_methodname</span><span class='op'>(</span><span class='nam'>format_string</span><span class='op'>,</span> <span class='nam'>methodname</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t30' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t31' class='pln'><span class='str'>&nbsp; &nbsp; Partially format a format_string, swapping out any</span><span class='strut'>&nbsp;</span></p>
<p id='t32' class='pln'><span class='str'>&nbsp; &nbsp; &#39;{methodname}&#39; or &#39;{methodnamehyphen}&#39; components.</span><span class='strut'>&nbsp;</span></p>
<p id='t33' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t34' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>methodnamehyphen</span> <span class='op'>=</span> <span class='nam'>methodname</span><span class='op'>.</span><span class='nam'>replace</span><span class='op'>(</span><span class='str'>&#39;_&#39;</span><span class='op'>,</span> <span class='str'>&#39;-&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t35' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>ret</span> <span class='op'>=</span> <span class='nam'>format_string</span><span class='strut'>&nbsp;</span></p>
<p id='t36' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>ret</span> <span class='op'>=</span> <span class='nam'>ret</span><span class='op'>.</span><span class='nam'>replace</span><span class='op'>(</span><span class='str'>&#39;{methodname}&#39;</span><span class='op'>,</span> <span class='nam'>methodname</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t37' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>ret</span> <span class='op'>=</span> <span class='nam'>ret</span><span class='op'>.</span><span class='nam'>replace</span><span class='op'>(</span><span class='str'>&#39;{methodnamehyphen}&#39;</span><span class='op'>,</span> <span class='nam'>methodnamehyphen</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t38' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>ret</span><span class='strut'>&nbsp;</span></p>
<p id='t39' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t40' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t41' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>BaseRouter</span><span class='op'>(</span><span class='nam'>object</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t42' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t43' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>registry</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t44' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t45' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>register</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>prefix</span><span class='op'>,</span> <span class='nam'>viewset</span><span class='op'>,</span> <span class='nam'>base_name</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t46' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>base_name</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t47' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>base_name</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_default_base_name</span><span class='op'>(</span><span class='nam'>viewset</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t48' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>registry</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='op'>(</span><span class='nam'>prefix</span><span class='op'>,</span> <span class='nam'>viewset</span><span class='op'>,</span> <span class='nam'>base_name</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t49' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t50' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>get_default_base_name</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>viewset</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t51' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t52' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; If `base_name` is not specified, attempt to automatically determine</span><span class='strut'>&nbsp;</span></p>
<p id='t53' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; it from the viewset.</span><span class='strut'>&nbsp;</span></p>
<p id='t54' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t55' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>NotImplemented</span><span class='op'>(</span><span class='str'>&#39;get_default_base_name must be overridden&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t56' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t57' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>get_urls</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t58' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t59' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Return a list of URL patterns, given the registered viewsets.</span><span class='strut'>&nbsp;</span></p>
<p id='t60' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t61' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>NotImplemented</span><span class='op'>(</span><span class='str'>&#39;get_urls must be overridden&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t62' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t63' class='stm run hide_run'>&nbsp; &nbsp; <span class='op'>@</span><span class='nam'>property</span><span class='strut'>&nbsp;</span></p>
<p id='t64' class='pln'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>urls</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t65' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='str'>&#39;_urls&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t66' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_urls</span> <span class='op'>=</span> <span class='nam'>patterns</span><span class='op'>(</span><span class='str'>&#39;&#39;</span><span class='op'>,</span> <span class='op'>*</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_urls</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t67' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_urls</span><span class='strut'>&nbsp;</span></p>
<p id='t68' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t69' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t70' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>SimpleRouter</span><span class='op'>(</span><span class='nam'>BaseRouter</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t71' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>routes</span> <span class='op'>=</span> <span class='op'>[</span><span class='strut'>&nbsp;</span></p>
<p id='t72' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># List route.</span><span class='strut'>&nbsp;</span></p>
<p id='t73' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>Route</span><span class='op'>(</span><span class='strut'>&nbsp;</span></p>
<p id='t74' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>url</span><span class='op'>=</span><span class='str'>r&#39;^{prefix}{trailing_slash}$&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t75' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mapping</span><span class='op'>=</span><span class='op'>{</span><span class='strut'>&nbsp;</span></p>
<p id='t76' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;get&#39;</span><span class='op'>:</span> <span class='str'>&#39;list&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t77' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;post&#39;</span><span class='op'>:</span> <span class='str'>&#39;create&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t78' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t79' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>name</span><span class='op'>=</span><span class='str'>&#39;{basename}-list&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t80' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>initkwargs</span><span class='op'>=</span><span class='op'>{</span><span class='str'>&#39;suffix&#39;</span><span class='op'>:</span> <span class='str'>&#39;List&#39;</span><span class='op'>}</span><span class='strut'>&nbsp;</span></p>
<p id='t81' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t82' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Detail route.</span><span class='strut'>&nbsp;</span></p>
<p id='t83' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>Route</span><span class='op'>(</span><span class='strut'>&nbsp;</span></p>
<p id='t84' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>url</span><span class='op'>=</span><span class='str'>r&#39;^{prefix}/{lookup}{trailing_slash}$&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t85' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mapping</span><span class='op'>=</span><span class='op'>{</span><span class='strut'>&nbsp;</span></p>
<p id='t86' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;get&#39;</span><span class='op'>:</span> <span class='str'>&#39;retrieve&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t87' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;put&#39;</span><span class='op'>:</span> <span class='str'>&#39;update&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t88' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;patch&#39;</span><span class='op'>:</span> <span class='str'>&#39;partial_update&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t89' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;delete&#39;</span><span class='op'>:</span> <span class='str'>&#39;destroy&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t90' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t91' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>name</span><span class='op'>=</span><span class='str'>&#39;{basename}-detail&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t92' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>initkwargs</span><span class='op'>=</span><span class='op'>{</span><span class='str'>&#39;suffix&#39;</span><span class='op'>:</span> <span class='str'>&#39;Instance&#39;</span><span class='op'>}</span><span class='strut'>&nbsp;</span></p>
<p id='t93' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t94' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Dynamically generated routes.</span><span class='strut'>&nbsp;</span></p>
<p id='t95' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Generated using @action or @link decorators on methods of the viewset.</span><span class='strut'>&nbsp;</span></p>
<p id='t96' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>Route</span><span class='op'>(</span><span class='strut'>&nbsp;</span></p>
<p id='t97' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>url</span><span class='op'>=</span><span class='str'>r&#39;^{prefix}/{lookup}/{methodname}{trailing_slash}$&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t98' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mapping</span><span class='op'>=</span><span class='op'>{</span><span class='strut'>&nbsp;</span></p>
<p id='t99' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;{httpmethod}&#39;</span><span class='op'>:</span> <span class='str'>&#39;{methodname}&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t100' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t101' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>name</span><span class='op'>=</span><span class='str'>&#39;{basename}-{methodnamehyphen}&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t102' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>initkwargs</span><span class='op'>=</span><span class='op'>{</span><span class='op'>}</span><span class='strut'>&nbsp;</span></p>
<p id='t103' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t104' class='pln'>&nbsp; &nbsp; <span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t105' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t106' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>trailing_slash</span><span class='op'>=</span><span class='nam'>True</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t107' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>trailing_slash</span> <span class='op'>=</span> <span class='nam'>trailing_slash</span> <span class='key'>and</span> <span class='str'>&#39;/&#39;</span> <span class='key'>or</span> <span class='str'>&#39;&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t108' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>super</span><span class='op'>(</span><span class='nam'>SimpleRouter</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>__init__</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t109' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t110' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>get_default_base_name</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>viewset</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t111' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t112' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; If `base_name` is not specified, attempt to automatically determine</span><span class='strut'>&nbsp;</span></p>
<p id='t113' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; it from the viewset.</span><span class='strut'>&nbsp;</span></p>
<p id='t114' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t115' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>model_cls</span> <span class='op'>=</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>viewset</span><span class='op'>,</span> <span class='str'>&#39;model&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t116' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>queryset</span> <span class='op'>=</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>viewset</span><span class='op'>,</span> <span class='str'>&#39;queryset&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t117' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>model_cls</span> <span class='key'>is</span> <span class='nam'>None</span> <span class='key'>and</span> <span class='nam'>queryset</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t118' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>model_cls</span> <span class='op'>=</span> <span class='nam'>queryset</span><span class='op'>.</span><span class='nam'>model</span><span class='strut'>&nbsp;</span></p>
<p id='t119' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t120' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>assert</span> <span class='nam'>model_cls</span><span class='op'>,</span> <span class='str'>&#39;`name` not argument not specified, and could &#39;</span> <span class='xx'>\</span><span class='strut'>&nbsp;</span></p>
<p id='t121' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;not automatically determine the name from the viewset, as &#39;</span> <span class='xx'>\</span><span class='strut'>&nbsp;</span></p>
<p id='t122' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;it does not have a `.model` or `.queryset` attribute.&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t123' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t124' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>model_cls</span><span class='op'>.</span><span class='nam'>_meta</span><span class='op'>.</span><span class='nam'>object_name</span><span class='op'>.</span><span class='nam'>lower</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t125' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t126' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>get_routes</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>viewset</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t127' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t128' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Augment `self.routes` with any dynamically generated routes.</span><span class='strut'>&nbsp;</span></p>
<p id='t129' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t130' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Returns a list of the Route namedtuple.</span><span class='strut'>&nbsp;</span></p>
<p id='t131' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t132' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t133' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Determine any `@action` or `@link` decorated methods on the viewset</span><span class='strut'>&nbsp;</span></p>
<p id='t134' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>dynamic_routes</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t135' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>methodname</span> <span class='key'>in</span> <span class='nam'>dir</span><span class='op'>(</span><span class='nam'>viewset</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t136' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>attr</span> <span class='op'>=</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>viewset</span><span class='op'>,</span> <span class='nam'>methodname</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t137' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>httpmethods</span> <span class='op'>=</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>attr</span><span class='op'>,</span> <span class='str'>&#39;bind_to_methods&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t138' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>httpmethods</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t139' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>dynamic_routes</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='op'>(</span><span class='nam'>httpmethods</span><span class='op'>,</span> <span class='nam'>methodname</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t140' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t141' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ret</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t142' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>route</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>routes</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t143' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>route</span><span class='op'>.</span><span class='nam'>mapping</span> <span class='op'>==</span> <span class='op'>{</span><span class='str'>&#39;{httpmethod}&#39;</span><span class='op'>:</span> <span class='str'>&#39;{methodname}&#39;</span><span class='op'>}</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t144' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Dynamic routes (@link or @action decorator)</span><span class='strut'>&nbsp;</span></p>
<p id='t145' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>httpmethods</span><span class='op'>,</span> <span class='nam'>methodname</span> <span class='key'>in</span> <span class='nam'>dynamic_routes</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t146' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>initkwargs</span> <span class='op'>=</span> <span class='nam'>route</span><span class='op'>.</span><span class='nam'>initkwargs</span><span class='op'>.</span><span class='nam'>copy</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t147' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>initkwargs</span><span class='op'>.</span><span class='nam'>update</span><span class='op'>(</span><span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>viewset</span><span class='op'>,</span> <span class='nam'>methodname</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>kwargs</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t148' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ret</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='nam'>Route</span><span class='op'>(</span><span class='strut'>&nbsp;</span></p>
<p id='t149' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>url</span><span class='op'>=</span><span class='nam'>replace_methodname</span><span class='op'>(</span><span class='nam'>route</span><span class='op'>.</span><span class='nam'>url</span><span class='op'>,</span> <span class='nam'>methodname</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t150' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mapping</span><span class='op'>=</span><span class='nam'>dict</span><span class='op'>(</span><span class='op'>(</span><span class='nam'>httpmethod</span><span class='op'>,</span> <span class='nam'>methodname</span><span class='op'>)</span> <span class='key'>for</span> <span class='nam'>httpmethod</span> <span class='key'>in</span> <span class='nam'>httpmethods</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t151' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>name</span><span class='op'>=</span><span class='nam'>replace_methodname</span><span class='op'>(</span><span class='nam'>route</span><span class='op'>.</span><span class='nam'>name</span><span class='op'>,</span> <span class='nam'>methodname</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t152' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>initkwargs</span><span class='op'>=</span><span class='nam'>initkwargs</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t153' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t154' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t155' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Standard route</span><span class='strut'>&nbsp;</span></p>
<p id='t156' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ret</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='nam'>route</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t157' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t158' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>ret</span><span class='strut'>&nbsp;</span></p>
<p id='t159' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t160' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>get_method_map</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>viewset</span><span class='op'>,</span> <span class='nam'>method_map</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t161' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t162' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Given a viewset, and a mapping of http methods to actions,</span><span class='strut'>&nbsp;</span></p>
<p id='t163' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; return a new mapping which only includes any mappings that</span><span class='strut'>&nbsp;</span></p>
<p id='t164' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; are actually implemented by the viewset.</span><span class='strut'>&nbsp;</span></p>
<p id='t165' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t166' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>bound_methods</span> <span class='op'>=</span> <span class='op'>{</span><span class='op'>}</span><span class='strut'>&nbsp;</span></p>
<p id='t167' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>method</span><span class='op'>,</span> <span class='nam'>action</span> <span class='key'>in</span> <span class='nam'>method_map</span><span class='op'>.</span><span class='nam'>items</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t168' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>viewset</span><span class='op'>,</span> <span class='nam'>action</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t169' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>bound_methods</span><span class='op'>[</span><span class='nam'>method</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>action</span><span class='strut'>&nbsp;</span></p>
<p id='t170' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>bound_methods</span><span class='strut'>&nbsp;</span></p>
<p id='t171' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t172' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>get_lookup_regex</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>viewset</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t173' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t174' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Given a viewset, return the portion of URL regex that is used</span><span class='strut'>&nbsp;</span></p>
<p id='t175' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; to match against a single instance.</span><span class='strut'>&nbsp;</span></p>
<p id='t176' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t177' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>base_regex</span> <span class='op'>=</span> <span class='str'>&#39;(?P&lt;{lookup_field}&gt;[^/]+)&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t178' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>lookup_field</span> <span class='op'>=</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>viewset</span><span class='op'>,</span> <span class='str'>&#39;lookup_field&#39;</span><span class='op'>,</span> <span class='str'>&#39;pk&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t179' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>base_regex</span><span class='op'>.</span><span class='nam'>format</span><span class='op'>(</span><span class='nam'>lookup_field</span><span class='op'>=</span><span class='nam'>lookup_field</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t180' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t181' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>get_urls</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t182' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t183' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Use the registered viewsets to generate a list of URL patterns.</span><span class='strut'>&nbsp;</span></p>
<p id='t184' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t185' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ret</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t186' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t187' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>prefix</span><span class='op'>,</span> <span class='nam'>viewset</span><span class='op'>,</span> <span class='nam'>basename</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>registry</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t188' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>lookup</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_lookup_regex</span><span class='op'>(</span><span class='nam'>viewset</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t189' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>routes</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_routes</span><span class='op'>(</span><span class='nam'>viewset</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t190' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t191' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>route</span> <span class='key'>in</span> <span class='nam'>routes</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t192' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t193' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Only actions which actually exist on the viewset will be bound</span><span class='strut'>&nbsp;</span></p>
<p id='t194' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mapping</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_method_map</span><span class='op'>(</span><span class='nam'>viewset</span><span class='op'>,</span> <span class='nam'>route</span><span class='op'>.</span><span class='nam'>mapping</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t195' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>mapping</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t196' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>continue</span><span class='strut'>&nbsp;</span></p>
<p id='t197' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t198' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Build the url pattern</span><span class='strut'>&nbsp;</span></p>
<p id='t199' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>regex</span> <span class='op'>=</span> <span class='nam'>route</span><span class='op'>.</span><span class='nam'>url</span><span class='op'>.</span><span class='nam'>format</span><span class='op'>(</span><span class='strut'>&nbsp;</span></p>
<p id='t200' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>prefix</span><span class='op'>=</span><span class='nam'>prefix</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t201' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>lookup</span><span class='op'>=</span><span class='nam'>lookup</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t202' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>trailing_slash</span><span class='op'>=</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>trailing_slash</span><span class='strut'>&nbsp;</span></p>
<p id='t203' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t204' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>view</span> <span class='op'>=</span> <span class='nam'>viewset</span><span class='op'>.</span><span class='nam'>as_view</span><span class='op'>(</span><span class='nam'>mapping</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>route</span><span class='op'>.</span><span class='nam'>initkwargs</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t205' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>name</span> <span class='op'>=</span> <span class='nam'>route</span><span class='op'>.</span><span class='nam'>name</span><span class='op'>.</span><span class='nam'>format</span><span class='op'>(</span><span class='nam'>basename</span><span class='op'>=</span><span class='nam'>basename</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t206' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ret</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>(</span><span class='nam'>regex</span><span class='op'>,</span> <span class='nam'>view</span><span class='op'>,</span> <span class='nam'>name</span><span class='op'>=</span><span class='nam'>name</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t207' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t208' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>ret</span><span class='strut'>&nbsp;</span></p>
<p id='t209' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t210' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t211' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>DefaultRouter</span><span class='op'>(</span><span class='nam'>SimpleRouter</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t212' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t213' class='pln'><span class='str'>&nbsp; &nbsp; The default router extends the SimpleRouter, but also adds in a default</span><span class='strut'>&nbsp;</span></p>
<p id='t214' class='pln'><span class='str'>&nbsp; &nbsp; API root view, and adds format suffix patterns to the URLs.</span><span class='strut'>&nbsp;</span></p>
<p id='t215' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t216' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>include_root_view</span> <span class='op'>=</span> <span class='nam'>True</span><span class='strut'>&nbsp;</span></p>
<p id='t217' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>include_format_suffixes</span> <span class='op'>=</span> <span class='nam'>True</span><span class='strut'>&nbsp;</span></p>
<p id='t218' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>root_view_name</span> <span class='op'>=</span> <span class='str'>&#39;api-root&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t219' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t220' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>get_api_root_view</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t221' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t222' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Return a view to use as the API root.</span><span class='strut'>&nbsp;</span></p>
<p id='t223' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t224' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>api_root_dict</span> <span class='op'>=</span> <span class='op'>{</span><span class='op'>}</span><span class='strut'>&nbsp;</span></p>
<p id='t225' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>list_name</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>routes</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>name</span><span class='strut'>&nbsp;</span></p>
<p id='t226' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>prefix</span><span class='op'>,</span> <span class='nam'>viewset</span><span class='op'>,</span> <span class='nam'>basename</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>registry</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t227' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>api_root_dict</span><span class='op'>[</span><span class='nam'>prefix</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>list_name</span><span class='op'>.</span><span class='nam'>format</span><span class='op'>(</span><span class='nam'>basename</span><span class='op'>=</span><span class='nam'>basename</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t228' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t229' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>class</span> <span class='nam'>APIRoot</span><span class='op'>(</span><span class='nam'>views</span><span class='op'>.</span><span class='nam'>APIView</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t230' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>_ignore_model_permissions</span> <span class='op'>=</span> <span class='nam'>True</span><span class='strut'>&nbsp;</span></p>
<p id='t231' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t232' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>get</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='nam'>format</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t233' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ret</span> <span class='op'>=</span> <span class='op'>{</span><span class='op'>}</span><span class='strut'>&nbsp;</span></p>
<p id='t234' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>key</span><span class='op'>,</span> <span class='nam'>url_name</span> <span class='key'>in</span> <span class='nam'>api_root_dict</span><span class='op'>.</span><span class='nam'>items</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t235' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ret</span><span class='op'>[</span><span class='nam'>key</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>reverse</span><span class='op'>(</span><span class='nam'>url_name</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>=</span><span class='nam'>request</span><span class='op'>,</span> <span class='nam'>format</span><span class='op'>=</span><span class='nam'>format</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t236' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>Response</span><span class='op'>(</span><span class='nam'>ret</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t237' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t238' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>APIRoot</span><span class='op'>.</span><span class='nam'>as_view</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t239' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t240' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>get_urls</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t241' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t242' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Generate the list of URL patterns, including a default root view</span><span class='strut'>&nbsp;</span></p>
<p id='t243' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; for the API, and appending `.json` style format suffixes.</span><span class='strut'>&nbsp;</span></p>
<p id='t244' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t245' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>urls</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t246' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t247' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>include_root_view</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t248' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>root_url</span> <span class='op'>=</span> <span class='nam'>url</span><span class='op'>(</span><span class='str'>r&#39;^$&#39;</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_api_root_view</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>name</span><span class='op'>=</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>root_view_name</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t249' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>urls</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='nam'>root_url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t250' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t251' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>default_urls</span> <span class='op'>=</span> <span class='nam'>super</span><span class='op'>(</span><span class='nam'>DefaultRouter</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>get_urls</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t252' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>urls</span><span class='op'>.</span><span class='nam'>extend</span><span class='op'>(</span><span class='nam'>default_urls</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t253' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t254' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>include_format_suffixes</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t255' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>urls</span> <span class='op'>=</span> <span class='nam'>format_suffix_patterns</span><span class='op'>(</span><span class='nam'>urls</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t256' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t257' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>urls</span><span class='strut'>&nbsp;</span></p>
</td>
</tr>
</table>
</div>
<div id='footer'>
<div class='content'>
<p>
<a class='nav' href='index.html'>&#xab; index</a> &nbsp; &nbsp; <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.5.1</a>
</p>
</div>
</div>
</body>
</html>

File diff suppressed because it is too large Load Diff

View File

@ -1,465 +0,0 @@
<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
<title>Coverage for rest_framework/settings: 95%</title>
<link rel='stylesheet' href='style.css' type='text/css'>
<script type='text/javascript' src='jquery-1.4.3.min.js'></script>
<script type='text/javascript' src='jquery.hotkeys.js'></script>
<script type='text/javascript' src='jquery.isonscreen.js'></script>
<script type='text/javascript' src='coverage_html.js'></script>
<script type='text/javascript' charset='utf-8'>
jQuery(document).ready(coverage.pyfile_ready);
</script>
</head>
<body id='pyfile'>
<div id='header'>
<div class='content'>
<h1>Coverage for <b>rest_framework/settings</b> :
<span class='pc_cov'>95%</span>
</h1>
<img id='keyboard_icon' src='keybd_closed.png'>
<h2 class='stats'>
44 statements
<span class='run hide_run shortkey_r' onclick='coverage.toggle_lines(this, "run")'>42 run</span>
<span class='mis shortkey_m' onclick='coverage.toggle_lines(this, "mis")'>2 missing</span>
<span class='exc shortkey_x' onclick='coverage.toggle_lines(this, "exc")'>0 excluded</span>
</h2>
</div>
</div>
<div class='help_panel'>
<img id='panel_icon' src='keybd_open.png'>
<p class='legend'>Hot-keys on this page</p>
<div>
<p class='keyhelp'>
<span class='key'>r</span>
<span class='key'>m</span>
<span class='key'>x</span>
<span class='key'>p</span> &nbsp; toggle line displays
</p>
<p class='keyhelp'>
<span class='key'>j</span>
<span class='key'>k</span> &nbsp; next/prev highlighted chunk
</p>
<p class='keyhelp'>
<span class='key'>0</span> &nbsp; (zero) top of page
</p>
<p class='keyhelp'>
<span class='key'>1</span> &nbsp; (one) first highlighted chunk
</p>
</div>
</div>
<div id='source'>
<table cellspacing='0' cellpadding='0'>
<tr>
<td class='linenos' valign='top'>
<p id='n1' class='pln'><a href='#n1'>1</a></p>
<p id='n2' class='pln'><a href='#n2'>2</a></p>
<p id='n3' class='pln'><a href='#n3'>3</a></p>
<p id='n4' class='pln'><a href='#n4'>4</a></p>
<p id='n5' class='pln'><a href='#n5'>5</a></p>
<p id='n6' class='pln'><a href='#n6'>6</a></p>
<p id='n7' class='pln'><a href='#n7'>7</a></p>
<p id='n8' class='pln'><a href='#n8'>8</a></p>
<p id='n9' class='pln'><a href='#n9'>9</a></p>
<p id='n10' class='pln'><a href='#n10'>10</a></p>
<p id='n11' class='pln'><a href='#n11'>11</a></p>
<p id='n12' class='pln'><a href='#n12'>12</a></p>
<p id='n13' class='pln'><a href='#n13'>13</a></p>
<p id='n14' class='pln'><a href='#n14'>14</a></p>
<p id='n15' class='pln'><a href='#n15'>15</a></p>
<p id='n16' class='pln'><a href='#n16'>16</a></p>
<p id='n17' class='pln'><a href='#n17'>17</a></p>
<p id='n18' class='pln'><a href='#n18'>18</a></p>
<p id='n19' class='pln'><a href='#n19'>19</a></p>
<p id='n20' class='stm run hide_run'><a href='#n20'>20</a></p>
<p id='n21' class='pln'><a href='#n21'>21</a></p>
<p id='n22' class='stm run hide_run'><a href='#n22'>22</a></p>
<p id='n23' class='stm run hide_run'><a href='#n23'>23</a></p>
<p id='n24' class='pln'><a href='#n24'>24</a></p>
<p id='n25' class='stm run hide_run'><a href='#n25'>25</a></p>
<p id='n26' class='stm run hide_run'><a href='#n26'>26</a></p>
<p id='n27' class='pln'><a href='#n27'>27</a></p>
<p id='n28' class='pln'><a href='#n28'>28</a></p>
<p id='n29' class='stm run hide_run'><a href='#n29'>29</a></p>
<p id='n30' class='pln'><a href='#n30'>30</a></p>
<p id='n31' class='stm run hide_run'><a href='#n31'>31</a></p>
<p id='n32' class='pln'><a href='#n32'>32</a></p>
<p id='n33' class='pln'><a href='#n33'>33</a></p>
<p id='n34' class='pln'><a href='#n34'>34</a></p>
<p id='n35' class='pln'><a href='#n35'>35</a></p>
<p id='n36' class='pln'><a href='#n36'>36</a></p>
<p id='n37' class='pln'><a href='#n37'>37</a></p>
<p id='n38' class='pln'><a href='#n38'>38</a></p>
<p id='n39' class='pln'><a href='#n39'>39</a></p>
<p id='n40' class='pln'><a href='#n40'>40</a></p>
<p id='n41' class='pln'><a href='#n41'>41</a></p>
<p id='n42' class='pln'><a href='#n42'>42</a></p>
<p id='n43' class='pln'><a href='#n43'>43</a></p>
<p id='n44' class='pln'><a href='#n44'>44</a></p>
<p id='n45' class='pln'><a href='#n45'>45</a></p>
<p id='n46' class='pln'><a href='#n46'>46</a></p>
<p id='n47' class='pln'><a href='#n47'>47</a></p>
<p id='n48' class='pln'><a href='#n48'>48</a></p>
<p id='n49' class='pln'><a href='#n49'>49</a></p>
<p id='n50' class='pln'><a href='#n50'>50</a></p>
<p id='n51' class='pln'><a href='#n51'>51</a></p>
<p id='n52' class='pln'><a href='#n52'>52</a></p>
<p id='n53' class='pln'><a href='#n53'>53</a></p>
<p id='n54' class='pln'><a href='#n54'>54</a></p>
<p id='n55' class='pln'><a href='#n55'>55</a></p>
<p id='n56' class='pln'><a href='#n56'>56</a></p>
<p id='n57' class='pln'><a href='#n57'>57</a></p>
<p id='n58' class='pln'><a href='#n58'>58</a></p>
<p id='n59' class='pln'><a href='#n59'>59</a></p>
<p id='n60' class='pln'><a href='#n60'>60</a></p>
<p id='n61' class='pln'><a href='#n61'>61</a></p>
<p id='n62' class='pln'><a href='#n62'>62</a></p>
<p id='n63' class='pln'><a href='#n63'>63</a></p>
<p id='n64' class='pln'><a href='#n64'>64</a></p>
<p id='n65' class='pln'><a href='#n65'>65</a></p>
<p id='n66' class='pln'><a href='#n66'>66</a></p>
<p id='n67' class='pln'><a href='#n67'>67</a></p>
<p id='n68' class='pln'><a href='#n68'>68</a></p>
<p id='n69' class='pln'><a href='#n69'>69</a></p>
<p id='n70' class='pln'><a href='#n70'>70</a></p>
<p id='n71' class='pln'><a href='#n71'>71</a></p>
<p id='n72' class='pln'><a href='#n72'>72</a></p>
<p id='n73' class='pln'><a href='#n73'>73</a></p>
<p id='n74' class='pln'><a href='#n74'>74</a></p>
<p id='n75' class='pln'><a href='#n75'>75</a></p>
<p id='n76' class='pln'><a href='#n76'>76</a></p>
<p id='n77' class='pln'><a href='#n77'>77</a></p>
<p id='n78' class='pln'><a href='#n78'>78</a></p>
<p id='n79' class='pln'><a href='#n79'>79</a></p>
<p id='n80' class='pln'><a href='#n80'>80</a></p>
<p id='n81' class='pln'><a href='#n81'>81</a></p>
<p id='n82' class='pln'><a href='#n82'>82</a></p>
<p id='n83' class='pln'><a href='#n83'>83</a></p>
<p id='n84' class='pln'><a href='#n84'>84</a></p>
<p id='n85' class='pln'><a href='#n85'>85</a></p>
<p id='n86' class='pln'><a href='#n86'>86</a></p>
<p id='n87' class='pln'><a href='#n87'>87</a></p>
<p id='n88' class='pln'><a href='#n88'>88</a></p>
<p id='n89' class='pln'><a href='#n89'>89</a></p>
<p id='n90' class='pln'><a href='#n90'>90</a></p>
<p id='n91' class='pln'><a href='#n91'>91</a></p>
<p id='n92' class='pln'><a href='#n92'>92</a></p>
<p id='n93' class='pln'><a href='#n93'>93</a></p>
<p id='n94' class='pln'><a href='#n94'>94</a></p>
<p id='n95' class='pln'><a href='#n95'>95</a></p>
<p id='n96' class='pln'><a href='#n96'>96</a></p>
<p id='n97' class='pln'><a href='#n97'>97</a></p>
<p id='n98' class='pln'><a href='#n98'>98</a></p>
<p id='n99' class='pln'><a href='#n99'>99</a></p>
<p id='n100' class='pln'><a href='#n100'>100</a></p>
<p id='n101' class='pln'><a href='#n101'>101</a></p>
<p id='n102' class='pln'><a href='#n102'>102</a></p>
<p id='n103' class='pln'><a href='#n103'>103</a></p>
<p id='n104' class='pln'><a href='#n104'>104</a></p>
<p id='n105' class='pln'><a href='#n105'>105</a></p>
<p id='n106' class='pln'><a href='#n106'>106</a></p>
<p id='n107' class='stm run hide_run'><a href='#n107'>107</a></p>
<p id='n108' class='pln'><a href='#n108'>108</a></p>
<p id='n109' class='pln'><a href='#n109'>109</a></p>
<p id='n110' class='pln'><a href='#n110'>110</a></p>
<p id='n111' class='pln'><a href='#n111'>111</a></p>
<p id='n112' class='pln'><a href='#n112'>112</a></p>
<p id='n113' class='pln'><a href='#n113'>113</a></p>
<p id='n114' class='pln'><a href='#n114'>114</a></p>
<p id='n115' class='pln'><a href='#n115'>115</a></p>
<p id='n116' class='pln'><a href='#n116'>116</a></p>
<p id='n117' class='pln'><a href='#n117'>117</a></p>
<p id='n118' class='pln'><a href='#n118'>118</a></p>
<p id='n119' class='pln'><a href='#n119'>119</a></p>
<p id='n120' class='pln'><a href='#n120'>120</a></p>
<p id='n121' class='pln'><a href='#n121'>121</a></p>
<p id='n122' class='pln'><a href='#n122'>122</a></p>
<p id='n123' class='stm run hide_run'><a href='#n123'>123</a></p>
<p id='n124' class='pln'><a href='#n124'>124</a></p>
<p id='n125' class='pln'><a href='#n125'>125</a></p>
<p id='n126' class='pln'><a href='#n126'>126</a></p>
<p id='n127' class='pln'><a href='#n127'>127</a></p>
<p id='n128' class='stm run hide_run'><a href='#n128'>128</a></p>
<p id='n129' class='stm run hide_run'><a href='#n129'>129</a></p>
<p id='n130' class='stm run hide_run'><a href='#n130'>130</a></p>
<p id='n131' class='stm run hide_run'><a href='#n131'>131</a></p>
<p id='n132' class='stm mis'><a href='#n132'>132</a></p>
<p id='n133' class='pln'><a href='#n133'>133</a></p>
<p id='n134' class='pln'><a href='#n134'>134</a></p>
<p id='n135' class='stm run hide_run'><a href='#n135'>135</a></p>
<p id='n136' class='pln'><a href='#n136'>136</a></p>
<p id='n137' class='pln'><a href='#n137'>137</a></p>
<p id='n138' class='pln'><a href='#n138'>138</a></p>
<p id='n139' class='stm run hide_run'><a href='#n139'>139</a></p>
<p id='n140' class='pln'><a href='#n140'>140</a></p>
<p id='n141' class='stm run hide_run'><a href='#n141'>141</a></p>
<p id='n142' class='stm run hide_run'><a href='#n142'>142</a></p>
<p id='n143' class='stm run hide_run'><a href='#n143'>143</a></p>
<p id='n144' class='stm run hide_run'><a href='#n144'>144</a></p>
<p id='n145' class='stm run hide_run'><a href='#n145'>145</a></p>
<p id='n146' class='stm run hide_run'><a href='#n146'>146</a></p>
<p id='n147' class='stm run hide_run'><a href='#n147'>147</a></p>
<p id='n148' class='pln'><a href='#n148'>148</a></p>
<p id='n149' class='pln'><a href='#n149'>149</a></p>
<p id='n150' class='stm run hide_run'><a href='#n150'>150</a></p>
<p id='n151' class='pln'><a href='#n151'>151</a></p>
<p id='n152' class='pln'><a href='#n152'>152</a></p>
<p id='n153' class='pln'><a href='#n153'>153</a></p>
<p id='n154' class='pln'><a href='#n154'>154</a></p>
<p id='n155' class='pln'><a href='#n155'>155</a></p>
<p id='n156' class='pln'><a href='#n156'>156</a></p>
<p id='n157' class='pln'><a href='#n157'>157</a></p>
<p id='n158' class='pln'><a href='#n158'>158</a></p>
<p id='n159' class='pln'><a href='#n159'>159</a></p>
<p id='n160' class='pln'><a href='#n160'>160</a></p>
<p id='n161' class='stm run hide_run'><a href='#n161'>161</a></p>
<p id='n162' class='stm run hide_run'><a href='#n162'>162</a></p>
<p id='n163' class='stm run hide_run'><a href='#n163'>163</a></p>
<p id='n164' class='stm run hide_run'><a href='#n164'>164</a></p>
<p id='n165' class='pln'><a href='#n165'>165</a></p>
<p id='n166' class='stm run hide_run'><a href='#n166'>166</a></p>
<p id='n167' class='stm run hide_run'><a href='#n167'>167</a></p>
<p id='n168' class='stm run hide_run'><a href='#n168'>168</a></p>
<p id='n169' class='pln'><a href='#n169'>169</a></p>
<p id='n170' class='stm run hide_run'><a href='#n170'>170</a></p>
<p id='n171' class='pln'><a href='#n171'>171</a></p>
<p id='n172' class='stm run hide_run'><a href='#n172'>172</a></p>
<p id='n173' class='stm run hide_run'><a href='#n173'>173</a></p>
<p id='n174' class='pln'><a href='#n174'>174</a></p>
<p id='n175' class='stm run hide_run'><a href='#n175'>175</a></p>
<p id='n176' class='pln'><a href='#n176'>176</a></p>
<p id='n177' class='pln'><a href='#n177'>177</a></p>
<p id='n178' class='stm run hide_run'><a href='#n178'>178</a></p>
<p id='n179' class='stm run hide_run'><a href='#n179'>179</a></p>
<p id='n180' class='pln'><a href='#n180'>180</a></p>
<p id='n181' class='stm run hide_run'><a href='#n181'>181</a></p>
<p id='n182' class='pln'><a href='#n182'>182</a></p>
<p id='n183' class='pln'><a href='#n183'>183</a></p>
<p id='n184' class='stm run hide_run'><a href='#n184'>184</a></p>
<p id='n185' class='stm run hide_run'><a href='#n185'>185</a></p>
<p id='n186' class='pln'><a href='#n186'>186</a></p>
<p id='n187' class='stm run hide_run'><a href='#n187'>187</a></p>
<p id='n188' class='stm run hide_run'><a href='#n188'>188</a></p>
<p id='n189' class='pln'><a href='#n189'>189</a></p>
<p id='n190' class='stm mis'><a href='#n190'>190</a></p>
<p id='n191' class='pln'><a href='#n191'>191</a></p>
<p id='n192' class='stm run hide_run'><a href='#n192'>192</a></p>
</td>
<td class='text' valign='top'>
<p id='t1' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t2' class='pln'><span class='str'>Settings for REST framework are all namespaced in the REST_FRAMEWORK setting.</span><span class='strut'>&nbsp;</span></p>
<p id='t3' class='pln'><span class='str'>For example your project&#39;s `settings.py` file might look like this:</span><span class='strut'>&nbsp;</span></p>
<p id='t4' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t5' class='pln'><span class='str'>REST_FRAMEWORK = {</span><span class='strut'>&nbsp;</span></p>
<p id='t6' class='pln'><span class='str'>&nbsp; &nbsp; &#39;DEFAULT_RENDERER_CLASSES&#39;: (</span><span class='strut'>&nbsp;</span></p>
<p id='t7' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &#39;rest_framework.renderers.JSONRenderer&#39;,</span><span class='strut'>&nbsp;</span></p>
<p id='t8' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &#39;rest_framework.renderers.YAMLRenderer&#39;,</span><span class='strut'>&nbsp;</span></p>
<p id='t9' class='pln'><span class='str'>&nbsp; &nbsp; )</span><span class='strut'>&nbsp;</span></p>
<p id='t10' class='pln'><span class='str'>&nbsp; &nbsp; &#39;DEFAULT_PARSER_CLASSES&#39;: (</span><span class='strut'>&nbsp;</span></p>
<p id='t11' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &#39;rest_framework.parsers.JSONParser&#39;,</span><span class='strut'>&nbsp;</span></p>
<p id='t12' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &#39;rest_framework.parsers.YAMLParser&#39;,</span><span class='strut'>&nbsp;</span></p>
<p id='t13' class='pln'><span class='str'>&nbsp; &nbsp; )</span><span class='strut'>&nbsp;</span></p>
<p id='t14' class='pln'><span class='str'>}</span><span class='strut'>&nbsp;</span></p>
<p id='t15' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t16' class='pln'><span class='str'>This module provides the `api_setting` object, that is used to access</span><span class='strut'>&nbsp;</span></p>
<p id='t17' class='pln'><span class='str'>REST framework settings, checking for user settings first, then falling</span><span class='strut'>&nbsp;</span></p>
<p id='t18' class='pln'><span class='str'>back to the defaults.</span><span class='strut'>&nbsp;</span></p>
<p id='t19' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t20' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>__future__</span> <span class='key'>import</span> <span class='nam'>unicode_literals</span><span class='strut'>&nbsp;</span></p>
<p id='t21' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t22' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>django</span><span class='op'>.</span><span class='nam'>conf</span> <span class='key'>import</span> <span class='nam'>settings</span><span class='strut'>&nbsp;</span></p>
<p id='t23' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>django</span><span class='op'>.</span><span class='nam'>utils</span> <span class='key'>import</span> <span class='nam'>importlib</span><span class='strut'>&nbsp;</span></p>
<p id='t24' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t25' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span> <span class='key'>import</span> <span class='nam'>ISO_8601</span><span class='strut'>&nbsp;</span></p>
<p id='t26' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>compat</span> <span class='key'>import</span> <span class='nam'>six</span><span class='strut'>&nbsp;</span></p>
<p id='t27' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t28' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t29' class='stm run hide_run'><span class='nam'>USER_SETTINGS</span> <span class='op'>=</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>settings</span><span class='op'>,</span> <span class='str'>&#39;REST_FRAMEWORK&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t30' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t31' class='stm run hide_run'><span class='nam'>DEFAULTS</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
<p id='t32' class='pln'>&nbsp; &nbsp; <span class='com'># Base API policies</span><span class='strut'>&nbsp;</span></p>
<p id='t33' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;DEFAULT_RENDERER_CLASSES&#39;</span><span class='op'>:</span> <span class='op'>(</span><span class='strut'>&nbsp;</span></p>
<p id='t34' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;rest_framework.renderers.JSONRenderer&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t35' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;rest_framework.renderers.BrowsableAPIRenderer&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t36' class='pln'>&nbsp; &nbsp; <span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t37' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;DEFAULT_PARSER_CLASSES&#39;</span><span class='op'>:</span> <span class='op'>(</span><span class='strut'>&nbsp;</span></p>
<p id='t38' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;rest_framework.parsers.JSONParser&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t39' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;rest_framework.parsers.FormParser&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t40' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;rest_framework.parsers.MultiPartParser&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t41' class='pln'>&nbsp; &nbsp; <span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t42' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;DEFAULT_AUTHENTICATION_CLASSES&#39;</span><span class='op'>:</span> <span class='op'>(</span><span class='strut'>&nbsp;</span></p>
<p id='t43' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;rest_framework.authentication.SessionAuthentication&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t44' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;rest_framework.authentication.BasicAuthentication&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t45' class='pln'>&nbsp; &nbsp; <span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t46' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;DEFAULT_PERMISSION_CLASSES&#39;</span><span class='op'>:</span> <span class='op'>(</span><span class='strut'>&nbsp;</span></p>
<p id='t47' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;rest_framework.permissions.AllowAny&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t48' class='pln'>&nbsp; &nbsp; <span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t49' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;DEFAULT_THROTTLE_CLASSES&#39;</span><span class='op'>:</span> <span class='op'>(</span><span class='strut'>&nbsp;</span></p>
<p id='t50' class='pln'>&nbsp; &nbsp; <span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t51' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t52' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;DEFAULT_CONTENT_NEGOTIATION_CLASS&#39;</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t53' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;rest_framework.negotiation.DefaultContentNegotiation&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t54' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t55' class='pln'>&nbsp; &nbsp; <span class='com'># Genric view behavior</span><span class='strut'>&nbsp;</span></p>
<p id='t56' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;DEFAULT_MODEL_SERIALIZER_CLASS&#39;</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t57' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;rest_framework.serializers.ModelSerializer&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t58' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;DEFAULT_PAGINATION_SERIALIZER_CLASS&#39;</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t59' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;rest_framework.pagination.PaginationSerializer&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t60' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;DEFAULT_FILTER_BACKENDS&#39;</span><span class='op'>:</span> <span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t61' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t62' class='pln'>&nbsp; &nbsp; <span class='com'># Throttling</span><span class='strut'>&nbsp;</span></p>
<p id='t63' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;DEFAULT_THROTTLE_RATES&#39;</span><span class='op'>:</span> <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
<p id='t64' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;user&#39;</span><span class='op'>:</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t65' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;anon&#39;</span><span class='op'>:</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t66' class='pln'>&nbsp; &nbsp; <span class='op'>}</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t67' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t68' class='pln'>&nbsp; &nbsp; <span class='com'># Pagination</span><span class='strut'>&nbsp;</span></p>
<p id='t69' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;PAGINATE_BY&#39;</span><span class='op'>:</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t70' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;PAGINATE_BY_PARAM&#39;</span><span class='op'>:</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t71' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t72' class='pln'>&nbsp; &nbsp; <span class='com'># Authentication</span><span class='strut'>&nbsp;</span></p>
<p id='t73' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;UNAUTHENTICATED_USER&#39;</span><span class='op'>:</span> <span class='str'>&#39;django.contrib.auth.models.AnonymousUser&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t74' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;UNAUTHENTICATED_TOKEN&#39;</span><span class='op'>:</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t75' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t76' class='pln'>&nbsp; &nbsp; <span class='com'># Browser enhancements</span><span class='strut'>&nbsp;</span></p>
<p id='t77' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;FORM_METHOD_OVERRIDE&#39;</span><span class='op'>:</span> <span class='str'>&#39;_method&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t78' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;FORM_CONTENT_OVERRIDE&#39;</span><span class='op'>:</span> <span class='str'>&#39;_content&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t79' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;FORM_CONTENTTYPE_OVERRIDE&#39;</span><span class='op'>:</span> <span class='str'>&#39;_content_type&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t80' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;URL_ACCEPT_OVERRIDE&#39;</span><span class='op'>:</span> <span class='str'>&#39;accept&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t81' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;URL_FORMAT_OVERRIDE&#39;</span><span class='op'>:</span> <span class='str'>&#39;format&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t82' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t83' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;FORMAT_SUFFIX_KWARG&#39;</span><span class='op'>:</span> <span class='str'>&#39;format&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t84' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t85' class='pln'>&nbsp; &nbsp; <span class='com'># Input and output formats</span><span class='strut'>&nbsp;</span></p>
<p id='t86' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;DATE_INPUT_FORMATS&#39;</span><span class='op'>:</span> <span class='op'>(</span><span class='strut'>&nbsp;</span></p>
<p id='t87' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ISO_8601</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t88' class='pln'>&nbsp; &nbsp; <span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t89' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;DATE_FORMAT&#39;</span><span class='op'>:</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t90' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t91' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;DATETIME_INPUT_FORMATS&#39;</span><span class='op'>:</span> <span class='op'>(</span><span class='strut'>&nbsp;</span></p>
<p id='t92' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ISO_8601</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t93' class='pln'>&nbsp; &nbsp; <span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t94' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;DATETIME_FORMAT&#39;</span><span class='op'>:</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t95' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t96' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;TIME_INPUT_FORMATS&#39;</span><span class='op'>:</span> <span class='op'>(</span><span class='strut'>&nbsp;</span></p>
<p id='t97' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ISO_8601</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t98' class='pln'>&nbsp; &nbsp; <span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t99' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;TIME_FORMAT&#39;</span><span class='op'>:</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t100' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t101' class='pln'>&nbsp; &nbsp; <span class='com'># Pending deprecation</span><span class='strut'>&nbsp;</span></p>
<p id='t102' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;FILTER_BACKEND&#39;</span><span class='op'>:</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t103' class='pln'><span class='op'>}</span><span class='strut'>&nbsp;</span></p>
<p id='t104' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t105' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t106' class='pln'><span class='com'># List of settings that may be in string import notation.</span><span class='strut'>&nbsp;</span></p>
<p id='t107' class='stm run hide_run'><span class='nam'>IMPORT_STRINGS</span> <span class='op'>=</span> <span class='op'>(</span><span class='strut'>&nbsp;</span></p>
<p id='t108' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;DEFAULT_RENDERER_CLASSES&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t109' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;DEFAULT_PARSER_CLASSES&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t110' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;DEFAULT_AUTHENTICATION_CLASSES&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t111' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;DEFAULT_PERMISSION_CLASSES&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t112' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;DEFAULT_THROTTLE_CLASSES&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t113' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;DEFAULT_CONTENT_NEGOTIATION_CLASS&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t114' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;DEFAULT_MODEL_SERIALIZER_CLASS&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t115' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;DEFAULT_PAGINATION_SERIALIZER_CLASS&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t116' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;DEFAULT_FILTER_BACKENDS&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t117' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;FILTER_BACKEND&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t118' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;UNAUTHENTICATED_USER&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t119' class='pln'>&nbsp; &nbsp; <span class='str'>&#39;UNAUTHENTICATED_TOKEN&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t120' class='pln'><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t121' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t122' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t123' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>perform_import</span><span class='op'>(</span><span class='nam'>val</span><span class='op'>,</span> <span class='nam'>setting_name</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t124' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t125' class='pln'><span class='str'>&nbsp; &nbsp; If the given setting is a string import notation,</span><span class='strut'>&nbsp;</span></p>
<p id='t126' class='pln'><span class='str'>&nbsp; &nbsp; then perform the necessary import or imports.</span><span class='strut'>&nbsp;</span></p>
<p id='t127' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t128' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>val</span><span class='op'>,</span> <span class='nam'>six</span><span class='op'>.</span><span class='nam'>string_types</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t129' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>import_from_string</span><span class='op'>(</span><span class='nam'>val</span><span class='op'>,</span> <span class='nam'>setting_name</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t130' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>elif</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>val</span><span class='op'>,</span> <span class='op'>(</span><span class='nam'>list</span><span class='op'>,</span> <span class='nam'>tuple</span><span class='op'>)</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t131' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>[</span><span class='nam'>import_from_string</span><span class='op'>(</span><span class='nam'>item</span><span class='op'>,</span> <span class='nam'>setting_name</span><span class='op'>)</span> <span class='key'>for</span> <span class='nam'>item</span> <span class='key'>in</span> <span class='nam'>val</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t132' class='stm mis'>&nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>val</span><span class='strut'>&nbsp;</span></p>
<p id='t133' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t134' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t135' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>import_from_string</span><span class='op'>(</span><span class='nam'>val</span><span class='op'>,</span> <span class='nam'>setting_name</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t136' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t137' class='pln'><span class='str'>&nbsp; &nbsp; Attempt to import a class from a string representation.</span><span class='strut'>&nbsp;</span></p>
<p id='t138' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t139' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t140' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Nod to tastypie&#39;s use of importlib.</span><span class='strut'>&nbsp;</span></p>
<p id='t141' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>parts</span> <span class='op'>=</span> <span class='nam'>val</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>&#39;.&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t142' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>module_path</span><span class='op'>,</span> <span class='nam'>class_name</span> <span class='op'>=</span> <span class='str'>&#39;.&#39;</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='nam'>parts</span><span class='op'>[</span><span class='op'>:</span><span class='op'>-</span><span class='num'>1</span><span class='op'>]</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>parts</span><span class='op'>[</span><span class='op'>-</span><span class='num'>1</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t143' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>module</span> <span class='op'>=</span> <span class='nam'>importlib</span><span class='op'>.</span><span class='nam'>import_module</span><span class='op'>(</span><span class='nam'>module_path</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t144' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>module</span><span class='op'>,</span> <span class='nam'>class_name</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t145' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>except</span> <span class='nam'>ImportError</span> <span class='key'>as</span> <span class='nam'>e</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t146' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>msg</span> <span class='op'>=</span> <span class='str'>&quot;Could not import &#39;%s&#39; for API setting &#39;%s&#39;. %s: %s.&quot;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>val</span><span class='op'>,</span> <span class='nam'>setting_name</span><span class='op'>,</span> <span class='nam'>e</span><span class='op'>.</span><span class='nam'>__class__</span><span class='op'>.</span><span class='nam'>__name__</span><span class='op'>,</span> <span class='nam'>e</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t147' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>ImportError</span><span class='op'>(</span><span class='nam'>msg</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t148' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t149' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t150' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>APISettings</span><span class='op'>(</span><span class='nam'>object</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t151' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t152' class='pln'><span class='str'>&nbsp; &nbsp; A settings object, that allows API settings to be accessed as properties.</span><span class='strut'>&nbsp;</span></p>
<p id='t153' class='pln'><span class='str'>&nbsp; &nbsp; For example:</span><span class='strut'>&nbsp;</span></p>
<p id='t154' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t155' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; from rest_framework.settings import api_settings</span><span class='strut'>&nbsp;</span></p>
<p id='t156' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; print api_settings.DEFAULT_RENDERER_CLASSES</span><span class='strut'>&nbsp;</span></p>
<p id='t157' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t158' class='pln'><span class='str'>&nbsp; &nbsp; Any setting with string import paths will be automatically resolved</span><span class='strut'>&nbsp;</span></p>
<p id='t159' class='pln'><span class='str'>&nbsp; &nbsp; and return the class, rather than the string literal.</span><span class='strut'>&nbsp;</span></p>
<p id='t160' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t161' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>user_settings</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>defaults</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>import_strings</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t162' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>user_settings</span> <span class='op'>=</span> <span class='nam'>user_settings</span> <span class='key'>or</span> <span class='op'>{</span><span class='op'>}</span><span class='strut'>&nbsp;</span></p>
<p id='t163' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>defaults</span> <span class='op'>=</span> <span class='nam'>defaults</span> <span class='key'>or</span> <span class='op'>{</span><span class='op'>}</span><span class='strut'>&nbsp;</span></p>
<p id='t164' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>import_strings</span> <span class='op'>=</span> <span class='nam'>import_strings</span> <span class='key'>or</span> <span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t165' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t166' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__getattr__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>attr</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t167' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>attr</span> <span class='key'>not</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>defaults</span><span class='op'>.</span><span class='nam'>keys</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t168' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>AttributeError</span><span class='op'>(</span><span class='str'>&quot;Invalid API setting: &#39;%s&#39;&quot;</span> <span class='op'>%</span> <span class='nam'>attr</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t169' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t170' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t171' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Check if present in user settings</span><span class='strut'>&nbsp;</span></p>
<p id='t172' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>val</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>user_settings</span><span class='op'>[</span><span class='nam'>attr</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t173' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='nam'>KeyError</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t174' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Fall back to defaults</span><span class='strut'>&nbsp;</span></p>
<p id='t175' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>val</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>defaults</span><span class='op'>[</span><span class='nam'>attr</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t176' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t177' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Coerce import strings into classes</span><span class='strut'>&nbsp;</span></p>
<p id='t178' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>val</span> <span class='key'>and</span> <span class='nam'>attr</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>import_strings</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t179' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>val</span> <span class='op'>=</span> <span class='nam'>perform_import</span><span class='op'>(</span><span class='nam'>val</span><span class='op'>,</span> <span class='nam'>attr</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t180' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t181' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>validate_setting</span><span class='op'>(</span><span class='nam'>attr</span><span class='op'>,</span> <span class='nam'>val</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t182' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t183' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Cache the result</span><span class='strut'>&nbsp;</span></p>
<p id='t184' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>setattr</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>attr</span><span class='op'>,</span> <span class='nam'>val</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t185' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>val</span><span class='strut'>&nbsp;</span></p>
<p id='t186' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t187' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>validate_setting</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>attr</span><span class='op'>,</span> <span class='nam'>val</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t188' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>attr</span> <span class='op'>==</span> <span class='str'>&#39;FILTER_BACKEND&#39;</span> <span class='key'>and</span> <span class='nam'>val</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t189' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Make sure we can initialize the class</span><span class='strut'>&nbsp;</span></p>
<p id='t190' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>val</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t191' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t192' class='stm run hide_run'><span class='nam'>api_settings</span> <span class='op'>=</span> <span class='nam'>APISettings</span><span class='op'>(</span><span class='nam'>USER_SETTINGS</span><span class='op'>,</span> <span class='nam'>DEFAULTS</span><span class='op'>,</span> <span class='nam'>IMPORT_STRINGS</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
</td>
</tr>
</table>
</div>
<div id='footer'>
<div class='content'>
<p>
<a class='nav' href='index.html'>&#xab; index</a> &nbsp; &nbsp; <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.5.1</a>
</p>
</div>
</div>
</body>
</html>

View File

@ -1,187 +0,0 @@
<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
<title>Coverage for rest_framework/status: 100%</title>
<link rel='stylesheet' href='style.css' type='text/css'>
<script type='text/javascript' src='jquery-1.4.3.min.js'></script>
<script type='text/javascript' src='jquery.hotkeys.js'></script>
<script type='text/javascript' src='jquery.isonscreen.js'></script>
<script type='text/javascript' src='coverage_html.js'></script>
<script type='text/javascript' charset='utf-8'>
jQuery(document).ready(coverage.pyfile_ready);
</script>
</head>
<body id='pyfile'>
<div id='header'>
<div class='content'>
<h1>Coverage for <b>rest_framework/status</b> :
<span class='pc_cov'>100%</span>
</h1>
<img id='keyboard_icon' src='keybd_closed.png'>
<h2 class='stats'>
46 statements
<span class='run hide_run shortkey_r' onclick='coverage.toggle_lines(this, "run")'>46 run</span>
<span class='mis shortkey_m' onclick='coverage.toggle_lines(this, "mis")'>0 missing</span>
<span class='exc shortkey_x' onclick='coverage.toggle_lines(this, "exc")'>0 excluded</span>
</h2>
</div>
</div>
<div class='help_panel'>
<img id='panel_icon' src='keybd_open.png'>
<p class='legend'>Hot-keys on this page</p>
<div>
<p class='keyhelp'>
<span class='key'>r</span>
<span class='key'>m</span>
<span class='key'>x</span>
<span class='key'>p</span> &nbsp; toggle line displays
</p>
<p class='keyhelp'>
<span class='key'>j</span>
<span class='key'>k</span> &nbsp; next/prev highlighted chunk
</p>
<p class='keyhelp'>
<span class='key'>0</span> &nbsp; (zero) top of page
</p>
<p class='keyhelp'>
<span class='key'>1</span> &nbsp; (one) first highlighted chunk
</p>
</div>
</div>
<div id='source'>
<table cellspacing='0' cellpadding='0'>
<tr>
<td class='linenos' valign='top'>
<p id='n1' class='pln'><a href='#n1'>1</a></p>
<p id='n2' class='pln'><a href='#n2'>2</a></p>
<p id='n3' class='pln'><a href='#n3'>3</a></p>
<p id='n4' class='pln'><a href='#n4'>4</a></p>
<p id='n5' class='pln'><a href='#n5'>5</a></p>
<p id='n6' class='pln'><a href='#n6'>6</a></p>
<p id='n7' class='stm run hide_run'><a href='#n7'>7</a></p>
<p id='n8' class='pln'><a href='#n8'>8</a></p>
<p id='n9' class='stm run hide_run'><a href='#n9'>9</a></p>
<p id='n10' class='stm run hide_run'><a href='#n10'>10</a></p>
<p id='n11' class='stm run hide_run'><a href='#n11'>11</a></p>
<p id='n12' class='stm run hide_run'><a href='#n12'>12</a></p>
<p id='n13' class='stm run hide_run'><a href='#n13'>13</a></p>
<p id='n14' class='stm run hide_run'><a href='#n14'>14</a></p>
<p id='n15' class='stm run hide_run'><a href='#n15'>15</a></p>
<p id='n16' class='stm run hide_run'><a href='#n16'>16</a></p>
<p id='n17' class='stm run hide_run'><a href='#n17'>17</a></p>
<p id='n18' class='stm run hide_run'><a href='#n18'>18</a></p>
<p id='n19' class='stm run hide_run'><a href='#n19'>19</a></p>
<p id='n20' class='stm run hide_run'><a href='#n20'>20</a></p>
<p id='n21' class='stm run hide_run'><a href='#n21'>21</a></p>
<p id='n22' class='stm run hide_run'><a href='#n22'>22</a></p>
<p id='n23' class='stm run hide_run'><a href='#n23'>23</a></p>
<p id='n24' class='stm run hide_run'><a href='#n24'>24</a></p>
<p id='n25' class='stm run hide_run'><a href='#n25'>25</a></p>
<p id='n26' class='stm run hide_run'><a href='#n26'>26</a></p>
<p id='n27' class='stm run hide_run'><a href='#n27'>27</a></p>
<p id='n28' class='stm run hide_run'><a href='#n28'>28</a></p>
<p id='n29' class='stm run hide_run'><a href='#n29'>29</a></p>
<p id='n30' class='stm run hide_run'><a href='#n30'>30</a></p>
<p id='n31' class='stm run hide_run'><a href='#n31'>31</a></p>
<p id='n32' class='stm run hide_run'><a href='#n32'>32</a></p>
<p id='n33' class='stm run hide_run'><a href='#n33'>33</a></p>
<p id='n34' class='stm run hide_run'><a href='#n34'>34</a></p>
<p id='n35' class='stm run hide_run'><a href='#n35'>35</a></p>
<p id='n36' class='stm run hide_run'><a href='#n36'>36</a></p>
<p id='n37' class='stm run hide_run'><a href='#n37'>37</a></p>
<p id='n38' class='stm run hide_run'><a href='#n38'>38</a></p>
<p id='n39' class='stm run hide_run'><a href='#n39'>39</a></p>
<p id='n40' class='stm run hide_run'><a href='#n40'>40</a></p>
<p id='n41' class='stm run hide_run'><a href='#n41'>41</a></p>
<p id='n42' class='stm run hide_run'><a href='#n42'>42</a></p>
<p id='n43' class='stm run hide_run'><a href='#n43'>43</a></p>
<p id='n44' class='stm run hide_run'><a href='#n44'>44</a></p>
<p id='n45' class='stm run hide_run'><a href='#n45'>45</a></p>
<p id='n46' class='stm run hide_run'><a href='#n46'>46</a></p>
<p id='n47' class='stm run hide_run'><a href='#n47'>47</a></p>
<p id='n48' class='stm run hide_run'><a href='#n48'>48</a></p>
<p id='n49' class='stm run hide_run'><a href='#n49'>49</a></p>
<p id='n50' class='stm run hide_run'><a href='#n50'>50</a></p>
<p id='n51' class='stm run hide_run'><a href='#n51'>51</a></p>
<p id='n52' class='stm run hide_run'><a href='#n52'>52</a></p>
<p id='n53' class='stm run hide_run'><a href='#n53'>53</a></p>
</td>
<td class='text' valign='top'>
<p id='t1' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t2' class='pln'><span class='str'>Descriptive HTTP status codes, for code readability.</span><span class='strut'>&nbsp;</span></p>
<p id='t3' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t4' class='pln'><span class='str'>See RFC 2616 - http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html</span><span class='strut'>&nbsp;</span></p>
<p id='t5' class='pln'><span class='str'>And RFC 6585 - http://tools.ietf.org/html/rfc6585</span><span class='strut'>&nbsp;</span></p>
<p id='t6' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t7' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>__future__</span> <span class='key'>import</span> <span class='nam'>unicode_literals</span><span class='strut'>&nbsp;</span></p>
<p id='t8' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t9' class='stm run hide_run'><span class='nam'>HTTP_100_CONTINUE</span> <span class='op'>=</span> <span class='num'>100</span><span class='strut'>&nbsp;</span></p>
<p id='t10' class='stm run hide_run'><span class='nam'>HTTP_101_SWITCHING_PROTOCOLS</span> <span class='op'>=</span> <span class='num'>101</span><span class='strut'>&nbsp;</span></p>
<p id='t11' class='stm run hide_run'><span class='nam'>HTTP_200_OK</span> <span class='op'>=</span> <span class='num'>200</span><span class='strut'>&nbsp;</span></p>
<p id='t12' class='stm run hide_run'><span class='nam'>HTTP_201_CREATED</span> <span class='op'>=</span> <span class='num'>201</span><span class='strut'>&nbsp;</span></p>
<p id='t13' class='stm run hide_run'><span class='nam'>HTTP_202_ACCEPTED</span> <span class='op'>=</span> <span class='num'>202</span><span class='strut'>&nbsp;</span></p>
<p id='t14' class='stm run hide_run'><span class='nam'>HTTP_203_NON_AUTHORITATIVE_INFORMATION</span> <span class='op'>=</span> <span class='num'>203</span><span class='strut'>&nbsp;</span></p>
<p id='t15' class='stm run hide_run'><span class='nam'>HTTP_204_NO_CONTENT</span> <span class='op'>=</span> <span class='num'>204</span><span class='strut'>&nbsp;</span></p>
<p id='t16' class='stm run hide_run'><span class='nam'>HTTP_205_RESET_CONTENT</span> <span class='op'>=</span> <span class='num'>205</span><span class='strut'>&nbsp;</span></p>
<p id='t17' class='stm run hide_run'><span class='nam'>HTTP_206_PARTIAL_CONTENT</span> <span class='op'>=</span> <span class='num'>206</span><span class='strut'>&nbsp;</span></p>
<p id='t18' class='stm run hide_run'><span class='nam'>HTTP_300_MULTIPLE_CHOICES</span> <span class='op'>=</span> <span class='num'>300</span><span class='strut'>&nbsp;</span></p>
<p id='t19' class='stm run hide_run'><span class='nam'>HTTP_301_MOVED_PERMANENTLY</span> <span class='op'>=</span> <span class='num'>301</span><span class='strut'>&nbsp;</span></p>
<p id='t20' class='stm run hide_run'><span class='nam'>HTTP_302_FOUND</span> <span class='op'>=</span> <span class='num'>302</span><span class='strut'>&nbsp;</span></p>
<p id='t21' class='stm run hide_run'><span class='nam'>HTTP_303_SEE_OTHER</span> <span class='op'>=</span> <span class='num'>303</span><span class='strut'>&nbsp;</span></p>
<p id='t22' class='stm run hide_run'><span class='nam'>HTTP_304_NOT_MODIFIED</span> <span class='op'>=</span> <span class='num'>304</span><span class='strut'>&nbsp;</span></p>
<p id='t23' class='stm run hide_run'><span class='nam'>HTTP_305_USE_PROXY</span> <span class='op'>=</span> <span class='num'>305</span><span class='strut'>&nbsp;</span></p>
<p id='t24' class='stm run hide_run'><span class='nam'>HTTP_306_RESERVED</span> <span class='op'>=</span> <span class='num'>306</span><span class='strut'>&nbsp;</span></p>
<p id='t25' class='stm run hide_run'><span class='nam'>HTTP_307_TEMPORARY_REDIRECT</span> <span class='op'>=</span> <span class='num'>307</span><span class='strut'>&nbsp;</span></p>
<p id='t26' class='stm run hide_run'><span class='nam'>HTTP_400_BAD_REQUEST</span> <span class='op'>=</span> <span class='num'>400</span><span class='strut'>&nbsp;</span></p>
<p id='t27' class='stm run hide_run'><span class='nam'>HTTP_401_UNAUTHORIZED</span> <span class='op'>=</span> <span class='num'>401</span><span class='strut'>&nbsp;</span></p>
<p id='t28' class='stm run hide_run'><span class='nam'>HTTP_402_PAYMENT_REQUIRED</span> <span class='op'>=</span> <span class='num'>402</span><span class='strut'>&nbsp;</span></p>
<p id='t29' class='stm run hide_run'><span class='nam'>HTTP_403_FORBIDDEN</span> <span class='op'>=</span> <span class='num'>403</span><span class='strut'>&nbsp;</span></p>
<p id='t30' class='stm run hide_run'><span class='nam'>HTTP_404_NOT_FOUND</span> <span class='op'>=</span> <span class='num'>404</span><span class='strut'>&nbsp;</span></p>
<p id='t31' class='stm run hide_run'><span class='nam'>HTTP_405_METHOD_NOT_ALLOWED</span> <span class='op'>=</span> <span class='num'>405</span><span class='strut'>&nbsp;</span></p>
<p id='t32' class='stm run hide_run'><span class='nam'>HTTP_406_NOT_ACCEPTABLE</span> <span class='op'>=</span> <span class='num'>406</span><span class='strut'>&nbsp;</span></p>
<p id='t33' class='stm run hide_run'><span class='nam'>HTTP_407_PROXY_AUTHENTICATION_REQUIRED</span> <span class='op'>=</span> <span class='num'>407</span><span class='strut'>&nbsp;</span></p>
<p id='t34' class='stm run hide_run'><span class='nam'>HTTP_408_REQUEST_TIMEOUT</span> <span class='op'>=</span> <span class='num'>408</span><span class='strut'>&nbsp;</span></p>
<p id='t35' class='stm run hide_run'><span class='nam'>HTTP_409_CONFLICT</span> <span class='op'>=</span> <span class='num'>409</span><span class='strut'>&nbsp;</span></p>
<p id='t36' class='stm run hide_run'><span class='nam'>HTTP_410_GONE</span> <span class='op'>=</span> <span class='num'>410</span><span class='strut'>&nbsp;</span></p>
<p id='t37' class='stm run hide_run'><span class='nam'>HTTP_411_LENGTH_REQUIRED</span> <span class='op'>=</span> <span class='num'>411</span><span class='strut'>&nbsp;</span></p>
<p id='t38' class='stm run hide_run'><span class='nam'>HTTP_412_PRECONDITION_FAILED</span> <span class='op'>=</span> <span class='num'>412</span><span class='strut'>&nbsp;</span></p>
<p id='t39' class='stm run hide_run'><span class='nam'>HTTP_413_REQUEST_ENTITY_TOO_LARGE</span> <span class='op'>=</span> <span class='num'>413</span><span class='strut'>&nbsp;</span></p>
<p id='t40' class='stm run hide_run'><span class='nam'>HTTP_414_REQUEST_URI_TOO_LONG</span> <span class='op'>=</span> <span class='num'>414</span><span class='strut'>&nbsp;</span></p>
<p id='t41' class='stm run hide_run'><span class='nam'>HTTP_415_UNSUPPORTED_MEDIA_TYPE</span> <span class='op'>=</span> <span class='num'>415</span><span class='strut'>&nbsp;</span></p>
<p id='t42' class='stm run hide_run'><span class='nam'>HTTP_416_REQUESTED_RANGE_NOT_SATISFIABLE</span> <span class='op'>=</span> <span class='num'>416</span><span class='strut'>&nbsp;</span></p>
<p id='t43' class='stm run hide_run'><span class='nam'>HTTP_417_EXPECTATION_FAILED</span> <span class='op'>=</span> <span class='num'>417</span><span class='strut'>&nbsp;</span></p>
<p id='t44' class='stm run hide_run'><span class='nam'>HTTP_428_PRECONDITION_REQUIRED</span> <span class='op'>=</span> <span class='num'>428</span><span class='strut'>&nbsp;</span></p>
<p id='t45' class='stm run hide_run'><span class='nam'>HTTP_429_TOO_MANY_REQUESTS</span> <span class='op'>=</span> <span class='num'>429</span><span class='strut'>&nbsp;</span></p>
<p id='t46' class='stm run hide_run'><span class='nam'>HTTP_431_REQUEST_HEADER_FIELDS_TOO_LARGE</span> <span class='op'>=</span> <span class='num'>431</span><span class='strut'>&nbsp;</span></p>
<p id='t47' class='stm run hide_run'><span class='nam'>HTTP_500_INTERNAL_SERVER_ERROR</span> <span class='op'>=</span> <span class='num'>500</span><span class='strut'>&nbsp;</span></p>
<p id='t48' class='stm run hide_run'><span class='nam'>HTTP_501_NOT_IMPLEMENTED</span> <span class='op'>=</span> <span class='num'>501</span><span class='strut'>&nbsp;</span></p>
<p id='t49' class='stm run hide_run'><span class='nam'>HTTP_502_BAD_GATEWAY</span> <span class='op'>=</span> <span class='num'>502</span><span class='strut'>&nbsp;</span></p>
<p id='t50' class='stm run hide_run'><span class='nam'>HTTP_503_SERVICE_UNAVAILABLE</span> <span class='op'>=</span> <span class='num'>503</span><span class='strut'>&nbsp;</span></p>
<p id='t51' class='stm run hide_run'><span class='nam'>HTTP_504_GATEWAY_TIMEOUT</span> <span class='op'>=</span> <span class='num'>504</span><span class='strut'>&nbsp;</span></p>
<p id='t52' class='stm run hide_run'><span class='nam'>HTTP_505_HTTP_VERSION_NOT_SUPPORTED</span> <span class='op'>=</span> <span class='num'>505</span><span class='strut'>&nbsp;</span></p>
<p id='t53' class='stm run hide_run'><span class='nam'>HTTP_511_NETWORK_AUTHENTICATION_REQUIRED</span> <span class='op'>=</span> <span class='num'>511</span><span class='strut'>&nbsp;</span></p>
</td>
</tr>
</table>
</div>
<div id='footer'>
<div class='content'>
<p>
<a class='nav' href='index.html'>&#xab; index</a> &nbsp; &nbsp; <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.5.1</a>
</p>
</div>
</div>
</body>
</html>

View File

@ -1,533 +0,0 @@
<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
<title>Coverage for rest_framework/throttling: 81%</title>
<link rel='stylesheet' href='style.css' type='text/css'>
<script type='text/javascript' src='jquery-1.4.3.min.js'></script>
<script type='text/javascript' src='jquery.hotkeys.js'></script>
<script type='text/javascript' src='jquery.isonscreen.js'></script>
<script type='text/javascript' src='coverage_html.js'></script>
<script type='text/javascript' charset='utf-8'>
jQuery(document).ready(coverage.pyfile_ready);
</script>
</head>
<body id='pyfile'>
<div id='header'>
<div class='content'>
<h1>Coverage for <b>rest_framework/throttling</b> :
<span class='pc_cov'>81%</span>
</h1>
<img id='keyboard_icon' src='keybd_closed.png'>
<h2 class='stats'>
90 statements
<span class='run hide_run shortkey_r' onclick='coverage.toggle_lines(this, "run")'>73 run</span>
<span class='mis shortkey_m' onclick='coverage.toggle_lines(this, "mis")'>17 missing</span>
<span class='exc shortkey_x' onclick='coverage.toggle_lines(this, "exc")'>0 excluded</span>
</h2>
</div>
</div>
<div class='help_panel'>
<img id='panel_icon' src='keybd_open.png'>
<p class='legend'>Hot-keys on this page</p>
<div>
<p class='keyhelp'>
<span class='key'>r</span>
<span class='key'>m</span>
<span class='key'>x</span>
<span class='key'>p</span> &nbsp; toggle line displays
</p>
<p class='keyhelp'>
<span class='key'>j</span>
<span class='key'>k</span> &nbsp; next/prev highlighted chunk
</p>
<p class='keyhelp'>
<span class='key'>0</span> &nbsp; (zero) top of page
</p>
<p class='keyhelp'>
<span class='key'>1</span> &nbsp; (one) first highlighted chunk
</p>
</div>
</div>
<div id='source'>
<table cellspacing='0' cellpadding='0'>
<tr>
<td class='linenos' valign='top'>
<p id='n1' class='pln'><a href='#n1'>1</a></p>
<p id='n2' class='pln'><a href='#n2'>2</a></p>
<p id='n3' class='pln'><a href='#n3'>3</a></p>
<p id='n4' class='stm run hide_run'><a href='#n4'>4</a></p>
<p id='n5' class='stm run hide_run'><a href='#n5'>5</a></p>
<p id='n6' class='stm run hide_run'><a href='#n6'>6</a></p>
<p id='n7' class='stm run hide_run'><a href='#n7'>7</a></p>
<p id='n8' class='stm run hide_run'><a href='#n8'>8</a></p>
<p id='n9' class='pln'><a href='#n9'>9</a></p>
<p id='n10' class='pln'><a href='#n10'>10</a></p>
<p id='n11' class='stm run hide_run'><a href='#n11'>11</a></p>
<p id='n12' class='pln'><a href='#n12'>12</a></p>
<p id='n13' class='pln'><a href='#n13'>13</a></p>
<p id='n14' class='pln'><a href='#n14'>14</a></p>
<p id='n15' class='stm run hide_run'><a href='#n15'>15</a></p>
<p id='n16' class='pln'><a href='#n16'>16</a></p>
<p id='n17' class='pln'><a href='#n17'>17</a></p>
<p id='n18' class='pln'><a href='#n18'>18</a></p>
<p id='n19' class='stm mis'><a href='#n19'>19</a></p>
<p id='n20' class='pln'><a href='#n20'>20</a></p>
<p id='n21' class='stm run hide_run'><a href='#n21'>21</a></p>
<p id='n22' class='pln'><a href='#n22'>22</a></p>
<p id='n23' class='pln'><a href='#n23'>23</a></p>
<p id='n24' class='pln'><a href='#n24'>24</a></p>
<p id='n25' class='pln'><a href='#n25'>25</a></p>
<p id='n26' class='stm mis'><a href='#n26'>26</a></p>
<p id='n27' class='pln'><a href='#n27'>27</a></p>
<p id='n28' class='pln'><a href='#n28'>28</a></p>
<p id='n29' class='stm run hide_run'><a href='#n29'>29</a></p>
<p id='n30' class='pln'><a href='#n30'>30</a></p>
<p id='n31' class='pln'><a href='#n31'>31</a></p>
<p id='n32' class='pln'><a href='#n32'>32</a></p>
<p id='n33' class='pln'><a href='#n33'>33</a></p>
<p id='n34' class='pln'><a href='#n34'>34</a></p>
<p id='n35' class='pln'><a href='#n35'>35</a></p>
<p id='n36' class='pln'><a href='#n36'>36</a></p>
<p id='n37' class='pln'><a href='#n37'>37</a></p>
<p id='n38' class='pln'><a href='#n38'>38</a></p>
<p id='n39' class='pln'><a href='#n39'>39</a></p>
<p id='n40' class='pln'><a href='#n40'>40</a></p>
<p id='n41' class='pln'><a href='#n41'>41</a></p>
<p id='n42' class='stm run hide_run'><a href='#n42'>42</a></p>
<p id='n43' class='stm run hide_run'><a href='#n43'>43</a></p>
<p id='n44' class='stm run hide_run'><a href='#n44'>44</a></p>
<p id='n45' class='stm run hide_run'><a href='#n45'>45</a></p>
<p id='n46' class='pln'><a href='#n46'>46</a></p>
<p id='n47' class='stm run hide_run'><a href='#n47'>47</a></p>
<p id='n48' class='stm run hide_run'><a href='#n48'>48</a></p>
<p id='n49' class='stm mis'><a href='#n49'>49</a></p>
<p id='n50' class='stm run hide_run'><a href='#n50'>50</a></p>
<p id='n51' class='pln'><a href='#n51'>51</a></p>
<p id='n52' class='stm run hide_run'><a href='#n52'>52</a></p>
<p id='n53' class='pln'><a href='#n53'>53</a></p>
<p id='n54' class='pln'><a href='#n54'>54</a></p>
<p id='n55' class='pln'><a href='#n55'>55</a></p>
<p id='n56' class='pln'><a href='#n56'>56</a></p>
<p id='n57' class='pln'><a href='#n57'>57</a></p>
<p id='n58' class='pln'><a href='#n58'>58</a></p>
<p id='n59' class='stm mis'><a href='#n59'>59</a></p>
<p id='n60' class='pln'><a href='#n60'>60</a></p>
<p id='n61' class='stm run hide_run'><a href='#n61'>61</a></p>
<p id='n62' class='pln'><a href='#n62'>62</a></p>
<p id='n63' class='pln'><a href='#n63'>63</a></p>
<p id='n64' class='pln'><a href='#n64'>64</a></p>
<p id='n65' class='stm run hide_run'><a href='#n65'>65</a></p>
<p id='n66' class='stm mis'><a href='#n66'>66</a></p>
<p id='n67' class='pln'><a href='#n67'>67</a></p>
<p id='n68' class='stm mis'><a href='#n68'>68</a></p>
<p id='n69' class='pln'><a href='#n69'>69</a></p>
<p id='n70' class='stm run hide_run'><a href='#n70'>70</a></p>
<p id='n71' class='stm run hide_run'><a href='#n71'>71</a></p>
<p id='n72' class='stm mis'><a href='#n72'>72</a></p>
<p id='n73' class='stm mis'><a href='#n73'>73</a></p>
<p id='n74' class='stm mis'><a href='#n74'>74</a></p>
<p id='n75' class='pln'><a href='#n75'>75</a></p>
<p id='n76' class='stm run hide_run'><a href='#n76'>76</a></p>
<p id='n77' class='pln'><a href='#n77'>77</a></p>
<p id='n78' class='pln'><a href='#n78'>78</a></p>
<p id='n79' class='pln'><a href='#n79'>79</a></p>
<p id='n80' class='pln'><a href='#n80'>80</a></p>
<p id='n81' class='stm run hide_run'><a href='#n81'>81</a></p>
<p id='n82' class='stm mis'><a href='#n82'>82</a></p>
<p id='n83' class='stm run hide_run'><a href='#n83'>83</a></p>
<p id='n84' class='stm run hide_run'><a href='#n84'>84</a></p>
<p id='n85' class='stm run hide_run'><a href='#n85'>85</a></p>
<p id='n86' class='stm run hide_run'><a href='#n86'>86</a></p>
<p id='n87' class='pln'><a href='#n87'>87</a></p>
<p id='n88' class='stm run hide_run'><a href='#n88'>88</a></p>
<p id='n89' class='pln'><a href='#n89'>89</a></p>
<p id='n90' class='pln'><a href='#n90'>90</a></p>
<p id='n91' class='pln'><a href='#n91'>91</a></p>
<p id='n92' class='pln'><a href='#n92'>92</a></p>
<p id='n93' class='pln'><a href='#n93'>93</a></p>
<p id='n94' class='pln'><a href='#n94'>94</a></p>
<p id='n95' class='stm run hide_run'><a href='#n95'>95</a></p>
<p id='n96' class='stm mis'><a href='#n96'>96</a></p>
<p id='n97' class='pln'><a href='#n97'>97</a></p>
<p id='n98' class='stm run hide_run'><a href='#n98'>98</a></p>
<p id='n99' class='stm run hide_run'><a href='#n99'>99</a></p>
<p id='n100' class='stm run hide_run'><a href='#n100'>100</a></p>
<p id='n101' class='pln'><a href='#n101'>101</a></p>
<p id='n102' class='pln'><a href='#n102'>102</a></p>
<p id='n103' class='pln'><a href='#n103'>103</a></p>
<p id='n104' class='stm run hide_run'><a href='#n104'>104</a></p>
<p id='n105' class='stm run hide_run'><a href='#n105'>105</a></p>
<p id='n106' class='stm run hide_run'><a href='#n106'>106</a></p>
<p id='n107' class='stm run hide_run'><a href='#n107'>107</a></p>
<p id='n108' class='stm run hide_run'><a href='#n108'>108</a></p>
<p id='n109' class='pln'><a href='#n109'>109</a></p>
<p id='n110' class='stm run hide_run'><a href='#n110'>110</a></p>
<p id='n111' class='pln'><a href='#n111'>111</a></p>
<p id='n112' class='pln'><a href='#n112'>112</a></p>
<p id='n113' class='pln'><a href='#n113'>113</a></p>
<p id='n114' class='pln'><a href='#n114'>114</a></p>
<p id='n115' class='stm run hide_run'><a href='#n115'>115</a></p>
<p id='n116' class='stm run hide_run'><a href='#n116'>116</a></p>
<p id='n117' class='stm run hide_run'><a href='#n117'>117</a></p>
<p id='n118' class='pln'><a href='#n118'>118</a></p>
<p id='n119' class='stm run hide_run'><a href='#n119'>119</a></p>
<p id='n120' class='pln'><a href='#n120'>120</a></p>
<p id='n121' class='pln'><a href='#n121'>121</a></p>
<p id='n122' class='pln'><a href='#n122'>122</a></p>
<p id='n123' class='stm run hide_run'><a href='#n123'>123</a></p>
<p id='n124' class='pln'><a href='#n124'>124</a></p>
<p id='n125' class='stm run hide_run'><a href='#n125'>125</a></p>
<p id='n126' class='pln'><a href='#n126'>126</a></p>
<p id='n127' class='pln'><a href='#n127'>127</a></p>
<p id='n128' class='pln'><a href='#n128'>128</a></p>
<p id='n129' class='stm run hide_run'><a href='#n129'>129</a></p>
<p id='n130' class='stm run hide_run'><a href='#n130'>130</a></p>
<p id='n131' class='pln'><a href='#n131'>131</a></p>
<p id='n132' class='stm mis'><a href='#n132'>132</a></p>
<p id='n133' class='pln'><a href='#n133'>133</a></p>
<p id='n134' class='stm run hide_run'><a href='#n134'>134</a></p>
<p id='n135' class='pln'><a href='#n135'>135</a></p>
<p id='n136' class='stm run hide_run'><a href='#n136'>136</a></p>
<p id='n137' class='pln'><a href='#n137'>137</a></p>
<p id='n138' class='pln'><a href='#n138'>138</a></p>
<p id='n139' class='stm run hide_run'><a href='#n139'>139</a></p>
<p id='n140' class='pln'><a href='#n140'>140</a></p>
<p id='n141' class='pln'><a href='#n141'>141</a></p>
<p id='n142' class='pln'><a href='#n142'>142</a></p>
<p id='n143' class='pln'><a href='#n143'>143</a></p>
<p id='n144' class='pln'><a href='#n144'>144</a></p>
<p id='n145' class='stm run hide_run'><a href='#n145'>145</a></p>
<p id='n146' class='pln'><a href='#n146'>146</a></p>
<p id='n147' class='stm run hide_run'><a href='#n147'>147</a></p>
<p id='n148' class='stm mis'><a href='#n148'>148</a></p>
<p id='n149' class='stm mis'><a href='#n149'>149</a></p>
<p id='n150' class='pln'><a href='#n150'>150</a></p>
<p id='n151' class='stm mis'><a href='#n151'>151</a></p>
<p id='n152' class='pln'><a href='#n152'>152</a></p>
<p id='n153' class='stm mis'><a href='#n153'>153</a></p>
<p id='n154' class='pln'><a href='#n154'>154</a></p>
<p id='n155' class='pln'><a href='#n155'>155</a></p>
<p id='n156' class='pln'><a href='#n156'>156</a></p>
<p id='n157' class='pln'><a href='#n157'>157</a></p>
<p id='n158' class='pln'><a href='#n158'>158</a></p>
<p id='n159' class='stm run hide_run'><a href='#n159'>159</a></p>
<p id='n160' class='pln'><a href='#n160'>160</a></p>
<p id='n161' class='pln'><a href='#n161'>161</a></p>
<p id='n162' class='pln'><a href='#n162'>162</a></p>
<p id='n163' class='pln'><a href='#n163'>163</a></p>
<p id='n164' class='pln'><a href='#n164'>164</a></p>
<p id='n165' class='pln'><a href='#n165'>165</a></p>
<p id='n166' class='pln'><a href='#n166'>166</a></p>
<p id='n167' class='stm run hide_run'><a href='#n167'>167</a></p>
<p id='n168' class='pln'><a href='#n168'>168</a></p>
<p id='n169' class='stm run hide_run'><a href='#n169'>169</a></p>
<p id='n170' class='stm run hide_run'><a href='#n170'>170</a></p>
<p id='n171' class='stm run hide_run'><a href='#n171'>171</a></p>
<p id='n172' class='pln'><a href='#n172'>172</a></p>
<p id='n173' class='stm run hide_run'><a href='#n173'>173</a></p>
<p id='n174' class='pln'><a href='#n174'>174</a></p>
<p id='n175' class='stm run hide_run'><a href='#n175'>175</a></p>
<p id='n176' class='pln'><a href='#n176'>176</a></p>
<p id='n177' class='pln'><a href='#n177'>177</a></p>
<p id='n178' class='pln'><a href='#n178'>178</a></p>
<p id='n179' class='pln'><a href='#n179'>179</a></p>
<p id='n180' class='pln'><a href='#n180'>180</a></p>
<p id='n181' class='stm run hide_run'><a href='#n181'>181</a></p>
<p id='n182' class='pln'><a href='#n182'>182</a></p>
<p id='n183' class='pln'><a href='#n183'>183</a></p>
<p id='n184' class='pln'><a href='#n184'>184</a></p>
<p id='n185' class='pln'><a href='#n185'>185</a></p>
<p id='n186' class='pln'><a href='#n186'>186</a></p>
<p id='n187' class='pln'><a href='#n187'>187</a></p>
<p id='n188' class='stm run hide_run'><a href='#n188'>188</a></p>
<p id='n189' class='pln'><a href='#n189'>189</a></p>
<p id='n190' class='stm run hide_run'><a href='#n190'>190</a></p>
<p id='n191' class='pln'><a href='#n191'>191</a></p>
<p id='n192' class='pln'><a href='#n192'>192</a></p>
<p id='n193' class='stm run hide_run'><a href='#n193'>193</a></p>
<p id='n194' class='pln'><a href='#n194'>194</a></p>
<p id='n195' class='stm run hide_run'><a href='#n195'>195</a></p>
<p id='n196' class='pln'><a href='#n196'>196</a></p>
<p id='n197' class='stm run hide_run'><a href='#n197'>197</a></p>
<p id='n198' class='pln'><a href='#n198'>198</a></p>
<p id='n199' class='pln'><a href='#n199'>199</a></p>
<p id='n200' class='stm run hide_run'><a href='#n200'>200</a></p>
<p id='n201' class='stm run hide_run'><a href='#n201'>201</a></p>
<p id='n202' class='pln'><a href='#n202'>202</a></p>
<p id='n203' class='pln'><a href='#n203'>203</a></p>
<p id='n204' class='pln'><a href='#n204'>204</a></p>
<p id='n205' class='stm run hide_run'><a href='#n205'>205</a></p>
<p id='n206' class='stm run hide_run'><a href='#n206'>206</a></p>
<p id='n207' class='pln'><a href='#n207'>207</a></p>
<p id='n208' class='pln'><a href='#n208'>208</a></p>
<p id='n209' class='stm run hide_run'><a href='#n209'>209</a></p>
<p id='n210' class='pln'><a href='#n210'>210</a></p>
<p id='n211' class='stm run hide_run'><a href='#n211'>211</a></p>
<p id='n212' class='pln'><a href='#n212'>212</a></p>
<p id='n213' class='pln'><a href='#n213'>213</a></p>
<p id='n214' class='pln'><a href='#n214'>214</a></p>
<p id='n215' class='pln'><a href='#n215'>215</a></p>
<p id='n216' class='pln'><a href='#n216'>216</a></p>
<p id='n217' class='pln'><a href='#n217'>217</a></p>
<p id='n218' class='stm run hide_run'><a href='#n218'>218</a></p>
<p id='n219' class='stm mis'><a href='#n219'>219</a></p>
<p id='n220' class='pln'><a href='#n220'>220</a></p>
<p id='n221' class='stm run hide_run'><a href='#n221'>221</a></p>
<p id='n222' class='pln'><a href='#n222'>222</a></p>
<p id='n223' class='stm run hide_run'><a href='#n223'>223</a></p>
<p id='n224' class='pln'><a href='#n224'>224</a></p>
<p id='n225' class='pln'><a href='#n225'>225</a></p>
<p id='n226' class='pln'><a href='#n226'>226</a></p>
</td>
<td class='text' valign='top'>
<p id='t1' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t2' class='pln'><span class='str'>Provides various throttling policies.</span><span class='strut'>&nbsp;</span></p>
<p id='t3' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t4' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>__future__</span> <span class='key'>import</span> <span class='nam'>unicode_literals</span><span class='strut'>&nbsp;</span></p>
<p id='t5' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>django</span><span class='op'>.</span><span class='nam'>core</span><span class='op'>.</span><span class='nam'>cache</span> <span class='key'>import</span> <span class='nam'>cache</span><span class='strut'>&nbsp;</span></p>
<p id='t6' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>django</span><span class='op'>.</span><span class='nam'>core</span><span class='op'>.</span><span class='nam'>exceptions</span> <span class='key'>import</span> <span class='nam'>ImproperlyConfigured</span><span class='strut'>&nbsp;</span></p>
<p id='t7' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>settings</span> <span class='key'>import</span> <span class='nam'>api_settings</span><span class='strut'>&nbsp;</span></p>
<p id='t8' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>time</span><span class='strut'>&nbsp;</span></p>
<p id='t9' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t10' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t11' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>BaseThrottle</span><span class='op'>(</span><span class='nam'>object</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t12' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t13' class='pln'><span class='str'>&nbsp; &nbsp; Rate throttling of requests.</span><span class='strut'>&nbsp;</span></p>
<p id='t14' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t15' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>allow_request</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='nam'>view</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t16' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t17' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Return `True` if the request should be allowed, `False` otherwise.</span><span class='strut'>&nbsp;</span></p>
<p id='t18' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t19' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>NotImplementedError</span><span class='op'>(</span><span class='str'>&#39;.allow_request() must be overridden&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t20' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t21' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>wait</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t22' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t23' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Optionally, return a recommended number of seconds to wait before</span><span class='strut'>&nbsp;</span></p>
<p id='t24' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; the next request.</span><span class='strut'>&nbsp;</span></p>
<p id='t25' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t26' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
<p id='t27' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t28' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t29' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>SimpleRateThrottle</span><span class='op'>(</span><span class='nam'>BaseThrottle</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t30' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t31' class='pln'><span class='str'>&nbsp; &nbsp; A simple cache implementation, that only requires `.get_cache_key()`</span><span class='strut'>&nbsp;</span></p>
<p id='t32' class='pln'><span class='str'>&nbsp; &nbsp; to be overridden.</span><span class='strut'>&nbsp;</span></p>
<p id='t33' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t34' class='pln'><span class='str'>&nbsp; &nbsp; The rate (requests / seconds) is set by a `throttle` attribute on the View</span><span class='strut'>&nbsp;</span></p>
<p id='t35' class='pln'><span class='str'>&nbsp; &nbsp; class.&nbsp; The attribute is a string of the form &#39;number_of_requests/period&#39;.</span><span class='strut'>&nbsp;</span></p>
<p id='t36' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t37' class='pln'><span class='str'>&nbsp; &nbsp; Period should be one of: (&#39;s&#39;, &#39;sec&#39;, &#39;m&#39;, &#39;min&#39;, &#39;h&#39;, &#39;hour&#39;, &#39;d&#39;, &#39;day&#39;)</span><span class='strut'>&nbsp;</span></p>
<p id='t38' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t39' class='pln'><span class='str'>&nbsp; &nbsp; Previous request information used for throttling is stored in the cache.</span><span class='strut'>&nbsp;</span></p>
<p id='t40' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t41' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t42' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>timer</span> <span class='op'>=</span> <span class='nam'>time</span><span class='op'>.</span><span class='nam'>time</span><span class='strut'>&nbsp;</span></p>
<p id='t43' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>cache_format</span> <span class='op'>=</span> <span class='str'>&#39;throtte_%(scope)s_%(ident)s&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t44' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>scope</span> <span class='op'>=</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
<p id='t45' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>THROTTLE_RATES</span> <span class='op'>=</span> <span class='nam'>api_settings</span><span class='op'>.</span><span class='nam'>DEFAULT_THROTTLE_RATES</span><span class='strut'>&nbsp;</span></p>
<p id='t46' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t47' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t48' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='str'>&#39;rate&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t49' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>rate</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_rate</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t50' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>num_requests</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>duration</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>parse_rate</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>rate</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t51' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t52' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>get_cache_key</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='nam'>view</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t53' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t54' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Should return a unique cache-key which can be used for throttling.</span><span class='strut'>&nbsp;</span></p>
<p id='t55' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Must be overridden.</span><span class='strut'>&nbsp;</span></p>
<p id='t56' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t57' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; May return `None` if the request should not be throttled.</span><span class='strut'>&nbsp;</span></p>
<p id='t58' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t59' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>NotImplementedError</span><span class='op'>(</span><span class='str'>&#39;.get_cache_key() must be overridden&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t60' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t61' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>get_rate</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t62' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t63' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Determine the string representation of the allowed request rate.</span><span class='strut'>&nbsp;</span></p>
<p id='t64' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t65' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='str'>&#39;scope&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t66' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>msg</span> <span class='op'>=</span> <span class='op'>(</span><span class='str'>&quot;You must set either `.scope` or `.rate` for &#39;%s&#39; throttle&quot;</span> <span class='op'>%</span><span class='strut'>&nbsp;</span></p>
<p id='t67' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>__class__</span><span class='op'>.</span><span class='nam'>__name__</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t68' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>ImproperlyConfigured</span><span class='op'>(</span><span class='nam'>msg</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t69' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t70' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t71' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>THROTTLE_RATES</span><span class='op'>[</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>scope</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t72' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='nam'>KeyError</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t73' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>msg</span> <span class='op'>=</span> <span class='str'>&quot;No default throttle rate set for &#39;%s&#39; scope&quot;</span> <span class='op'>%</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>scope</span><span class='strut'>&nbsp;</span></p>
<p id='t74' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>ImproperlyConfigured</span><span class='op'>(</span><span class='nam'>msg</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t75' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t76' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>parse_rate</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>rate</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t77' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t78' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Given the request rate string, return a two tuple of:</span><span class='strut'>&nbsp;</span></p>
<p id='t79' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &lt;allowed number of requests&gt;, &lt;period of time in seconds&gt;</span><span class='strut'>&nbsp;</span></p>
<p id='t80' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t81' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>rate</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t82' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>(</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t83' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>num</span><span class='op'>,</span> <span class='nam'>period</span> <span class='op'>=</span> <span class='nam'>rate</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>&#39;/&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t84' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>num_requests</span> <span class='op'>=</span> <span class='nam'>int</span><span class='op'>(</span><span class='nam'>num</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t85' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>duration</span> <span class='op'>=</span> <span class='op'>{</span><span class='str'>&#39;s&#39;</span><span class='op'>:</span> <span class='num'>1</span><span class='op'>,</span> <span class='str'>&#39;m&#39;</span><span class='op'>:</span> <span class='num'>60</span><span class='op'>,</span> <span class='str'>&#39;h&#39;</span><span class='op'>:</span> <span class='num'>3600</span><span class='op'>,</span> <span class='str'>&#39;d&#39;</span><span class='op'>:</span> <span class='num'>86400</span><span class='op'>}</span><span class='op'>[</span><span class='nam'>period</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t86' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>(</span><span class='nam'>num_requests</span><span class='op'>,</span> <span class='nam'>duration</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t87' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t88' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>allow_request</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='nam'>view</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t89' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t90' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Implement the check to see if the request should be throttled.</span><span class='strut'>&nbsp;</span></p>
<p id='t91' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t92' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; On success calls `throttle_success`.</span><span class='strut'>&nbsp;</span></p>
<p id='t93' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; On failure calls `throttle_failure`.</span><span class='strut'>&nbsp;</span></p>
<p id='t94' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t95' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>rate</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t96' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>True</span><span class='strut'>&nbsp;</span></p>
<p id='t97' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t98' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>key</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_cache_key</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>,</span> <span class='nam'>view</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t99' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>history</span> <span class='op'>=</span> <span class='nam'>cache</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>key</span><span class='op'>,</span> <span class='op'>[</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t100' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>now</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>timer</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t101' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t102' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Drop any requests from the history which have now passed the</span><span class='strut'>&nbsp;</span></p>
<p id='t103' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># throttle duration</span><span class='strut'>&nbsp;</span></p>
<p id='t104' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>while</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>history</span> <span class='key'>and</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>history</span><span class='op'>[</span><span class='op'>-</span><span class='num'>1</span><span class='op'>]</span> <span class='op'>&lt;=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>now</span> <span class='op'>-</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>duration</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t105' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>history</span><span class='op'>.</span><span class='nam'>pop</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t106' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>history</span><span class='op'>)</span> <span class='op'>&gt;=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>num_requests</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t107' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>throttle_failure</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t108' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>throttle_success</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t109' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t110' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>throttle_success</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t111' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t112' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Inserts the current request&#39;s timestamp along with the key</span><span class='strut'>&nbsp;</span></p>
<p id='t113' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; into the cache.</span><span class='strut'>&nbsp;</span></p>
<p id='t114' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t115' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>history</span><span class='op'>.</span><span class='nam'>insert</span><span class='op'>(</span><span class='num'>0</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>now</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t116' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>cache</span><span class='op'>.</span><span class='nam'>set</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>key</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>history</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>duration</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t117' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>True</span><span class='strut'>&nbsp;</span></p>
<p id='t118' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t119' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>throttle_failure</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t120' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t121' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Called when a request to the API has failed due to throttling.</span><span class='strut'>&nbsp;</span></p>
<p id='t122' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t123' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>False</span><span class='strut'>&nbsp;</span></p>
<p id='t124' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t125' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>wait</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t126' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t127' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Returns the recommended next request time in seconds.</span><span class='strut'>&nbsp;</span></p>
<p id='t128' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t129' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>history</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t130' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>remaining_duration</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>duration</span> <span class='op'>-</span> <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>now</span> <span class='op'>-</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>history</span><span class='op'>[</span><span class='op'>-</span><span class='num'>1</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t131' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t132' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>remaining_duration</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>duration</span><span class='strut'>&nbsp;</span></p>
<p id='t133' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t134' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>available_requests</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>num_requests</span> <span class='op'>-</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>history</span><span class='op'>)</span> <span class='op'>+</span> <span class='num'>1</span><span class='strut'>&nbsp;</span></p>
<p id='t135' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t136' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>remaining_duration</span> <span class='op'>/</span> <span class='nam'>float</span><span class='op'>(</span><span class='nam'>available_requests</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t137' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t138' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t139' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>AnonRateThrottle</span><span class='op'>(</span><span class='nam'>SimpleRateThrottle</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t140' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t141' class='pln'><span class='str'>&nbsp; &nbsp; Limits the rate of API calls that may be made by a anonymous users.</span><span class='strut'>&nbsp;</span></p>
<p id='t142' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t143' class='pln'><span class='str'>&nbsp; &nbsp; The IP address of the request will be used as the unique cache key.</span><span class='strut'>&nbsp;</span></p>
<p id='t144' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t145' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>scope</span> <span class='op'>=</span> <span class='str'>&#39;anon&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t146' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t147' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>get_cache_key</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='nam'>view</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t148' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>user</span><span class='op'>.</span><span class='nam'>is_authenticated</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t149' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>None</span>&nbsp; <span class='com'># Only throttle unauthenticated requests.</span><span class='strut'>&nbsp;</span></p>
<p id='t150' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t151' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ident</span> <span class='op'>=</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>META</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;REMOTE_ADDR&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t152' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t153' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cache_format</span> <span class='op'>%</span> <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
<p id='t154' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;scope&#39;</span><span class='op'>:</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>scope</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t155' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;ident&#39;</span><span class='op'>:</span> <span class='nam'>ident</span><span class='strut'>&nbsp;</span></p>
<p id='t156' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
<p id='t157' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t158' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t159' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>UserRateThrottle</span><span class='op'>(</span><span class='nam'>SimpleRateThrottle</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t160' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t161' class='pln'><span class='str'>&nbsp; &nbsp; Limits the rate of API calls that may be made by a given user.</span><span class='strut'>&nbsp;</span></p>
<p id='t162' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t163' class='pln'><span class='str'>&nbsp; &nbsp; The user id will be used as a unique cache key if the user is</span><span class='strut'>&nbsp;</span></p>
<p id='t164' class='pln'><span class='str'>&nbsp; &nbsp; authenticated.&nbsp; For anonymous requests, the IP address of the request will</span><span class='strut'>&nbsp;</span></p>
<p id='t165' class='pln'><span class='str'>&nbsp; &nbsp; be used.</span><span class='strut'>&nbsp;</span></p>
<p id='t166' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t167' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>scope</span> <span class='op'>=</span> <span class='str'>&#39;user&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t168' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t169' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>get_cache_key</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='nam'>view</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t170' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>user</span><span class='op'>.</span><span class='nam'>is_authenticated</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t171' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ident</span> <span class='op'>=</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>user</span><span class='op'>.</span><span class='nam'>id</span><span class='strut'>&nbsp;</span></p>
<p id='t172' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t173' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ident</span> <span class='op'>=</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>META</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;REMOTE_ADDR&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t174' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t175' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cache_format</span> <span class='op'>%</span> <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
<p id='t176' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;scope&#39;</span><span class='op'>:</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>scope</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t177' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;ident&#39;</span><span class='op'>:</span> <span class='nam'>ident</span><span class='strut'>&nbsp;</span></p>
<p id='t178' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
<p id='t179' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t180' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t181' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>ScopedRateThrottle</span><span class='op'>(</span><span class='nam'>SimpleRateThrottle</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t182' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t183' class='pln'><span class='str'>&nbsp; &nbsp; Limits the rate of API calls by different amounts for various parts of</span><span class='strut'>&nbsp;</span></p>
<p id='t184' class='pln'><span class='str'>&nbsp; &nbsp; the API.&nbsp; Any view that has the `throttle_scope` property set will be</span><span class='strut'>&nbsp;</span></p>
<p id='t185' class='pln'><span class='str'>&nbsp; &nbsp; throttled.&nbsp; The unique cache key will be generated by concatenating the</span><span class='strut'>&nbsp;</span></p>
<p id='t186' class='pln'><span class='str'>&nbsp; &nbsp; user id of the request, and the scope of the view being accessed.</span><span class='strut'>&nbsp;</span></p>
<p id='t187' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t188' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>scope_attr</span> <span class='op'>=</span> <span class='str'>&#39;throttle_scope&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t189' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t190' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t191' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Override the usual SimpleRateThrottle, because we can&#39;t determine</span><span class='strut'>&nbsp;</span></p>
<p id='t192' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># the rate until called by the view.</span><span class='strut'>&nbsp;</span></p>
<p id='t193' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>pass</span><span class='strut'>&nbsp;</span></p>
<p id='t194' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t195' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>allow_request</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='nam'>view</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t196' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># We can only determine the scope once we&#39;re called by the view.</span><span class='strut'>&nbsp;</span></p>
<p id='t197' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>scope</span> <span class='op'>=</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>view</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>scope_attr</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t198' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t199' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># If a view does not have a `throttle_scope` always allow the request</span><span class='strut'>&nbsp;</span></p>
<p id='t200' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>scope</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t201' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>True</span><span class='strut'>&nbsp;</span></p>
<p id='t202' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t203' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Determine the allowed request rate as we normally would during</span><span class='strut'>&nbsp;</span></p>
<p id='t204' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># the `__init__` call.</span><span class='strut'>&nbsp;</span></p>
<p id='t205' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>rate</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_rate</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t206' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>num_requests</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>duration</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>parse_rate</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>rate</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t207' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t208' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># We can now proceed as normal.</span><span class='strut'>&nbsp;</span></p>
<p id='t209' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>super</span><span class='op'>(</span><span class='nam'>ScopedRateThrottle</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>allow_request</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>,</span> <span class='nam'>view</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t210' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t211' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>get_cache_key</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='nam'>view</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t212' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t213' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; If `view.throttle_scope` is not set, don&#39;t apply this throttle.</span><span class='strut'>&nbsp;</span></p>
<p id='t214' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t215' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Otherwise generate the unique cache key by concatenating the user id</span><span class='strut'>&nbsp;</span></p>
<p id='t216' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; with the &#39;.throttle_scope` property of the view.</span><span class='strut'>&nbsp;</span></p>
<p id='t217' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t218' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>user</span><span class='op'>.</span><span class='nam'>is_authenticated</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t219' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ident</span> <span class='op'>=</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>user</span><span class='op'>.</span><span class='nam'>id</span><span class='strut'>&nbsp;</span></p>
<p id='t220' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t221' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ident</span> <span class='op'>=</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>META</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;REMOTE_ADDR&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t222' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t223' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cache_format</span> <span class='op'>%</span> <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
<p id='t224' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;scope&#39;</span><span class='op'>:</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>scope</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t225' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;ident&#39;</span><span class='op'>:</span> <span class='nam'>ident</span><span class='strut'>&nbsp;</span></p>
<p id='t226' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
</td>
</tr>
</table>
</div>
<div id='footer'>
<div class='content'>
<p>
<a class='nav' href='index.html'>&#xab; index</a> &nbsp; &nbsp; <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.5.1</a>
</p>
</div>
</div>
</body>
</html>

View File

@ -1,205 +0,0 @@
<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
<title>Coverage for rest_framework/urlpatterns: 87%</title>
<link rel='stylesheet' href='style.css' type='text/css'>
<script type='text/javascript' src='jquery-1.4.3.min.js'></script>
<script type='text/javascript' src='jquery.hotkeys.js'></script>
<script type='text/javascript' src='jquery.isonscreen.js'></script>
<script type='text/javascript' src='coverage_html.js'></script>
<script type='text/javascript' charset='utf-8'>
jQuery(document).ready(coverage.pyfile_ready);
</script>
</head>
<body id='pyfile'>
<div id='header'>
<div class='content'>
<h1>Coverage for <b>rest_framework/urlpatterns</b> :
<span class='pc_cov'>87%</span>
</h1>
<img id='keyboard_icon' src='keybd_closed.png'>
<h2 class='stats'>
31 statements
<span class='run hide_run shortkey_r' onclick='coverage.toggle_lines(this, "run")'>27 run</span>
<span class='mis shortkey_m' onclick='coverage.toggle_lines(this, "mis")'>4 missing</span>
<span class='exc shortkey_x' onclick='coverage.toggle_lines(this, "exc")'>0 excluded</span>
</h2>
</div>
</div>
<div class='help_panel'>
<img id='panel_icon' src='keybd_open.png'>
<p class='legend'>Hot-keys on this page</p>
<div>
<p class='keyhelp'>
<span class='key'>r</span>
<span class='key'>m</span>
<span class='key'>x</span>
<span class='key'>p</span> &nbsp; toggle line displays
</p>
<p class='keyhelp'>
<span class='key'>j</span>
<span class='key'>k</span> &nbsp; next/prev highlighted chunk
</p>
<p class='keyhelp'>
<span class='key'>0</span> &nbsp; (zero) top of page
</p>
<p class='keyhelp'>
<span class='key'>1</span> &nbsp; (one) first highlighted chunk
</p>
</div>
</div>
<div id='source'>
<table cellspacing='0' cellpadding='0'>
<tr>
<td class='linenos' valign='top'>
<p id='n1' class='stm run hide_run'><a href='#n1'>1</a></p>
<p id='n2' class='stm run hide_run'><a href='#n2'>2</a></p>
<p id='n3' class='stm run hide_run'><a href='#n3'>3</a></p>
<p id='n4' class='stm run hide_run'><a href='#n4'>4</a></p>
<p id='n5' class='pln'><a href='#n5'>5</a></p>
<p id='n6' class='pln'><a href='#n6'>6</a></p>
<p id='n7' class='stm run hide_run'><a href='#n7'>7</a></p>
<p id='n8' class='stm run hide_run'><a href='#n8'>8</a></p>
<p id='n9' class='stm run hide_run'><a href='#n9'>9</a></p>
<p id='n10' class='stm run hide_run'><a href='#n10'>10</a></p>
<p id='n11' class='pln'><a href='#n11'>11</a></p>
<p id='n12' class='stm run hide_run'><a href='#n12'>12</a></p>
<p id='n13' class='stm run hide_run'><a href='#n13'>13</a></p>
<p id='n14' class='stm run hide_run'><a href='#n14'>14</a></p>
<p id='n15' class='stm run hide_run'><a href='#n15'>15</a></p>
<p id='n16' class='pln'><a href='#n16'>16</a></p>
<p id='n17' class='stm run hide_run'><a href='#n17'>17</a></p>
<p id='n18' class='pln'><a href='#n18'>18</a></p>
<p id='n19' class='pln'><a href='#n19'>19</a></p>
<p id='n20' class='stm run hide_run'><a href='#n20'>20</a></p>
<p id='n21' class='pln'><a href='#n21'>21</a></p>
<p id='n22' class='pln'><a href='#n22'>22</a></p>
<p id='n23' class='pln'><a href='#n23'>23</a></p>
<p id='n24' class='stm run hide_run'><a href='#n24'>24</a></p>
<p id='n25' class='stm run hide_run'><a href='#n25'>25</a></p>
<p id='n26' class='stm run hide_run'><a href='#n26'>26</a></p>
<p id='n27' class='stm run hide_run'><a href='#n27'>27</a></p>
<p id='n28' class='pln'><a href='#n28'>28</a></p>
<p id='n29' class='stm run hide_run'><a href='#n29'>29</a></p>
<p id='n30' class='stm run hide_run'><a href='#n30'>30</a></p>
<p id='n31' class='stm run hide_run'><a href='#n31'>31</a></p>
<p id='n32' class='pln'><a href='#n32'>32</a></p>
<p id='n33' class='stm run hide_run'><a href='#n33'>33</a></p>
<p id='n34' class='pln'><a href='#n34'>34</a></p>
<p id='n35' class='pln'><a href='#n35'>35</a></p>
<p id='n36' class='stm run hide_run'><a href='#n36'>36</a></p>
<p id='n37' class='pln'><a href='#n37'>37</a></p>
<p id='n38' class='pln'><a href='#n38'>38</a></p>
<p id='n39' class='pln'><a href='#n39'>39</a></p>
<p id='n40' class='pln'><a href='#n40'>40</a></p>
<p id='n41' class='pln'><a href='#n41'>41</a></p>
<p id='n42' class='pln'><a href='#n42'>42</a></p>
<p id='n43' class='pln'><a href='#n43'>43</a></p>
<p id='n44' class='pln'><a href='#n44'>44</a></p>
<p id='n45' class='pln'><a href='#n45'>45</a></p>
<p id='n46' class='pln'><a href='#n46'>46</a></p>
<p id='n47' class='pln'><a href='#n47'>47</a></p>
<p id='n48' class='pln'><a href='#n48'>48</a></p>
<p id='n49' class='pln'><a href='#n49'>49</a></p>
<p id='n50' class='pln'><a href='#n50'>50</a></p>
<p id='n51' class='pln'><a href='#n51'>51</a></p>
<p id='n52' class='stm run hide_run'><a href='#n52'>52</a></p>
<p id='n53' class='stm run hide_run'><a href='#n53'>53</a></p>
<p id='n54' class='stm mis'><a href='#n54'>54</a></p>
<p id='n55' class='stm mis'><a href='#n55'>55</a></p>
<p id='n56' class='pln'><a href='#n56'>56</a></p>
<p id='n57' class='stm mis'><a href='#n57'>57</a></p>
<p id='n58' class='stm mis'><a href='#n58'>58</a></p>
<p id='n59' class='pln'><a href='#n59'>59</a></p>
<p id='n60' class='stm run hide_run'><a href='#n60'>60</a></p>
<p id='n61' class='pln'><a href='#n61'>61</a></p>
<p id='n62' class='stm run hide_run'><a href='#n62'>62</a></p>
</td>
<td class='text' valign='top'>
<p id='t1' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>__future__</span> <span class='key'>import</span> <span class='nam'>unicode_literals</span><span class='strut'>&nbsp;</span></p>
<p id='t2' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>django</span><span class='op'>.</span><span class='nam'>core</span><span class='op'>.</span><span class='nam'>urlresolvers</span> <span class='key'>import</span> <span class='nam'>RegexURLResolver</span><span class='strut'>&nbsp;</span></p>
<p id='t3' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>compat</span> <span class='key'>import</span> <span class='nam'>url</span><span class='op'>,</span> <span class='nam'>include</span><span class='strut'>&nbsp;</span></p>
<p id='t4' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>settings</span> <span class='key'>import</span> <span class='nam'>api_settings</span><span class='strut'>&nbsp;</span></p>
<p id='t5' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t6' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t7' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>apply_suffix_patterns</span><span class='op'>(</span><span class='nam'>urlpatterns</span><span class='op'>,</span> <span class='nam'>suffix_pattern</span><span class='op'>,</span> <span class='nam'>suffix_required</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t8' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>ret</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t9' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>urlpattern</span> <span class='key'>in</span> <span class='nam'>urlpatterns</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t10' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>urlpattern</span><span class='op'>,</span> <span class='nam'>RegexURLResolver</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t11' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Set of included URL patterns</span><span class='strut'>&nbsp;</span></p>
<p id='t12' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>regex</span> <span class='op'>=</span> <span class='nam'>urlpattern</span><span class='op'>.</span><span class='nam'>regex</span><span class='op'>.</span><span class='nam'>pattern</span><span class='strut'>&nbsp;</span></p>
<p id='t13' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>namespace</span> <span class='op'>=</span> <span class='nam'>urlpattern</span><span class='op'>.</span><span class='nam'>namespace</span><span class='strut'>&nbsp;</span></p>
<p id='t14' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>app_name</span> <span class='op'>=</span> <span class='nam'>urlpattern</span><span class='op'>.</span><span class='nam'>app_name</span><span class='strut'>&nbsp;</span></p>
<p id='t15' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>kwargs</span> <span class='op'>=</span> <span class='nam'>urlpattern</span><span class='op'>.</span><span class='nam'>default_kwargs</span><span class='strut'>&nbsp;</span></p>
<p id='t16' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Add in the included patterns, after applying the suffixes</span><span class='strut'>&nbsp;</span></p>
<p id='t17' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>patterns</span> <span class='op'>=</span> <span class='nam'>apply_suffix_patterns</span><span class='op'>(</span><span class='nam'>urlpattern</span><span class='op'>.</span><span class='nam'>url_patterns</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t18' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <span class='nam'>suffix_pattern</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t19' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <span class='nam'>suffix_required</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t20' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ret</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>(</span><span class='nam'>regex</span><span class='op'>,</span> <span class='nam'>include</span><span class='op'>(</span><span class='nam'>patterns</span><span class='op'>,</span> <span class='nam'>namespace</span><span class='op'>,</span> <span class='nam'>app_name</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>kwargs</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t21' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t22' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t23' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Regular URL pattern</span><span class='strut'>&nbsp;</span></p>
<p id='t24' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>regex</span> <span class='op'>=</span> <span class='nam'>urlpattern</span><span class='op'>.</span><span class='nam'>regex</span><span class='op'>.</span><span class='nam'>pattern</span><span class='op'>.</span><span class='nam'>rstrip</span><span class='op'>(</span><span class='str'>&#39;$&#39;</span><span class='op'>)</span> <span class='op'>+</span> <span class='nam'>suffix_pattern</span><span class='strut'>&nbsp;</span></p>
<p id='t25' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>view</span> <span class='op'>=</span> <span class='nam'>urlpattern</span><span class='op'>.</span><span class='nam'>_callback</span> <span class='key'>or</span> <span class='nam'>urlpattern</span><span class='op'>.</span><span class='nam'>_callback_str</span><span class='strut'>&nbsp;</span></p>
<p id='t26' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>kwargs</span> <span class='op'>=</span> <span class='nam'>urlpattern</span><span class='op'>.</span><span class='nam'>default_args</span><span class='strut'>&nbsp;</span></p>
<p id='t27' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>name</span> <span class='op'>=</span> <span class='nam'>urlpattern</span><span class='op'>.</span><span class='nam'>name</span><span class='strut'>&nbsp;</span></p>
<p id='t28' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Add in both the existing and the new urlpattern</span><span class='strut'>&nbsp;</span></p>
<p id='t29' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>suffix_required</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t30' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ret</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='nam'>urlpattern</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t31' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ret</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>(</span><span class='nam'>regex</span><span class='op'>,</span> <span class='nam'>view</span><span class='op'>,</span> <span class='nam'>kwargs</span><span class='op'>,</span> <span class='nam'>name</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t32' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t33' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>ret</span><span class='strut'>&nbsp;</span></p>
<p id='t34' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t35' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t36' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>format_suffix_patterns</span><span class='op'>(</span><span class='nam'>urlpatterns</span><span class='op'>,</span> <span class='nam'>suffix_required</span><span class='op'>=</span><span class='nam'>False</span><span class='op'>,</span> <span class='nam'>allowed</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t37' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t38' class='pln'><span class='str'>&nbsp; &nbsp; Supplement existing urlpatterns with corresponding patterns that also</span><span class='strut'>&nbsp;</span></p>
<p id='t39' class='pln'><span class='str'>&nbsp; &nbsp; include a &#39;.format&#39; suffix.&nbsp; Retains urlpattern ordering.</span><span class='strut'>&nbsp;</span></p>
<p id='t40' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t41' class='pln'><span class='str'>&nbsp; &nbsp; urlpatterns:</span><span class='strut'>&nbsp;</span></p>
<p id='t42' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; A list of URL patterns.</span><span class='strut'>&nbsp;</span></p>
<p id='t43' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t44' class='pln'><span class='str'>&nbsp; &nbsp; suffix_required:</span><span class='strut'>&nbsp;</span></p>
<p id='t45' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; If `True`, only suffixed URLs will be generated, and non-suffixed</span><span class='strut'>&nbsp;</span></p>
<p id='t46' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; URLs will not be used.&nbsp; Defaults to `False`.</span><span class='strut'>&nbsp;</span></p>
<p id='t47' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t48' class='pln'><span class='str'>&nbsp; &nbsp; allowed:</span><span class='strut'>&nbsp;</span></p>
<p id='t49' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; An optional tuple/list of allowed suffixes.&nbsp; eg [&#39;json&#39;, &#39;api&#39;]</span><span class='strut'>&nbsp;</span></p>
<p id='t50' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Defaults to `None`, which allows any suffix.</span><span class='strut'>&nbsp;</span></p>
<p id='t51' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t52' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>suffix_kwarg</span> <span class='op'>=</span> <span class='nam'>api_settings</span><span class='op'>.</span><span class='nam'>FORMAT_SUFFIX_KWARG</span><span class='strut'>&nbsp;</span></p>
<p id='t53' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>allowed</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t54' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>allowed</span><span class='op'>)</span> <span class='op'>==</span> <span class='num'>1</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t55' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>allowed_pattern</span> <span class='op'>=</span> <span class='nam'>allowed</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t56' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t57' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>allowed_pattern</span> <span class='op'>=</span> <span class='str'>&#39;(%s)&#39;</span> <span class='op'>%</span> <span class='str'>&#39;|&#39;</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='nam'>allowed</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t58' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>suffix_pattern</span> <span class='op'>=</span> <span class='str'>r&#39;\.(?P&lt;%s&gt;%s)$&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>suffix_kwarg</span><span class='op'>,</span> <span class='nam'>allowed_pattern</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t59' class='pln'>&nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t60' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>suffix_pattern</span> <span class='op'>=</span> <span class='str'>r&#39;\.(?P&lt;%s&gt;[a-z]+)$&#39;</span> <span class='op'>%</span> <span class='nam'>suffix_kwarg</span><span class='strut'>&nbsp;</span></p>
<p id='t61' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t62' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>apply_suffix_patterns</span><span class='op'>(</span><span class='nam'>urlpatterns</span><span class='op'>,</span> <span class='nam'>suffix_pattern</span><span class='op'>,</span> <span class='nam'>suffix_required</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
</td>
</tr>
</table>
</div>
<div id='footer'>
<div class='content'>
<p>
<a class='nav' href='index.html'>&#xab; index</a> &nbsp; &nbsp; <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.5.1</a>
</p>
</div>
</div>
</body>
</html>

View File

@ -1,129 +0,0 @@
<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
<title>Coverage for rest_framework/urls: 100%</title>
<link rel='stylesheet' href='style.css' type='text/css'>
<script type='text/javascript' src='jquery-1.4.3.min.js'></script>
<script type='text/javascript' src='jquery.hotkeys.js'></script>
<script type='text/javascript' src='jquery.isonscreen.js'></script>
<script type='text/javascript' src='coverage_html.js'></script>
<script type='text/javascript' charset='utf-8'>
jQuery(document).ready(coverage.pyfile_ready);
</script>
</head>
<body id='pyfile'>
<div id='header'>
<div class='content'>
<h1>Coverage for <b>rest_framework/urls</b> :
<span class='pc_cov'>100%</span>
</h1>
<img id='keyboard_icon' src='keybd_closed.png'>
<h2 class='stats'>
4 statements
<span class='run hide_run shortkey_r' onclick='coverage.toggle_lines(this, "run")'>4 run</span>
<span class='mis shortkey_m' onclick='coverage.toggle_lines(this, "mis")'>0 missing</span>
<span class='exc shortkey_x' onclick='coverage.toggle_lines(this, "exc")'>0 excluded</span>
</h2>
</div>
</div>
<div class='help_panel'>
<img id='panel_icon' src='keybd_open.png'>
<p class='legend'>Hot-keys on this page</p>
<div>
<p class='keyhelp'>
<span class='key'>r</span>
<span class='key'>m</span>
<span class='key'>x</span>
<span class='key'>p</span> &nbsp; toggle line displays
</p>
<p class='keyhelp'>
<span class='key'>j</span>
<span class='key'>k</span> &nbsp; next/prev highlighted chunk
</p>
<p class='keyhelp'>
<span class='key'>0</span> &nbsp; (zero) top of page
</p>
<p class='keyhelp'>
<span class='key'>1</span> &nbsp; (one) first highlighted chunk
</p>
</div>
</div>
<div id='source'>
<table cellspacing='0' cellpadding='0'>
<tr>
<td class='linenos' valign='top'>
<p id='n1' class='pln'><a href='#n1'>1</a></p>
<p id='n2' class='pln'><a href='#n2'>2</a></p>
<p id='n3' class='pln'><a href='#n3'>3</a></p>
<p id='n4' class='pln'><a href='#n4'>4</a></p>
<p id='n5' class='pln'><a href='#n5'>5</a></p>
<p id='n6' class='pln'><a href='#n6'>6</a></p>
<p id='n7' class='pln'><a href='#n7'>7</a></p>
<p id='n8' class='pln'><a href='#n8'>8</a></p>
<p id='n9' class='pln'><a href='#n9'>9</a></p>
<p id='n10' class='pln'><a href='#n10'>10</a></p>
<p id='n11' class='pln'><a href='#n11'>11</a></p>
<p id='n12' class='pln'><a href='#n12'>12</a></p>
<p id='n13' class='pln'><a href='#n13'>13</a></p>
<p id='n14' class='pln'><a href='#n14'>14</a></p>
<p id='n15' class='stm run hide_run'><a href='#n15'>15</a></p>
<p id='n16' class='stm run hide_run'><a href='#n16'>16</a></p>
<p id='n17' class='pln'><a href='#n17'>17</a></p>
<p id='n18' class='pln'><a href='#n18'>18</a></p>
<p id='n19' class='stm run hide_run'><a href='#n19'>19</a></p>
<p id='n20' class='pln'><a href='#n20'>20</a></p>
<p id='n21' class='stm run hide_run'><a href='#n21'>21</a></p>
<p id='n22' class='pln'><a href='#n22'>22</a></p>
<p id='n23' class='pln'><a href='#n23'>23</a></p>
<p id='n24' class='pln'><a href='#n24'>24</a></p>
</td>
<td class='text' valign='top'>
<p id='t1' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t2' class='pln'><span class='str'>Login and logout views for the browsable API.</span><span class='strut'>&nbsp;</span></p>
<p id='t3' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t4' class='pln'><span class='str'>Add these to your root URLconf if you&#39;re using the browsable API and</span><span class='strut'>&nbsp;</span></p>
<p id='t5' class='pln'><span class='str'>your API requires authentication.</span><span class='strut'>&nbsp;</span></p>
<p id='t6' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t7' class='pln'><span class='str'>The urls must be namespaced as &#39;rest_framework&#39;, and you should make sure</span><span class='strut'>&nbsp;</span></p>
<p id='t8' class='pln'><span class='str'>your authentication settings include `SessionAuthentication`.</span><span class='strut'>&nbsp;</span></p>
<p id='t9' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t10' class='pln'><span class='str'>&nbsp; &nbsp; urlpatterns = patterns(&#39;&#39;,</span><span class='strut'>&nbsp;</span></p>
<p id='t11' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; ...</span><span class='strut'>&nbsp;</span></p>
<p id='t12' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; url(r&#39;^auth&#39;, include(&#39;rest_framework.urls&#39;, namespace=&#39;rest_framework&#39;))</span><span class='strut'>&nbsp;</span></p>
<p id='t13' class='pln'><span class='str'>&nbsp; &nbsp; )</span><span class='strut'>&nbsp;</span></p>
<p id='t14' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t15' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>__future__</span> <span class='key'>import</span> <span class='nam'>unicode_literals</span><span class='strut'>&nbsp;</span></p>
<p id='t16' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>compat</span> <span class='key'>import</span> <span class='nam'>patterns</span><span class='op'>,</span> <span class='nam'>url</span><span class='strut'>&nbsp;</span></p>
<p id='t17' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t18' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t19' class='stm run hide_run'><span class='nam'>template_name</span> <span class='op'>=</span> <span class='op'>{</span><span class='str'>&#39;template_name&#39;</span><span class='op'>:</span> <span class='str'>&#39;rest_framework/login.html&#39;</span><span class='op'>}</span><span class='strut'>&nbsp;</span></p>
<p id='t20' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t21' class='stm run hide_run'><span class='nam'>urlpatterns</span> <span class='op'>=</span> <span class='nam'>patterns</span><span class='op'>(</span><span class='str'>&#39;django.contrib.auth.views&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t22' class='pln'>&nbsp; &nbsp; <span class='nam'>url</span><span class='op'>(</span><span class='str'>r&#39;^login/$&#39;</span><span class='op'>,</span> <span class='str'>&#39;login&#39;</span><span class='op'>,</span> <span class='nam'>template_name</span><span class='op'>,</span> <span class='nam'>name</span><span class='op'>=</span><span class='str'>&#39;login&#39;</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t23' class='pln'>&nbsp; &nbsp; <span class='nam'>url</span><span class='op'>(</span><span class='str'>r&#39;^logout/$&#39;</span><span class='op'>,</span> <span class='str'>&#39;logout&#39;</span><span class='op'>,</span> <span class='nam'>template_name</span><span class='op'>,</span> <span class='nam'>name</span><span class='op'>=</span><span class='str'>&#39;logout&#39;</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t24' class='pln'><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
</td>
</tr>
</table>
</div>
<div id='footer'>
<div class='content'>
<p>
<a class='nav' href='index.html'>&#xab; index</a> &nbsp; &nbsp; <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.5.1</a>
</p>
</div>
</div>
</body>
</html>

View File

@ -1,81 +0,0 @@
<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
<title>Coverage for rest_framework/utils/__init__: 100%</title>
<link rel='stylesheet' href='style.css' type='text/css'>
<script type='text/javascript' src='jquery-1.4.3.min.js'></script>
<script type='text/javascript' src='jquery.hotkeys.js'></script>
<script type='text/javascript' src='jquery.isonscreen.js'></script>
<script type='text/javascript' src='coverage_html.js'></script>
<script type='text/javascript' charset='utf-8'>
jQuery(document).ready(coverage.pyfile_ready);
</script>
</head>
<body id='pyfile'>
<div id='header'>
<div class='content'>
<h1>Coverage for <b>rest_framework/utils/__init__</b> :
<span class='pc_cov'>100%</span>
</h1>
<img id='keyboard_icon' src='keybd_closed.png'>
<h2 class='stats'>
0 statements
<span class='run hide_run shortkey_r' onclick='coverage.toggle_lines(this, "run")'>0 run</span>
<span class='mis shortkey_m' onclick='coverage.toggle_lines(this, "mis")'>0 missing</span>
<span class='exc shortkey_x' onclick='coverage.toggle_lines(this, "exc")'>0 excluded</span>
</h2>
</div>
</div>
<div class='help_panel'>
<img id='panel_icon' src='keybd_open.png'>
<p class='legend'>Hot-keys on this page</p>
<div>
<p class='keyhelp'>
<span class='key'>r</span>
<span class='key'>m</span>
<span class='key'>x</span>
<span class='key'>p</span> &nbsp; toggle line displays
</p>
<p class='keyhelp'>
<span class='key'>j</span>
<span class='key'>k</span> &nbsp; next/prev highlighted chunk
</p>
<p class='keyhelp'>
<span class='key'>0</span> &nbsp; (zero) top of page
</p>
<p class='keyhelp'>
<span class='key'>1</span> &nbsp; (one) first highlighted chunk
</p>
</div>
</div>
<div id='source'>
<table cellspacing='0' cellpadding='0'>
<tr>
<td class='linenos' valign='top'>
</td>
<td class='text' valign='top'>
</td>
</tr>
</table>
</div>
<div id='footer'>
<div class='content'>
<p>
<a class='nav' href='index.html'>&#xab; index</a> &nbsp; &nbsp; <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.5.1</a>
</p>
</div>
</div>
</body>
</html>

View File

@ -1,189 +0,0 @@
<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
<title>Coverage for rest_framework/utils/breadcrumbs: 100%</title>
<link rel='stylesheet' href='style.css' type='text/css'>
<script type='text/javascript' src='jquery-1.4.3.min.js'></script>
<script type='text/javascript' src='jquery.hotkeys.js'></script>
<script type='text/javascript' src='jquery.isonscreen.js'></script>
<script type='text/javascript' src='coverage_html.js'></script>
<script type='text/javascript' charset='utf-8'>
jQuery(document).ready(coverage.pyfile_ready);
</script>
</head>
<body id='pyfile'>
<div id='header'>
<div class='content'>
<h1>Coverage for <b>rest_framework/utils/breadcrumbs</b> :
<span class='pc_cov'>100%</span>
</h1>
<img id='keyboard_icon' src='keybd_closed.png'>
<h2 class='stats'>
27 statements
<span class='run hide_run shortkey_r' onclick='coverage.toggle_lines(this, "run")'>27 run</span>
<span class='mis shortkey_m' onclick='coverage.toggle_lines(this, "mis")'>0 missing</span>
<span class='exc shortkey_x' onclick='coverage.toggle_lines(this, "exc")'>0 excluded</span>
</h2>
</div>
</div>
<div class='help_panel'>
<img id='panel_icon' src='keybd_open.png'>
<p class='legend'>Hot-keys on this page</p>
<div>
<p class='keyhelp'>
<span class='key'>r</span>
<span class='key'>m</span>
<span class='key'>x</span>
<span class='key'>p</span> &nbsp; toggle line displays
</p>
<p class='keyhelp'>
<span class='key'>j</span>
<span class='key'>k</span> &nbsp; next/prev highlighted chunk
</p>
<p class='keyhelp'>
<span class='key'>0</span> &nbsp; (zero) top of page
</p>
<p class='keyhelp'>
<span class='key'>1</span> &nbsp; (one) first highlighted chunk
</p>
</div>
</div>
<div id='source'>
<table cellspacing='0' cellpadding='0'>
<tr>
<td class='linenos' valign='top'>
<p id='n1' class='stm run hide_run'><a href='#n1'>1</a></p>
<p id='n2' class='stm run hide_run'><a href='#n2'>2</a></p>
<p id='n3' class='stm run hide_run'><a href='#n3'>3</a></p>
<p id='n4' class='pln'><a href='#n4'>4</a></p>
<p id='n5' class='pln'><a href='#n5'>5</a></p>
<p id='n6' class='stm run hide_run'><a href='#n6'>6</a></p>
<p id='n7' class='pln'><a href='#n7'>7</a></p>
<p id='n8' class='pln'><a href='#n8'>8</a></p>
<p id='n9' class='pln'><a href='#n9'>9</a></p>
<p id='n10' class='pln'><a href='#n10'>10</a></p>
<p id='n11' class='pln'><a href='#n11'>11</a></p>
<p id='n12' class='stm run hide_run'><a href='#n12'>12</a></p>
<p id='n13' class='pln'><a href='#n13'>13</a></p>
<p id='n14' class='stm run hide_run'><a href='#n14'>14</a></p>
<p id='n15' class='pln'><a href='#n15'>15</a></p>
<p id='n16' class='pln'><a href='#n16'>16</a></p>
<p id='n17' class='pln'><a href='#n17'>17</a></p>
<p id='n18' class='pln'><a href='#n18'>18</a></p>
<p id='n19' class='pln'><a href='#n19'>19</a></p>
<p id='n20' class='stm run hide_run'><a href='#n20'>20</a></p>
<p id='n21' class='stm run hide_run'><a href='#n21'>21</a></p>
<p id='n22' class='stm run hide_run'><a href='#n22'>22</a></p>
<p id='n23' class='stm run hide_run'><a href='#n23'>23</a></p>
<p id='n24' class='pln'><a href='#n24'>24</a></p>
<p id='n25' class='pln'><a href='#n25'>25</a></p>
<p id='n26' class='pln'><a href='#n26'>26</a></p>
<p id='n27' class='stm run hide_run'><a href='#n27'>27</a></p>
<p id='n28' class='stm run hide_run'><a href='#n28'>28</a></p>
<p id='n29' class='pln'><a href='#n29'>29</a></p>
<p id='n30' class='pln'><a href='#n30'>30</a></p>
<p id='n31' class='stm run hide_run'><a href='#n31'>31</a></p>
<p id='n32' class='stm run hide_run'><a href='#n32'>32</a></p>
<p id='n33' class='stm run hide_run'><a href='#n33'>33</a></p>
<p id='n34' class='stm run hide_run'><a href='#n34'>34</a></p>
<p id='n35' class='stm run hide_run'><a href='#n35'>35</a></p>
<p id='n36' class='pln'><a href='#n36'>36</a></p>
<p id='n37' class='stm run hide_run'><a href='#n37'>37</a></p>
<p id='n38' class='pln'><a href='#n38'>38</a></p>
<p id='n39' class='stm run hide_run'><a href='#n39'>39</a></p>
<p id='n40' class='pln'><a href='#n40'>40</a></p>
<p id='n41' class='stm run hide_run'><a href='#n41'>41</a></p>
<p id='n42' class='pln'><a href='#n42'>42</a></p>
<p id='n43' class='pln'><a href='#n43'>43</a></p>
<p id='n44' class='stm run hide_run'><a href='#n44'>44</a></p>
<p id='n45' class='stm run hide_run'><a href='#n45'>45</a></p>
<p id='n46' class='pln'><a href='#n46'>46</a></p>
<p id='n47' class='pln'><a href='#n47'>47</a></p>
<p id='n48' class='pln'><a href='#n48'>48</a></p>
<p id='n49' class='stm run hide_run'><a href='#n49'>49</a></p>
<p id='n50' class='stm run hide_run'><a href='#n50'>50</a></p>
<p id='n51' class='pln'><a href='#n51'>51</a></p>
<p id='n52' class='stm run hide_run'><a href='#n52'>52</a></p>
<p id='n53' class='stm run hide_run'><a href='#n53'>53</a></p>
<p id='n54' class='stm run hide_run'><a href='#n54'>54</a></p>
</td>
<td class='text' valign='top'>
<p id='t1' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>__future__</span> <span class='key'>import</span> <span class='nam'>unicode_literals</span><span class='strut'>&nbsp;</span></p>
<p id='t2' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>django</span><span class='op'>.</span><span class='nam'>core</span><span class='op'>.</span><span class='nam'>urlresolvers</span> <span class='key'>import</span> <span class='nam'>resolve</span><span class='op'>,</span> <span class='nam'>get_script_prefix</span><span class='strut'>&nbsp;</span></p>
<p id='t3' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>utils</span><span class='op'>.</span><span class='nam'>formatting</span> <span class='key'>import</span> <span class='nam'>get_view_name</span><span class='strut'>&nbsp;</span></p>
<p id='t4' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t5' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t6' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>get_breadcrumbs</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t7' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t8' class='pln'><span class='str'>&nbsp; &nbsp; Given a url returns a list of breadcrumbs, which are each a</span><span class='strut'>&nbsp;</span></p>
<p id='t9' class='pln'><span class='str'>&nbsp; &nbsp; tuple of (name, url).</span><span class='strut'>&nbsp;</span></p>
<p id='t10' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t11' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t12' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>views</span> <span class='key'>import</span> <span class='nam'>APIView</span><span class='strut'>&nbsp;</span></p>
<p id='t13' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t14' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>breadcrumbs_recursive</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>,</span> <span class='nam'>breadcrumbs_list</span><span class='op'>,</span> <span class='nam'>prefix</span><span class='op'>,</span> <span class='nam'>seen</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t15' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t16' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Add tuples of (name, url) to the breadcrumbs list,</span><span class='strut'>&nbsp;</span></p>
<p id='t17' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; progressively chomping off parts of the url.</span><span class='strut'>&nbsp;</span></p>
<p id='t18' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t19' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t20' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t21' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>(</span><span class='nam'>view</span><span class='op'>,</span> <span class='nam'>unused_args</span><span class='op'>,</span> <span class='nam'>unused_kwargs</span><span class='op'>)</span> <span class='op'>=</span> <span class='nam'>resolve</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t22' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='nam'>Exception</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t23' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>pass</span><span class='strut'>&nbsp;</span></p>
<p id='t24' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t25' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Check if this is a REST framework view,</span><span class='strut'>&nbsp;</span></p>
<p id='t26' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># and if so add it to the breadcrumbs</span><span class='strut'>&nbsp;</span></p>
<p id='t27' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>cls</span> <span class='op'>=</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>view</span><span class='op'>,</span> <span class='str'>&#39;cls&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t28' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>cls</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span> <span class='key'>and</span> <span class='nam'>issubclass</span><span class='op'>(</span><span class='nam'>cls</span><span class='op'>,</span> <span class='nam'>APIView</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t29' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Don&#39;t list the same view twice in a row.</span><span class='strut'>&nbsp;</span></p>
<p id='t30' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Probably an optional trailing slash.</span><span class='strut'>&nbsp;</span></p>
<p id='t31' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>seen</span> <span class='key'>or</span> <span class='nam'>seen</span><span class='op'>[</span><span class='op'>-</span><span class='num'>1</span><span class='op'>]</span> <span class='op'>!=</span> <span class='nam'>view</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t32' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>suffix</span> <span class='op'>=</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>view</span><span class='op'>,</span> <span class='str'>&#39;suffix&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t33' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>name</span> <span class='op'>=</span> <span class='nam'>get_view_name</span><span class='op'>(</span><span class='nam'>view</span><span class='op'>.</span><span class='nam'>cls</span><span class='op'>,</span> <span class='nam'>suffix</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t34' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>breadcrumbs_list</span><span class='op'>.</span><span class='nam'>insert</span><span class='op'>(</span><span class='num'>0</span><span class='op'>,</span> <span class='op'>(</span><span class='nam'>name</span><span class='op'>,</span> <span class='nam'>prefix</span> <span class='op'>+</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t35' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>seen</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='nam'>view</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t36' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t37' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>url</span> <span class='op'>==</span> <span class='str'>&#39;&#39;</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t38' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># All done</span><span class='strut'>&nbsp;</span></p>
<p id='t39' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>breadcrumbs_list</span><span class='strut'>&nbsp;</span></p>
<p id='t40' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t41' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>elif</span> <span class='nam'>url</span><span class='op'>.</span><span class='nam'>endswith</span><span class='op'>(</span><span class='str'>&#39;/&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t42' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Drop trailing slash off the end and continue to try to</span><span class='strut'>&nbsp;</span></p>
<p id='t43' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># resolve more breadcrumbs</span><span class='strut'>&nbsp;</span></p>
<p id='t44' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>url</span> <span class='op'>=</span> <span class='nam'>url</span><span class='op'>.</span><span class='nam'>rstrip</span><span class='op'>(</span><span class='str'>&#39;/&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t45' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>breadcrumbs_recursive</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>,</span> <span class='nam'>breadcrumbs_list</span><span class='op'>,</span> <span class='nam'>prefix</span><span class='op'>,</span> <span class='nam'>seen</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t46' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t47' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Drop trailing non-slash off the end and continue to try to</span><span class='strut'>&nbsp;</span></p>
<p id='t48' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># resolve more breadcrumbs</span><span class='strut'>&nbsp;</span></p>
<p id='t49' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>url</span> <span class='op'>=</span> <span class='nam'>url</span><span class='op'>[</span><span class='op'>:</span><span class='nam'>url</span><span class='op'>.</span><span class='nam'>rfind</span><span class='op'>(</span><span class='str'>&#39;/&#39;</span><span class='op'>)</span> <span class='op'>+</span> <span class='num'>1</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t50' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>breadcrumbs_recursive</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>,</span> <span class='nam'>breadcrumbs_list</span><span class='op'>,</span> <span class='nam'>prefix</span><span class='op'>,</span> <span class='nam'>seen</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t51' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t52' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>prefix</span> <span class='op'>=</span> <span class='nam'>get_script_prefix</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>rstrip</span><span class='op'>(</span><span class='str'>&#39;/&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t53' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>url</span> <span class='op'>=</span> <span class='nam'>url</span><span class='op'>[</span><span class='nam'>len</span><span class='op'>(</span><span class='nam'>prefix</span><span class='op'>)</span><span class='op'>:</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t54' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>breadcrumbs_recursive</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>,</span> <span class='op'>[</span><span class='op'>]</span><span class='op'>,</span> <span class='nam'>prefix</span><span class='op'>,</span> <span class='op'>[</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
</td>
</tr>
</table>
</div>
<div id='footer'>
<div class='content'>
<p>
<a class='nav' href='index.html'>&#xab; index</a> &nbsp; &nbsp; <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.5.1</a>
</p>
</div>
</div>
</body>
</html>

View File

@ -1,275 +0,0 @@
<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
<title>Coverage for rest_framework/utils/encoders: 73%</title>
<link rel='stylesheet' href='style.css' type='text/css'>
<script type='text/javascript' src='jquery-1.4.3.min.js'></script>
<script type='text/javascript' src='jquery.hotkeys.js'></script>
<script type='text/javascript' src='jquery.isonscreen.js'></script>
<script type='text/javascript' src='coverage_html.js'></script>
<script type='text/javascript' charset='utf-8'>
jQuery(document).ready(coverage.pyfile_ready);
</script>
</head>
<body id='pyfile'>
<div id='header'>
<div class='content'>
<h1>Coverage for <b>rest_framework/utils/encoders</b> :
<span class='pc_cov'>73%</span>
</h1>
<img id='keyboard_icon' src='keybd_closed.png'>
<h2 class='stats'>
70 statements
<span class='run hide_run shortkey_r' onclick='coverage.toggle_lines(this, "run")'>51 run</span>
<span class='mis shortkey_m' onclick='coverage.toggle_lines(this, "mis")'>19 missing</span>
<span class='exc shortkey_x' onclick='coverage.toggle_lines(this, "exc")'>0 excluded</span>
</h2>
</div>
</div>
<div class='help_panel'>
<img id='panel_icon' src='keybd_open.png'>
<p class='legend'>Hot-keys on this page</p>
<div>
<p class='keyhelp'>
<span class='key'>r</span>
<span class='key'>m</span>
<span class='key'>x</span>
<span class='key'>p</span> &nbsp; toggle line displays
</p>
<p class='keyhelp'>
<span class='key'>j</span>
<span class='key'>k</span> &nbsp; next/prev highlighted chunk
</p>
<p class='keyhelp'>
<span class='key'>0</span> &nbsp; (zero) top of page
</p>
<p class='keyhelp'>
<span class='key'>1</span> &nbsp; (one) first highlighted chunk
</p>
</div>
</div>
<div id='source'>
<table cellspacing='0' cellpadding='0'>
<tr>
<td class='linenos' valign='top'>
<p id='n1' class='pln'><a href='#n1'>1</a></p>
<p id='n2' class='pln'><a href='#n2'>2</a></p>
<p id='n3' class='pln'><a href='#n3'>3</a></p>
<p id='n4' class='stm run hide_run'><a href='#n4'>4</a></p>
<p id='n5' class='stm run hide_run'><a href='#n5'>5</a></p>
<p id='n6' class='stm run hide_run'><a href='#n6'>6</a></p>
<p id='n7' class='stm run hide_run'><a href='#n7'>7</a></p>
<p id='n8' class='stm run hide_run'><a href='#n8'>8</a></p>
<p id='n9' class='stm run hide_run'><a href='#n9'>9</a></p>
<p id='n10' class='stm run hide_run'><a href='#n10'>10</a></p>
<p id='n11' class='stm run hide_run'><a href='#n11'>11</a></p>
<p id='n12' class='stm run hide_run'><a href='#n12'>12</a></p>
<p id='n13' class='pln'><a href='#n13'>13</a></p>
<p id='n14' class='pln'><a href='#n14'>14</a></p>
<p id='n15' class='stm run hide_run'><a href='#n15'>15</a></p>
<p id='n16' class='pln'><a href='#n16'>16</a></p>
<p id='n17' class='pln'><a href='#n17'>17</a></p>
<p id='n18' class='pln'><a href='#n18'>18</a></p>
<p id='n19' class='pln'><a href='#n19'>19</a></p>
<p id='n20' class='stm run hide_run'><a href='#n20'>20</a></p>
<p id='n21' class='pln'><a href='#n21'>21</a></p>
<p id='n22' class='pln'><a href='#n22'>22</a></p>
<p id='n23' class='stm run hide_run'><a href='#n23'>23</a></p>
<p id='n24' class='stm run hide_run'><a href='#n24'>24</a></p>
<p id='n25' class='stm run hide_run'><a href='#n25'>25</a></p>
<p id='n26' class='stm mis'><a href='#n26'>26</a></p>
<p id='n27' class='stm mis'><a href='#n27'>27</a></p>
<p id='n28' class='stm mis'><a href='#n28'>28</a></p>
<p id='n29' class='stm mis'><a href='#n29'>29</a></p>
<p id='n30' class='stm mis'><a href='#n30'>30</a></p>
<p id='n31' class='stm mis'><a href='#n31'>31</a></p>
<p id='n32' class='stm run hide_run'><a href='#n32'>32</a></p>
<p id='n33' class='stm run hide_run'><a href='#n33'>33</a></p>
<p id='n34' class='stm run hide_run'><a href='#n34'>34</a></p>
<p id='n35' class='stm mis'><a href='#n35'>35</a></p>
<p id='n36' class='stm mis'><a href='#n36'>36</a></p>
<p id='n37' class='stm mis'><a href='#n37'>37</a></p>
<p id='n38' class='stm mis'><a href='#n38'>38</a></p>
<p id='n39' class='stm mis'><a href='#n39'>39</a></p>
<p id='n40' class='stm mis'><a href='#n40'>40</a></p>
<p id='n41' class='stm run hide_run'><a href='#n41'>41</a></p>
<p id='n42' class='stm mis'><a href='#n42'>42</a></p>
<p id='n43' class='stm run hide_run'><a href='#n43'>43</a></p>
<p id='n44' class='stm run hide_run'><a href='#n44'>44</a></p>
<p id='n45' class='stm run hide_run'><a href='#n45'>45</a></p>
<p id='n46' class='stm run hide_run'><a href='#n46'>46</a></p>
<p id='n47' class='stm mis'><a href='#n47'>47</a></p>
<p id='n48' class='pln'><a href='#n48'>48</a></p>
<p id='n49' class='pln'><a href='#n49'>49</a></p>
<p id='n50' class='stm run hide_run'><a href='#n50'>50</a></p>
<p id='n51' class='stm run hide_run'><a href='#n51'>51</a></p>
<p id='n52' class='stm mis'><a href='#n52'>52</a></p>
<p id='n53' class='stm mis'><a href='#n53'>53</a></p>
<p id='n54' class='pln'><a href='#n54'>54</a></p>
<p id='n55' class='pln'><a href='#n55'>55</a></p>
<p id='n56' class='stm run hide_run'><a href='#n56'>56</a></p>
<p id='n57' class='pln'><a href='#n57'>57</a></p>
<p id='n58' class='pln'><a href='#n58'>58</a></p>
<p id='n59' class='pln'><a href='#n59'>59</a></p>
<p id='n60' class='pln'><a href='#n60'>60</a></p>
<p id='n61' class='pln'><a href='#n61'>61</a></p>
<p id='n62' class='stm run hide_run'><a href='#n62'>62</a></p>
<p id='n63' class='stm mis'><a href='#n63'>63</a></p>
<p id='n64' class='pln'><a href='#n64'>64</a></p>
<p id='n65' class='stm run hide_run'><a href='#n65'>65</a></p>
<p id='n66' class='stm run hide_run'><a href='#n66'>66</a></p>
<p id='n67' class='stm run hide_run'><a href='#n67'>67</a></p>
<p id='n68' class='stm run hide_run'><a href='#n68'>68</a></p>
<p id='n69' class='stm run hide_run'><a href='#n69'>69</a></p>
<p id='n70' class='stm run hide_run'><a href='#n70'>70</a></p>
<p id='n71' class='stm run hide_run'><a href='#n71'>71</a></p>
<p id='n72' class='stm run hide_run'><a href='#n72'>72</a></p>
<p id='n73' class='stm run hide_run'><a href='#n73'>73</a></p>
<p id='n74' class='stm run hide_run'><a href='#n74'>74</a></p>
<p id='n75' class='stm run hide_run'><a href='#n75'>75</a></p>
<p id='n76' class='stm run hide_run'><a href='#n76'>76</a></p>
<p id='n77' class='stm run hide_run'><a href='#n77'>77</a></p>
<p id='n78' class='stm run hide_run'><a href='#n78'>78</a></p>
<p id='n79' class='stm mis'><a href='#n79'>79</a></p>
<p id='n80' class='stm run hide_run'><a href='#n80'>80</a></p>
<p id='n81' class='stm run hide_run'><a href='#n81'>81</a></p>
<p id='n82' class='stm run hide_run'><a href='#n82'>82</a></p>
<p id='n83' class='stm run hide_run'><a href='#n83'>83</a></p>
<p id='n84' class='stm run hide_run'><a href='#n84'>84</a></p>
<p id='n85' class='stm mis'><a href='#n85'>85</a></p>
<p id='n86' class='pln'><a href='#n86'>86</a></p>
<p id='n87' class='stm run hide_run'><a href='#n87'>87</a></p>
<p id='n88' class='stm run hide_run'><a href='#n88'>88</a></p>
<p id='n89' class='pln'><a href='#n89'>89</a></p>
<p id='n90' class='stm run hide_run'><a href='#n90'>90</a></p>
<p id='n91' class='pln'><a href='#n91'>91</a></p>
<p id='n92' class='stm run hide_run'><a href='#n92'>92</a></p>
<p id='n93' class='pln'><a href='#n93'>93</a></p>
<p id='n94' class='stm run hide_run'><a href='#n94'>94</a></p>
<p id='n95' class='pln'><a href='#n95'>95</a></p>
<p id='n96' class='stm run hide_run'><a href='#n96'>96</a></p>
<p id='n97' class='pln'><a href='#n97'>97</a></p>
</td>
<td class='text' valign='top'>
<p id='t1' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t2' class='pln'><span class='str'>Helper classes for parsers.</span><span class='strut'>&nbsp;</span></p>
<p id='t3' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t4' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>__future__</span> <span class='key'>import</span> <span class='nam'>unicode_literals</span><span class='strut'>&nbsp;</span></p>
<p id='t5' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>django</span><span class='op'>.</span><span class='nam'>utils</span><span class='op'>.</span><span class='nam'>datastructures</span> <span class='key'>import</span> <span class='nam'>SortedDict</span><span class='strut'>&nbsp;</span></p>
<p id='t6' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>django</span><span class='op'>.</span><span class='nam'>utils</span><span class='op'>.</span><span class='nam'>functional</span> <span class='key'>import</span> <span class='nam'>Promise</span><span class='strut'>&nbsp;</span></p>
<p id='t7' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>compat</span> <span class='key'>import</span> <span class='nam'>timezone</span><span class='op'>,</span> <span class='nam'>force_text</span><span class='strut'>&nbsp;</span></p>
<p id='t8' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>serializers</span> <span class='key'>import</span> <span class='nam'>DictWithMetadata</span><span class='op'>,</span> <span class='nam'>SortedDictWithMetadata</span><span class='strut'>&nbsp;</span></p>
<p id='t9' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>datetime</span><span class='strut'>&nbsp;</span></p>
<p id='t10' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>decimal</span><span class='strut'>&nbsp;</span></p>
<p id='t11' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>types</span><span class='strut'>&nbsp;</span></p>
<p id='t12' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>json</span><span class='strut'>&nbsp;</span></p>
<p id='t13' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t14' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t15' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>JSONEncoder</span><span class='op'>(</span><span class='nam'>json</span><span class='op'>.</span><span class='nam'>JSONEncoder</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t16' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t17' class='pln'><span class='str'>&nbsp; &nbsp; JSONEncoder subclass that knows how to encode date/time/timedelta,</span><span class='strut'>&nbsp;</span></p>
<p id='t18' class='pln'><span class='str'>&nbsp; &nbsp; decimal types, and generators.</span><span class='strut'>&nbsp;</span></p>
<p id='t19' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t20' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>default</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>o</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t21' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># For Date Time string spec, see ECMA 262</span><span class='strut'>&nbsp;</span></p>
<p id='t22' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># http://ecma-international.org/ecma-262/5.1/#sec-15.9.1.15</span><span class='strut'>&nbsp;</span></p>
<p id='t23' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>o</span><span class='op'>,</span> <span class='nam'>Promise</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t24' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>force_text</span><span class='op'>(</span><span class='nam'>o</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t25' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>elif</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>o</span><span class='op'>,</span> <span class='nam'>datetime</span><span class='op'>.</span><span class='nam'>datetime</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t26' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>r</span> <span class='op'>=</span> <span class='nam'>o</span><span class='op'>.</span><span class='nam'>isoformat</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t27' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>o</span><span class='op'>.</span><span class='nam'>microsecond</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t28' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>r</span> <span class='op'>=</span> <span class='nam'>r</span><span class='op'>[</span><span class='op'>:</span><span class='num'>23</span><span class='op'>]</span> <span class='op'>+</span> <span class='nam'>r</span><span class='op'>[</span><span class='num'>26</span><span class='op'>:</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t29' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>r</span><span class='op'>.</span><span class='nam'>endswith</span><span class='op'>(</span><span class='str'>&#39;+00:00&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t30' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>r</span> <span class='op'>=</span> <span class='nam'>r</span><span class='op'>[</span><span class='op'>:</span><span class='op'>-</span><span class='num'>6</span><span class='op'>]</span> <span class='op'>+</span> <span class='str'>&#39;Z&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t31' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>r</span><span class='strut'>&nbsp;</span></p>
<p id='t32' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>elif</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>o</span><span class='op'>,</span> <span class='nam'>datetime</span><span class='op'>.</span><span class='nam'>date</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t33' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>o</span><span class='op'>.</span><span class='nam'>isoformat</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t34' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>elif</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>o</span><span class='op'>,</span> <span class='nam'>datetime</span><span class='op'>.</span><span class='nam'>time</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t35' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>timezone</span> <span class='key'>and</span> <span class='nam'>timezone</span><span class='op'>.</span><span class='nam'>is_aware</span><span class='op'>(</span><span class='nam'>o</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t36' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>ValueError</span><span class='op'>(</span><span class='str'>&quot;JSON can&#39;t represent timezone-aware times.&quot;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t37' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>r</span> <span class='op'>=</span> <span class='nam'>o</span><span class='op'>.</span><span class='nam'>isoformat</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t38' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>o</span><span class='op'>.</span><span class='nam'>microsecond</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t39' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>r</span> <span class='op'>=</span> <span class='nam'>r</span><span class='op'>[</span><span class='op'>:</span><span class='num'>12</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t40' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>r</span><span class='strut'>&nbsp;</span></p>
<p id='t41' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>elif</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>o</span><span class='op'>,</span> <span class='nam'>datetime</span><span class='op'>.</span><span class='nam'>timedelta</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t42' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>str</span><span class='op'>(</span><span class='nam'>o</span><span class='op'>.</span><span class='nam'>total_seconds</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t43' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>elif</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>o</span><span class='op'>,</span> <span class='nam'>decimal</span><span class='op'>.</span><span class='nam'>Decimal</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t44' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>str</span><span class='op'>(</span><span class='nam'>o</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t45' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>elif</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>o</span><span class='op'>,</span> <span class='str'>&#39;__iter__&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t46' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>[</span><span class='nam'>i</span> <span class='key'>for</span> <span class='nam'>i</span> <span class='key'>in</span> <span class='nam'>o</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t47' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>super</span><span class='op'>(</span><span class='nam'>JSONEncoder</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>default</span><span class='op'>(</span><span class='nam'>o</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t48' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t49' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t50' class='stm run hide_run'><span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t51' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>import</span> <span class='nam'>yaml</span><span class='strut'>&nbsp;</span></p>
<p id='t52' class='stm mis'><span class='key'>except</span> <span class='nam'>ImportError</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t53' class='stm mis'>&nbsp; &nbsp; <span class='nam'>SafeDumper</span> <span class='op'>=</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
<p id='t54' class='pln'><span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t55' class='pln'>&nbsp; &nbsp; <span class='com'># Adapted from http://pyyaml.org/attachment/ticket/161/use_ordered_dict.py</span><span class='strut'>&nbsp;</span></p>
<p id='t56' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>class</span> <span class='nam'>SafeDumper</span><span class='op'>(</span><span class='nam'>yaml</span><span class='op'>.</span><span class='nam'>SafeDumper</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t57' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t58' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Handles decimals as strings.</span><span class='strut'>&nbsp;</span></p>
<p id='t59' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Handles SortedDicts as usual dicts, but preserves field order, rather</span><span class='strut'>&nbsp;</span></p>
<p id='t60' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; than the usual behaviour of sorting the keys.</span><span class='strut'>&nbsp;</span></p>
<p id='t61' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t62' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>represent_decimal</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>data</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t63' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>represent_scalar</span><span class='op'>(</span><span class='str'>&#39;tag:yaml.org,2002:str&#39;</span><span class='op'>,</span> <span class='nam'>str</span><span class='op'>(</span><span class='nam'>data</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t64' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t65' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>represent_mapping</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>tag</span><span class='op'>,</span> <span class='nam'>mapping</span><span class='op'>,</span> <span class='nam'>flow_style</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t66' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>value</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t67' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>node</span> <span class='op'>=</span> <span class='nam'>yaml</span><span class='op'>.</span><span class='nam'>MappingNode</span><span class='op'>(</span><span class='nam'>tag</span><span class='op'>,</span> <span class='nam'>value</span><span class='op'>,</span> <span class='nam'>flow_style</span><span class='op'>=</span><span class='nam'>flow_style</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t68' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>alias_key</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t69' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>represented_objects</span><span class='op'>[</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>alias_key</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>node</span><span class='strut'>&nbsp;</span></p>
<p id='t70' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>best_style</span> <span class='op'>=</span> <span class='nam'>True</span><span class='strut'>&nbsp;</span></p>
<p id='t71' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>mapping</span><span class='op'>,</span> <span class='str'>&#39;items&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t72' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mapping</span> <span class='op'>=</span> <span class='nam'>list</span><span class='op'>(</span><span class='nam'>mapping</span><span class='op'>.</span><span class='nam'>items</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t73' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>mapping</span><span class='op'>,</span> <span class='nam'>SortedDict</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t74' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mapping</span><span class='op'>.</span><span class='nam'>sort</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t75' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>item_key</span><span class='op'>,</span> <span class='nam'>item_value</span> <span class='key'>in</span> <span class='nam'>mapping</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t76' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>node_key</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>represent_data</span><span class='op'>(</span><span class='nam'>item_key</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t77' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>node_value</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>represent_data</span><span class='op'>(</span><span class='nam'>item_value</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t78' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='op'>(</span><span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>node_key</span><span class='op'>,</span> <span class='nam'>yaml</span><span class='op'>.</span><span class='nam'>ScalarNode</span><span class='op'>)</span> <span class='key'>and</span> <span class='key'>not</span> <span class='nam'>node_key</span><span class='op'>.</span><span class='nam'>style</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t79' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>best_style</span> <span class='op'>=</span> <span class='nam'>False</span><span class='strut'>&nbsp;</span></p>
<p id='t80' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='op'>(</span><span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>node_value</span><span class='op'>,</span> <span class='nam'>yaml</span><span class='op'>.</span><span class='nam'>ScalarNode</span><span class='op'>)</span> <span class='key'>and</span> <span class='key'>not</span> <span class='nam'>node_value</span><span class='op'>.</span><span class='nam'>style</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t81' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>best_style</span> <span class='op'>=</span> <span class='nam'>False</span><span class='strut'>&nbsp;</span></p>
<p id='t82' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>value</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='op'>(</span><span class='nam'>node_key</span><span class='op'>,</span> <span class='nam'>node_value</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t83' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>flow_style</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t84' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>default_flow_style</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t85' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>node</span><span class='op'>.</span><span class='nam'>flow_style</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>default_flow_style</span><span class='strut'>&nbsp;</span></p>
<p id='t86' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t87' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>node</span><span class='op'>.</span><span class='nam'>flow_style</span> <span class='op'>=</span> <span class='nam'>best_style</span><span class='strut'>&nbsp;</span></p>
<p id='t88' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>node</span><span class='strut'>&nbsp;</span></p>
<p id='t89' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t90' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>SafeDumper</span><span class='op'>.</span><span class='nam'>add_representer</span><span class='op'>(</span><span class='nam'>SortedDict</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t91' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>yaml</span><span class='op'>.</span><span class='nam'>representer</span><span class='op'>.</span><span class='nam'>SafeRepresenter</span><span class='op'>.</span><span class='nam'>represent_dict</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t92' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>SafeDumper</span><span class='op'>.</span><span class='nam'>add_representer</span><span class='op'>(</span><span class='nam'>DictWithMetadata</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t93' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>yaml</span><span class='op'>.</span><span class='nam'>representer</span><span class='op'>.</span><span class='nam'>SafeRepresenter</span><span class='op'>.</span><span class='nam'>represent_dict</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t94' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>SafeDumper</span><span class='op'>.</span><span class='nam'>add_representer</span><span class='op'>(</span><span class='nam'>SortedDictWithMetadata</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t95' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>yaml</span><span class='op'>.</span><span class='nam'>representer</span><span class='op'>.</span><span class='nam'>SafeRepresenter</span><span class='op'>.</span><span class='nam'>represent_dict</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t96' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>SafeDumper</span><span class='op'>.</span><span class='nam'>add_representer</span><span class='op'>(</span><span class='nam'>types</span><span class='op'>.</span><span class='nam'>GeneratorType</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t97' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>yaml</span><span class='op'>.</span><span class='nam'>representer</span><span class='op'>.</span><span class='nam'>SafeRepresenter</span><span class='op'>.</span><span class='nam'>represent_list</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
</td>
</tr>
</table>
</div>
<div id='footer'>
<div class='content'>
<p>
<a class='nav' href='index.html'>&#xab; index</a> &nbsp; &nbsp; <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.5.1</a>
</p>
</div>
</div>
</body>
</html>

View File

@ -1,241 +0,0 @@
<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
<title>Coverage for rest_framework/utils/formatting: 97%</title>
<link rel='stylesheet' href='style.css' type='text/css'>
<script type='text/javascript' src='jquery-1.4.3.min.js'></script>
<script type='text/javascript' src='jquery.hotkeys.js'></script>
<script type='text/javascript' src='jquery.isonscreen.js'></script>
<script type='text/javascript' src='coverage_html.js'></script>
<script type='text/javascript' charset='utf-8'>
jQuery(document).ready(coverage.pyfile_ready);
</script>
</head>
<body id='pyfile'>
<div id='header'>
<div class='content'>
<h1>Coverage for <b>rest_framework/utils/formatting</b> :
<span class='pc_cov'>97%</span>
</h1>
<img id='keyboard_icon' src='keybd_closed.png'>
<h2 class='stats'>
39 statements
<span class='run hide_run shortkey_r' onclick='coverage.toggle_lines(this, "run")'>38 run</span>
<span class='mis shortkey_m' onclick='coverage.toggle_lines(this, "mis")'>1 missing</span>
<span class='exc shortkey_x' onclick='coverage.toggle_lines(this, "exc")'>0 excluded</span>
</h2>
</div>
</div>
<div class='help_panel'>
<img id='panel_icon' src='keybd_open.png'>
<p class='legend'>Hot-keys on this page</p>
<div>
<p class='keyhelp'>
<span class='key'>r</span>
<span class='key'>m</span>
<span class='key'>x</span>
<span class='key'>p</span> &nbsp; toggle line displays
</p>
<p class='keyhelp'>
<span class='key'>j</span>
<span class='key'>k</span> &nbsp; next/prev highlighted chunk
</p>
<p class='keyhelp'>
<span class='key'>0</span> &nbsp; (zero) top of page
</p>
<p class='keyhelp'>
<span class='key'>1</span> &nbsp; (one) first highlighted chunk
</p>
</div>
</div>
<div id='source'>
<table cellspacing='0' cellpadding='0'>
<tr>
<td class='linenos' valign='top'>
<p id='n1' class='pln'><a href='#n1'>1</a></p>
<p id='n2' class='pln'><a href='#n2'>2</a></p>
<p id='n3' class='pln'><a href='#n3'>3</a></p>
<p id='n4' class='stm run hide_run'><a href='#n4'>4</a></p>
<p id='n5' class='pln'><a href='#n5'>5</a></p>
<p id='n6' class='stm run hide_run'><a href='#n6'>6</a></p>
<p id='n7' class='stm run hide_run'><a href='#n7'>7</a></p>
<p id='n8' class='stm run hide_run'><a href='#n8'>8</a></p>
<p id='n9' class='stm run hide_run'><a href='#n9'>9</a></p>
<p id='n10' class='pln'><a href='#n10'>10</a></p>
<p id='n11' class='pln'><a href='#n11'>11</a></p>
<p id='n12' class='stm run hide_run'><a href='#n12'>12</a></p>
<p id='n13' class='pln'><a href='#n13'>13</a></p>
<p id='n14' class='pln'><a href='#n14'>14</a></p>
<p id='n15' class='pln'><a href='#n15'>15</a></p>
<p id='n16' class='pln'><a href='#n16'>16</a></p>
<p id='n17' class='stm run hide_run'><a href='#n17'>17</a></p>
<p id='n18' class='stm run hide_run'><a href='#n18'>18</a></p>
<p id='n19' class='stm run hide_run'><a href='#n19'>19</a></p>
<p id='n20' class='pln'><a href='#n20'>20</a></p>
<p id='n21' class='pln'><a href='#n21'>21</a></p>
<p id='n22' class='stm run hide_run'><a href='#n22'>22</a></p>
<p id='n23' class='pln'><a href='#n23'>23</a></p>
<p id='n24' class='pln'><a href='#n24'>24</a></p>
<p id='n25' class='pln'><a href='#n25'>25</a></p>
<p id='n26' class='pln'><a href='#n26'>26</a></p>
<p id='n27' class='stm run hide_run'><a href='#n27'>27</a></p>
<p id='n28' class='pln'><a href='#n28'>28</a></p>
<p id='n29' class='pln'><a href='#n29'>29</a></p>
<p id='n30' class='pln'><a href='#n30'>30</a></p>
<p id='n31' class='stm run hide_run'><a href='#n31'>31</a></p>
<p id='n32' class='stm run hide_run'><a href='#n32'>32</a></p>
<p id='n33' class='stm run hide_run'><a href='#n33'>33</a></p>
<p id='n34' class='stm run hide_run'><a href='#n34'>34</a></p>
<p id='n35' class='stm run hide_run'><a href='#n35'>35</a></p>
<p id='n36' class='pln'><a href='#n36'>36</a></p>
<p id='n37' class='pln'><a href='#n37'>37</a></p>
<p id='n38' class='stm run hide_run'><a href='#n38'>38</a></p>
<p id='n39' class='pln'><a href='#n39'>39</a></p>
<p id='n40' class='pln'><a href='#n40'>40</a></p>
<p id='n41' class='pln'><a href='#n41'>41</a></p>
<p id='n42' class='pln'><a href='#n42'>42</a></p>
<p id='n43' class='stm run hide_run'><a href='#n43'>43</a></p>
<p id='n44' class='stm run hide_run'><a href='#n44'>44</a></p>
<p id='n45' class='stm run hide_run'><a href='#n45'>45</a></p>
<p id='n46' class='pln'><a href='#n46'>46</a></p>
<p id='n47' class='pln'><a href='#n47'>47</a></p>
<p id='n48' class='stm run hide_run'><a href='#n48'>48</a></p>
<p id='n49' class='pln'><a href='#n49'>49</a></p>
<p id='n50' class='pln'><a href='#n50'>50</a></p>
<p id='n51' class='pln'><a href='#n51'>51</a></p>
<p id='n52' class='stm run hide_run'><a href='#n52'>52</a></p>
<p id='n53' class='stm run hide_run'><a href='#n53'>53</a></p>
<p id='n54' class='stm run hide_run'><a href='#n54'>54</a></p>
<p id='n55' class='stm run hide_run'><a href='#n55'>55</a></p>
<p id='n56' class='stm run hide_run'><a href='#n56'>56</a></p>
<p id='n57' class='stm run hide_run'><a href='#n57'>57</a></p>
<p id='n58' class='stm run hide_run'><a href='#n58'>58</a></p>
<p id='n59' class='pln'><a href='#n59'>59</a></p>
<p id='n60' class='pln'><a href='#n60'>60</a></p>
<p id='n61' class='stm run hide_run'><a href='#n61'>61</a></p>
<p id='n62' class='pln'><a href='#n62'>62</a></p>
<p id='n63' class='pln'><a href='#n63'>63</a></p>
<p id='n64' class='pln'><a href='#n64'>64</a></p>
<p id='n65' class='stm run hide_run'><a href='#n65'>65</a></p>
<p id='n66' class='stm run hide_run'><a href='#n66'>66</a></p>
<p id='n67' class='stm run hide_run'><a href='#n67'>67</a></p>
<p id='n68' class='stm run hide_run'><a href='#n68'>68</a></p>
<p id='n69' class='stm run hide_run'><a href='#n69'>69</a></p>
<p id='n70' class='pln'><a href='#n70'>70</a></p>
<p id='n71' class='pln'><a href='#n71'>71</a></p>
<p id='n72' class='stm run hide_run'><a href='#n72'>72</a></p>
<p id='n73' class='pln'><a href='#n73'>73</a></p>
<p id='n74' class='pln'><a href='#n74'>74</a></p>
<p id='n75' class='pln'><a href='#n75'>75</a></p>
<p id='n76' class='stm run hide_run'><a href='#n76'>76</a></p>
<p id='n77' class='stm run hide_run'><a href='#n77'>77</a></p>
<p id='n78' class='pln'><a href='#n78'>78</a></p>
<p id='n79' class='stm mis'><a href='#n79'>79</a></p>
<p id='n80' class='stm run hide_run'><a href='#n80'>80</a></p>
</td>
<td class='text' valign='top'>
<p id='t1' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t2' class='pln'><span class='str'>Utility functions to return a formatted name and description for a given view.</span><span class='strut'>&nbsp;</span></p>
<p id='t3' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t4' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>__future__</span> <span class='key'>import</span> <span class='nam'>unicode_literals</span><span class='strut'>&nbsp;</span></p>
<p id='t5' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t6' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>django</span><span class='op'>.</span><span class='nam'>utils</span><span class='op'>.</span><span class='nam'>html</span> <span class='key'>import</span> <span class='nam'>escape</span><span class='strut'>&nbsp;</span></p>
<p id='t7' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>django</span><span class='op'>.</span><span class='nam'>utils</span><span class='op'>.</span><span class='nam'>safestring</span> <span class='key'>import</span> <span class='nam'>mark_safe</span><span class='strut'>&nbsp;</span></p>
<p id='t8' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>compat</span> <span class='key'>import</span> <span class='nam'>apply_markdown</span><span class='strut'>&nbsp;</span></p>
<p id='t9' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>re</span><span class='strut'>&nbsp;</span></p>
<p id='t10' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t11' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t12' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>_remove_trailing_string</span><span class='op'>(</span><span class='nam'>content</span><span class='op'>,</span> <span class='nam'>trailing</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t13' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t14' class='pln'><span class='str'>&nbsp; &nbsp; Strip trailing component `trailing` from `content` if it exists.</span><span class='strut'>&nbsp;</span></p>
<p id='t15' class='pln'><span class='str'>&nbsp; &nbsp; Used when generating names from view classes.</span><span class='strut'>&nbsp;</span></p>
<p id='t16' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t17' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>content</span><span class='op'>.</span><span class='nam'>endswith</span><span class='op'>(</span><span class='nam'>trailing</span><span class='op'>)</span> <span class='key'>and</span> <span class='nam'>content</span> <span class='op'>!=</span> <span class='nam'>trailing</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t18' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>content</span><span class='op'>[</span><span class='op'>:</span><span class='op'>-</span><span class='nam'>len</span><span class='op'>(</span><span class='nam'>trailing</span><span class='op'>)</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t19' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>content</span><span class='strut'>&nbsp;</span></p>
<p id='t20' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t21' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t22' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>_remove_leading_indent</span><span class='op'>(</span><span class='nam'>content</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t23' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t24' class='pln'><span class='str'>&nbsp; &nbsp; Remove leading indent from a block of text.</span><span class='strut'>&nbsp;</span></p>
<p id='t25' class='pln'><span class='str'>&nbsp; &nbsp; Used when generating descriptions from docstrings.</span><span class='strut'>&nbsp;</span></p>
<p id='t26' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t27' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>whitespace_counts</span> <span class='op'>=</span> <span class='op'>[</span><span class='nam'>len</span><span class='op'>(</span><span class='nam'>line</span><span class='op'>)</span> <span class='op'>-</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>line</span><span class='op'>.</span><span class='nam'>lstrip</span><span class='op'>(</span><span class='str'>&#39; &#39;</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t28' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <span class='key'>for</span> <span class='nam'>line</span> <span class='key'>in</span> <span class='nam'>content</span><span class='op'>.</span><span class='nam'>splitlines</span><span class='op'>(</span><span class='op'>)</span><span class='op'>[</span><span class='num'>1</span><span class='op'>:</span><span class='op'>]</span> <span class='key'>if</span> <span class='nam'>line</span><span class='op'>.</span><span class='nam'>lstrip</span><span class='op'>(</span><span class='op'>)</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t29' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t30' class='pln'>&nbsp; &nbsp; <span class='com'># unindent the content if needed</span><span class='strut'>&nbsp;</span></p>
<p id='t31' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>whitespace_counts</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t32' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>whitespace_pattern</span> <span class='op'>=</span> <span class='str'>&#39;^&#39;</span> <span class='op'>+</span> <span class='op'>(</span><span class='str'>&#39; &#39;</span> <span class='op'>*</span> <span class='nam'>min</span><span class='op'>(</span><span class='nam'>whitespace_counts</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t33' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>content</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>sub</span><span class='op'>(</span><span class='nam'>re</span><span class='op'>.</span><span class='nam'>compile</span><span class='op'>(</span><span class='nam'>whitespace_pattern</span><span class='op'>,</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>MULTILINE</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>&#39;&#39;</span><span class='op'>,</span> <span class='nam'>content</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t34' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>content</span> <span class='op'>=</span> <span class='nam'>content</span><span class='op'>.</span><span class='nam'>strip</span><span class='op'>(</span><span class='str'>&#39;\n&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t35' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>content</span><span class='strut'>&nbsp;</span></p>
<p id='t36' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t37' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t38' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>_camelcase_to_spaces</span><span class='op'>(</span><span class='nam'>content</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t39' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t40' class='pln'><span class='str'>&nbsp; &nbsp; Translate &#39;CamelCaseNames&#39; to &#39;Camel Case Names&#39;.</span><span class='strut'>&nbsp;</span></p>
<p id='t41' class='pln'><span class='str'>&nbsp; &nbsp; Used when generating names from view classes.</span><span class='strut'>&nbsp;</span></p>
<p id='t42' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t43' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>camelcase_boundry</span> <span class='op'>=</span> <span class='str'>&#39;(((?&lt;=[a-z])[A-Z])|([A-Z](?![A-Z]|$)))&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t44' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>content</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>sub</span><span class='op'>(</span><span class='nam'>camelcase_boundry</span><span class='op'>,</span> <span class='str'>&#39; \\1&#39;</span><span class='op'>,</span> <span class='nam'>content</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>strip</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t45' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>return</span> <span class='str'>&#39; &#39;</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='nam'>content</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>&#39;_&#39;</span><span class='op'>)</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>title</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t46' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t47' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t48' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>get_view_name</span><span class='op'>(</span><span class='nam'>cls</span><span class='op'>,</span> <span class='nam'>suffix</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t49' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t50' class='pln'><span class='str'>&nbsp; &nbsp; Return a formatted name for an `APIView` class or `@api_view` function.</span><span class='strut'>&nbsp;</span></p>
<p id='t51' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t52' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>name</span> <span class='op'>=</span> <span class='nam'>cls</span><span class='op'>.</span><span class='nam'>__name__</span><span class='strut'>&nbsp;</span></p>
<p id='t53' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>name</span> <span class='op'>=</span> <span class='nam'>_remove_trailing_string</span><span class='op'>(</span><span class='nam'>name</span><span class='op'>,</span> <span class='str'>&#39;View&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t54' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>name</span> <span class='op'>=</span> <span class='nam'>_remove_trailing_string</span><span class='op'>(</span><span class='nam'>name</span><span class='op'>,</span> <span class='str'>&#39;ViewSet&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t55' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>name</span> <span class='op'>=</span> <span class='nam'>_camelcase_to_spaces</span><span class='op'>(</span><span class='nam'>name</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t56' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>suffix</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t57' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>name</span> <span class='op'>+=</span> <span class='str'>&#39; &#39;</span> <span class='op'>+</span> <span class='nam'>suffix</span><span class='strut'>&nbsp;</span></p>
<p id='t58' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>name</span><span class='strut'>&nbsp;</span></p>
<p id='t59' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t60' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t61' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>get_view_description</span><span class='op'>(</span><span class='nam'>cls</span><span class='op'>,</span> <span class='nam'>html</span><span class='op'>=</span><span class='nam'>False</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t62' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t63' class='pln'><span class='str'>&nbsp; &nbsp; Return a description for an `APIView` class or `@api_view` function.</span><span class='strut'>&nbsp;</span></p>
<p id='t64' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t65' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>description</span> <span class='op'>=</span> <span class='nam'>cls</span><span class='op'>.</span><span class='nam'>__doc__</span> <span class='key'>or</span> <span class='str'>&#39;&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t66' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>description</span> <span class='op'>=</span> <span class='nam'>_remove_leading_indent</span><span class='op'>(</span><span class='nam'>description</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t67' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>html</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t68' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>markup_description</span><span class='op'>(</span><span class='nam'>description</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t69' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>description</span><span class='strut'>&nbsp;</span></p>
<p id='t70' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t71' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t72' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>markup_description</span><span class='op'>(</span><span class='nam'>description</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t73' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t74' class='pln'><span class='str'>&nbsp; &nbsp; Apply HTML markup to the given description.</span><span class='strut'>&nbsp;</span></p>
<p id='t75' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t76' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>apply_markdown</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t77' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>description</span> <span class='op'>=</span> <span class='nam'>apply_markdown</span><span class='op'>(</span><span class='nam'>description</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t78' class='pln'>&nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t79' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>description</span> <span class='op'>=</span> <span class='nam'>escape</span><span class='op'>(</span><span class='nam'>description</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>replace</span><span class='op'>(</span><span class='str'>&#39;\n&#39;</span><span class='op'>,</span> <span class='str'>&#39;&lt;br /&gt;&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t80' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>mark_safe</span><span class='op'>(</span><span class='nam'>description</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
</td>
</tr>
</table>
</div>
<div id='footer'>
<div class='content'>
<p>
<a class='nav' href='index.html'>&#xab; index</a> &nbsp; &nbsp; <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.5.1</a>
</p>
</div>
</div>
</body>
</html>

View File

@ -1,257 +0,0 @@
<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
<title>Coverage for rest_framework/utils/mediatypes: 77%</title>
<link rel='stylesheet' href='style.css' type='text/css'>
<script type='text/javascript' src='jquery-1.4.3.min.js'></script>
<script type='text/javascript' src='jquery.hotkeys.js'></script>
<script type='text/javascript' src='jquery.isonscreen.js'></script>
<script type='text/javascript' src='coverage_html.js'></script>
<script type='text/javascript' charset='utf-8'>
jQuery(document).ready(coverage.pyfile_ready);
</script>
</head>
<body id='pyfile'>
<div id='header'>
<div class='content'>
<h1>Coverage for <b>rest_framework/utils/mediatypes</b> :
<span class='pc_cov'>77%</span>
</h1>
<img id='keyboard_icon' src='keybd_closed.png'>
<h2 class='stats'>
44 statements
<span class='run hide_run shortkey_r' onclick='coverage.toggle_lines(this, "run")'>34 run</span>
<span class='mis shortkey_m' onclick='coverage.toggle_lines(this, "mis")'>10 missing</span>
<span class='exc shortkey_x' onclick='coverage.toggle_lines(this, "exc")'>0 excluded</span>
</h2>
</div>
</div>
<div class='help_panel'>
<img id='panel_icon' src='keybd_open.png'>
<p class='legend'>Hot-keys on this page</p>
<div>
<p class='keyhelp'>
<span class='key'>r</span>
<span class='key'>m</span>
<span class='key'>x</span>
<span class='key'>p</span> &nbsp; toggle line displays
</p>
<p class='keyhelp'>
<span class='key'>j</span>
<span class='key'>k</span> &nbsp; next/prev highlighted chunk
</p>
<p class='keyhelp'>
<span class='key'>0</span> &nbsp; (zero) top of page
</p>
<p class='keyhelp'>
<span class='key'>1</span> &nbsp; (one) first highlighted chunk
</p>
</div>
</div>
<div id='source'>
<table cellspacing='0' cellpadding='0'>
<tr>
<td class='linenos' valign='top'>
<p id='n1' class='pln'><a href='#n1'>1</a></p>
<p id='n2' class='pln'><a href='#n2'>2</a></p>
<p id='n3' class='pln'><a href='#n3'>3</a></p>
<p id='n4' class='pln'><a href='#n4'>4</a></p>
<p id='n5' class='pln'><a href='#n5'>5</a></p>
<p id='n6' class='stm run hide_run'><a href='#n6'>6</a></p>
<p id='n7' class='stm run hide_run'><a href='#n7'>7</a></p>
<p id='n8' class='stm run hide_run'><a href='#n8'>8</a></p>
<p id='n9' class='pln'><a href='#n9'>9</a></p>
<p id='n10' class='pln'><a href='#n10'>10</a></p>
<p id='n11' class='stm run hide_run'><a href='#n11'>11</a></p>
<p id='n12' class='pln'><a href='#n12'>12</a></p>
<p id='n13' class='pln'><a href='#n13'>13</a></p>
<p id='n14' class='pln'><a href='#n14'>14</a></p>
<p id='n15' class='pln'><a href='#n15'>15</a></p>
<p id='n16' class='pln'><a href='#n16'>16</a></p>
<p id='n17' class='pln'><a href='#n17'>17</a></p>
<p id='n18' class='pln'><a href='#n18'>18</a></p>
<p id='n19' class='pln'><a href='#n19'>19</a></p>
<p id='n20' class='pln'><a href='#n20'>20</a></p>
<p id='n21' class='pln'><a href='#n21'>21</a></p>
<p id='n22' class='pln'><a href='#n22'>22</a></p>
<p id='n23' class='pln'><a href='#n23'>23</a></p>
<p id='n24' class='stm run hide_run'><a href='#n24'>24</a></p>
<p id='n25' class='stm run hide_run'><a href='#n25'>25</a></p>
<p id='n26' class='stm run hide_run'><a href='#n26'>26</a></p>
<p id='n27' class='pln'><a href='#n27'>27</a></p>
<p id='n28' class='pln'><a href='#n28'>28</a></p>
<p id='n29' class='stm run hide_run'><a href='#n29'>29</a></p>
<p id='n30' class='pln'><a href='#n30'>30</a></p>
<p id='n31' class='pln'><a href='#n31'>31</a></p>
<p id='n32' class='pln'><a href='#n32'>32</a></p>
<p id='n33' class='pln'><a href='#n33'>33</a></p>
<p id='n34' class='pln'><a href='#n34'>34</a></p>
<p id='n35' class='pln'><a href='#n35'>35</a></p>
<p id='n36' class='pln'><a href='#n36'>36</a></p>
<p id='n37' class='pln'><a href='#n37'>37</a></p>
<p id='n38' class='pln'><a href='#n38'>38</a></p>
<p id='n39' class='stm run hide_run'><a href='#n39'>39</a></p>
<p id='n40' class='stm run hide_run'><a href='#n40'>40</a></p>
<p id='n41' class='stm run hide_run'><a href='#n41'>41</a></p>
<p id='n42' class='stm run hide_run'><a href='#n42'>42</a></p>
<p id='n43' class='stm run hide_run'><a href='#n43'>43</a></p>
<p id='n44' class='pln'><a href='#n44'>44</a></p>
<p id='n45' class='pln'><a href='#n45'>45</a></p>
<p id='n46' class='stm run hide_run'><a href='#n46'>46</a></p>
<p id='n47' class='stm run hide_run'><a href='#n47'>47</a></p>
<p id='n48' class='stm run hide_run'><a href='#n48'>48</a></p>
<p id='n49' class='stm mis'><a href='#n49'>49</a></p>
<p id='n50' class='stm run hide_run'><a href='#n50'>50</a></p>
<p id='n51' class='stm run hide_run'><a href='#n51'>51</a></p>
<p id='n52' class='stm run hide_run'><a href='#n52'>52</a></p>
<p id='n53' class='pln'><a href='#n53'>53</a></p>
<p id='n54' class='stm run hide_run'><a href='#n54'>54</a></p>
<p id='n55' class='pln'><a href='#n55'>55</a></p>
<p id='n56' class='stm run hide_run'><a href='#n56'>56</a></p>
<p id='n57' class='stm mis'><a href='#n57'>57</a></p>
<p id='n58' class='stm mis'><a href='#n58'>58</a></p>
<p id='n59' class='pln'><a href='#n59'>59</a></p>
<p id='n60' class='stm run hide_run'><a href='#n60'>60</a></p>
<p id='n61' class='stm run hide_run'><a href='#n61'>61</a></p>
<p id='n62' class='pln'><a href='#n62'>62</a></p>
<p id='n63' class='stm run hide_run'><a href='#n63'>63</a></p>
<p id='n64' class='stm mis'><a href='#n64'>64</a></p>
<p id='n65' class='pln'><a href='#n65'>65</a></p>
<p id='n66' class='stm run hide_run'><a href='#n66'>66</a></p>
<p id='n67' class='pln'><a href='#n67'>67</a></p>
<p id='n68' class='stm run hide_run'><a href='#n68'>68</a></p>
<p id='n69' class='pln'><a href='#n69'>69</a></p>
<p id='n70' class='pln'><a href='#n70'>70</a></p>
<p id='n71' class='pln'><a href='#n71'>71</a></p>
<p id='n72' class='pln'><a href='#n72'>72</a></p>
<p id='n73' class='stm run hide_run'><a href='#n73'>73</a></p>
<p id='n74' class='stm run hide_run'><a href='#n74'>74</a></p>
<p id='n75' class='stm run hide_run'><a href='#n75'>75</a></p>
<p id='n76' class='stm mis'><a href='#n76'>76</a></p>
<p id='n77' class='stm run hide_run'><a href='#n77'>77</a></p>
<p id='n78' class='stm run hide_run'><a href='#n78'>78</a></p>
<p id='n79' class='stm run hide_run'><a href='#n79'>79</a></p>
<p id='n80' class='pln'><a href='#n80'>80</a></p>
<p id='n81' class='stm run hide_run'><a href='#n81'>81</a></p>
<p id='n82' class='stm mis'><a href='#n82'>82</a></p>
<p id='n83' class='pln'><a href='#n83'>83</a></p>
<p id='n84' class='stm run hide_run'><a href='#n84'>84</a></p>
<p id='n85' class='stm mis'><a href='#n85'>85</a></p>
<p id='n86' class='stm mis'><a href='#n86'>86</a></p>
<p id='n87' class='stm mis'><a href='#n87'>87</a></p>
<p id='n88' class='stm mis'><a href='#n88'>88</a></p>
</td>
<td class='text' valign='top'>
<p id='t1' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t2' class='pln'><span class='str'>Handling of media types, as found in HTTP Content-Type and Accept headers.</span><span class='strut'>&nbsp;</span></p>
<p id='t3' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t4' class='pln'><span class='str'>See http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7</span><span class='strut'>&nbsp;</span></p>
<p id='t5' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t6' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>__future__</span> <span class='key'>import</span> <span class='nam'>unicode_literals</span><span class='strut'>&nbsp;</span></p>
<p id='t7' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>django</span><span class='op'>.</span><span class='nam'>http</span><span class='op'>.</span><span class='nam'>multipartparser</span> <span class='key'>import</span> <span class='nam'>parse_header</span><span class='strut'>&nbsp;</span></p>
<p id='t8' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span> <span class='key'>import</span> <span class='nam'>HTTP_HEADER_ENCODING</span><span class='strut'>&nbsp;</span></p>
<p id='t9' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t10' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t11' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>media_type_matches</span><span class='op'>(</span><span class='nam'>lhs</span><span class='op'>,</span> <span class='nam'>rhs</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t12' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t13' class='pln'><span class='str'>&nbsp; &nbsp; Returns ``True`` if the media type in the first argument &lt;= the</span><span class='strut'>&nbsp;</span></p>
<p id='t14' class='pln'><span class='str'>&nbsp; &nbsp; media type in the second argument.&nbsp; The media types are strings</span><span class='strut'>&nbsp;</span></p>
<p id='t15' class='pln'><span class='str'>&nbsp; &nbsp; as described by the HTTP spec.</span><span class='strut'>&nbsp;</span></p>
<p id='t16' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t17' class='pln'><span class='str'>&nbsp; &nbsp; Valid media type strings include:</span><span class='strut'>&nbsp;</span></p>
<p id='t18' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t19' class='pln'><span class='str'>&nbsp; &nbsp; &#39;application/json; indent=4&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t20' class='pln'><span class='str'>&nbsp; &nbsp; &#39;application/json&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t21' class='pln'><span class='str'>&nbsp; &nbsp; &#39;text/*&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t22' class='pln'><span class='str'>&nbsp; &nbsp; &#39;*/*&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t23' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t24' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>lhs</span> <span class='op'>=</span> <span class='nam'>_MediaType</span><span class='op'>(</span><span class='nam'>lhs</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t25' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>rhs</span> <span class='op'>=</span> <span class='nam'>_MediaType</span><span class='op'>(</span><span class='nam'>rhs</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t26' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>lhs</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>rhs</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t27' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t28' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t29' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>order_by_precedence</span><span class='op'>(</span><span class='nam'>media_type_lst</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t30' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t31' class='pln'><span class='str'>&nbsp; &nbsp; Returns a list of sets of media type strings, ordered by precedence.</span><span class='strut'>&nbsp;</span></p>
<p id='t32' class='pln'><span class='str'>&nbsp; &nbsp; Precedence is determined by how specific a media type is:</span><span class='strut'>&nbsp;</span></p>
<p id='t33' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t34' class='pln'><span class='str'>&nbsp; &nbsp; 3. &#39;type/subtype; param=val&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t35' class='pln'><span class='str'>&nbsp; &nbsp; 2. &#39;type/subtype&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t36' class='pln'><span class='str'>&nbsp; &nbsp; 1. &#39;type/*&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t37' class='pln'><span class='str'>&nbsp; &nbsp; 0. &#39;*/*&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t38' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t39' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>ret</span> <span class='op'>=</span> <span class='op'>[</span><span class='nam'>set</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>set</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>set</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>set</span><span class='op'>(</span><span class='op'>)</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t40' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>media_type</span> <span class='key'>in</span> <span class='nam'>media_type_lst</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t41' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>precedence</span> <span class='op'>=</span> <span class='nam'>_MediaType</span><span class='op'>(</span><span class='nam'>media_type</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>precedence</span><span class='strut'>&nbsp;</span></p>
<p id='t42' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ret</span><span class='op'>[</span><span class='num'>3</span> <span class='op'>-</span> <span class='nam'>precedence</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>add</span><span class='op'>(</span><span class='nam'>media_type</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t43' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>return</span> <span class='op'>[</span><span class='nam'>media_types</span> <span class='key'>for</span> <span class='nam'>media_types</span> <span class='key'>in</span> <span class='nam'>ret</span> <span class='key'>if</span> <span class='nam'>media_types</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t44' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t45' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t46' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>_MediaType</span><span class='op'>(</span><span class='nam'>object</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t47' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>media_type_str</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t48' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>media_type_str</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t49' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>media_type_str</span> <span class='op'>=</span> <span class='str'>&#39;&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t50' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>orig</span> <span class='op'>=</span> <span class='nam'>media_type_str</span><span class='strut'>&nbsp;</span></p>
<p id='t51' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>full_type</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>params</span> <span class='op'>=</span> <span class='nam'>parse_header</span><span class='op'>(</span><span class='nam'>media_type_str</span><span class='op'>.</span><span class='nam'>encode</span><span class='op'>(</span><span class='nam'>HTTP_HEADER_ENCODING</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t52' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>main_type</span><span class='op'>,</span> <span class='nam'>sep</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sub_type</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>full_type</span><span class='op'>.</span><span class='nam'>partition</span><span class='op'>(</span><span class='str'>&#39;/&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t53' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t54' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>other</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t55' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Return true if this MediaType satisfies the given MediaType.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t56' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>key</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>params</span><span class='op'>.</span><span class='nam'>keys</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t57' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>key</span> <span class='op'>!=</span> <span class='str'>&#39;q&#39;</span> <span class='key'>and</span> <span class='nam'>other</span><span class='op'>.</span><span class='nam'>params</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='nam'>key</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span> <span class='op'>!=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>params</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='nam'>key</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t58' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>False</span><span class='strut'>&nbsp;</span></p>
<p id='t59' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t60' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sub_type</span> <span class='op'>!=</span> <span class='str'>&#39;*&#39;</span> <span class='key'>and</span> <span class='nam'>other</span><span class='op'>.</span><span class='nam'>sub_type</span> <span class='op'>!=</span> <span class='str'>&#39;*&#39;</span>&nbsp; <span class='key'>and</span> <span class='nam'>other</span><span class='op'>.</span><span class='nam'>sub_type</span> <span class='op'>!=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sub_type</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t61' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>False</span><span class='strut'>&nbsp;</span></p>
<p id='t62' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t63' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>main_type</span> <span class='op'>!=</span> <span class='str'>&#39;*&#39;</span> <span class='key'>and</span> <span class='nam'>other</span><span class='op'>.</span><span class='nam'>main_type</span> <span class='op'>!=</span> <span class='str'>&#39;*&#39;</span> <span class='key'>and</span> <span class='nam'>other</span><span class='op'>.</span><span class='nam'>main_type</span> <span class='op'>!=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>main_type</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t64' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>False</span><span class='strut'>&nbsp;</span></p>
<p id='t65' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t66' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>True</span><span class='strut'>&nbsp;</span></p>
<p id='t67' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t68' class='stm run hide_run'>&nbsp; &nbsp; <span class='op'>@</span><span class='nam'>property</span><span class='strut'>&nbsp;</span></p>
<p id='t69' class='pln'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>precedence</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t70' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t71' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Return a precedence level from 0-3 for the media type given how specific it is.</span><span class='strut'>&nbsp;</span></p>
<p id='t72' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t73' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>main_type</span> <span class='op'>==</span> <span class='str'>&#39;*&#39;</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t74' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='num'>0</span><span class='strut'>&nbsp;</span></p>
<p id='t75' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>elif</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sub_type</span> <span class='op'>==</span> <span class='str'>&#39;*&#39;</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t76' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='num'>1</span><span class='strut'>&nbsp;</span></p>
<p id='t77' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>elif</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>params</span> <span class='key'>or</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>params</span><span class='op'>.</span><span class='nam'>keys</span><span class='op'>(</span><span class='op'>)</span> <span class='op'>==</span> <span class='op'>[</span><span class='str'>&#39;q&#39;</span><span class='op'>]</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t78' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='num'>2</span><span class='strut'>&nbsp;</span></p>
<p id='t79' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='num'>3</span><span class='strut'>&nbsp;</span></p>
<p id='t80' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t81' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__str__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t82' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>unicode</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>encode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t83' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t84' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__unicode__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t85' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ret</span> <span class='op'>=</span> <span class='str'>&quot;%s/%s&quot;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>main_type</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sub_type</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t86' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>key</span><span class='op'>,</span> <span class='nam'>val</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>params</span><span class='op'>.</span><span class='nam'>items</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t87' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ret</span> <span class='op'>+=</span> <span class='str'>&quot;; %s=%s&quot;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>key</span><span class='op'>,</span> <span class='nam'>val</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t88' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>ret</span><span class='strut'>&nbsp;</span></p>
</td>
</tr>
</table>
</div>
<div id='footer'>
<div class='content'>
<p>
<a class='nav' href='index.html'>&#xab; index</a> &nbsp; &nbsp; <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.5.1</a>
</p>
</div>
</div>
</body>
</html>

View File

@ -1,793 +0,0 @@
<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
<title>Coverage for rest_framework/views: 100%</title>
<link rel='stylesheet' href='style.css' type='text/css'>
<script type='text/javascript' src='jquery-1.4.3.min.js'></script>
<script type='text/javascript' src='jquery.hotkeys.js'></script>
<script type='text/javascript' src='jquery.isonscreen.js'></script>
<script type='text/javascript' src='coverage_html.js'></script>
<script type='text/javascript' charset='utf-8'>
jQuery(document).ready(coverage.pyfile_ready);
</script>
</head>
<body id='pyfile'>
<div id='header'>
<div class='content'>
<h1>Coverage for <b>rest_framework/views</b> :
<span class='pc_cov'>100%</span>
</h1>
<img id='keyboard_icon' src='keybd_closed.png'>
<h2 class='stats'>
146 statements
<span class='run hide_run shortkey_r' onclick='coverage.toggle_lines(this, "run")'>146 run</span>
<span class='mis shortkey_m' onclick='coverage.toggle_lines(this, "mis")'>0 missing</span>
<span class='exc shortkey_x' onclick='coverage.toggle_lines(this, "exc")'>0 excluded</span>
</h2>
</div>
</div>
<div class='help_panel'>
<img id='panel_icon' src='keybd_open.png'>
<p class='legend'>Hot-keys on this page</p>
<div>
<p class='keyhelp'>
<span class='key'>r</span>
<span class='key'>m</span>
<span class='key'>x</span>
<span class='key'>p</span> &nbsp; toggle line displays
</p>
<p class='keyhelp'>
<span class='key'>j</span>
<span class='key'>k</span> &nbsp; next/prev highlighted chunk
</p>
<p class='keyhelp'>
<span class='key'>0</span> &nbsp; (zero) top of page
</p>
<p class='keyhelp'>
<span class='key'>1</span> &nbsp; (one) first highlighted chunk
</p>
</div>
</div>
<div id='source'>
<table cellspacing='0' cellpadding='0'>
<tr>
<td class='linenos' valign='top'>
<p id='n1' class='pln'><a href='#n1'>1</a></p>
<p id='n2' class='pln'><a href='#n2'>2</a></p>
<p id='n3' class='pln'><a href='#n3'>3</a></p>
<p id='n4' class='stm run hide_run'><a href='#n4'>4</a></p>
<p id='n5' class='pln'><a href='#n5'>5</a></p>
<p id='n6' class='stm run hide_run'><a href='#n6'>6</a></p>
<p id='n7' class='stm run hide_run'><a href='#n7'>7</a></p>
<p id='n8' class='stm run hide_run'><a href='#n8'>8</a></p>
<p id='n9' class='stm run hide_run'><a href='#n9'>9</a></p>
<p id='n10' class='stm run hide_run'><a href='#n10'>10</a></p>
<p id='n11' class='stm run hide_run'><a href='#n11'>11</a></p>
<p id='n12' class='stm run hide_run'><a href='#n12'>12</a></p>
<p id='n13' class='stm run hide_run'><a href='#n13'>13</a></p>
<p id='n14' class='stm run hide_run'><a href='#n14'>14</a></p>
<p id='n15' class='stm run hide_run'><a href='#n15'>15</a></p>
<p id='n16' class='pln'><a href='#n16'>16</a></p>
<p id='n17' class='pln'><a href='#n17'>17</a></p>
<p id='n18' class='stm run hide_run'><a href='#n18'>18</a></p>
<p id='n19' class='stm run hide_run'><a href='#n19'>19</a></p>
<p id='n20' class='pln'><a href='#n20'>20</a></p>
<p id='n21' class='stm run hide_run'><a href='#n21'>21</a></p>
<p id='n22' class='stm run hide_run'><a href='#n22'>22</a></p>
<p id='n23' class='stm run hide_run'><a href='#n23'>23</a></p>
<p id='n24' class='stm run hide_run'><a href='#n24'>24</a></p>
<p id='n25' class='stm run hide_run'><a href='#n25'>25</a></p>
<p id='n26' class='stm run hide_run'><a href='#n26'>26</a></p>
<p id='n27' class='pln'><a href='#n27'>27</a></p>
<p id='n28' class='stm run hide_run'><a href='#n28'>28</a></p>
<p id='n29' class='pln'><a href='#n29'>29</a></p>
<p id='n30' class='pln'><a href='#n30'>30</a></p>
<p id='n31' class='pln'><a href='#n31'>31</a></p>
<p id='n32' class='pln'><a href='#n32'>32</a></p>
<p id='n33' class='pln'><a href='#n33'>33</a></p>
<p id='n34' class='pln'><a href='#n34'>34</a></p>
<p id='n35' class='pln'><a href='#n35'>35</a></p>
<p id='n36' class='stm run hide_run'><a href='#n36'>36</a></p>
<p id='n37' class='stm run hide_run'><a href='#n37'>37</a></p>
<p id='n38' class='stm run hide_run'><a href='#n38'>38</a></p>
<p id='n39' class='pln'><a href='#n39'>39</a></p>
<p id='n40' class='stm run hide_run'><a href='#n40'>40</a></p>
<p id='n41' class='pln'><a href='#n41'>41</a></p>
<p id='n42' class='pln'><a href='#n42'>42</a></p>
<p id='n43' class='pln'><a href='#n43'>43</a></p>
<p id='n44' class='pln'><a href='#n44'>44</a></p>
<p id='n45' class='stm run hide_run'><a href='#n45'>45</a></p>
<p id='n46' class='pln'><a href='#n46'>46</a></p>
<p id='n47' class='stm run hide_run'><a href='#n47'>47</a></p>
<p id='n48' class='pln'><a href='#n48'>48</a></p>
<p id='n49' class='pln'><a href='#n49'>49</a></p>
<p id='n50' class='pln'><a href='#n50'>50</a></p>
<p id='n51' class='stm run hide_run'><a href='#n51'>51</a></p>
<p id='n52' class='pln'><a href='#n52'>52</a></p>
<p id='n53' class='pln'><a href='#n53'>53</a></p>
<p id='n54' class='pln'><a href='#n54'>54</a></p>
<p id='n55' class='pln'><a href='#n55'>55</a></p>
<p id='n56' class='stm run hide_run'><a href='#n56'>56</a></p>
<p id='n57' class='pln'><a href='#n57'>57</a></p>
<p id='n58' class='pln'><a href='#n58'>58</a></p>
<p id='n59' class='pln'><a href='#n59'>59</a></p>
<p id='n60' class='pln'><a href='#n60'>60</a></p>
<p id='n61' class='stm run hide_run'><a href='#n61'>61</a></p>
<p id='n62' class='pln'><a href='#n62'>62</a></p>
<p id='n63' class='stm run hide_run'><a href='#n63'>63</a></p>
<p id='n64' class='pln'><a href='#n64'>64</a></p>
<p id='n65' class='pln'><a href='#n65'>65</a></p>
<p id='n66' class='pln'><a href='#n66'>66</a></p>
<p id='n67' class='stm run hide_run'><a href='#n67'>67</a></p>
<p id='n68' class='stm run hide_run'><a href='#n68'>68</a></p>
<p id='n69' class='stm run hide_run'><a href='#n69'>69</a></p>
<p id='n70' class='pln'><a href='#n70'>70</a></p>
<p id='n71' class='stm run hide_run'><a href='#n71'>71</a></p>
<p id='n72' class='pln'><a href='#n72'>72</a></p>
<p id='n73' class='pln'><a href='#n73'>73</a></p>
<p id='n74' class='pln'><a href='#n74'>74</a></p>
<p id='n75' class='stm run hide_run'><a href='#n75'>75</a></p>
<p id='n76' class='pln'><a href='#n76'>76</a></p>
<p id='n77' class='stm run hide_run'><a href='#n77'>77</a></p>
<p id='n78' class='pln'><a href='#n78'>78</a></p>
<p id='n79' class='pln'><a href='#n79'>79</a></p>
<p id='n80' class='pln'><a href='#n80'>80</a></p>
<p id='n81' class='pln'><a href='#n81'>81</a></p>
<p id='n82' class='stm run hide_run'><a href='#n82'>82</a></p>
<p id='n83' class='stm run hide_run'><a href='#n83'>83</a></p>
<p id='n84' class='stm run hide_run'><a href='#n84'>84</a></p>
<p id='n85' class='pln'><a href='#n85'>85</a></p>
<p id='n86' class='stm run hide_run'><a href='#n86'>86</a></p>
<p id='n87' class='pln'><a href='#n87'>87</a></p>
<p id='n88' class='pln'><a href='#n88'>88</a></p>
<p id='n89' class='pln'><a href='#n89'>89</a></p>
<p id='n90' class='pln'><a href='#n90'>90</a></p>
<p id='n91' class='pln'><a href='#n91'>91</a></p>
<p id='n92' class='pln'><a href='#n92'>92</a></p>
<p id='n93' class='stm run hide_run'><a href='#n93'>93</a></p>
<p id='n94' class='pln'><a href='#n94'>94</a></p>
<p id='n95' class='pln'><a href='#n95'>95</a></p>
<p id='n96' class='pln'><a href='#n96'>96</a></p>
<p id='n97' class='pln'><a href='#n97'>97</a></p>
<p id='n98' class='pln'><a href='#n98'>98</a></p>
<p id='n99' class='stm run hide_run'><a href='#n99'>99</a></p>
<p id='n100' class='pln'><a href='#n100'>100</a></p>
<p id='n101' class='pln'><a href='#n101'>101</a></p>
<p id='n102' class='pln'><a href='#n102'>102</a></p>
<p id='n103' class='pln'><a href='#n103'>103</a></p>
<p id='n104' class='pln'><a href='#n104'>104</a></p>
<p id='n105' class='pln'><a href='#n105'>105</a></p>
<p id='n106' class='stm run hide_run'><a href='#n106'>106</a></p>
<p id='n107' class='pln'><a href='#n107'>107</a></p>
<p id='n108' class='pln'><a href='#n108'>108</a></p>
<p id='n109' class='pln'><a href='#n109'>109</a></p>
<p id='n110' class='pln'><a href='#n110'>110</a></p>
<p id='n111' class='pln'><a href='#n111'>111</a></p>
<p id='n112' class='pln'><a href='#n112'>112</a></p>
<p id='n113' class='pln'><a href='#n113'>113</a></p>
<p id='n114' class='pln'><a href='#n114'>114</a></p>
<p id='n115' class='stm run hide_run'><a href='#n115'>115</a></p>
<p id='n116' class='pln'><a href='#n116'>116</a></p>
<p id='n117' class='pln'><a href='#n117'>117</a></p>
<p id='n118' class='pln'><a href='#n118'>118</a></p>
<p id='n119' class='stm run hide_run'><a href='#n119'>119</a></p>
<p id='n120' class='stm run hide_run'><a href='#n120'>120</a></p>
<p id='n121' class='pln'><a href='#n121'>121</a></p>
<p id='n122' class='stm run hide_run'><a href='#n122'>122</a></p>
<p id='n123' class='pln'><a href='#n123'>123</a></p>
<p id='n124' class='pln'><a href='#n124'>124</a></p>
<p id='n125' class='pln'><a href='#n125'>125</a></p>
<p id='n126' class='stm run hide_run'><a href='#n126'>126</a></p>
<p id='n127' class='pln'><a href='#n127'>127</a></p>
<p id='n128' class='stm run hide_run'><a href='#n128'>128</a></p>
<p id='n129' class='pln'><a href='#n129'>129</a></p>
<p id='n130' class='pln'><a href='#n130'>130</a></p>
<p id='n131' class='pln'><a href='#n131'>131</a></p>
<p id='n132' class='stm run hide_run'><a href='#n132'>132</a></p>
<p id='n133' class='pln'><a href='#n133'>133</a></p>
<p id='n134' class='stm run hide_run'><a href='#n134'>134</a></p>
<p id='n135' class='pln'><a href='#n135'>135</a></p>
<p id='n136' class='pln'><a href='#n136'>136</a></p>
<p id='n137' class='pln'><a href='#n137'>137</a></p>
<p id='n138' class='stm run hide_run'><a href='#n138'>138</a></p>
<p id='n139' class='pln'><a href='#n139'>139</a></p>
<p id='n140' class='stm run hide_run'><a href='#n140'>140</a></p>
<p id='n141' class='pln'><a href='#n141'>141</a></p>
<p id='n142' class='pln'><a href='#n142'>142</a></p>
<p id='n143' class='pln'><a href='#n143'>143</a></p>
<p id='n144' class='stm run hide_run'><a href='#n144'>144</a></p>
<p id='n145' class='pln'><a href='#n145'>145</a></p>
<p id='n146' class='stm run hide_run'><a href='#n146'>146</a></p>
<p id='n147' class='pln'><a href='#n147'>147</a></p>
<p id='n148' class='pln'><a href='#n148'>148</a></p>
<p id='n149' class='pln'><a href='#n149'>149</a></p>
<p id='n150' class='stm run hide_run'><a href='#n150'>150</a></p>
<p id='n151' class='pln'><a href='#n151'>151</a></p>
<p id='n152' class='stm run hide_run'><a href='#n152'>152</a></p>
<p id='n153' class='pln'><a href='#n153'>153</a></p>
<p id='n154' class='pln'><a href='#n154'>154</a></p>
<p id='n155' class='pln'><a href='#n155'>155</a></p>
<p id='n156' class='stm run hide_run'><a href='#n156'>156</a></p>
<p id='n157' class='stm run hide_run'><a href='#n157'>157</a></p>
<p id='n158' class='stm run hide_run'><a href='#n158'>158</a></p>
<p id='n159' class='pln'><a href='#n159'>159</a></p>
<p id='n160' class='pln'><a href='#n160'>160</a></p>
<p id='n161' class='pln'><a href='#n161'>161</a></p>
<p id='n162' class='stm run hide_run'><a href='#n162'>162</a></p>
<p id='n163' class='pln'><a href='#n163'>163</a></p>
<p id='n164' class='pln'><a href='#n164'>164</a></p>
<p id='n165' class='pln'><a href='#n165'>165</a></p>
<p id='n166' class='stm run hide_run'><a href='#n166'>166</a></p>
<p id='n167' class='stm run hide_run'><a href='#n167'>167</a></p>
<p id='n168' class='pln'><a href='#n168'>168</a></p>
<p id='n169' class='stm run hide_run'><a href='#n169'>169</a></p>
<p id='n170' class='stm run hide_run'><a href='#n170'>170</a></p>
<p id='n171' class='stm run hide_run'><a href='#n171'>171</a></p>
<p id='n172' class='stm run hide_run'><a href='#n172'>172</a></p>
<p id='n173' class='stm run hide_run'><a href='#n173'>173</a></p>
<p id='n174' class='stm run hide_run'><a href='#n174'>174</a></p>
<p id='n175' class='pln'><a href='#n175'>175</a></p>
<p id='n176' class='stm run hide_run'><a href='#n176'>176</a></p>
<p id='n177' class='pln'><a href='#n177'>177</a></p>
<p id='n178' class='pln'><a href='#n178'>178</a></p>
<p id='n179' class='pln'><a href='#n179'>179</a></p>
<p id='n180' class='pln'><a href='#n180'>180</a></p>
<p id='n181' class='pln'><a href='#n181'>181</a></p>
<p id='n182' class='pln'><a href='#n182'>182</a></p>
<p id='n183' class='pln'><a href='#n183'>183</a></p>
<p id='n184' class='stm run hide_run'><a href='#n184'>184</a></p>
<p id='n185' class='pln'><a href='#n185'>185</a></p>
<p id='n186' class='stm run hide_run'><a href='#n186'>186</a></p>
<p id='n187' class='pln'><a href='#n187'>187</a></p>
<p id='n188' class='pln'><a href='#n188'>188</a></p>
<p id='n189' class='pln'><a href='#n189'>189</a></p>
<p id='n190' class='pln'><a href='#n190'>190</a></p>
<p id='n191' class='stm run hide_run'><a href='#n191'>191</a></p>
<p id='n192' class='stm run hide_run'><a href='#n192'>192</a></p>
<p id='n193' class='stm run hide_run'><a href='#n193'>193</a></p>
<p id='n194' class='pln'><a href='#n194'>194</a></p>
<p id='n195' class='stm run hide_run'><a href='#n195'>195</a></p>
<p id='n196' class='pln'><a href='#n196'>196</a></p>
<p id='n197' class='pln'><a href='#n197'>197</a></p>
<p id='n198' class='pln'><a href='#n198'>198</a></p>
<p id='n199' class='pln'><a href='#n199'>199</a></p>
<p id='n200' class='stm run hide_run'><a href='#n200'>200</a></p>
<p id='n201' class='stm run hide_run'><a href='#n201'>201</a></p>
<p id='n202' class='stm run hide_run'><a href='#n202'>202</a></p>
<p id='n203' class='pln'><a href='#n203'>203</a></p>
<p id='n204' class='stm run hide_run'><a href='#n204'>204</a></p>
<p id='n205' class='pln'><a href='#n205'>205</a></p>
<p id='n206' class='pln'><a href='#n206'>206</a></p>
<p id='n207' class='pln'><a href='#n207'>207</a></p>
<p id='n208' class='pln'><a href='#n208'>208</a></p>
<p id='n209' class='stm run hide_run'><a href='#n209'>209</a></p>
<p id='n210' class='stm run hide_run'><a href='#n210'>210</a></p>
<p id='n211' class='stm run hide_run'><a href='#n211'>211</a></p>
<p id='n212' class='pln'><a href='#n212'>212</a></p>
<p id='n213' class='pln'><a href='#n213'>213</a></p>
<p id='n214' class='pln'><a href='#n214'>214</a></p>
<p id='n215' class='stm run hide_run'><a href='#n215'>215</a></p>
<p id='n216' class='pln'><a href='#n216'>216</a></p>
<p id='n217' class='pln'><a href='#n217'>217</a></p>
<p id='n218' class='pln'><a href='#n218'>218</a></p>
<p id='n219' class='stm run hide_run'><a href='#n219'>219</a></p>
<p id='n220' class='pln'><a href='#n220'>220</a></p>
<p id='n221' class='stm run hide_run'><a href='#n221'>221</a></p>
<p id='n222' class='pln'><a href='#n222'>222</a></p>
<p id='n223' class='pln'><a href='#n223'>223</a></p>
<p id='n224' class='pln'><a href='#n224'>224</a></p>
<p id='n225' class='pln'><a href='#n225'>225</a></p>
<p id='n226' class='pln'><a href='#n226'>226</a></p>
<p id='n227' class='stm run hide_run'><a href='#n227'>227</a></p>
<p id='n228' class='pln'><a href='#n228'>228</a></p>
<p id='n229' class='pln'><a href='#n229'>229</a></p>
<p id='n230' class='pln'><a href='#n230'>230</a></p>
<p id='n231' class='stm run hide_run'><a href='#n231'>231</a></p>
<p id='n232' class='pln'><a href='#n232'>232</a></p>
<p id='n233' class='pln'><a href='#n233'>233</a></p>
<p id='n234' class='stm run hide_run'><a href='#n234'>234</a></p>
<p id='n235' class='stm run hide_run'><a href='#n235'>235</a></p>
<p id='n236' class='stm run hide_run'><a href='#n236'>236</a></p>
<p id='n237' class='pln'><a href='#n237'>237</a></p>
<p id='n238' class='pln'><a href='#n238'>238</a></p>
<p id='n239' class='stm run hide_run'><a href='#n239'>239</a></p>
<p id='n240' class='stm run hide_run'><a href='#n240'>240</a></p>
<p id='n241' class='pln'><a href='#n241'>241</a></p>
<p id='n242' class='stm run hide_run'><a href='#n242'>242</a></p>
<p id='n243' class='pln'><a href='#n243'>243</a></p>
<p id='n244' class='pln'><a href='#n244'>244</a></p>
<p id='n245' class='pln'><a href='#n245'>245</a></p>
<p id='n246' class='pln'><a href='#n246'>246</a></p>
<p id='n247' class='stm run hide_run'><a href='#n247'>247</a></p>
<p id='n248' class='pln'><a href='#n248'>248</a></p>
<p id='n249' class='pln'><a href='#n249'>249</a></p>
<p id='n250' class='pln'><a href='#n250'>250</a></p>
<p id='n251' class='pln'><a href='#n251'>251</a></p>
<p id='n252' class='stm run hide_run'><a href='#n252'>252</a></p>
<p id='n253' class='stm run hide_run'><a href='#n253'>253</a></p>
<p id='n254' class='stm run hide_run'><a href='#n254'>254</a></p>
<p id='n255' class='stm run hide_run'><a href='#n255'>255</a></p>
<p id='n256' class='pln'><a href='#n256'>256</a></p>
<p id='n257' class='stm run hide_run'><a href='#n257'>257</a></p>
<p id='n258' class='stm run hide_run'><a href='#n258'>258</a></p>
<p id='n259' class='stm run hide_run'><a href='#n259'>259</a></p>
<p id='n260' class='pln'><a href='#n260'>260</a></p>
<p id='n261' class='stm run hide_run'><a href='#n261'>261</a></p>
<p id='n262' class='stm run hide_run'><a href='#n262'>262</a></p>
<p id='n263' class='pln'><a href='#n263'>263</a></p>
<p id='n264' class='stm run hide_run'><a href='#n264'>264</a></p>
<p id='n265' class='pln'><a href='#n265'>265</a></p>
<p id='n266' class='stm run hide_run'><a href='#n266'>266</a></p>
<p id='n267' class='pln'><a href='#n267'>267</a></p>
<p id='n268' class='pln'><a href='#n268'>268</a></p>
<p id='n269' class='pln'><a href='#n269'>269</a></p>
<p id='n270' class='pln'><a href='#n270'>270</a></p>
<p id='n271' class='stm run hide_run'><a href='#n271'>271</a></p>
<p id='n272' class='pln'><a href='#n272'>272</a></p>
<p id='n273' class='stm run hide_run'><a href='#n273'>273</a></p>
<p id='n274' class='pln'><a href='#n274'>274</a></p>
<p id='n275' class='stm run hide_run'><a href='#n275'>275</a></p>
<p id='n276' class='pln'><a href='#n276'>276</a></p>
<p id='n277' class='pln'><a href='#n277'>277</a></p>
<p id='n278' class='stm run hide_run'><a href='#n278'>278</a></p>
<p id='n279' class='pln'><a href='#n279'>279</a></p>
<p id='n280' class='stm run hide_run'><a href='#n280'>280</a></p>
<p id='n281' class='stm run hide_run'><a href='#n281'>281</a></p>
<p id='n282' class='pln'><a href='#n282'>282</a></p>
<p id='n283' class='stm run hide_run'><a href='#n283'>283</a></p>
<p id='n284' class='pln'><a href='#n284'>284</a></p>
<p id='n285' class='stm run hide_run'><a href='#n285'>285</a></p>
<p id='n286' class='stm run hide_run'><a href='#n286'>286</a></p>
<p id='n287' class='pln'><a href='#n287'>287</a></p>
<p id='n288' class='pln'><a href='#n288'>288</a></p>
<p id='n289' class='stm run hide_run'><a href='#n289'>289</a></p>
<p id='n290' class='stm run hide_run'><a href='#n290'>290</a></p>
<p id='n291' class='pln'><a href='#n291'>291</a></p>
<p id='n292' class='pln'><a href='#n292'>292</a></p>
<p id='n293' class='stm run hide_run'><a href='#n293'>293</a></p>
<p id='n294' class='stm run hide_run'><a href='#n294'>294</a></p>
<p id='n295' class='pln'><a href='#n295'>295</a></p>
<p id='n296' class='pln'><a href='#n296'>296</a></p>
<p id='n297' class='stm run hide_run'><a href='#n297'>297</a></p>
<p id='n298' class='pln'><a href='#n298'>298</a></p>
<p id='n299' class='pln'><a href='#n299'>299</a></p>
<p id='n300' class='pln'><a href='#n300'>300</a></p>
<p id='n301' class='stm run hide_run'><a href='#n301'>301</a></p>
<p id='n302' class='pln'><a href='#n302'>302</a></p>
<p id='n303' class='pln'><a href='#n303'>303</a></p>
<p id='n304' class='pln'><a href='#n304'>304</a></p>
<p id='n305' class='pln'><a href='#n305'>305</a></p>
<p id='n306' class='pln'><a href='#n306'>306</a></p>
<p id='n307' class='stm run hide_run'><a href='#n307'>307</a></p>
<p id='n308' class='stm run hide_run'><a href='#n308'>308</a></p>
<p id='n309' class='stm run hide_run'><a href='#n309'>309</a></p>
<p id='n310' class='stm run hide_run'><a href='#n310'>310</a></p>
<p id='n311' class='stm run hide_run'><a href='#n311'>311</a></p>
<p id='n312' class='pln'><a href='#n312'>312</a></p>
<p id='n313' class='stm run hide_run'><a href='#n313'>313</a></p>
<p id='n314' class='stm run hide_run'><a href='#n314'>314</a></p>
<p id='n315' class='pln'><a href='#n315'>315</a></p>
<p id='n316' class='pln'><a href='#n316'>316</a></p>
<p id='n317' class='stm run hide_run'><a href='#n317'>317</a></p>
<p id='n318' class='stm run hide_run'><a href='#n318'>318</a></p>
<p id='n319' class='pln'><a href='#n319'>319</a></p>
<p id='n320' class='pln'><a href='#n320'>320</a></p>
<p id='n321' class='stm run hide_run'><a href='#n321'>321</a></p>
<p id='n322' class='pln'><a href='#n322'>322</a></p>
<p id='n323' class='stm run hide_run'><a href='#n323'>323</a></p>
<p id='n324' class='pln'><a href='#n324'>324</a></p>
<p id='n325' class='stm run hide_run'><a href='#n325'>325</a></p>
<p id='n326' class='stm run hide_run'><a href='#n326'>326</a></p>
<p id='n327' class='pln'><a href='#n327'>327</a></p>
<p id='n328' class='stm run hide_run'><a href='#n328'>328</a></p>
<p id='n329' class='stm run hide_run'><a href='#n329'>329</a></p>
<p id='n330' class='pln'><a href='#n330'>330</a></p>
<p id='n331' class='stm run hide_run'><a href='#n331'>331</a></p>
<p id='n332' class='pln'><a href='#n332'>332</a></p>
<p id='n333' class='pln'><a href='#n333'>333</a></p>
<p id='n334' class='pln'><a href='#n334'>334</a></p>
<p id='n335' class='pln'><a href='#n335'>335</a></p>
<p id='n336' class='pln'><a href='#n336'>336</a></p>
<p id='n337' class='stm run hide_run'><a href='#n337'>337</a></p>
<p id='n338' class='pln'><a href='#n338'>338</a></p>
<p id='n339' class='stm run hide_run'><a href='#n339'>339</a></p>
<p id='n340' class='pln'><a href='#n340'>340</a></p>
<p id='n341' class='pln'><a href='#n341'>341</a></p>
<p id='n342' class='pln'><a href='#n342'>342</a></p>
<p id='n343' class='pln'><a href='#n343'>343</a></p>
<p id='n344' class='pln'><a href='#n344'>344</a></p>
<p id='n345' class='pln'><a href='#n345'>345</a></p>
<p id='n346' class='stm run hide_run'><a href='#n346'>346</a></p>
<p id='n347' class='pln'><a href='#n347'>347</a></p>
<p id='n348' class='pln'><a href='#n348'>348</a></p>
<p id='n349' class='pln'><a href='#n349'>349</a></p>
<p id='n350' class='pln'><a href='#n350'>350</a></p>
<p id='n351' class='stm run hide_run'><a href='#n351'>351</a></p>
<p id='n352' class='stm run hide_run'><a href='#n352'>352</a></p>
<p id='n353' class='stm run hide_run'><a href='#n353'>353</a></p>
<p id='n354' class='stm run hide_run'><a href='#n354'>354</a></p>
<p id='n355' class='stm run hide_run'><a href='#n355'>355</a></p>
<p id='n356' class='stm run hide_run'><a href='#n356'>356</a></p>
</td>
<td class='text' valign='top'>
<p id='t1' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t2' class='pln'><span class='str'>Provides an APIView class that is the base of all views in REST framework.</span><span class='strut'>&nbsp;</span></p>
<p id='t3' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t4' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>__future__</span> <span class='key'>import</span> <span class='nam'>unicode_literals</span><span class='strut'>&nbsp;</span></p>
<p id='t5' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t6' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>django</span><span class='op'>.</span><span class='nam'>core</span><span class='op'>.</span><span class='nam'>exceptions</span> <span class='key'>import</span> <span class='nam'>PermissionDenied</span><span class='strut'>&nbsp;</span></p>
<p id='t7' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>django</span><span class='op'>.</span><span class='nam'>http</span> <span class='key'>import</span> <span class='nam'>Http404</span><span class='op'>,</span> <span class='nam'>HttpResponse</span><span class='strut'>&nbsp;</span></p>
<p id='t8' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>django</span><span class='op'>.</span><span class='nam'>utils</span><span class='op'>.</span><span class='nam'>datastructures</span> <span class='key'>import</span> <span class='nam'>SortedDict</span><span class='strut'>&nbsp;</span></p>
<p id='t9' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>django</span><span class='op'>.</span><span class='nam'>views</span><span class='op'>.</span><span class='nam'>decorators</span><span class='op'>.</span><span class='nam'>csrf</span> <span class='key'>import</span> <span class='nam'>csrf_exempt</span><span class='strut'>&nbsp;</span></p>
<p id='t10' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span> <span class='key'>import</span> <span class='nam'>status</span><span class='op'>,</span> <span class='nam'>exceptions</span><span class='strut'>&nbsp;</span></p>
<p id='t11' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>compat</span> <span class='key'>import</span> <span class='nam'>View</span><span class='strut'>&nbsp;</span></p>
<p id='t12' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>request</span> <span class='key'>import</span> <span class='nam'>Request</span><span class='strut'>&nbsp;</span></p>
<p id='t13' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>response</span> <span class='key'>import</span> <span class='nam'>Response</span><span class='strut'>&nbsp;</span></p>
<p id='t14' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>settings</span> <span class='key'>import</span> <span class='nam'>api_settings</span><span class='strut'>&nbsp;</span></p>
<p id='t15' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span><span class='op'>.</span><span class='nam'>utils</span><span class='op'>.</span><span class='nam'>formatting</span> <span class='key'>import</span> <span class='nam'>get_view_name</span><span class='op'>,</span> <span class='nam'>get_view_description</span><span class='strut'>&nbsp;</span></p>
<p id='t16' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t17' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t18' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>APIView</span><span class='op'>(</span><span class='nam'>View</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t19' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>settings</span> <span class='op'>=</span> <span class='nam'>api_settings</span><span class='strut'>&nbsp;</span></p>
<p id='t20' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t21' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>renderer_classes</span> <span class='op'>=</span> <span class='nam'>api_settings</span><span class='op'>.</span><span class='nam'>DEFAULT_RENDERER_CLASSES</span><span class='strut'>&nbsp;</span></p>
<p id='t22' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>parser_classes</span> <span class='op'>=</span> <span class='nam'>api_settings</span><span class='op'>.</span><span class='nam'>DEFAULT_PARSER_CLASSES</span><span class='strut'>&nbsp;</span></p>
<p id='t23' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>authentication_classes</span> <span class='op'>=</span> <span class='nam'>api_settings</span><span class='op'>.</span><span class='nam'>DEFAULT_AUTHENTICATION_CLASSES</span><span class='strut'>&nbsp;</span></p>
<p id='t24' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>throttle_classes</span> <span class='op'>=</span> <span class='nam'>api_settings</span><span class='op'>.</span><span class='nam'>DEFAULT_THROTTLE_CLASSES</span><span class='strut'>&nbsp;</span></p>
<p id='t25' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>permission_classes</span> <span class='op'>=</span> <span class='nam'>api_settings</span><span class='op'>.</span><span class='nam'>DEFAULT_PERMISSION_CLASSES</span><span class='strut'>&nbsp;</span></p>
<p id='t26' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>content_negotiation_class</span> <span class='op'>=</span> <span class='nam'>api_settings</span><span class='op'>.</span><span class='nam'>DEFAULT_CONTENT_NEGOTIATION_CLASS</span><span class='strut'>&nbsp;</span></p>
<p id='t27' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t28' class='stm run hide_run'>&nbsp; &nbsp; <span class='op'>@</span><span class='nam'>classmethod</span><span class='strut'>&nbsp;</span></p>
<p id='t29' class='pln'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>as_view</span><span class='op'>(</span><span class='nam'>cls</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>initkwargs</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t30' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t31' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Store the original class on the view function.</span><span class='strut'>&nbsp;</span></p>
<p id='t32' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t33' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; This allows us to discover information about the view when we do URL</span><span class='strut'>&nbsp;</span></p>
<p id='t34' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; reverse lookups.&nbsp; Used for breadcrumb generation.</span><span class='strut'>&nbsp;</span></p>
<p id='t35' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t36' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>view</span> <span class='op'>=</span> <span class='nam'>super</span><span class='op'>(</span><span class='nam'>APIView</span><span class='op'>,</span> <span class='nam'>cls</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>as_view</span><span class='op'>(</span><span class='op'>**</span><span class='nam'>initkwargs</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t37' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>view</span><span class='op'>.</span><span class='nam'>cls</span> <span class='op'>=</span> <span class='nam'>cls</span><span class='strut'>&nbsp;</span></p>
<p id='t38' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>view</span><span class='strut'>&nbsp;</span></p>
<p id='t39' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t40' class='stm run hide_run'>&nbsp; &nbsp; <span class='op'>@</span><span class='nam'>property</span><span class='strut'>&nbsp;</span></p>
<p id='t41' class='pln'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>allowed_methods</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t42' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t43' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Wrap Django&#39;s private `_allowed_methods` interface in a public property.</span><span class='strut'>&nbsp;</span></p>
<p id='t44' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t45' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_allowed_methods</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t46' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t47' class='stm run hide_run'>&nbsp; &nbsp; <span class='op'>@</span><span class='nam'>property</span><span class='strut'>&nbsp;</span></p>
<p id='t48' class='pln'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>default_response_headers</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t49' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># TODO: deprecate?</span><span class='strut'>&nbsp;</span></p>
<p id='t50' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># TODO: Only vary by accept if multiple renderers</span><span class='strut'>&nbsp;</span></p>
<p id='t51' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
<p id='t52' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;Allow&#39;</span><span class='op'>:</span> <span class='str'>&#39;, &#39;</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>allowed_methods</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t53' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;Vary&#39;</span><span class='op'>:</span> <span class='str'>&#39;Accept&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t54' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
<p id='t55' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t56' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>http_method_not_allowed</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='op'>*</span><span class='nam'>args</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kwargs</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t57' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t58' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; If `request.method` does not correspond to a handler method,</span><span class='strut'>&nbsp;</span></p>
<p id='t59' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; determine what kind of exception to raise.</span><span class='strut'>&nbsp;</span></p>
<p id='t60' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t61' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>exceptions</span><span class='op'>.</span><span class='nam'>MethodNotAllowed</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>.</span><span class='nam'>method</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t62' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t63' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>permission_denied</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t64' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t65' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; If request is not permitted, determine what kind of exception to raise.</span><span class='strut'>&nbsp;</span></p>
<p id='t66' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t67' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>request</span><span class='op'>.</span><span class='nam'>successful_authenticator</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t68' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>exceptions</span><span class='op'>.</span><span class='nam'>NotAuthenticated</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t69' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>exceptions</span><span class='op'>.</span><span class='nam'>PermissionDenied</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t70' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t71' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>throttled</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='nam'>wait</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t72' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t73' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; If request is throttled, determine what kind of exception to raise.</span><span class='strut'>&nbsp;</span></p>
<p id='t74' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t75' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>exceptions</span><span class='op'>.</span><span class='nam'>Throttled</span><span class='op'>(</span><span class='nam'>wait</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t76' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t77' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>get_authenticate_header</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t78' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t79' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; If a request is unauthenticated, determine the WWW-Authenticate</span><span class='strut'>&nbsp;</span></p>
<p id='t80' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; header to use for 401 responses, if any.</span><span class='strut'>&nbsp;</span></p>
<p id='t81' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t82' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>authenticators</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_authenticators</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t83' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>authenticators</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t84' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>authenticators</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>authenticate_header</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t85' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t86' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>get_parser_context</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>http_request</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t87' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t88' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Returns a dict that is passed through to Parser.parse(),</span><span class='strut'>&nbsp;</span></p>
<p id='t89' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; as the `parser_context` keyword argument.</span><span class='strut'>&nbsp;</span></p>
<p id='t90' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t91' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Note: Additionally `request` will also be added to the context</span><span class='strut'>&nbsp;</span></p>
<p id='t92' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'>#&nbsp; &nbsp; &nbsp;&nbsp; by the Request object.</span><span class='strut'>&nbsp;</span></p>
<p id='t93' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
<p id='t94' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;view&#39;</span><span class='op'>:</span> <span class='nam'>self</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t95' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;args&#39;</span><span class='op'>:</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='str'>&#39;args&#39;</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t96' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;kwargs&#39;</span><span class='op'>:</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='str'>&#39;kwargs&#39;</span><span class='op'>,</span> <span class='op'>{</span><span class='op'>}</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t97' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
<p id='t98' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t99' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>get_renderer_context</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t100' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t101' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Returns a dict that is passed through to Renderer.render(),</span><span class='strut'>&nbsp;</span></p>
<p id='t102' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; as the `renderer_context` keyword argument.</span><span class='strut'>&nbsp;</span></p>
<p id='t103' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t104' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Note: Additionally &#39;response&#39; will also be added to the context,</span><span class='strut'>&nbsp;</span></p>
<p id='t105' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'>#&nbsp; &nbsp; &nbsp;&nbsp; by the Response object.</span><span class='strut'>&nbsp;</span></p>
<p id='t106' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
<p id='t107' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;view&#39;</span><span class='op'>:</span> <span class='nam'>self</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t108' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;args&#39;</span><span class='op'>:</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='str'>&#39;args&#39;</span><span class='op'>,</span> <span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t109' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;kwargs&#39;</span><span class='op'>:</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='str'>&#39;kwargs&#39;</span><span class='op'>,</span> <span class='op'>{</span><span class='op'>}</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t110' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;request&#39;</span><span class='op'>:</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='str'>&#39;request&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t111' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
<p id='t112' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t113' class='pln'>&nbsp; &nbsp; <span class='com'># API policy instantiation methods</span><span class='strut'>&nbsp;</span></p>
<p id='t114' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t115' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>get_format_suffix</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kwargs</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t116' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t117' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Determine if the request includes a &#39;.json&#39; style format suffix</span><span class='strut'>&nbsp;</span></p>
<p id='t118' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t119' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>settings</span><span class='op'>.</span><span class='nam'>FORMAT_SUFFIX_KWARG</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t120' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>kwargs</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>settings</span><span class='op'>.</span><span class='nam'>FORMAT_SUFFIX_KWARG</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t121' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t122' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>get_renderers</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t123' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t124' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Instantiates and returns the list of renderers that this view can use.</span><span class='strut'>&nbsp;</span></p>
<p id='t125' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t126' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>[</span><span class='nam'>renderer</span><span class='op'>(</span><span class='op'>)</span> <span class='key'>for</span> <span class='nam'>renderer</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>renderer_classes</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t127' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t128' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>get_parsers</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t129' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t130' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Instantiates and returns the list of parsers that this view can use.</span><span class='strut'>&nbsp;</span></p>
<p id='t131' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t132' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>[</span><span class='nam'>parser</span><span class='op'>(</span><span class='op'>)</span> <span class='key'>for</span> <span class='nam'>parser</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>parser_classes</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t133' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t134' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>get_authenticators</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t135' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t136' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Instantiates and returns the list of authenticators that this view can use.</span><span class='strut'>&nbsp;</span></p>
<p id='t137' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t138' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>[</span><span class='nam'>auth</span><span class='op'>(</span><span class='op'>)</span> <span class='key'>for</span> <span class='nam'>auth</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>authentication_classes</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t139' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t140' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>get_permissions</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t141' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t142' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Instantiates and returns the list of permissions that this view requires.</span><span class='strut'>&nbsp;</span></p>
<p id='t143' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t144' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>[</span><span class='nam'>permission</span><span class='op'>(</span><span class='op'>)</span> <span class='key'>for</span> <span class='nam'>permission</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>permission_classes</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t145' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t146' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>get_throttles</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t147' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t148' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Instantiates and returns the list of throttles that this view uses.</span><span class='strut'>&nbsp;</span></p>
<p id='t149' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t150' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>[</span><span class='nam'>throttle</span><span class='op'>(</span><span class='op'>)</span> <span class='key'>for</span> <span class='nam'>throttle</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>throttle_classes</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t151' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t152' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>get_content_negotiator</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t153' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t154' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Instantiate and return the content negotiation class to use.</span><span class='strut'>&nbsp;</span></p>
<p id='t155' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t156' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='str'>&#39;_negotiator&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t157' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_negotiator</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>content_negotiation_class</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t158' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_negotiator</span><span class='strut'>&nbsp;</span></p>
<p id='t159' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t160' class='pln'>&nbsp; &nbsp; <span class='com'># API policy implementation methods</span><span class='strut'>&nbsp;</span></p>
<p id='t161' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t162' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>perform_content_negotiation</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='nam'>force</span><span class='op'>=</span><span class='nam'>False</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t163' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t164' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Determine which renderer and media type to use render the response.</span><span class='strut'>&nbsp;</span></p>
<p id='t165' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t166' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>renderers</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_renderers</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t167' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>conneg</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_content_negotiator</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t168' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t169' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t170' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>conneg</span><span class='op'>.</span><span class='nam'>select_renderer</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>,</span> <span class='nam'>renderers</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>format_kwarg</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t171' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='nam'>Exception</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t172' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>force</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t173' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>(</span><span class='nam'>renderers</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>,</span> <span class='nam'>renderers</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>media_type</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t174' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span><span class='strut'>&nbsp;</span></p>
<p id='t175' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t176' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>perform_authentication</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t177' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t178' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Perform authentication on the incoming request.</span><span class='strut'>&nbsp;</span></p>
<p id='t179' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t180' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Note that if you override this and simply &#39;pass&#39;, then authentication</span><span class='strut'>&nbsp;</span></p>
<p id='t181' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; will instead be performed lazily, the first time either</span><span class='strut'>&nbsp;</span></p>
<p id='t182' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; `request.user` or `request.auth` is accessed.</span><span class='strut'>&nbsp;</span></p>
<p id='t183' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t184' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span><span class='op'>.</span><span class='nam'>user</span><span class='strut'>&nbsp;</span></p>
<p id='t185' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t186' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>check_permissions</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t187' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t188' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Check if the request should be permitted.</span><span class='strut'>&nbsp;</span></p>
<p id='t189' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Raises an appropriate exception if the request is not permitted.</span><span class='strut'>&nbsp;</span></p>
<p id='t190' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t191' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>permission</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_permissions</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t192' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>permission</span><span class='op'>.</span><span class='nam'>has_permission</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t193' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>permission_denied</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t194' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t195' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>check_object_permissions</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='nam'>obj</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t196' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t197' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Check if the request should be permitted for a given object.</span><span class='strut'>&nbsp;</span></p>
<p id='t198' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Raises an appropriate exception if the request is not permitted.</span><span class='strut'>&nbsp;</span></p>
<p id='t199' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t200' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>permission</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_permissions</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t201' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>permission</span><span class='op'>.</span><span class='nam'>has_object_permission</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>,</span> <span class='nam'>obj</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t202' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>permission_denied</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t203' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t204' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>check_throttles</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t205' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t206' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Check if request should be throttled.</span><span class='strut'>&nbsp;</span></p>
<p id='t207' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Raises an appropriate exception if the request is throttled.</span><span class='strut'>&nbsp;</span></p>
<p id='t208' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t209' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>throttle</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_throttles</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t210' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>throttle</span><span class='op'>.</span><span class='nam'>allow_request</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t211' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>throttled</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>,</span> <span class='nam'>throttle</span><span class='op'>.</span><span class='nam'>wait</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t212' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t213' class='pln'>&nbsp; &nbsp; <span class='com'># Dispatch methods</span><span class='strut'>&nbsp;</span></p>
<p id='t214' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t215' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>initialize_request</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='op'>*</span><span class='nam'>args</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kargs</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t216' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t217' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Returns the initial request object.</span><span class='strut'>&nbsp;</span></p>
<p id='t218' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t219' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>parser_context</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_parser_context</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t220' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t221' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>Request</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t222' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <span class='nam'>parsers</span><span class='op'>=</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_parsers</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t223' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <span class='nam'>authenticators</span><span class='op'>=</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_authenticators</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t224' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <span class='nam'>negotiator</span><span class='op'>=</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_content_negotiator</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t225' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <span class='nam'>parser_context</span><span class='op'>=</span><span class='nam'>parser_context</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t226' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t227' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>initial</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='op'>*</span><span class='nam'>args</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kwargs</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t228' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t229' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Runs anything that needs to occur prior to calling the method handler.</span><span class='strut'>&nbsp;</span></p>
<p id='t230' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t231' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>format_kwarg</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_format_suffix</span><span class='op'>(</span><span class='op'>**</span><span class='nam'>kwargs</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t232' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t233' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Ensure that the incoming request is permitted</span><span class='strut'>&nbsp;</span></p>
<p id='t234' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>perform_authentication</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t235' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>check_permissions</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t236' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>check_throttles</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t237' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t238' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Perform content negotiation and store the accepted info on the request</span><span class='strut'>&nbsp;</span></p>
<p id='t239' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>neg</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>perform_content_negotiation</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t240' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span><span class='op'>.</span><span class='nam'>accepted_renderer</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>accepted_media_type</span> <span class='op'>=</span> <span class='nam'>neg</span><span class='strut'>&nbsp;</span></p>
<p id='t241' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t242' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>finalize_response</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='nam'>response</span><span class='op'>,</span> <span class='op'>*</span><span class='nam'>args</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kwargs</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t243' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t244' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Returns the final response object.</span><span class='strut'>&nbsp;</span></p>
<p id='t245' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t246' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Make the error obvious if a proper response is not returned</span><span class='strut'>&nbsp;</span></p>
<p id='t247' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>assert</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>response</span><span class='op'>,</span> <span class='nam'>HttpResponse</span><span class='op'>)</span><span class='op'>,</span> <span class='op'>(</span><span class='strut'>&nbsp;</span></p>
<p id='t248' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;Expected a `Response` to be returned from the view, &#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t249' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;but received a `%s`&#39;</span> <span class='op'>%</span> <span class='nam'>type</span><span class='op'>(</span><span class='nam'>response</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t250' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t251' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t252' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>response</span><span class='op'>,</span> <span class='nam'>Response</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t253' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>,</span> <span class='str'>&#39;accepted_renderer&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t254' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>neg</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>perform_content_negotiation</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>,</span> <span class='nam'>force</span><span class='op'>=</span><span class='nam'>True</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t255' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span><span class='op'>.</span><span class='nam'>accepted_renderer</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>accepted_media_type</span> <span class='op'>=</span> <span class='nam'>neg</span><span class='strut'>&nbsp;</span></p>
<p id='t256' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t257' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>response</span><span class='op'>.</span><span class='nam'>accepted_renderer</span> <span class='op'>=</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>accepted_renderer</span><span class='strut'>&nbsp;</span></p>
<p id='t258' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>response</span><span class='op'>.</span><span class='nam'>accepted_media_type</span> <span class='op'>=</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>accepted_media_type</span><span class='strut'>&nbsp;</span></p>
<p id='t259' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>response</span><span class='op'>.</span><span class='nam'>renderer_context</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_renderer_context</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t260' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t261' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>key</span><span class='op'>,</span> <span class='nam'>value</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>headers</span><span class='op'>.</span><span class='nam'>items</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t262' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>response</span><span class='op'>[</span><span class='nam'>key</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>value</span><span class='strut'>&nbsp;</span></p>
<p id='t263' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t264' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>response</span><span class='strut'>&nbsp;</span></p>
<p id='t265' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t266' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>handle_exception</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>exc</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t267' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t268' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Handle any exception that occurs, by returning an appropriate response,</span><span class='strut'>&nbsp;</span></p>
<p id='t269' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; or re-raising the error.</span><span class='strut'>&nbsp;</span></p>
<p id='t270' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t271' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>exc</span><span class='op'>,</span> <span class='nam'>exceptions</span><span class='op'>.</span><span class='nam'>Throttled</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t272' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Throttle wait header</span><span class='strut'>&nbsp;</span></p>
<p id='t273' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>headers</span><span class='op'>[</span><span class='str'>&#39;X-Throttle-Wait-Seconds&#39;</span><span class='op'>]</span> <span class='op'>=</span> <span class='str'>&#39;%d&#39;</span> <span class='op'>%</span> <span class='nam'>exc</span><span class='op'>.</span><span class='nam'>wait</span><span class='strut'>&nbsp;</span></p>
<p id='t274' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t275' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>exc</span><span class='op'>,</span> <span class='op'>(</span><span class='nam'>exceptions</span><span class='op'>.</span><span class='nam'>NotAuthenticated</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t276' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>exceptions</span><span class='op'>.</span><span class='nam'>AuthenticationFailed</span><span class='op'>)</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t277' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># WWW-Authenticate header for 401 responses, else coerce to 403</span><span class='strut'>&nbsp;</span></p>
<p id='t278' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>auth_header</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_authenticate_header</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>request</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t279' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t280' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>auth_header</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t281' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>headers</span><span class='op'>[</span><span class='str'>&#39;WWW-Authenticate&#39;</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>auth_header</span><span class='strut'>&nbsp;</span></p>
<p id='t282' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t283' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>exc</span><span class='op'>.</span><span class='nam'>status_code</span> <span class='op'>=</span> <span class='nam'>status</span><span class='op'>.</span><span class='nam'>HTTP_403_FORBIDDEN</span><span class='strut'>&nbsp;</span></p>
<p id='t284' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t285' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>exc</span><span class='op'>,</span> <span class='nam'>exceptions</span><span class='op'>.</span><span class='nam'>APIException</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t286' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>Response</span><span class='op'>(</span><span class='op'>{</span><span class='str'>&#39;detail&#39;</span><span class='op'>:</span> <span class='nam'>exc</span><span class='op'>.</span><span class='nam'>detail</span><span class='op'>}</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t287' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>status</span><span class='op'>=</span><span class='nam'>exc</span><span class='op'>.</span><span class='nam'>status_code</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t288' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>exception</span><span class='op'>=</span><span class='nam'>True</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t289' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>elif</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>exc</span><span class='op'>,</span> <span class='nam'>Http404</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t290' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>Response</span><span class='op'>(</span><span class='op'>{</span><span class='str'>&#39;detail&#39;</span><span class='op'>:</span> <span class='str'>&#39;Not found&#39;</span><span class='op'>}</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t291' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>status</span><span class='op'>=</span><span class='nam'>status</span><span class='op'>.</span><span class='nam'>HTTP_404_NOT_FOUND</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t292' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>exception</span><span class='op'>=</span><span class='nam'>True</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t293' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>elif</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>exc</span><span class='op'>,</span> <span class='nam'>PermissionDenied</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t294' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>Response</span><span class='op'>(</span><span class='op'>{</span><span class='str'>&#39;detail&#39;</span><span class='op'>:</span> <span class='str'>&#39;Permission denied&#39;</span><span class='op'>}</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t295' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>status</span><span class='op'>=</span><span class='nam'>status</span><span class='op'>.</span><span class='nam'>HTTP_403_FORBIDDEN</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t296' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>exception</span><span class='op'>=</span><span class='nam'>True</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t297' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span><span class='strut'>&nbsp;</span></p>
<p id='t298' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t299' class='pln'>&nbsp; &nbsp; <span class='com'># Note: session based authentication is explicitly CSRF validated,</span><span class='strut'>&nbsp;</span></p>
<p id='t300' class='pln'>&nbsp; &nbsp; <span class='com'># all other authentication is CSRF exempt.</span><span class='strut'>&nbsp;</span></p>
<p id='t301' class='stm run hide_run'>&nbsp; &nbsp; <span class='op'>@</span><span class='nam'>csrf_exempt</span><span class='strut'>&nbsp;</span></p>
<p id='t302' class='pln'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>dispatch</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='op'>*</span><span class='nam'>args</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kwargs</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t303' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t304' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; `.dispatch()` is pretty much the same as Django&#39;s regular dispatch,</span><span class='strut'>&nbsp;</span></p>
<p id='t305' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; but with extra hooks for startup, finalize, and exception handling.</span><span class='strut'>&nbsp;</span></p>
<p id='t306' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t307' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>args</span> <span class='op'>=</span> <span class='nam'>args</span><span class='strut'>&nbsp;</span></p>
<p id='t308' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>kwargs</span> <span class='op'>=</span> <span class='nam'>kwargs</span><span class='strut'>&nbsp;</span></p>
<p id='t309' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>initialize_request</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>,</span> <span class='op'>*</span><span class='nam'>args</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kwargs</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t310' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>request</span><span class='strut'>&nbsp;</span></p>
<p id='t311' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>headers</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>default_response_headers</span>&nbsp; <span class='com'># deprecate?</span><span class='strut'>&nbsp;</span></p>
<p id='t312' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t313' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t314' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>initial</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>,</span> <span class='op'>*</span><span class='nam'>args</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kwargs</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t315' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t316' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Get the appropriate handler method</span><span class='strut'>&nbsp;</span></p>
<p id='t317' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>method</span><span class='op'>.</span><span class='nam'>lower</span><span class='op'>(</span><span class='op'>)</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>http_method_names</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t318' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>handler</span> <span class='op'>=</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>.</span><span class='nam'>method</span><span class='op'>.</span><span class='nam'>lower</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t319' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>http_method_not_allowed</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t320' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t321' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>handler</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>http_method_not_allowed</span><span class='strut'>&nbsp;</span></p>
<p id='t322' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t323' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>response</span> <span class='op'>=</span> <span class='nam'>handler</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>,</span> <span class='op'>*</span><span class='nam'>args</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kwargs</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t324' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t325' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='nam'>Exception</span> <span class='key'>as</span> <span class='nam'>exc</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t326' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>response</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>handle_exception</span><span class='op'>(</span><span class='nam'>exc</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t327' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t328' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>response</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>finalize_response</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>,</span> <span class='nam'>response</span><span class='op'>,</span> <span class='op'>*</span><span class='nam'>args</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kwargs</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t329' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>response</span><span class='strut'>&nbsp;</span></p>
<p id='t330' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t331' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>options</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='op'>*</span><span class='nam'>args</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kwargs</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t332' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t333' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Handler method for HTTP &#39;OPTIONS&#39; request.</span><span class='strut'>&nbsp;</span></p>
<p id='t334' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; We may as well implement this as Django will otherwise provide</span><span class='strut'>&nbsp;</span></p>
<p id='t335' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; a less useful default implementation.</span><span class='strut'>&nbsp;</span></p>
<p id='t336' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t337' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>Response</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>metadata</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>status</span><span class='op'>=</span><span class='nam'>status</span><span class='op'>.</span><span class='nam'>HTTP_200_OK</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t338' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t339' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>metadata</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t340' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t341' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Return a dictionary of metadata about the view.</span><span class='strut'>&nbsp;</span></p>
<p id='t342' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Used to return responses for OPTIONS requests.</span><span class='strut'>&nbsp;</span></p>
<p id='t343' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t344' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t345' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># This is used by ViewSets to disambiguate instance vs list views</span><span class='strut'>&nbsp;</span></p>
<p id='t346' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>view_name_suffix</span> <span class='op'>=</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='str'>&#39;suffix&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t347' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t348' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># By default we can&#39;t provide any form-like information, however the</span><span class='strut'>&nbsp;</span></p>
<p id='t349' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># generic views override this implementation and add additional</span><span class='strut'>&nbsp;</span></p>
<p id='t350' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># information for POST and PUT methods, based on the serializer.</span><span class='strut'>&nbsp;</span></p>
<p id='t351' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ret</span> <span class='op'>=</span> <span class='nam'>SortedDict</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t352' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ret</span><span class='op'>[</span><span class='str'>&#39;name&#39;</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>get_view_name</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>__class__</span><span class='op'>,</span> <span class='nam'>view_name_suffix</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t353' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ret</span><span class='op'>[</span><span class='str'>&#39;description&#39;</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>get_view_description</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>__class__</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t354' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ret</span><span class='op'>[</span><span class='str'>&#39;renders&#39;</span><span class='op'>]</span> <span class='op'>=</span> <span class='op'>[</span><span class='nam'>renderer</span><span class='op'>.</span><span class='nam'>media_type</span> <span class='key'>for</span> <span class='nam'>renderer</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>renderer_classes</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t355' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ret</span><span class='op'>[</span><span class='str'>&#39;parses&#39;</span><span class='op'>]</span> <span class='op'>=</span> <span class='op'>[</span><span class='nam'>parser</span><span class='op'>.</span><span class='nam'>media_type</span> <span class='key'>for</span> <span class='nam'>parser</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>parser_classes</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t356' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>ret</span><span class='strut'>&nbsp;</span></p>
</td>
</tr>
</table>
</div>
<div id='footer'>
<div class='content'>
<p>
<a class='nav' href='index.html'>&#xab; index</a> &nbsp; &nbsp; <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.5.1</a>
</p>
</div>
</div>
</body>
</html>

View File

@ -1,359 +0,0 @@
<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
<title>Coverage for rest_framework/viewsets: 95%</title>
<link rel='stylesheet' href='style.css' type='text/css'>
<script type='text/javascript' src='jquery-1.4.3.min.js'></script>
<script type='text/javascript' src='jquery.hotkeys.js'></script>
<script type='text/javascript' src='jquery.isonscreen.js'></script>
<script type='text/javascript' src='coverage_html.js'></script>
<script type='text/javascript' charset='utf-8'>
jQuery(document).ready(coverage.pyfile_ready);
</script>
</head>
<body id='pyfile'>
<div id='header'>
<div class='content'>
<h1>Coverage for <b>rest_framework/viewsets</b> :
<span class='pc_cov'>95%</span>
</h1>
<img id='keyboard_icon' src='keybd_closed.png'>
<h2 class='stats'>
39 statements
<span class='run hide_run shortkey_r' onclick='coverage.toggle_lines(this, "run")'>37 run</span>
<span class='mis shortkey_m' onclick='coverage.toggle_lines(this, "mis")'>2 missing</span>
<span class='exc shortkey_x' onclick='coverage.toggle_lines(this, "exc")'>0 excluded</span>
</h2>
</div>
</div>
<div class='help_panel'>
<img id='panel_icon' src='keybd_open.png'>
<p class='legend'>Hot-keys on this page</p>
<div>
<p class='keyhelp'>
<span class='key'>r</span>
<span class='key'>m</span>
<span class='key'>x</span>
<span class='key'>p</span> &nbsp; toggle line displays
</p>
<p class='keyhelp'>
<span class='key'>j</span>
<span class='key'>k</span> &nbsp; next/prev highlighted chunk
</p>
<p class='keyhelp'>
<span class='key'>0</span> &nbsp; (zero) top of page
</p>
<p class='keyhelp'>
<span class='key'>1</span> &nbsp; (one) first highlighted chunk
</p>
</div>
</div>
<div id='source'>
<table cellspacing='0' cellpadding='0'>
<tr>
<td class='linenos' valign='top'>
<p id='n1' class='pln'><a href='#n1'>1</a></p>
<p id='n2' class='pln'><a href='#n2'>2</a></p>
<p id='n3' class='pln'><a href='#n3'>3</a></p>
<p id='n4' class='pln'><a href='#n4'>4</a></p>
<p id='n5' class='pln'><a href='#n5'>5</a></p>
<p id='n6' class='pln'><a href='#n6'>6</a></p>
<p id='n7' class='pln'><a href='#n7'>7</a></p>
<p id='n8' class='pln'><a href='#n8'>8</a></p>
<p id='n9' class='pln'><a href='#n9'>9</a></p>
<p id='n10' class='pln'><a href='#n10'>10</a></p>
<p id='n11' class='pln'><a href='#n11'>11</a></p>
<p id='n12' class='pln'><a href='#n12'>12</a></p>
<p id='n13' class='pln'><a href='#n13'>13</a></p>
<p id='n14' class='pln'><a href='#n14'>14</a></p>
<p id='n15' class='pln'><a href='#n15'>15</a></p>
<p id='n16' class='pln'><a href='#n16'>16</a></p>
<p id='n17' class='pln'><a href='#n17'>17</a></p>
<p id='n18' class='pln'><a href='#n18'>18</a></p>
<p id='n19' class='stm run hide_run'><a href='#n19'>19</a></p>
<p id='n20' class='pln'><a href='#n20'>20</a></p>
<p id='n21' class='stm run hide_run'><a href='#n21'>21</a></p>
<p id='n22' class='stm run hide_run'><a href='#n22'>22</a></p>
<p id='n23' class='stm run hide_run'><a href='#n23'>23</a></p>
<p id='n24' class='pln'><a href='#n24'>24</a></p>
<p id='n25' class='pln'><a href='#n25'>25</a></p>
<p id='n26' class='stm run hide_run'><a href='#n26'>26</a></p>
<p id='n27' class='pln'><a href='#n27'>27</a></p>
<p id='n28' class='pln'><a href='#n28'>28</a></p>
<p id='n29' class='pln'><a href='#n29'>29</a></p>
<p id='n30' class='pln'><a href='#n30'>30</a></p>
<p id='n31' class='pln'><a href='#n31'>31</a></p>
<p id='n32' class='pln'><a href='#n32'>32</a></p>
<p id='n33' class='pln'><a href='#n33'>33</a></p>
<p id='n34' class='pln'><a href='#n34'>34</a></p>
<p id='n35' class='pln'><a href='#n35'>35</a></p>
<p id='n36' class='pln'><a href='#n36'>36</a></p>
<p id='n37' class='pln'><a href='#n37'>37</a></p>
<p id='n38' class='pln'><a href='#n38'>38</a></p>
<p id='n39' class='stm run hide_run'><a href='#n39'>39</a></p>
<p id='n40' class='stm run hide_run'><a href='#n40'>40</a></p>
<p id='n41' class='pln'><a href='#n41'>41</a></p>
<p id='n42' class='pln'><a href='#n42'>42</a></p>
<p id='n43' class='pln'><a href='#n43'>43</a></p>
<p id='n44' class='pln'><a href='#n44'>44</a></p>
<p id='n45' class='pln'><a href='#n45'>45</a></p>
<p id='n46' class='pln'><a href='#n46'>46</a></p>
<p id='n47' class='pln'><a href='#n47'>47</a></p>
<p id='n48' class='stm run hide_run'><a href='#n48'>48</a></p>
<p id='n49' class='pln'><a href='#n49'>49</a></p>
<p id='n50' class='pln'><a href='#n50'>50</a></p>
<p id='n51' class='stm run hide_run'><a href='#n51'>51</a></p>
<p id='n52' class='stm run hide_run'><a href='#n52'>52</a></p>
<p id='n53' class='stm mis'><a href='#n53'>53</a></p>
<p id='n54' class='pln'><a href='#n54'>54</a></p>
<p id='n55' class='pln'><a href='#n55'>55</a></p>
<p id='n56' class='stm run hide_run'><a href='#n56'>56</a></p>
<p id='n57' class='stm mis'><a href='#n57'>57</a></p>
<p id='n58' class='pln'><a href='#n58'>58</a></p>
<p id='n59' class='pln'><a href='#n59'>59</a></p>
<p id='n60' class='stm run hide_run'><a href='#n60'>60</a></p>
<p id='n61' class='stm run hide_run'><a href='#n61'>61</a></p>
<p id='n62' class='pln'><a href='#n62'>62</a></p>
<p id='n63' class='pln'><a href='#n63'>63</a></p>
<p id='n64' class='pln'><a href='#n64'>64</a></p>
<p id='n65' class='stm run hide_run'><a href='#n65'>65</a></p>
<p id='n66' class='pln'><a href='#n66'>66</a></p>
<p id='n67' class='pln'><a href='#n67'>67</a></p>
<p id='n68' class='pln'><a href='#n68'>68</a></p>
<p id='n69' class='stm run hide_run'><a href='#n69'>69</a></p>
<p id='n70' class='stm run hide_run'><a href='#n70'>70</a></p>
<p id='n71' class='stm run hide_run'><a href='#n71'>71</a></p>
<p id='n72' class='pln'><a href='#n72'>72</a></p>
<p id='n73' class='pln'><a href='#n73'>73</a></p>
<p id='n74' class='stm run hide_run'><a href='#n74'>74</a></p>
<p id='n75' class='stm run hide_run'><a href='#n75'>75</a></p>
<p id='n76' class='pln'><a href='#n76'>76</a></p>
<p id='n77' class='pln'><a href='#n77'>77</a></p>
<p id='n78' class='stm run hide_run'><a href='#n78'>78</a></p>
<p id='n79' class='pln'><a href='#n79'>79</a></p>
<p id='n80' class='pln'><a href='#n80'>80</a></p>
<p id='n81' class='stm run hide_run'><a href='#n81'>81</a></p>
<p id='n82' class='pln'><a href='#n82'>82</a></p>
<p id='n83' class='pln'><a href='#n83'>83</a></p>
<p id='n84' class='pln'><a href='#n84'>84</a></p>
<p id='n85' class='stm run hide_run'><a href='#n85'>85</a></p>
<p id='n86' class='pln'><a href='#n86'>86</a></p>
<p id='n87' class='pln'><a href='#n87'>87</a></p>
<p id='n88' class='pln'><a href='#n88'>88</a></p>
<p id='n89' class='pln'><a href='#n89'>89</a></p>
<p id='n90' class='stm run hide_run'><a href='#n90'>90</a></p>
<p id='n91' class='stm run hide_run'><a href='#n91'>91</a></p>
<p id='n92' class='stm run hide_run'><a href='#n92'>92</a></p>
<p id='n93' class='pln'><a href='#n93'>93</a></p>
<p id='n94' class='stm run hide_run'><a href='#n94'>94</a></p>
<p id='n95' class='pln'><a href='#n95'>95</a></p>
<p id='n96' class='pln'><a href='#n96'>96</a></p>
<p id='n97' class='pln'><a href='#n97'>97</a></p>
<p id='n98' class='pln'><a href='#n98'>98</a></p>
<p id='n99' class='stm run hide_run'><a href='#n99'>99</a></p>
<p id='n100' class='stm run hide_run'><a href='#n100'>100</a></p>
<p id='n101' class='stm run hide_run'><a href='#n101'>101</a></p>
<p id='n102' class='pln'><a href='#n102'>102</a></p>
<p id='n103' class='pln'><a href='#n103'>103</a></p>
<p id='n104' class='stm run hide_run'><a href='#n104'>104</a></p>
<p id='n105' class='pln'><a href='#n105'>105</a></p>
<p id='n106' class='pln'><a href='#n106'>106</a></p>
<p id='n107' class='pln'><a href='#n107'>107</a></p>
<p id='n108' class='stm run hide_run'><a href='#n108'>108</a></p>
<p id='n109' class='pln'><a href='#n109'>109</a></p>
<p id='n110' class='pln'><a href='#n110'>110</a></p>
<p id='n111' class='stm run hide_run'><a href='#n111'>111</a></p>
<p id='n112' class='pln'><a href='#n112'>112</a></p>
<p id='n113' class='pln'><a href='#n113'>113</a></p>
<p id='n114' class='pln'><a href='#n114'>114</a></p>
<p id='n115' class='pln'><a href='#n115'>115</a></p>
<p id='n116' class='pln'><a href='#n116'>116</a></p>
<p id='n117' class='stm run hide_run'><a href='#n117'>117</a></p>
<p id='n118' class='pln'><a href='#n118'>118</a></p>
<p id='n119' class='pln'><a href='#n119'>119</a></p>
<p id='n120' class='stm run hide_run'><a href='#n120'>120</a></p>
<p id='n121' class='pln'><a href='#n121'>121</a></p>
<p id='n122' class='pln'><a href='#n122'>122</a></p>
<p id='n123' class='pln'><a href='#n123'>123</a></p>
<p id='n124' class='pln'><a href='#n124'>124</a></p>
<p id='n125' class='pln'><a href='#n125'>125</a></p>
<p id='n126' class='stm run hide_run'><a href='#n126'>126</a></p>
<p id='n127' class='pln'><a href='#n127'>127</a></p>
<p id='n128' class='pln'><a href='#n128'>128</a></p>
<p id='n129' class='stm run hide_run'><a href='#n129'>129</a></p>
<p id='n130' class='pln'><a href='#n130'>130</a></p>
<p id='n131' class='pln'><a href='#n131'>131</a></p>
<p id='n132' class='pln'><a href='#n132'>132</a></p>
<p id='n133' class='pln'><a href='#n133'>133</a></p>
<p id='n134' class='pln'><a href='#n134'>134</a></p>
<p id='n135' class='pln'><a href='#n135'>135</a></p>
<p id='n136' class='pln'><a href='#n136'>136</a></p>
<p id='n137' class='pln'><a href='#n137'>137</a></p>
<p id='n138' class='pln'><a href='#n138'>138</a></p>
<p id='n139' class='stm run hide_run'><a href='#n139'>139</a></p>
</td>
<td class='text' valign='top'>
<p id='t1' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t2' class='pln'><span class='str'>ViewSets are essentially just a type of class based view, that doesn&#39;t provide</span><span class='strut'>&nbsp;</span></p>
<p id='t3' class='pln'><span class='str'>any method handlers, such as `get()`, `post()`, etc... but instead has actions,</span><span class='strut'>&nbsp;</span></p>
<p id='t4' class='pln'><span class='str'>such as `list()`, `retrieve()`, `create()`, etc...</span><span class='strut'>&nbsp;</span></p>
<p id='t5' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t6' class='pln'><span class='str'>Actions are only bound to methods at the point of instantiating the views.</span><span class='strut'>&nbsp;</span></p>
<p id='t7' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t8' class='pln'><span class='str'>&nbsp; &nbsp; user_list = UserViewSet.as_view({&#39;get&#39;: &#39;list&#39;})</span><span class='strut'>&nbsp;</span></p>
<p id='t9' class='pln'><span class='str'>&nbsp; &nbsp; user_detail = UserViewSet.as_view({&#39;get&#39;: &#39;retrieve&#39;})</span><span class='strut'>&nbsp;</span></p>
<p id='t10' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t11' class='pln'><span class='str'>Typically, rather than instantiate views from viewsets directly, you&#39;ll</span><span class='strut'>&nbsp;</span></p>
<p id='t12' class='pln'><span class='str'>regsiter the viewset with a router and let the URL conf be determined</span><span class='strut'>&nbsp;</span></p>
<p id='t13' class='pln'><span class='str'>automatically.</span><span class='strut'>&nbsp;</span></p>
<p id='t14' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t15' class='pln'><span class='str'>&nbsp; &nbsp; router = DefaultRouter()</span><span class='strut'>&nbsp;</span></p>
<p id='t16' class='pln'><span class='str'>&nbsp; &nbsp; router.register(r&#39;users&#39;, UserViewSet, &#39;user&#39;)</span><span class='strut'>&nbsp;</span></p>
<p id='t17' class='pln'><span class='str'>&nbsp; &nbsp; urlpatterns = router.urls</span><span class='strut'>&nbsp;</span></p>
<p id='t18' class='pln'><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t19' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>__future__</span> <span class='key'>import</span> <span class='nam'>unicode_literals</span><span class='strut'>&nbsp;</span></p>
<p id='t20' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t21' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>functools</span> <span class='key'>import</span> <span class='nam'>update_wrapper</span><span class='strut'>&nbsp;</span></p>
<p id='t22' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>django</span><span class='op'>.</span><span class='nam'>utils</span><span class='op'>.</span><span class='nam'>decorators</span> <span class='key'>import</span> <span class='nam'>classonlymethod</span><span class='strut'>&nbsp;</span></p>
<p id='t23' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>rest_framework</span> <span class='key'>import</span> <span class='nam'>views</span><span class='op'>,</span> <span class='nam'>generics</span><span class='op'>,</span> <span class='nam'>mixins</span><span class='strut'>&nbsp;</span></p>
<p id='t24' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t25' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t26' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>ViewSetMixin</span><span class='op'>(</span><span class='nam'>object</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t27' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t28' class='pln'><span class='str'>&nbsp; &nbsp; This is the magic.</span><span class='strut'>&nbsp;</span></p>
<p id='t29' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t30' class='pln'><span class='str'>&nbsp; &nbsp; Overrides `.as_view()` so that it takes an `actions` keyword that performs</span><span class='strut'>&nbsp;</span></p>
<p id='t31' class='pln'><span class='str'>&nbsp; &nbsp; the binding of HTTP methods to actions on the Resource.</span><span class='strut'>&nbsp;</span></p>
<p id='t32' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t33' class='pln'><span class='str'>&nbsp; &nbsp; For example, to create a concrete view binding the &#39;GET&#39; and &#39;POST&#39; methods</span><span class='strut'>&nbsp;</span></p>
<p id='t34' class='pln'><span class='str'>&nbsp; &nbsp; to the &#39;list&#39; and &#39;create&#39; actions...</span><span class='strut'>&nbsp;</span></p>
<p id='t35' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t36' class='pln'><span class='str'>&nbsp; &nbsp; view = MyViewSet.as_view({&#39;get&#39;: &#39;list&#39;, &#39;post&#39;: &#39;create&#39;})</span><span class='strut'>&nbsp;</span></p>
<p id='t37' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t38' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t39' class='stm run hide_run'>&nbsp; &nbsp; <span class='op'>@</span><span class='nam'>classonlymethod</span><span class='strut'>&nbsp;</span></p>
<p id='t40' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>as_view</span><span class='op'>(</span><span class='nam'>cls</span><span class='op'>,</span> <span class='nam'>actions</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>initkwargs</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t41' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t42' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Because of the way class based views create a closure around the</span><span class='strut'>&nbsp;</span></p>
<p id='t43' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; instantiated view, we need to totally reimplement `.as_view`,</span><span class='strut'>&nbsp;</span></p>
<p id='t44' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; and slightly modify the view function that is created and returned.</span><span class='strut'>&nbsp;</span></p>
<p id='t45' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t46' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># The suffix initkwarg is reserved for identifing the viewset type</span><span class='strut'>&nbsp;</span></p>
<p id='t47' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># eg. &#39;List&#39; or &#39;Instance&#39;.</span><span class='strut'>&nbsp;</span></p>
<p id='t48' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>cls</span><span class='op'>.</span><span class='nam'>suffix</span> <span class='op'>=</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
<p id='t49' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t50' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># sanitize keyword arguments</span><span class='strut'>&nbsp;</span></p>
<p id='t51' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>key</span> <span class='key'>in</span> <span class='nam'>initkwargs</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t52' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>key</span> <span class='key'>in</span> <span class='nam'>cls</span><span class='op'>.</span><span class='nam'>http_method_names</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t53' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>TypeError</span><span class='op'>(</span><span class='str'>&quot;You tried to pass in the %s method name as a &quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t54' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;keyword argument to %s(). Don&#39;t do that.&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t55' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>%</span> <span class='op'>(</span><span class='nam'>key</span><span class='op'>,</span> <span class='nam'>cls</span><span class='op'>.</span><span class='nam'>__name__</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t56' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>cls</span><span class='op'>,</span> <span class='nam'>key</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t57' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>TypeError</span><span class='op'>(</span><span class='str'>&quot;%s() received an invalid keyword %r&quot;</span> <span class='op'>%</span> <span class='op'>(</span><span class='strut'>&nbsp;</span></p>
<p id='t58' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>cls</span><span class='op'>.</span><span class='nam'>__name__</span><span class='op'>,</span> <span class='nam'>key</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t59' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t60' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>view</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>,</span> <span class='op'>*</span><span class='nam'>args</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kwargs</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t61' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span> <span class='op'>=</span> <span class='nam'>cls</span><span class='op'>(</span><span class='op'>**</span><span class='nam'>initkwargs</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t62' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># We also store the mapping of request methods to actions,</span><span class='strut'>&nbsp;</span></p>
<p id='t63' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># so that we can later set the action attribute.</span><span class='strut'>&nbsp;</span></p>
<p id='t64' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># eg. `self.action = &#39;list&#39;` on an incoming GET request.</span><span class='strut'>&nbsp;</span></p>
<p id='t65' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>action_map</span> <span class='op'>=</span> <span class='nam'>actions</span><span class='strut'>&nbsp;</span></p>
<p id='t66' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t67' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Bind methods to actions</span><span class='strut'>&nbsp;</span></p>
<p id='t68' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># This is the bit that&#39;s different to a standard view</span><span class='strut'>&nbsp;</span></p>
<p id='t69' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>method</span><span class='op'>,</span> <span class='nam'>action</span> <span class='key'>in</span> <span class='nam'>actions</span><span class='op'>.</span><span class='nam'>items</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t70' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>handler</span> <span class='op'>=</span> <span class='nam'>getattr</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>action</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t71' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>setattr</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>method</span><span class='op'>,</span> <span class='nam'>handler</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t72' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t73' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Patch this in as it&#39;s otherwise only present from 1.5 onwards</span><span class='strut'>&nbsp;</span></p>
<p id='t74' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='str'>&#39;get&#39;</span><span class='op'>)</span> <span class='key'>and</span> <span class='key'>not</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='str'>&#39;head&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t75' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>head</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get</span><span class='strut'>&nbsp;</span></p>
<p id='t76' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t77' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># And continue as usual</span><span class='strut'>&nbsp;</span></p>
<p id='t78' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>dispatch</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>,</span> <span class='op'>*</span><span class='nam'>args</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kwargs</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t79' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t80' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># take name and docstring from class</span><span class='strut'>&nbsp;</span></p>
<p id='t81' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>update_wrapper</span><span class='op'>(</span><span class='nam'>view</span><span class='op'>,</span> <span class='nam'>cls</span><span class='op'>,</span> <span class='nam'>updated</span><span class='op'>=</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t82' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t83' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># and possible attributes set by decorators</span><span class='strut'>&nbsp;</span></p>
<p id='t84' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># like csrf_exempt from dispatch</span><span class='strut'>&nbsp;</span></p>
<p id='t85' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>update_wrapper</span><span class='op'>(</span><span class='nam'>view</span><span class='op'>,</span> <span class='nam'>cls</span><span class='op'>.</span><span class='nam'>dispatch</span><span class='op'>,</span> <span class='nam'>assigned</span><span class='op'>=</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t86' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t87' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># We need to set these on the view function, so that breadcrumb</span><span class='strut'>&nbsp;</span></p>
<p id='t88' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># generation can pick out these bits of information from a</span><span class='strut'>&nbsp;</span></p>
<p id='t89' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># resolved URL.</span><span class='strut'>&nbsp;</span></p>
<p id='t90' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>view</span><span class='op'>.</span><span class='nam'>cls</span> <span class='op'>=</span> <span class='nam'>cls</span><span class='strut'>&nbsp;</span></p>
<p id='t91' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>view</span><span class='op'>.</span><span class='nam'>suffix</span> <span class='op'>=</span> <span class='nam'>initkwargs</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;suffix&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t92' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>view</span><span class='strut'>&nbsp;</span></p>
<p id='t93' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t94' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>initialize_request</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>request</span><span class='op'>,</span> <span class='op'>*</span><span class='nam'>args</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kargs</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t95' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t96' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; Set the `.action` attribute on the view,</span><span class='strut'>&nbsp;</span></p>
<p id='t97' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; depending on the request method.</span><span class='strut'>&nbsp;</span></p>
<p id='t98' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t99' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>super</span><span class='op'>(</span><span class='nam'>ViewSetMixin</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>initialize_request</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>,</span> <span class='op'>*</span><span class='nam'>args</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kargs</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t100' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>action</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>action_map</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>.</span><span class='nam'>method</span><span class='op'>.</span><span class='nam'>lower</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t101' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>request</span><span class='strut'>&nbsp;</span></p>
<p id='t102' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t103' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t104' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>ViewSet</span><span class='op'>(</span><span class='nam'>ViewSetMixin</span><span class='op'>,</span> <span class='nam'>views</span><span class='op'>.</span><span class='nam'>APIView</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t105' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t106' class='pln'><span class='str'>&nbsp; &nbsp; The base ViewSet class does not provide any actions by default.</span><span class='strut'>&nbsp;</span></p>
<p id='t107' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t108' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>pass</span><span class='strut'>&nbsp;</span></p>
<p id='t109' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t110' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t111' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>GenericViewSet</span><span class='op'>(</span><span class='nam'>ViewSetMixin</span><span class='op'>,</span> <span class='nam'>generics</span><span class='op'>.</span><span class='nam'>GenericAPIView</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t112' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t113' class='pln'><span class='str'>&nbsp; &nbsp; The GenericViewSet class does not provide any actions by default,</span><span class='strut'>&nbsp;</span></p>
<p id='t114' class='pln'><span class='str'>&nbsp; &nbsp; but does include the base set of generic view behavior, such as</span><span class='strut'>&nbsp;</span></p>
<p id='t115' class='pln'><span class='str'>&nbsp; &nbsp; the `get_object` and `get_queryset` methods.</span><span class='strut'>&nbsp;</span></p>
<p id='t116' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t117' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>pass</span><span class='strut'>&nbsp;</span></p>
<p id='t118' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t119' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t120' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>ReadOnlyModelViewSet</span><span class='op'>(</span><span class='nam'>mixins</span><span class='op'>.</span><span class='nam'>RetrieveModelMixin</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t121' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <span class='nam'>mixins</span><span class='op'>.</span><span class='nam'>ListModelMixin</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t122' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <span class='nam'>GenericViewSet</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t123' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t124' class='pln'><span class='str'>&nbsp; &nbsp; A viewset that provides default `list()` and `retrieve()` actions.</span><span class='strut'>&nbsp;</span></p>
<p id='t125' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t126' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>pass</span><span class='strut'>&nbsp;</span></p>
<p id='t127' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t128' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t129' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>ModelViewSet</span><span class='op'>(</span><span class='nam'>mixins</span><span class='op'>.</span><span class='nam'>CreateModelMixin</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t130' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mixins</span><span class='op'>.</span><span class='nam'>RetrieveModelMixin</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t131' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mixins</span><span class='op'>.</span><span class='nam'>UpdateModelMixin</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t132' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mixins</span><span class='op'>.</span><span class='nam'>DestroyModelMixin</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t133' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mixins</span><span class='op'>.</span><span class='nam'>ListModelMixin</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
<p id='t134' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>GenericViewSet</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t135' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t136' class='pln'><span class='str'>&nbsp; &nbsp; A viewset that provides default `create()`, `retrieve()`, `update()`,</span><span class='strut'>&nbsp;</span></p>
<p id='t137' class='pln'><span class='str'>&nbsp; &nbsp; `partial_update()`, `destroy()` and `list()` actions.</span><span class='strut'>&nbsp;</span></p>
<p id='t138' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t139' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>pass</span><span class='strut'>&nbsp;</span></p>
</td>
</tr>
</table>
</div>
<div id='footer'>
<div class='content'>
<p>
<a class='nav' href='index.html'>&#xab; index</a> &nbsp; &nbsp; <a class='nav' href='http://nedbatchelder.com/code/coverage'>coverage.py v3.5.1</a>
</p>
</div>
</div>
</body>
</html>

File diff suppressed because it is too large Load Diff

View File

@ -1,275 +0,0 @@
/* CSS styles for Coverage. */
/* Page-wide styles */
html, body, h1, h2, h3, p, td, th {
margin: 0;
padding: 0;
border: 0;
outline: 0;
font-weight: inherit;
font-style: inherit;
font-size: 100%;
font-family: inherit;
vertical-align: baseline;
}
/* Set baseline grid to 16 pt. */
body {
font-family: georgia, serif;
font-size: 1em;
}
html>body {
font-size: 16px;
}
/* Set base font size to 12/16 */
p {
font-size: .75em; /* 12/16 */
line-height: 1.3333em; /* 16/12 */
}
table {
border-collapse: collapse;
}
a.nav {
text-decoration: none;
color: inherit;
}
a.nav:hover {
text-decoration: underline;
color: inherit;
}
/* Page structure */
#header {
background: #f8f8f8;
width: 100%;
border-bottom: 1px solid #eee;
}
#source {
padding: 1em;
font-family: "courier new", monospace;
}
#indexfile #footer {
margin: 1em 3em;
}
#pyfile #footer {
margin: 1em 1em;
}
#footer .content {
padding: 0;
font-size: 85%;
font-family: verdana, sans-serif;
color: #666666;
font-style: italic;
}
#index {
margin: 1em 0 0 3em;
}
/* Header styles */
#header .content {
padding: 1em 3em;
}
h1 {
font-size: 1.25em;
}
h2.stats {
margin-top: .5em;
font-size: 1em;
}
.stats span {
border: 1px solid;
padding: .1em .25em;
margin: 0 .1em;
cursor: pointer;
border-color: #999 #ccc #ccc #999;
}
.stats span.hide_run, .stats span.hide_exc,
.stats span.hide_mis, .stats span.hide_par,
.stats span.par.hide_run.hide_par {
border-color: #ccc #999 #999 #ccc;
}
.stats span.par.hide_run {
border-color: #999 #ccc #ccc #999;
}
/* Help panel */
#keyboard_icon {
float: right;
cursor: pointer;
}
.help_panel {
position: absolute;
background: #ffc;
padding: .5em;
border: 1px solid #883;
display: none;
}
#indexfile .help_panel {
width: 20em; height: 4em;
}
#pyfile .help_panel {
width: 16em; height: 8em;
}
.help_panel .legend {
font-style: italic;
margin-bottom: 1em;
}
#panel_icon {
float: right;
cursor: pointer;
}
.keyhelp {
margin: .75em;
}
.keyhelp .key {
border: 1px solid black;
border-color: #888 #333 #333 #888;
padding: .1em .35em;
font-family: monospace;
font-weight: bold;
background: #eee;
}
/* Source file styles */
.linenos p {
text-align: right;
margin: 0;
padding: 0 .5em;
color: #999999;
font-family: verdana, sans-serif;
font-size: .625em; /* 10/16 */
line-height: 1.6em; /* 16/10 */
}
.linenos p.highlight {
background: #ffdd00;
}
.linenos p a {
text-decoration: none;
color: #999999;
}
.linenos p a:hover {
text-decoration: underline;
color: #999999;
}
td.text {
width: 100%;
}
.text p {
margin: 0;
padding: 0 0 0 .5em;
border-left: 2px solid #ffffff;
white-space: nowrap;
}
.text p.mis {
background: #ffdddd;
border-left: 2px solid #ff0000;
}
.text p.run, .text p.run.hide_par {
background: #ddffdd;
border-left: 2px solid #00ff00;
}
.text p.exc {
background: #eeeeee;
border-left: 2px solid #808080;
}
.text p.par, .text p.par.hide_run {
background: #ffffaa;
border-left: 2px solid #eeee99;
}
.text p.hide_run, .text p.hide_exc, .text p.hide_mis, .text p.hide_par,
.text p.hide_run.hide_par {
background: inherit;
}
.text span.annotate {
font-family: georgia;
font-style: italic;
color: #666;
float: right;
padding-right: .5em;
}
.text p.hide_par span.annotate {
display: none;
}
/* Syntax coloring */
.text .com {
color: green;
font-style: italic;
line-height: 1px;
}
.text .key {
font-weight: bold;
line-height: 1px;
}
.text .str {
color: #000080;
}
/* index styles */
#index td, #index th {
text-align: right;
width: 5em;
padding: .25em .5em;
border-bottom: 1px solid #eee;
}
#index th {
font-style: italic;
color: #333;
border-bottom: 1px solid #ccc;
cursor: pointer;
}
#index th:hover {
background: #eee;
border-bottom: 1px solid #999;
}
#index td.left, #index th.left {
padding-left: 0;
}
#index td.right, #index th.right {
padding-right: 0;
}
#index th.headerSortDown, #index th.headerSortUp {
border-bottom: 1px solid #000;
}
#index td.name, #index th.name {
text-align: left;
width: auto;
}
#index td.name a {
text-decoration: none;
color: #000;
}
#index td.name a:hover {
text-decoration: underline;
color: #000;
}
#index tr.total {
}
#index tr.total td {
font-weight: bold;
border-top: 1px solid #ccc;
border-bottom: none;
}
#index tr.file:hover {
background: #eeeeee;
}