##// END OF EJS Templates
release: Merge stable into default
marcink -
r195:a1dea1cb merge default
parent child Browse files
Show More
@@ -0,0 +1,15 b''
1 |RCE| 4.1.1 |RNS|
2 -----------------
3
4 Release Date
5 ^^^^^^^^^^^^
6
7 - 2016-06-14
8
9 Fixes
10 ^^^^^
11
12 - security: fixed permissions issues on pyramid auth-plugins views.
13 They no longer raise an internal server error page when accessed unauthorized.
14
15 - search: use better ElasticSearch repo filters. (EE only)
@@ -1,3 +1,4 b''
1 1bd3e92b7e2e2d2024152b34bb88dff1db544a71 v4.0.0
1 1bd3e92b7e2e2d2024152b34bb88dff1db544a71 v4.0.0
2 170c5398320ea6cddd50955e88d408794c21d43a v4.0.1
2 170c5398320ea6cddd50955e88d408794c21d43a v4.0.1
3 c3fe200198f5aa34cf2e4066df2881a9cefe3704 v4.1.0
3 c3fe200198f5aa34cf2e4066df2881a9cefe3704 v4.1.0
4 7fd5c850745e2ea821fb4406af5f4bff9b0a7526 v4.1.1
@@ -1,31 +1,34 b''
1 [DEFAULT]
1 [DEFAULT]
2 done = false
2 done = false
3
3
4 [task:bump_version]
5 done = true
6
7 [task:rc_tools_pinned]
8 done = true
9
4 [task:fixes_on_stable]
10 [task:fixes_on_stable]
5 done = true
11 done = true
6
12
13 [task:pip2nix_generated]
14 done = true
15
7 [task:changelog_updated]
16 [task:changelog_updated]
8 done = true
17 done = true
9
18
10 [task:nix_dependencies_moved]
19 [task:generate_api_docs]
11 done = true
12
13 [task:bump_version]
14 done = true
20 done = true
15
21
16 [task:generate_js_routes]
22 [task:generate_js_routes]
17 done = true
23 done = true
18
24
19 [task:generate_api_docs]
20 done = true
21
22 [release]
25 [release]
23 state = prepared
26 state = prepared
24 version = 3.8.3
27 version = 4.1.1
25
28
26 [task:updated_translation]
29 [task:updated_translation]
27
30
28 [task:updated_trial_license]
31 [task:updated_trial_license]
29
32
30 [task:generate_oss_licenses]
33 [task:generate_oss_licenses]
31
34
@@ -1,80 +1,81 b''
1 .. _rhodecode-release-notes-ref:
1 .. _rhodecode-release-notes-ref:
2
2
3 Release Notes
3 Release Notes
4 =============
4 =============
5
5
6 |RCE| 4.x Versions
6 |RCE| 4.x Versions
7 ------------------
7 ------------------
8
8
9 .. toctree::
9 .. toctree::
10 :maxdepth: 1
10 :maxdepth: 1
11
11
12 release-notes-4.1.1.rst
12 release-notes-4.1.0.rst
13 release-notes-4.1.0.rst
13 release-notes-4.0.1.rst
14 release-notes-4.0.1.rst
14 release-notes-4.0.0.rst
15 release-notes-4.0.0.rst
15
16
16 |RCE| 3.x Versions
17 |RCE| 3.x Versions
17 ------------------
18 ------------------
18
19
19 .. toctree::
20 .. toctree::
20 :maxdepth: 1
21 :maxdepth: 1
21
22
22 release-notes-3.8.4.rst
23 release-notes-3.8.4.rst
23 release-notes-3.8.3.rst
24 release-notes-3.8.3.rst
24 release-notes-3.8.2.rst
25 release-notes-3.8.2.rst
25 release-notes-3.8.1.rst
26 release-notes-3.8.1.rst
26 release-notes-3.8.0.rst
27 release-notes-3.8.0.rst
27 release-notes-3.7.1.rst
28 release-notes-3.7.1.rst
28 release-notes-3.7.0.rst
29 release-notes-3.7.0.rst
29 release-notes-3.6.1.rst
30 release-notes-3.6.1.rst
30 release-notes-3.6.0.rst
31 release-notes-3.6.0.rst
31 release-notes-3.5.2.rst
32 release-notes-3.5.2.rst
32 release-notes-3.5.1.rst
33 release-notes-3.5.1.rst
33 release-notes-3.5.0.rst
34 release-notes-3.5.0.rst
34 release-notes-3.4.1.rst
35 release-notes-3.4.1.rst
35 release-notes-3.4.0.rst
36 release-notes-3.4.0.rst
36 release-notes-3.3.4.rst
37 release-notes-3.3.4.rst
37 release-notes-3.3.3.rst
38 release-notes-3.3.3.rst
38 release-notes-3.3.2.rst
39 release-notes-3.3.2.rst
39 release-notes-3.3.1.rst
40 release-notes-3.3.1.rst
40 release-notes-3.3.0.rst
41 release-notes-3.3.0.rst
41 release-notes-3.2.3.rst
42 release-notes-3.2.3.rst
42 release-notes-3.2.2.rst
43 release-notes-3.2.2.rst
43 release-notes-3.2.1.rst
44 release-notes-3.2.1.rst
44 release-notes-3.2.0.rst
45 release-notes-3.2.0.rst
45 release-notes-3.1.1.rst
46 release-notes-3.1.1.rst
46 release-notes-3.1.0.rst
47 release-notes-3.1.0.rst
47 release-notes-3.0.2.rst
48 release-notes-3.0.2.rst
48 release-notes-3.0.1.rst
49 release-notes-3.0.1.rst
49 release-notes-3.0.0.rst
50 release-notes-3.0.0.rst
50
51
51 |RCE| 2.x Versions
52 |RCE| 2.x Versions
52 ------------------
53 ------------------
53
54
54 .. toctree::
55 .. toctree::
55 :maxdepth: 1
56 :maxdepth: 1
56
57
57 release-notes-2.2.8.rst
58 release-notes-2.2.8.rst
58 release-notes-2.2.7.rst
59 release-notes-2.2.7.rst
59 release-notes-2.2.6.rst
60 release-notes-2.2.6.rst
60 release-notes-2.2.5.rst
61 release-notes-2.2.5.rst
61 release-notes-2.2.4.rst
62 release-notes-2.2.4.rst
62 release-notes-2.2.3.rst
63 release-notes-2.2.3.rst
63 release-notes-2.2.2.rst
64 release-notes-2.2.2.rst
64 release-notes-2.2.1.rst
65 release-notes-2.2.1.rst
65 release-notes-2.2.0.rst
66 release-notes-2.2.0.rst
66 release-notes-2.1.0.rst
67 release-notes-2.1.0.rst
67 release-notes-2.0.2.rst
68 release-notes-2.0.2.rst
68 release-notes-2.0.1.rst
69 release-notes-2.0.1.rst
69 release-notes-2.0.0.rst
70 release-notes-2.0.0.rst
70
71
71 |RCE| 1.x Versions
72 |RCE| 1.x Versions
72 ------------------
73 ------------------
73
74
74 .. toctree::
75 .. toctree::
75 :maxdepth: 1
76 :maxdepth: 1
76
77
77 release-notes-1.7.2.rst
78 release-notes-1.7.2.rst
78 release-notes-1.7.1.rst
79 release-notes-1.7.1.rst
79 release-notes-1.7.0.rst
80 release-notes-1.7.0.rst
80 release-notes-1.6.0.rst
81 release-notes-1.6.0.rst
@@ -1,1263 +1,1263 b''
1 {
1 {
2 Babel = super.buildPythonPackage {
2 Babel = super.buildPythonPackage {
3 name = "Babel-1.3";
3 name = "Babel-1.3";
4 buildInputs = with self; [];
4 buildInputs = with self; [];
5 doCheck = false;
5 doCheck = false;
6 propagatedBuildInputs = with self; [pytz];
6 propagatedBuildInputs = with self; [pytz];
7 src = fetchurl {
7 src = fetchurl {
8 url = "https://pypi.python.org/packages/33/27/e3978243a03a76398c384c83f7ca879bc6e8f1511233a621fcada135606e/Babel-1.3.tar.gz";
8 url = "https://pypi.python.org/packages/33/27/e3978243a03a76398c384c83f7ca879bc6e8f1511233a621fcada135606e/Babel-1.3.tar.gz";
9 md5 = "5264ceb02717843cbc9ffce8e6e06bdb";
9 md5 = "5264ceb02717843cbc9ffce8e6e06bdb";
10 };
10 };
11 };
11 };
12 Beaker = super.buildPythonPackage {
12 Beaker = super.buildPythonPackage {
13 name = "Beaker-1.7.0";
13 name = "Beaker-1.7.0";
14 buildInputs = with self; [];
14 buildInputs = with self; [];
15 doCheck = false;
15 doCheck = false;
16 propagatedBuildInputs = with self; [];
16 propagatedBuildInputs = with self; [];
17 src = fetchurl {
17 src = fetchurl {
18 url = "https://pypi.python.org/packages/97/8e/409d2e7c009b8aa803dc9e6f239f1db7c3cdf578249087a404e7c27a505d/Beaker-1.7.0.tar.gz";
18 url = "https://pypi.python.org/packages/97/8e/409d2e7c009b8aa803dc9e6f239f1db7c3cdf578249087a404e7c27a505d/Beaker-1.7.0.tar.gz";
19 md5 = "386be3f7fe427358881eee4622b428b3";
19 md5 = "386be3f7fe427358881eee4622b428b3";
20 };
20 };
21 };
21 };
22 CProfileV = super.buildPythonPackage {
22 CProfileV = super.buildPythonPackage {
23 name = "CProfileV-1.0.6";
23 name = "CProfileV-1.0.6";
24 buildInputs = with self; [];
24 buildInputs = with self; [];
25 doCheck = false;
25 doCheck = false;
26 propagatedBuildInputs = with self; [bottle];
26 propagatedBuildInputs = with self; [bottle];
27 src = fetchurl {
27 src = fetchurl {
28 url = "https://pypi.python.org/packages/eb/df/983a0b6cfd3ac94abf023f5011cb04f33613ace196e33f53c86cf91850d5/CProfileV-1.0.6.tar.gz";
28 url = "https://pypi.python.org/packages/eb/df/983a0b6cfd3ac94abf023f5011cb04f33613ace196e33f53c86cf91850d5/CProfileV-1.0.6.tar.gz";
29 md5 = "08c7c242b6e64237bc53c5d13537e03d";
29 md5 = "08c7c242b6e64237bc53c5d13537e03d";
30 };
30 };
31 };
31 };
32 Fabric = super.buildPythonPackage {
32 Fabric = super.buildPythonPackage {
33 name = "Fabric-1.10.0";
33 name = "Fabric-1.10.0";
34 buildInputs = with self; [];
34 buildInputs = with self; [];
35 doCheck = false;
35 doCheck = false;
36 propagatedBuildInputs = with self; [paramiko];
36 propagatedBuildInputs = with self; [paramiko];
37 src = fetchurl {
37 src = fetchurl {
38 url = "https://pypi.python.org/packages/e3/5f/b6ebdb5241d5ec9eab582a5c8a01255c1107da396f849e538801d2fe64a5/Fabric-1.10.0.tar.gz";
38 url = "https://pypi.python.org/packages/e3/5f/b6ebdb5241d5ec9eab582a5c8a01255c1107da396f849e538801d2fe64a5/Fabric-1.10.0.tar.gz";
39 md5 = "2cb96473387f0e7aa035210892352f4a";
39 md5 = "2cb96473387f0e7aa035210892352f4a";
40 };
40 };
41 };
41 };
42 FormEncode = super.buildPythonPackage {
42 FormEncode = super.buildPythonPackage {
43 name = "FormEncode-1.2.4";
43 name = "FormEncode-1.2.4";
44 buildInputs = with self; [];
44 buildInputs = with self; [];
45 doCheck = false;
45 doCheck = false;
46 propagatedBuildInputs = with self; [];
46 propagatedBuildInputs = with self; [];
47 src = fetchurl {
47 src = fetchurl {
48 url = "https://pypi.python.org/packages/8e/59/0174271a6f004512e0201188593e6d319db139d14cb7490e488bbb078015/FormEncode-1.2.4.tar.gz";
48 url = "https://pypi.python.org/packages/8e/59/0174271a6f004512e0201188593e6d319db139d14cb7490e488bbb078015/FormEncode-1.2.4.tar.gz";
49 md5 = "6bc17fb9aed8aea198975e888e2077f4";
49 md5 = "6bc17fb9aed8aea198975e888e2077f4";
50 };
50 };
51 };
51 };
52 Jinja2 = super.buildPythonPackage {
52 Jinja2 = super.buildPythonPackage {
53 name = "Jinja2-2.7.3";
53 name = "Jinja2-2.7.3";
54 buildInputs = with self; [];
54 buildInputs = with self; [];
55 doCheck = false;
55 doCheck = false;
56 propagatedBuildInputs = with self; [MarkupSafe];
56 propagatedBuildInputs = with self; [MarkupSafe];
57 src = fetchurl {
57 src = fetchurl {
58 url = "https://pypi.python.org/packages/b0/73/eab0bca302d6d6a0b5c402f47ad1760dc9cb2dd14bbc1873ad48db258e4d/Jinja2-2.7.3.tar.gz";
58 url = "https://pypi.python.org/packages/b0/73/eab0bca302d6d6a0b5c402f47ad1760dc9cb2dd14bbc1873ad48db258e4d/Jinja2-2.7.3.tar.gz";
59 md5 = "b9dffd2f3b43d673802fe857c8445b1a";
59 md5 = "b9dffd2f3b43d673802fe857c8445b1a";
60 };
60 };
61 };
61 };
62 Mako = super.buildPythonPackage {
62 Mako = super.buildPythonPackage {
63 name = "Mako-1.0.1";
63 name = "Mako-1.0.1";
64 buildInputs = with self; [];
64 buildInputs = with self; [];
65 doCheck = false;
65 doCheck = false;
66 propagatedBuildInputs = with self; [MarkupSafe];
66 propagatedBuildInputs = with self; [MarkupSafe];
67 src = fetchurl {
67 src = fetchurl {
68 url = "https://pypi.python.org/packages/8e/a4/aa56533ecaa5f22ca92428f74e074d0c9337282933c722391902c8f9e0f8/Mako-1.0.1.tar.gz";
68 url = "https://pypi.python.org/packages/8e/a4/aa56533ecaa5f22ca92428f74e074d0c9337282933c722391902c8f9e0f8/Mako-1.0.1.tar.gz";
69 md5 = "9f0aafd177b039ef67b90ea350497a54";
69 md5 = "9f0aafd177b039ef67b90ea350497a54";
70 };
70 };
71 };
71 };
72 Markdown = super.buildPythonPackage {
72 Markdown = super.buildPythonPackage {
73 name = "Markdown-2.6.2";
73 name = "Markdown-2.6.2";
74 buildInputs = with self; [];
74 buildInputs = with self; [];
75 doCheck = false;
75 doCheck = false;
76 propagatedBuildInputs = with self; [];
76 propagatedBuildInputs = with self; [];
77 src = fetchurl {
77 src = fetchurl {
78 url = "https://pypi.python.org/packages/62/8b/83658b5f6c220d5fcde9f9852d46ea54765d734cfbc5a9f4c05bfc36db4d/Markdown-2.6.2.tar.gz";
78 url = "https://pypi.python.org/packages/62/8b/83658b5f6c220d5fcde9f9852d46ea54765d734cfbc5a9f4c05bfc36db4d/Markdown-2.6.2.tar.gz";
79 md5 = "256d19afcc564dc4ce4c229bb762f7ae";
79 md5 = "256d19afcc564dc4ce4c229bb762f7ae";
80 };
80 };
81 };
81 };
82 MarkupSafe = super.buildPythonPackage {
82 MarkupSafe = super.buildPythonPackage {
83 name = "MarkupSafe-0.23";
83 name = "MarkupSafe-0.23";
84 buildInputs = with self; [];
84 buildInputs = with self; [];
85 doCheck = false;
85 doCheck = false;
86 propagatedBuildInputs = with self; [];
86 propagatedBuildInputs = with self; [];
87 src = fetchurl {
87 src = fetchurl {
88 url = "https://pypi.python.org/packages/c0/41/bae1254e0396c0cc8cf1751cb7d9afc90a602353695af5952530482c963f/MarkupSafe-0.23.tar.gz";
88 url = "https://pypi.python.org/packages/c0/41/bae1254e0396c0cc8cf1751cb7d9afc90a602353695af5952530482c963f/MarkupSafe-0.23.tar.gz";
89 md5 = "f5ab3deee4c37cd6a922fb81e730da6e";
89 md5 = "f5ab3deee4c37cd6a922fb81e730da6e";
90 };
90 };
91 };
91 };
92 MySQL-python = super.buildPythonPackage {
92 MySQL-python = super.buildPythonPackage {
93 name = "MySQL-python-1.2.5";
93 name = "MySQL-python-1.2.5";
94 buildInputs = with self; [];
94 buildInputs = with self; [];
95 doCheck = false;
95 doCheck = false;
96 propagatedBuildInputs = with self; [];
96 propagatedBuildInputs = with self; [];
97 src = fetchurl {
97 src = fetchurl {
98 url = "https://pypi.python.org/packages/a5/e9/51b544da85a36a68debe7a7091f068d802fc515a3a202652828c73453cad/MySQL-python-1.2.5.zip";
98 url = "https://pypi.python.org/packages/a5/e9/51b544da85a36a68debe7a7091f068d802fc515a3a202652828c73453cad/MySQL-python-1.2.5.zip";
99 md5 = "654f75b302db6ed8dc5a898c625e030c";
99 md5 = "654f75b302db6ed8dc5a898c625e030c";
100 };
100 };
101 };
101 };
102 Paste = super.buildPythonPackage {
102 Paste = super.buildPythonPackage {
103 name = "Paste-2.0.2";
103 name = "Paste-2.0.2";
104 buildInputs = with self; [];
104 buildInputs = with self; [];
105 doCheck = false;
105 doCheck = false;
106 propagatedBuildInputs = with self; [six];
106 propagatedBuildInputs = with self; [six];
107 src = fetchurl {
107 src = fetchurl {
108 url = "https://pypi.python.org/packages/d5/8d/0f8ac40687b97ff3e07ebd1369be20bdb3f93864d2dc3c2ff542edb4ce50/Paste-2.0.2.tar.gz";
108 url = "https://pypi.python.org/packages/d5/8d/0f8ac40687b97ff3e07ebd1369be20bdb3f93864d2dc3c2ff542edb4ce50/Paste-2.0.2.tar.gz";
109 md5 = "4bfc8a7eaf858f6309d2ac0f40fc951c";
109 md5 = "4bfc8a7eaf858f6309d2ac0f40fc951c";
110 };
110 };
111 };
111 };
112 PasteDeploy = super.buildPythonPackage {
112 PasteDeploy = super.buildPythonPackage {
113 name = "PasteDeploy-1.5.2";
113 name = "PasteDeploy-1.5.2";
114 buildInputs = with self; [];
114 buildInputs = with self; [];
115 doCheck = false;
115 doCheck = false;
116 propagatedBuildInputs = with self; [];
116 propagatedBuildInputs = with self; [];
117 src = fetchurl {
117 src = fetchurl {
118 url = "https://pypi.python.org/packages/0f/90/8e20cdae206c543ea10793cbf4136eb9a8b3f417e04e40a29d72d9922cbd/PasteDeploy-1.5.2.tar.gz";
118 url = "https://pypi.python.org/packages/0f/90/8e20cdae206c543ea10793cbf4136eb9a8b3f417e04e40a29d72d9922cbd/PasteDeploy-1.5.2.tar.gz";
119 md5 = "352b7205c78c8de4987578d19431af3b";
119 md5 = "352b7205c78c8de4987578d19431af3b";
120 };
120 };
121 };
121 };
122 PasteScript = super.buildPythonPackage {
122 PasteScript = super.buildPythonPackage {
123 name = "PasteScript-1.7.5";
123 name = "PasteScript-1.7.5";
124 buildInputs = with self; [];
124 buildInputs = with self; [];
125 doCheck = false;
125 doCheck = false;
126 propagatedBuildInputs = with self; [Paste PasteDeploy];
126 propagatedBuildInputs = with self; [Paste PasteDeploy];
127 src = fetchurl {
127 src = fetchurl {
128 url = "https://pypi.python.org/packages/a5/05/fc60efa7c2f17a1dbaeccb2a903a1e90902d92b9d00eebabe3095829d806/PasteScript-1.7.5.tar.gz";
128 url = "https://pypi.python.org/packages/a5/05/fc60efa7c2f17a1dbaeccb2a903a1e90902d92b9d00eebabe3095829d806/PasteScript-1.7.5.tar.gz";
129 md5 = "4c72d78dcb6bb993f30536842c16af4d";
129 md5 = "4c72d78dcb6bb993f30536842c16af4d";
130 };
130 };
131 };
131 };
132 Pygments = super.buildPythonPackage {
132 Pygments = super.buildPythonPackage {
133 name = "Pygments-2.0.2";
133 name = "Pygments-2.0.2";
134 buildInputs = with self; [];
134 buildInputs = with self; [];
135 doCheck = false;
135 doCheck = false;
136 propagatedBuildInputs = with self; [];
136 propagatedBuildInputs = with self; [];
137 src = fetchurl {
137 src = fetchurl {
138 url = "https://pypi.python.org/packages/f4/c6/bdbc5a8a112256b2b6136af304dbae93d8b1ef8738ff2d12a51018800e46/Pygments-2.0.2.tar.gz";
138 url = "https://pypi.python.org/packages/f4/c6/bdbc5a8a112256b2b6136af304dbae93d8b1ef8738ff2d12a51018800e46/Pygments-2.0.2.tar.gz";
139 md5 = "238587a1370d62405edabd0794b3ec4a";
139 md5 = "238587a1370d62405edabd0794b3ec4a";
140 };
140 };
141 };
141 };
142 Pylons = super.buildPythonPackage {
142 Pylons = super.buildPythonPackage {
143 name = "Pylons-1.0.1";
143 name = "Pylons-1.0.1";
144 buildInputs = with self; [];
144 buildInputs = with self; [];
145 doCheck = false;
145 doCheck = false;
146 propagatedBuildInputs = with self; [Routes WebHelpers Beaker Paste PasteDeploy PasteScript FormEncode simplejson decorator nose Mako WebError WebTest Tempita MarkupSafe WebOb];
146 propagatedBuildInputs = with self; [Routes WebHelpers Beaker Paste PasteDeploy PasteScript FormEncode simplejson decorator nose Mako WebError WebTest Tempita MarkupSafe WebOb];
147 src = fetchurl {
147 src = fetchurl {
148 url = "https://pypi.python.org/packages/a2/69/b835a6bad00acbfeed3f33c6e44fa3f936efc998c795bfb15c61a79ecf62/Pylons-1.0.1.tar.gz";
148 url = "https://pypi.python.org/packages/a2/69/b835a6bad00acbfeed3f33c6e44fa3f936efc998c795bfb15c61a79ecf62/Pylons-1.0.1.tar.gz";
149 md5 = "6cb880d75fa81213192142b07a6e4915";
149 md5 = "6cb880d75fa81213192142b07a6e4915";
150 };
150 };
151 };
151 };
152 Pyro4 = super.buildPythonPackage {
152 Pyro4 = super.buildPythonPackage {
153 name = "Pyro4-4.41";
153 name = "Pyro4-4.41";
154 buildInputs = with self; [];
154 buildInputs = with self; [];
155 doCheck = false;
155 doCheck = false;
156 propagatedBuildInputs = with self; [serpent];
156 propagatedBuildInputs = with self; [serpent];
157 src = fetchurl {
157 src = fetchurl {
158 url = "https://pypi.python.org/packages/56/2b/89b566b4bf3e7f8ba790db2d1223852f8cb454c52cab7693dd41f608ca2a/Pyro4-4.41.tar.gz";
158 url = "https://pypi.python.org/packages/56/2b/89b566b4bf3e7f8ba790db2d1223852f8cb454c52cab7693dd41f608ca2a/Pyro4-4.41.tar.gz";
159 md5 = "ed69e9bfafa9c06c049a87cb0c4c2b6c";
159 md5 = "ed69e9bfafa9c06c049a87cb0c4c2b6c";
160 };
160 };
161 };
161 };
162 Routes = super.buildPythonPackage {
162 Routes = super.buildPythonPackage {
163 name = "Routes-1.13";
163 name = "Routes-1.13";
164 buildInputs = with self; [];
164 buildInputs = with self; [];
165 doCheck = false;
165 doCheck = false;
166 propagatedBuildInputs = with self; [repoze.lru];
166 propagatedBuildInputs = with self; [repoze.lru];
167 src = fetchurl {
167 src = fetchurl {
168 url = "https://pypi.python.org/packages/88/d3/259c3b3cde8837eb9441ab5f574a660e8a4acea8f54a078441d4d2acac1c/Routes-1.13.tar.gz";
168 url = "https://pypi.python.org/packages/88/d3/259c3b3cde8837eb9441ab5f574a660e8a4acea8f54a078441d4d2acac1c/Routes-1.13.tar.gz";
169 md5 = "d527b0ab7dd9172b1275a41f97448783";
169 md5 = "d527b0ab7dd9172b1275a41f97448783";
170 };
170 };
171 };
171 };
172 SQLAlchemy = super.buildPythonPackage {
172 SQLAlchemy = super.buildPythonPackage {
173 name = "SQLAlchemy-0.9.9";
173 name = "SQLAlchemy-0.9.9";
174 buildInputs = with self; [];
174 buildInputs = with self; [];
175 doCheck = false;
175 doCheck = false;
176 propagatedBuildInputs = with self; [];
176 propagatedBuildInputs = with self; [];
177 src = fetchurl {
177 src = fetchurl {
178 url = "https://pypi.python.org/packages/28/f7/1bbfd0d8597e8c358d5e15a166a486ad82fc5579b4e67b6ef7c05b1d182b/SQLAlchemy-0.9.9.tar.gz";
178 url = "https://pypi.python.org/packages/28/f7/1bbfd0d8597e8c358d5e15a166a486ad82fc5579b4e67b6ef7c05b1d182b/SQLAlchemy-0.9.9.tar.gz";
179 md5 = "8a10a9bd13ed3336ef7333ac2cc679ff";
179 md5 = "8a10a9bd13ed3336ef7333ac2cc679ff";
180 };
180 };
181 };
181 };
182 Sphinx = super.buildPythonPackage {
182 Sphinx = super.buildPythonPackage {
183 name = "Sphinx-1.2.2";
183 name = "Sphinx-1.2.2";
184 buildInputs = with self; [];
184 buildInputs = with self; [];
185 doCheck = false;
185 doCheck = false;
186 propagatedBuildInputs = with self; [Pygments docutils Jinja2];
186 propagatedBuildInputs = with self; [Pygments docutils Jinja2];
187 src = fetchurl {
187 src = fetchurl {
188 url = "https://pypi.python.org/packages/0a/50/34017e6efcd372893a416aba14b84a1a149fc7074537b0e9cb6ca7b7abe9/Sphinx-1.2.2.tar.gz";
188 url = "https://pypi.python.org/packages/0a/50/34017e6efcd372893a416aba14b84a1a149fc7074537b0e9cb6ca7b7abe9/Sphinx-1.2.2.tar.gz";
189 md5 = "3dc73ccaa8d0bfb2d62fb671b1f7e8a4";
189 md5 = "3dc73ccaa8d0bfb2d62fb671b1f7e8a4";
190 };
190 };
191 };
191 };
192 Tempita = super.buildPythonPackage {
192 Tempita = super.buildPythonPackage {
193 name = "Tempita-0.5.2";
193 name = "Tempita-0.5.2";
194 buildInputs = with self; [];
194 buildInputs = with self; [];
195 doCheck = false;
195 doCheck = false;
196 propagatedBuildInputs = with self; [];
196 propagatedBuildInputs = with self; [];
197 src = fetchurl {
197 src = fetchurl {
198 url = "https://pypi.python.org/packages/56/c8/8ed6eee83dbddf7b0fc64dd5d4454bc05e6ccaafff47991f73f2894d9ff4/Tempita-0.5.2.tar.gz";
198 url = "https://pypi.python.org/packages/56/c8/8ed6eee83dbddf7b0fc64dd5d4454bc05e6ccaafff47991f73f2894d9ff4/Tempita-0.5.2.tar.gz";
199 md5 = "4c2f17bb9d481821c41b6fbee904cea1";
199 md5 = "4c2f17bb9d481821c41b6fbee904cea1";
200 };
200 };
201 };
201 };
202 URLObject = super.buildPythonPackage {
202 URLObject = super.buildPythonPackage {
203 name = "URLObject-2.4.0";
203 name = "URLObject-2.4.0";
204 buildInputs = with self; [];
204 buildInputs = with self; [];
205 doCheck = false;
205 doCheck = false;
206 propagatedBuildInputs = with self; [];
206 propagatedBuildInputs = with self; [];
207 src = fetchurl {
207 src = fetchurl {
208 url = "https://pypi.python.org/packages/cb/b6/e25e58500f9caef85d664bec71ec67c116897bfebf8622c32cb75d1ca199/URLObject-2.4.0.tar.gz";
208 url = "https://pypi.python.org/packages/cb/b6/e25e58500f9caef85d664bec71ec67c116897bfebf8622c32cb75d1ca199/URLObject-2.4.0.tar.gz";
209 md5 = "2ed819738a9f0a3051f31dc9924e3065";
209 md5 = "2ed819738a9f0a3051f31dc9924e3065";
210 };
210 };
211 };
211 };
212 WebError = super.buildPythonPackage {
212 WebError = super.buildPythonPackage {
213 name = "WebError-0.10.3";
213 name = "WebError-0.10.3";
214 buildInputs = with self; [];
214 buildInputs = with self; [];
215 doCheck = false;
215 doCheck = false;
216 propagatedBuildInputs = with self; [WebOb Tempita Pygments Paste];
216 propagatedBuildInputs = with self; [WebOb Tempita Pygments Paste];
217 src = fetchurl {
217 src = fetchurl {
218 url = "https://pypi.python.org/packages/35/76/e7e5c2ce7e9c7f31b54c1ff295a495886d1279a002557d74dd8957346a79/WebError-0.10.3.tar.gz";
218 url = "https://pypi.python.org/packages/35/76/e7e5c2ce7e9c7f31b54c1ff295a495886d1279a002557d74dd8957346a79/WebError-0.10.3.tar.gz";
219 md5 = "84b9990b0baae6fd440b1e60cdd06f9a";
219 md5 = "84b9990b0baae6fd440b1e60cdd06f9a";
220 };
220 };
221 };
221 };
222 WebHelpers = super.buildPythonPackage {
222 WebHelpers = super.buildPythonPackage {
223 name = "WebHelpers-1.3";
223 name = "WebHelpers-1.3";
224 buildInputs = with self; [];
224 buildInputs = with self; [];
225 doCheck = false;
225 doCheck = false;
226 propagatedBuildInputs = with self; [MarkupSafe];
226 propagatedBuildInputs = with self; [MarkupSafe];
227 src = fetchurl {
227 src = fetchurl {
228 url = "https://pypi.python.org/packages/ee/68/4d07672821d514184357f1552f2dad923324f597e722de3b016ca4f7844f/WebHelpers-1.3.tar.gz";
228 url = "https://pypi.python.org/packages/ee/68/4d07672821d514184357f1552f2dad923324f597e722de3b016ca4f7844f/WebHelpers-1.3.tar.gz";
229 md5 = "32749ffadfc40fea51075a7def32588b";
229 md5 = "32749ffadfc40fea51075a7def32588b";
230 };
230 };
231 };
231 };
232 WebHelpers2 = super.buildPythonPackage {
232 WebHelpers2 = super.buildPythonPackage {
233 name = "WebHelpers2-2.0";
233 name = "WebHelpers2-2.0";
234 buildInputs = with self; [];
234 buildInputs = with self; [];
235 doCheck = false;
235 doCheck = false;
236 propagatedBuildInputs = with self; [MarkupSafe six];
236 propagatedBuildInputs = with self; [MarkupSafe six];
237 src = fetchurl {
237 src = fetchurl {
238 url = "https://pypi.python.org/packages/ff/30/56342c6ea522439e3662427c8d7b5e5b390dff4ff2dc92d8afcb8ab68b75/WebHelpers2-2.0.tar.gz";
238 url = "https://pypi.python.org/packages/ff/30/56342c6ea522439e3662427c8d7b5e5b390dff4ff2dc92d8afcb8ab68b75/WebHelpers2-2.0.tar.gz";
239 md5 = "0f6b68d70c12ee0aed48c00b24da13d3";
239 md5 = "0f6b68d70c12ee0aed48c00b24da13d3";
240 };
240 };
241 };
241 };
242 WebOb = super.buildPythonPackage {
242 WebOb = super.buildPythonPackage {
243 name = "WebOb-1.3.1";
243 name = "WebOb-1.3.1";
244 buildInputs = with self; [];
244 buildInputs = with self; [];
245 doCheck = false;
245 doCheck = false;
246 propagatedBuildInputs = with self; [];
246 propagatedBuildInputs = with self; [];
247 src = fetchurl {
247 src = fetchurl {
248 url = "https://pypi.python.org/packages/16/78/adfc0380b8a0d75b2d543fa7085ba98a573b1ae486d9def88d172b81b9fa/WebOb-1.3.1.tar.gz";
248 url = "https://pypi.python.org/packages/16/78/adfc0380b8a0d75b2d543fa7085ba98a573b1ae486d9def88d172b81b9fa/WebOb-1.3.1.tar.gz";
249 md5 = "20918251c5726956ba8fef22d1556177";
249 md5 = "20918251c5726956ba8fef22d1556177";
250 };
250 };
251 };
251 };
252 WebTest = super.buildPythonPackage {
252 WebTest = super.buildPythonPackage {
253 name = "WebTest-1.4.3";
253 name = "WebTest-1.4.3";
254 buildInputs = with self; [];
254 buildInputs = with self; [];
255 doCheck = false;
255 doCheck = false;
256 propagatedBuildInputs = with self; [WebOb];
256 propagatedBuildInputs = with self; [WebOb];
257 src = fetchurl {
257 src = fetchurl {
258 url = "https://pypi.python.org/packages/51/3d/84fd0f628df10b30c7db87895f56d0158e5411206b721ca903cb51bfd948/WebTest-1.4.3.zip";
258 url = "https://pypi.python.org/packages/51/3d/84fd0f628df10b30c7db87895f56d0158e5411206b721ca903cb51bfd948/WebTest-1.4.3.zip";
259 md5 = "631ce728bed92c681a4020a36adbc353";
259 md5 = "631ce728bed92c681a4020a36adbc353";
260 };
260 };
261 };
261 };
262 Whoosh = super.buildPythonPackage {
262 Whoosh = super.buildPythonPackage {
263 name = "Whoosh-2.7.0";
263 name = "Whoosh-2.7.0";
264 buildInputs = with self; [];
264 buildInputs = with self; [];
265 doCheck = false;
265 doCheck = false;
266 propagatedBuildInputs = with self; [];
266 propagatedBuildInputs = with self; [];
267 src = fetchurl {
267 src = fetchurl {
268 url = "https://pypi.python.org/packages/1c/dc/2f0231ff3875ded36df8c1ab851451e51a237dc0e5a86d3d96036158da94/Whoosh-2.7.0.zip";
268 url = "https://pypi.python.org/packages/1c/dc/2f0231ff3875ded36df8c1ab851451e51a237dc0e5a86d3d96036158da94/Whoosh-2.7.0.zip";
269 md5 = "7abfd970f16fadc7311960f3fa0bc7a9";
269 md5 = "7abfd970f16fadc7311960f3fa0bc7a9";
270 };
270 };
271 };
271 };
272 alembic = super.buildPythonPackage {
272 alembic = super.buildPythonPackage {
273 name = "alembic-0.8.4";
273 name = "alembic-0.8.4";
274 buildInputs = with self; [];
274 buildInputs = with self; [];
275 doCheck = false;
275 doCheck = false;
276 propagatedBuildInputs = with self; [SQLAlchemy Mako python-editor];
276 propagatedBuildInputs = with self; [SQLAlchemy Mako python-editor];
277 src = fetchurl {
277 src = fetchurl {
278 url = "https://pypi.python.org/packages/ca/7e/299b4499b5c75e5a38c5845145ad24755bebfb8eec07a2e1c366b7181eeb/alembic-0.8.4.tar.gz";
278 url = "https://pypi.python.org/packages/ca/7e/299b4499b5c75e5a38c5845145ad24755bebfb8eec07a2e1c366b7181eeb/alembic-0.8.4.tar.gz";
279 md5 = "5f95d8ee62b443f9b37eb5bee76c582d";
279 md5 = "5f95d8ee62b443f9b37eb5bee76c582d";
280 };
280 };
281 };
281 };
282 amqplib = super.buildPythonPackage {
282 amqplib = super.buildPythonPackage {
283 name = "amqplib-1.0.2";
283 name = "amqplib-1.0.2";
284 buildInputs = with self; [];
284 buildInputs = with self; [];
285 doCheck = false;
285 doCheck = false;
286 propagatedBuildInputs = with self; [];
286 propagatedBuildInputs = with self; [];
287 src = fetchurl {
287 src = fetchurl {
288 url = "https://pypi.python.org/packages/75/b7/8c2429bf8d92354a0118614f9a4d15e53bc69ebedce534284111de5a0102/amqplib-1.0.2.tgz";
288 url = "https://pypi.python.org/packages/75/b7/8c2429bf8d92354a0118614f9a4d15e53bc69ebedce534284111de5a0102/amqplib-1.0.2.tgz";
289 md5 = "5c92f17fbedd99b2b4a836d4352d1e2f";
289 md5 = "5c92f17fbedd99b2b4a836d4352d1e2f";
290 };
290 };
291 };
291 };
292 anyjson = super.buildPythonPackage {
292 anyjson = super.buildPythonPackage {
293 name = "anyjson-0.3.3";
293 name = "anyjson-0.3.3";
294 buildInputs = with self; [];
294 buildInputs = with self; [];
295 doCheck = false;
295 doCheck = false;
296 propagatedBuildInputs = with self; [];
296 propagatedBuildInputs = with self; [];
297 src = fetchurl {
297 src = fetchurl {
298 url = "https://pypi.python.org/packages/c3/4d/d4089e1a3dd25b46bebdb55a992b0797cff657b4477bc32ce28038fdecbc/anyjson-0.3.3.tar.gz";
298 url = "https://pypi.python.org/packages/c3/4d/d4089e1a3dd25b46bebdb55a992b0797cff657b4477bc32ce28038fdecbc/anyjson-0.3.3.tar.gz";
299 md5 = "2ea28d6ec311aeeebaf993cb3008b27c";
299 md5 = "2ea28d6ec311aeeebaf993cb3008b27c";
300 };
300 };
301 };
301 };
302 appenlight-client = super.buildPythonPackage {
302 appenlight-client = super.buildPythonPackage {
303 name = "appenlight-client-0.6.14";
303 name = "appenlight-client-0.6.14";
304 buildInputs = with self; [];
304 buildInputs = with self; [];
305 doCheck = false;
305 doCheck = false;
306 propagatedBuildInputs = with self; [WebOb requests];
306 propagatedBuildInputs = with self; [WebOb requests];
307 src = fetchurl {
307 src = fetchurl {
308 url = "https://pypi.python.org/packages/4d/e0/23fee3ebada8143f707e65c06bcb82992040ee64ea8355e044ed55ebf0c1/appenlight_client-0.6.14.tar.gz";
308 url = "https://pypi.python.org/packages/4d/e0/23fee3ebada8143f707e65c06bcb82992040ee64ea8355e044ed55ebf0c1/appenlight_client-0.6.14.tar.gz";
309 md5 = "578c69b09f4356d898fff1199b98a95c";
309 md5 = "578c69b09f4356d898fff1199b98a95c";
310 };
310 };
311 };
311 };
312 authomatic = super.buildPythonPackage {
312 authomatic = super.buildPythonPackage {
313 name = "authomatic-0.1.0.post1";
313 name = "authomatic-0.1.0.post1";
314 buildInputs = with self; [];
314 buildInputs = with self; [];
315 doCheck = false;
315 doCheck = false;
316 propagatedBuildInputs = with self; [];
316 propagatedBuildInputs = with self; [];
317 src = fetchurl {
317 src = fetchurl {
318 url = "https://pypi.python.org/packages/08/1a/8a930461e604c2d5a7a871e1ac59fa82ccf994c32e807230c8d2fb07815a/Authomatic-0.1.0.post1.tar.gz";
318 url = "https://pypi.python.org/packages/08/1a/8a930461e604c2d5a7a871e1ac59fa82ccf994c32e807230c8d2fb07815a/Authomatic-0.1.0.post1.tar.gz";
319 md5 = "be3f3ce08747d776aae6d6cc8dcb49a9";
319 md5 = "be3f3ce08747d776aae6d6cc8dcb49a9";
320 };
320 };
321 };
321 };
322 backport-ipaddress = super.buildPythonPackage {
322 backport-ipaddress = super.buildPythonPackage {
323 name = "backport-ipaddress-0.1";
323 name = "backport-ipaddress-0.1";
324 buildInputs = with self; [];
324 buildInputs = with self; [];
325 doCheck = false;
325 doCheck = false;
326 propagatedBuildInputs = with self; [];
326 propagatedBuildInputs = with self; [];
327 src = fetchurl {
327 src = fetchurl {
328 url = "https://pypi.python.org/packages/d3/30/54c6dab05a4dec44db25ff309f1fbb6b7a8bde3f2bade38bb9da67bbab8f/backport_ipaddress-0.1.tar.gz";
328 url = "https://pypi.python.org/packages/d3/30/54c6dab05a4dec44db25ff309f1fbb6b7a8bde3f2bade38bb9da67bbab8f/backport_ipaddress-0.1.tar.gz";
329 md5 = "9c1f45f4361f71b124d7293a60006c05";
329 md5 = "9c1f45f4361f71b124d7293a60006c05";
330 };
330 };
331 };
331 };
332 bottle = super.buildPythonPackage {
332 bottle = super.buildPythonPackage {
333 name = "bottle-0.12.8";
333 name = "bottle-0.12.8";
334 buildInputs = with self; [];
334 buildInputs = with self; [];
335 doCheck = false;
335 doCheck = false;
336 propagatedBuildInputs = with self; [];
336 propagatedBuildInputs = with self; [];
337 src = fetchurl {
337 src = fetchurl {
338 url = "https://pypi.python.org/packages/52/df/e4a408f3a7af396d186d4ecd3b389dd764f0f943b4fa8d257bfe7b49d343/bottle-0.12.8.tar.gz";
338 url = "https://pypi.python.org/packages/52/df/e4a408f3a7af396d186d4ecd3b389dd764f0f943b4fa8d257bfe7b49d343/bottle-0.12.8.tar.gz";
339 md5 = "13132c0a8f607bf860810a6ee9064c5b";
339 md5 = "13132c0a8f607bf860810a6ee9064c5b";
340 };
340 };
341 };
341 };
342 bumpversion = super.buildPythonPackage {
342 bumpversion = super.buildPythonPackage {
343 name = "bumpversion-0.5.3";
343 name = "bumpversion-0.5.3";
344 buildInputs = with self; [];
344 buildInputs = with self; [];
345 doCheck = false;
345 doCheck = false;
346 propagatedBuildInputs = with self; [];
346 propagatedBuildInputs = with self; [];
347 src = fetchurl {
347 src = fetchurl {
348 url = "https://pypi.python.org/packages/14/41/8c9da3549f8e00c84f0432c3a8cf8ed6898374714676aab91501d48760db/bumpversion-0.5.3.tar.gz";
348 url = "https://pypi.python.org/packages/14/41/8c9da3549f8e00c84f0432c3a8cf8ed6898374714676aab91501d48760db/bumpversion-0.5.3.tar.gz";
349 md5 = "c66a3492eafcf5ad4b024be9fca29820";
349 md5 = "c66a3492eafcf5ad4b024be9fca29820";
350 };
350 };
351 };
351 };
352 celery = super.buildPythonPackage {
352 celery = super.buildPythonPackage {
353 name = "celery-2.2.10";
353 name = "celery-2.2.10";
354 buildInputs = with self; [];
354 buildInputs = with self; [];
355 doCheck = false;
355 doCheck = false;
356 propagatedBuildInputs = with self; [python-dateutil anyjson kombu pyparsing];
356 propagatedBuildInputs = with self; [python-dateutil anyjson kombu pyparsing];
357 src = fetchurl {
357 src = fetchurl {
358 url = "https://pypi.python.org/packages/b1/64/860fd50e45844c83442e7953effcddeff66b2851d90b2d784f7201c111b8/celery-2.2.10.tar.gz";
358 url = "https://pypi.python.org/packages/b1/64/860fd50e45844c83442e7953effcddeff66b2851d90b2d784f7201c111b8/celery-2.2.10.tar.gz";
359 md5 = "898bc87e54f278055b561316ba73e222";
359 md5 = "898bc87e54f278055b561316ba73e222";
360 };
360 };
361 };
361 };
362 click = super.buildPythonPackage {
362 click = super.buildPythonPackage {
363 name = "click-5.1";
363 name = "click-5.1";
364 buildInputs = with self; [];
364 buildInputs = with self; [];
365 doCheck = false;
365 doCheck = false;
366 propagatedBuildInputs = with self; [];
366 propagatedBuildInputs = with self; [];
367 src = fetchurl {
367 src = fetchurl {
368 url = "https://pypi.python.org/packages/b7/34/a496632c4fb6c1ee76efedf77bb8d28b29363d839953d95095b12defe791/click-5.1.tar.gz";
368 url = "https://pypi.python.org/packages/b7/34/a496632c4fb6c1ee76efedf77bb8d28b29363d839953d95095b12defe791/click-5.1.tar.gz";
369 md5 = "9c5323008cccfe232a8b161fc8196d41";
369 md5 = "9c5323008cccfe232a8b161fc8196d41";
370 };
370 };
371 };
371 };
372 colander = super.buildPythonPackage {
372 colander = super.buildPythonPackage {
373 name = "colander-1.2";
373 name = "colander-1.2";
374 buildInputs = with self; [];
374 buildInputs = with self; [];
375 doCheck = false;
375 doCheck = false;
376 propagatedBuildInputs = with self; [translationstring iso8601];
376 propagatedBuildInputs = with self; [translationstring iso8601];
377 src = fetchurl {
377 src = fetchurl {
378 url = "https://pypi.python.org/packages/14/23/c9ceba07a6a1dc0eefbb215fc0dc64aabc2b22ee756bc0f0c13278fa0887/colander-1.2.tar.gz";
378 url = "https://pypi.python.org/packages/14/23/c9ceba07a6a1dc0eefbb215fc0dc64aabc2b22ee756bc0f0c13278fa0887/colander-1.2.tar.gz";
379 md5 = "83db21b07936a0726e588dae1914b9ed";
379 md5 = "83db21b07936a0726e588dae1914b9ed";
380 };
380 };
381 };
381 };
382 configobj = super.buildPythonPackage {
382 configobj = super.buildPythonPackage {
383 name = "configobj-5.0.6";
383 name = "configobj-5.0.6";
384 buildInputs = with self; [];
384 buildInputs = with self; [];
385 doCheck = false;
385 doCheck = false;
386 propagatedBuildInputs = with self; [six];
386 propagatedBuildInputs = with self; [six];
387 src = fetchurl {
387 src = fetchurl {
388 url = "https://pypi.python.org/packages/64/61/079eb60459c44929e684fa7d9e2fdca403f67d64dd9dbac27296be2e0fab/configobj-5.0.6.tar.gz";
388 url = "https://pypi.python.org/packages/64/61/079eb60459c44929e684fa7d9e2fdca403f67d64dd9dbac27296be2e0fab/configobj-5.0.6.tar.gz";
389 md5 = "e472a3a1c2a67bb0ec9b5d54c13a47d6";
389 md5 = "e472a3a1c2a67bb0ec9b5d54c13a47d6";
390 };
390 };
391 };
391 };
392 cov-core = super.buildPythonPackage {
392 cov-core = super.buildPythonPackage {
393 name = "cov-core-1.15.0";
393 name = "cov-core-1.15.0";
394 buildInputs = with self; [];
394 buildInputs = with self; [];
395 doCheck = false;
395 doCheck = false;
396 propagatedBuildInputs = with self; [coverage];
396 propagatedBuildInputs = with self; [coverage];
397 src = fetchurl {
397 src = fetchurl {
398 url = "https://pypi.python.org/packages/4b/87/13e75a47b4ba1be06f29f6d807ca99638bedc6b57fa491cd3de891ca2923/cov-core-1.15.0.tar.gz";
398 url = "https://pypi.python.org/packages/4b/87/13e75a47b4ba1be06f29f6d807ca99638bedc6b57fa491cd3de891ca2923/cov-core-1.15.0.tar.gz";
399 md5 = "f519d4cb4c4e52856afb14af52919fe6";
399 md5 = "f519d4cb4c4e52856afb14af52919fe6";
400 };
400 };
401 };
401 };
402 coverage = super.buildPythonPackage {
402 coverage = super.buildPythonPackage {
403 name = "coverage-3.7.1";
403 name = "coverage-3.7.1";
404 buildInputs = with self; [];
404 buildInputs = with self; [];
405 doCheck = false;
405 doCheck = false;
406 propagatedBuildInputs = with self; [];
406 propagatedBuildInputs = with self; [];
407 src = fetchurl {
407 src = fetchurl {
408 url = "https://pypi.python.org/packages/09/4f/89b06c7fdc09687bca507dc411c342556ef9c5a3b26756137a4878ff19bf/coverage-3.7.1.tar.gz";
408 url = "https://pypi.python.org/packages/09/4f/89b06c7fdc09687bca507dc411c342556ef9c5a3b26756137a4878ff19bf/coverage-3.7.1.tar.gz";
409 md5 = "c47b36ceb17eaff3ecfab3bcd347d0df";
409 md5 = "c47b36ceb17eaff3ecfab3bcd347d0df";
410 };
410 };
411 };
411 };
412 cssselect = super.buildPythonPackage {
412 cssselect = super.buildPythonPackage {
413 name = "cssselect-0.9.1";
413 name = "cssselect-0.9.1";
414 buildInputs = with self; [];
414 buildInputs = with self; [];
415 doCheck = false;
415 doCheck = false;
416 propagatedBuildInputs = with self; [];
416 propagatedBuildInputs = with self; [];
417 src = fetchurl {
417 src = fetchurl {
418 url = "https://pypi.python.org/packages/aa/e5/9ee1460d485b94a6d55732eb7ad5b6c084caf73dd6f9cb0bb7d2a78fafe8/cssselect-0.9.1.tar.gz";
418 url = "https://pypi.python.org/packages/aa/e5/9ee1460d485b94a6d55732eb7ad5b6c084caf73dd6f9cb0bb7d2a78fafe8/cssselect-0.9.1.tar.gz";
419 md5 = "c74f45966277dc7a0f768b9b0f3522ac";
419 md5 = "c74f45966277dc7a0f768b9b0f3522ac";
420 };
420 };
421 };
421 };
422 decorator = super.buildPythonPackage {
422 decorator = super.buildPythonPackage {
423 name = "decorator-3.4.2";
423 name = "decorator-3.4.2";
424 buildInputs = with self; [];
424 buildInputs = with self; [];
425 doCheck = false;
425 doCheck = false;
426 propagatedBuildInputs = with self; [];
426 propagatedBuildInputs = with self; [];
427 src = fetchurl {
427 src = fetchurl {
428 url = "https://pypi.python.org/packages/35/3a/42566eb7a2cbac774399871af04e11d7ae3fc2579e7dae85213b8d1d1c57/decorator-3.4.2.tar.gz";
428 url = "https://pypi.python.org/packages/35/3a/42566eb7a2cbac774399871af04e11d7ae3fc2579e7dae85213b8d1d1c57/decorator-3.4.2.tar.gz";
429 md5 = "9e0536870d2b83ae27d58dbf22582f4d";
429 md5 = "9e0536870d2b83ae27d58dbf22582f4d";
430 };
430 };
431 };
431 };
432 docutils = super.buildPythonPackage {
432 docutils = super.buildPythonPackage {
433 name = "docutils-0.12";
433 name = "docutils-0.12";
434 buildInputs = with self; [];
434 buildInputs = with self; [];
435 doCheck = false;
435 doCheck = false;
436 propagatedBuildInputs = with self; [];
436 propagatedBuildInputs = with self; [];
437 src = fetchurl {
437 src = fetchurl {
438 url = "https://pypi.python.org/packages/37/38/ceda70135b9144d84884ae2fc5886c6baac4edea39550f28bcd144c1234d/docutils-0.12.tar.gz";
438 url = "https://pypi.python.org/packages/37/38/ceda70135b9144d84884ae2fc5886c6baac4edea39550f28bcd144c1234d/docutils-0.12.tar.gz";
439 md5 = "4622263b62c5c771c03502afa3157768";
439 md5 = "4622263b62c5c771c03502afa3157768";
440 };
440 };
441 };
441 };
442 dogpile.cache = super.buildPythonPackage {
442 dogpile.cache = super.buildPythonPackage {
443 name = "dogpile.cache-0.5.7";
443 name = "dogpile.cache-0.5.7";
444 buildInputs = with self; [];
444 buildInputs = with self; [];
445 doCheck = false;
445 doCheck = false;
446 propagatedBuildInputs = with self; [dogpile.core];
446 propagatedBuildInputs = with self; [dogpile.core];
447 src = fetchurl {
447 src = fetchurl {
448 url = "https://pypi.python.org/packages/07/74/2a83bedf758156d9c95d112691bbad870d3b77ccbcfb781b4ef836ea7d96/dogpile.cache-0.5.7.tar.gz";
448 url = "https://pypi.python.org/packages/07/74/2a83bedf758156d9c95d112691bbad870d3b77ccbcfb781b4ef836ea7d96/dogpile.cache-0.5.7.tar.gz";
449 md5 = "3e58ce41af574aab41d78e9c4190f194";
449 md5 = "3e58ce41af574aab41d78e9c4190f194";
450 };
450 };
451 };
451 };
452 dogpile.core = super.buildPythonPackage {
452 dogpile.core = super.buildPythonPackage {
453 name = "dogpile.core-0.4.1";
453 name = "dogpile.core-0.4.1";
454 buildInputs = with self; [];
454 buildInputs = with self; [];
455 doCheck = false;
455 doCheck = false;
456 propagatedBuildInputs = with self; [];
456 propagatedBuildInputs = with self; [];
457 src = fetchurl {
457 src = fetchurl {
458 url = "https://pypi.python.org/packages/0e/77/e72abc04c22aedf874301861e5c1e761231c288b5de369c18be8f4b5c9bb/dogpile.core-0.4.1.tar.gz";
458 url = "https://pypi.python.org/packages/0e/77/e72abc04c22aedf874301861e5c1e761231c288b5de369c18be8f4b5c9bb/dogpile.core-0.4.1.tar.gz";
459 md5 = "01cb19f52bba3e95c9b560f39341f045";
459 md5 = "01cb19f52bba3e95c9b560f39341f045";
460 };
460 };
461 };
461 };
462 dulwich = super.buildPythonPackage {
462 dulwich = super.buildPythonPackage {
463 name = "dulwich-0.12.0";
463 name = "dulwich-0.12.0";
464 buildInputs = with self; [];
464 buildInputs = with self; [];
465 doCheck = false;
465 doCheck = false;
466 propagatedBuildInputs = with self; [];
466 propagatedBuildInputs = with self; [];
467 src = fetchurl {
467 src = fetchurl {
468 url = "https://pypi.python.org/packages/6f/04/fbe561b6d45c0ec758330d5b7f5ba4b6cb4f1ca1ab49859d2fc16320da75/dulwich-0.12.0.tar.gz";
468 url = "https://pypi.python.org/packages/6f/04/fbe561b6d45c0ec758330d5b7f5ba4b6cb4f1ca1ab49859d2fc16320da75/dulwich-0.12.0.tar.gz";
469 md5 = "f3a8a12bd9f9dd8c233e18f3d49436fa";
469 md5 = "f3a8a12bd9f9dd8c233e18f3d49436fa";
470 };
470 };
471 };
471 };
472 ecdsa = super.buildPythonPackage {
472 ecdsa = super.buildPythonPackage {
473 name = "ecdsa-0.11";
473 name = "ecdsa-0.11";
474 buildInputs = with self; [];
474 buildInputs = with self; [];
475 doCheck = false;
475 doCheck = false;
476 propagatedBuildInputs = with self; [];
476 propagatedBuildInputs = with self; [];
477 src = fetchurl {
477 src = fetchurl {
478 url = "https://pypi.python.org/packages/6c/3f/92fe5dcdcaa7bd117be21e5520c9a54375112b66ec000d209e9e9519fad1/ecdsa-0.11.tar.gz";
478 url = "https://pypi.python.org/packages/6c/3f/92fe5dcdcaa7bd117be21e5520c9a54375112b66ec000d209e9e9519fad1/ecdsa-0.11.tar.gz";
479 md5 = "8ef586fe4dbb156697d756900cb41d7c";
479 md5 = "8ef586fe4dbb156697d756900cb41d7c";
480 };
480 };
481 };
481 };
482 elasticsearch = super.buildPythonPackage {
482 elasticsearch = super.buildPythonPackage {
483 name = "elasticsearch-2.3.0";
483 name = "elasticsearch-2.3.0";
484 buildInputs = with self; [];
484 buildInputs = with self; [];
485 doCheck = false;
485 doCheck = false;
486 propagatedBuildInputs = with self; [urllib3];
486 propagatedBuildInputs = with self; [urllib3];
487 src = fetchurl {
487 src = fetchurl {
488 url = "https://pypi.python.org/packages/10/35/5fd52c5f0b0ee405ed4b5195e8bce44c5e041787680dc7b94b8071cac600/elasticsearch-2.3.0.tar.gz";
488 url = "https://pypi.python.org/packages/10/35/5fd52c5f0b0ee405ed4b5195e8bce44c5e041787680dc7b94b8071cac600/elasticsearch-2.3.0.tar.gz";
489 md5 = "2550f3b51629cf1ef9636608af92c340";
489 md5 = "2550f3b51629cf1ef9636608af92c340";
490 };
490 };
491 };
491 };
492 elasticsearch-dsl = super.buildPythonPackage {
492 elasticsearch-dsl = super.buildPythonPackage {
493 name = "elasticsearch-dsl-2.0.0";
493 name = "elasticsearch-dsl-2.0.0";
494 buildInputs = with self; [];
494 buildInputs = with self; [];
495 doCheck = false;
495 doCheck = false;
496 propagatedBuildInputs = with self; [six python-dateutil elasticsearch];
496 propagatedBuildInputs = with self; [six python-dateutil elasticsearch];
497 src = fetchurl {
497 src = fetchurl {
498 url = "https://pypi.python.org/packages/4e/5d/e788ae8dbe2ff4d13426db0a027533386a5c276c77a2654dc0e2007ce04a/elasticsearch-dsl-2.0.0.tar.gz";
498 url = "https://pypi.python.org/packages/4e/5d/e788ae8dbe2ff4d13426db0a027533386a5c276c77a2654dc0e2007ce04a/elasticsearch-dsl-2.0.0.tar.gz";
499 md5 = "4cdfec81bb35383dd3b7d02d7dc5ee68";
499 md5 = "4cdfec81bb35383dd3b7d02d7dc5ee68";
500 };
500 };
501 };
501 };
502 flake8 = super.buildPythonPackage {
502 flake8 = super.buildPythonPackage {
503 name = "flake8-2.4.1";
503 name = "flake8-2.4.1";
504 buildInputs = with self; [];
504 buildInputs = with self; [];
505 doCheck = false;
505 doCheck = false;
506 propagatedBuildInputs = with self; [pyflakes pep8 mccabe];
506 propagatedBuildInputs = with self; [pyflakes pep8 mccabe];
507 src = fetchurl {
507 src = fetchurl {
508 url = "https://pypi.python.org/packages/8f/b5/9a73c66c7dba273bac8758398f060c008a25f3e84531063b42503b5d0a95/flake8-2.4.1.tar.gz";
508 url = "https://pypi.python.org/packages/8f/b5/9a73c66c7dba273bac8758398f060c008a25f3e84531063b42503b5d0a95/flake8-2.4.1.tar.gz";
509 md5 = "ed45d3db81a3b7c88bd63c6e37ca1d65";
509 md5 = "ed45d3db81a3b7c88bd63c6e37ca1d65";
510 };
510 };
511 };
511 };
512 future = super.buildPythonPackage {
512 future = super.buildPythonPackage {
513 name = "future-0.14.3";
513 name = "future-0.14.3";
514 buildInputs = with self; [];
514 buildInputs = with self; [];
515 doCheck = false;
515 doCheck = false;
516 propagatedBuildInputs = with self; [];
516 propagatedBuildInputs = with self; [];
517 src = fetchurl {
517 src = fetchurl {
518 url = "https://pypi.python.org/packages/83/80/8ef3a11a15f8eaafafa0937b20c1b3f73527e69ab6b3fa1cf94a5a96aabb/future-0.14.3.tar.gz";
518 url = "https://pypi.python.org/packages/83/80/8ef3a11a15f8eaafafa0937b20c1b3f73527e69ab6b3fa1cf94a5a96aabb/future-0.14.3.tar.gz";
519 md5 = "e94079b0bd1fc054929e8769fc0f6083";
519 md5 = "e94079b0bd1fc054929e8769fc0f6083";
520 };
520 };
521 };
521 };
522 futures = super.buildPythonPackage {
522 futures = super.buildPythonPackage {
523 name = "futures-3.0.2";
523 name = "futures-3.0.2";
524 buildInputs = with self; [];
524 buildInputs = with self; [];
525 doCheck = false;
525 doCheck = false;
526 propagatedBuildInputs = with self; [];
526 propagatedBuildInputs = with self; [];
527 src = fetchurl {
527 src = fetchurl {
528 url = "https://pypi.python.org/packages/f8/e7/fc0fcbeb9193ba2d4de00b065e7fd5aecd0679e93ce95a07322b2b1434f4/futures-3.0.2.tar.gz";
528 url = "https://pypi.python.org/packages/f8/e7/fc0fcbeb9193ba2d4de00b065e7fd5aecd0679e93ce95a07322b2b1434f4/futures-3.0.2.tar.gz";
529 md5 = "42aaf1e4de48d6e871d77dc1f9d96d5a";
529 md5 = "42aaf1e4de48d6e871d77dc1f9d96d5a";
530 };
530 };
531 };
531 };
532 gnureadline = super.buildPythonPackage {
532 gnureadline = super.buildPythonPackage {
533 name = "gnureadline-6.3.3";
533 name = "gnureadline-6.3.3";
534 buildInputs = with self; [];
534 buildInputs = with self; [];
535 doCheck = false;
535 doCheck = false;
536 propagatedBuildInputs = with self; [];
536 propagatedBuildInputs = with self; [];
537 src = fetchurl {
537 src = fetchurl {
538 url = "https://pypi.python.org/packages/3a/ee/2c3f568b0a74974791ac590ec742ef6133e2fbd287a074ba72a53fa5e97c/gnureadline-6.3.3.tar.gz";
538 url = "https://pypi.python.org/packages/3a/ee/2c3f568b0a74974791ac590ec742ef6133e2fbd287a074ba72a53fa5e97c/gnureadline-6.3.3.tar.gz";
539 md5 = "c4af83c9a3fbeac8f2da9b5a7c60e51c";
539 md5 = "c4af83c9a3fbeac8f2da9b5a7c60e51c";
540 };
540 };
541 };
541 };
542 gprof2dot = super.buildPythonPackage {
542 gprof2dot = super.buildPythonPackage {
543 name = "gprof2dot-2015.12.01";
543 name = "gprof2dot-2015.12.01";
544 buildInputs = with self; [];
544 buildInputs = with self; [];
545 doCheck = false;
545 doCheck = false;
546 propagatedBuildInputs = with self; [];
546 propagatedBuildInputs = with self; [];
547 src = fetchurl {
547 src = fetchurl {
548 url = "https://pypi.python.org/packages/b9/34/7bf93c1952d40fa5c95ad963f4d8344b61ef58558632402eca18e6c14127/gprof2dot-2015.12.1.tar.gz";
548 url = "https://pypi.python.org/packages/b9/34/7bf93c1952d40fa5c95ad963f4d8344b61ef58558632402eca18e6c14127/gprof2dot-2015.12.1.tar.gz";
549 md5 = "e23bf4e2f94db032750c193384b4165b";
549 md5 = "e23bf4e2f94db032750c193384b4165b";
550 };
550 };
551 };
551 };
552 greenlet = super.buildPythonPackage {
552 greenlet = super.buildPythonPackage {
553 name = "greenlet-0.4.9";
553 name = "greenlet-0.4.9";
554 buildInputs = with self; [];
554 buildInputs = with self; [];
555 doCheck = false;
555 doCheck = false;
556 propagatedBuildInputs = with self; [];
556 propagatedBuildInputs = with self; [];
557 src = fetchurl {
557 src = fetchurl {
558 url = "https://pypi.python.org/packages/4e/3d/9d421539b74e33608b245092870156b2e171fb49f2b51390aa4641eecb4a/greenlet-0.4.9.zip";
558 url = "https://pypi.python.org/packages/4e/3d/9d421539b74e33608b245092870156b2e171fb49f2b51390aa4641eecb4a/greenlet-0.4.9.zip";
559 md5 = "c6659cdb2a5e591723e629d2eef22e82";
559 md5 = "c6659cdb2a5e591723e629d2eef22e82";
560 };
560 };
561 };
561 };
562 gunicorn = super.buildPythonPackage {
562 gunicorn = super.buildPythonPackage {
563 name = "gunicorn-19.6.0";
563 name = "gunicorn-19.6.0";
564 buildInputs = with self; [];
564 buildInputs = with self; [];
565 doCheck = false;
565 doCheck = false;
566 propagatedBuildInputs = with self; [];
566 propagatedBuildInputs = with self; [];
567 src = fetchurl {
567 src = fetchurl {
568 url = "https://pypi.python.org/packages/84/ce/7ea5396efad1cef682bbc4068e72a0276341d9d9d0f501da609fab9fcb80/gunicorn-19.6.0.tar.gz";
568 url = "https://pypi.python.org/packages/84/ce/7ea5396efad1cef682bbc4068e72a0276341d9d9d0f501da609fab9fcb80/gunicorn-19.6.0.tar.gz";
569 md5 = "338e5e8a83ea0f0625f768dba4597530";
569 md5 = "338e5e8a83ea0f0625f768dba4597530";
570 };
570 };
571 };
571 };
572 infrae.cache = super.buildPythonPackage {
572 infrae.cache = super.buildPythonPackage {
573 name = "infrae.cache-1.0.1";
573 name = "infrae.cache-1.0.1";
574 buildInputs = with self; [];
574 buildInputs = with self; [];
575 doCheck = false;
575 doCheck = false;
576 propagatedBuildInputs = with self; [Beaker repoze.lru];
576 propagatedBuildInputs = with self; [Beaker repoze.lru];
577 src = fetchurl {
577 src = fetchurl {
578 url = "https://pypi.python.org/packages/bb/f0/e7d5e984cf6592fd2807dc7bc44a93f9d18e04e6a61f87fdfb2622422d74/infrae.cache-1.0.1.tar.gz";
578 url = "https://pypi.python.org/packages/bb/f0/e7d5e984cf6592fd2807dc7bc44a93f9d18e04e6a61f87fdfb2622422d74/infrae.cache-1.0.1.tar.gz";
579 md5 = "b09076a766747e6ed2a755cc62088e32";
579 md5 = "b09076a766747e6ed2a755cc62088e32";
580 };
580 };
581 };
581 };
582 invoke = super.buildPythonPackage {
582 invoke = super.buildPythonPackage {
583 name = "invoke-0.11.1";
583 name = "invoke-0.11.1";
584 buildInputs = with self; [];
584 buildInputs = with self; [];
585 doCheck = false;
585 doCheck = false;
586 propagatedBuildInputs = with self; [];
586 propagatedBuildInputs = with self; [];
587 src = fetchurl {
587 src = fetchurl {
588 url = "https://pypi.python.org/packages/d3/bb/36a5558ea19882073def7b0edeef4a0e6282056fed96506dd10b1d532bd4/invoke-0.11.1.tar.gz";
588 url = "https://pypi.python.org/packages/d3/bb/36a5558ea19882073def7b0edeef4a0e6282056fed96506dd10b1d532bd4/invoke-0.11.1.tar.gz";
589 md5 = "3d4ecbe26779ceef1046ecf702c9c4a8";
589 md5 = "3d4ecbe26779ceef1046ecf702c9c4a8";
590 };
590 };
591 };
591 };
592 ipdb = super.buildPythonPackage {
592 ipdb = super.buildPythonPackage {
593 name = "ipdb-0.8";
593 name = "ipdb-0.8";
594 buildInputs = with self; [];
594 buildInputs = with self; [];
595 doCheck = false;
595 doCheck = false;
596 propagatedBuildInputs = with self; [ipython];
596 propagatedBuildInputs = with self; [ipython];
597 src = fetchurl {
597 src = fetchurl {
598 url = "https://pypi.python.org/packages/f0/25/d7dd430ced6cd8dc242a933c8682b5dbf32eb4011d82f87e34209e5ec845/ipdb-0.8.zip";
598 url = "https://pypi.python.org/packages/f0/25/d7dd430ced6cd8dc242a933c8682b5dbf32eb4011d82f87e34209e5ec845/ipdb-0.8.zip";
599 md5 = "96dca0712efa01aa5eaf6b22071dd3ed";
599 md5 = "96dca0712efa01aa5eaf6b22071dd3ed";
600 };
600 };
601 };
601 };
602 ipython = super.buildPythonPackage {
602 ipython = super.buildPythonPackage {
603 name = "ipython-3.1.0";
603 name = "ipython-3.1.0";
604 buildInputs = with self; [];
604 buildInputs = with self; [];
605 doCheck = false;
605 doCheck = false;
606 propagatedBuildInputs = with self; [];
606 propagatedBuildInputs = with self; [];
607 src = fetchurl {
607 src = fetchurl {
608 url = "https://pypi.python.org/packages/06/91/120c0835254c120af89f066afaabf81289bc2726c1fc3ca0555df6882f58/ipython-3.1.0.tar.gz";
608 url = "https://pypi.python.org/packages/06/91/120c0835254c120af89f066afaabf81289bc2726c1fc3ca0555df6882f58/ipython-3.1.0.tar.gz";
609 md5 = "a749d90c16068687b0ec45a27e72ef8f";
609 md5 = "a749d90c16068687b0ec45a27e72ef8f";
610 };
610 };
611 };
611 };
612 iso8601 = super.buildPythonPackage {
612 iso8601 = super.buildPythonPackage {
613 name = "iso8601-0.1.11";
613 name = "iso8601-0.1.11";
614 buildInputs = with self; [];
614 buildInputs = with self; [];
615 doCheck = false;
615 doCheck = false;
616 propagatedBuildInputs = with self; [];
616 propagatedBuildInputs = with self; [];
617 src = fetchurl {
617 src = fetchurl {
618 url = "https://pypi.python.org/packages/c0/75/c9209ee4d1b5975eb8c2cba4428bde6b61bd55664a98290dd015cdb18e98/iso8601-0.1.11.tar.gz";
618 url = "https://pypi.python.org/packages/c0/75/c9209ee4d1b5975eb8c2cba4428bde6b61bd55664a98290dd015cdb18e98/iso8601-0.1.11.tar.gz";
619 md5 = "b06d11cd14a64096f907086044f0fe38";
619 md5 = "b06d11cd14a64096f907086044f0fe38";
620 };
620 };
621 };
621 };
622 itsdangerous = super.buildPythonPackage {
622 itsdangerous = super.buildPythonPackage {
623 name = "itsdangerous-0.24";
623 name = "itsdangerous-0.24";
624 buildInputs = with self; [];
624 buildInputs = with self; [];
625 doCheck = false;
625 doCheck = false;
626 propagatedBuildInputs = with self; [];
626 propagatedBuildInputs = with self; [];
627 src = fetchurl {
627 src = fetchurl {
628 url = "https://pypi.python.org/packages/dc/b4/a60bcdba945c00f6d608d8975131ab3f25b22f2bcfe1dab221165194b2d4/itsdangerous-0.24.tar.gz";
628 url = "https://pypi.python.org/packages/dc/b4/a60bcdba945c00f6d608d8975131ab3f25b22f2bcfe1dab221165194b2d4/itsdangerous-0.24.tar.gz";
629 md5 = "a3d55aa79369aef5345c036a8a26307f";
629 md5 = "a3d55aa79369aef5345c036a8a26307f";
630 };
630 };
631 };
631 };
632 kombu = super.buildPythonPackage {
632 kombu = super.buildPythonPackage {
633 name = "kombu-1.5.1";
633 name = "kombu-1.5.1";
634 buildInputs = with self; [];
634 buildInputs = with self; [];
635 doCheck = false;
635 doCheck = false;
636 propagatedBuildInputs = with self; [anyjson amqplib];
636 propagatedBuildInputs = with self; [anyjson amqplib];
637 src = fetchurl {
637 src = fetchurl {
638 url = "https://pypi.python.org/packages/19/53/74bf2a624644b45f0850a638752514fc10a8e1cbd738f10804951a6df3f5/kombu-1.5.1.tar.gz";
638 url = "https://pypi.python.org/packages/19/53/74bf2a624644b45f0850a638752514fc10a8e1cbd738f10804951a6df3f5/kombu-1.5.1.tar.gz";
639 md5 = "50662f3c7e9395b3d0721fb75d100b63";
639 md5 = "50662f3c7e9395b3d0721fb75d100b63";
640 };
640 };
641 };
641 };
642 lxml = super.buildPythonPackage {
642 lxml = super.buildPythonPackage {
643 name = "lxml-3.4.4";
643 name = "lxml-3.4.4";
644 buildInputs = with self; [];
644 buildInputs = with self; [];
645 doCheck = false;
645 doCheck = false;
646 propagatedBuildInputs = with self; [];
646 propagatedBuildInputs = with self; [];
647 src = fetchurl {
647 src = fetchurl {
648 url = "https://pypi.python.org/packages/63/c7/4f2a2a4ad6c6fa99b14be6b3c1cece9142e2d915aa7c43c908677afc8fa4/lxml-3.4.4.tar.gz";
648 url = "https://pypi.python.org/packages/63/c7/4f2a2a4ad6c6fa99b14be6b3c1cece9142e2d915aa7c43c908677afc8fa4/lxml-3.4.4.tar.gz";
649 md5 = "a9a65972afc173ec7a39c585f4eea69c";
649 md5 = "a9a65972afc173ec7a39c585f4eea69c";
650 };
650 };
651 };
651 };
652 mccabe = super.buildPythonPackage {
652 mccabe = super.buildPythonPackage {
653 name = "mccabe-0.3";
653 name = "mccabe-0.3";
654 buildInputs = with self; [];
654 buildInputs = with self; [];
655 doCheck = false;
655 doCheck = false;
656 propagatedBuildInputs = with self; [];
656 propagatedBuildInputs = with self; [];
657 src = fetchurl {
657 src = fetchurl {
658 url = "https://pypi.python.org/packages/c9/2e/75231479e11a906b64ac43bad9d0bb534d00080b18bdca8db9da46e1faf7/mccabe-0.3.tar.gz";
658 url = "https://pypi.python.org/packages/c9/2e/75231479e11a906b64ac43bad9d0bb534d00080b18bdca8db9da46e1faf7/mccabe-0.3.tar.gz";
659 md5 = "81640948ff226f8c12b3277059489157";
659 md5 = "81640948ff226f8c12b3277059489157";
660 };
660 };
661 };
661 };
662 meld3 = super.buildPythonPackage {
662 meld3 = super.buildPythonPackage {
663 name = "meld3-1.0.2";
663 name = "meld3-1.0.2";
664 buildInputs = with self; [];
664 buildInputs = with self; [];
665 doCheck = false;
665 doCheck = false;
666 propagatedBuildInputs = with self; [];
666 propagatedBuildInputs = with self; [];
667 src = fetchurl {
667 src = fetchurl {
668 url = "https://pypi.python.org/packages/45/a0/317c6422b26c12fe0161e936fc35f36552069ba8e6f7ecbd99bbffe32a5f/meld3-1.0.2.tar.gz";
668 url = "https://pypi.python.org/packages/45/a0/317c6422b26c12fe0161e936fc35f36552069ba8e6f7ecbd99bbffe32a5f/meld3-1.0.2.tar.gz";
669 md5 = "3ccc78cd79cffd63a751ad7684c02c91";
669 md5 = "3ccc78cd79cffd63a751ad7684c02c91";
670 };
670 };
671 };
671 };
672 mock = super.buildPythonPackage {
672 mock = super.buildPythonPackage {
673 name = "mock-1.0.1";
673 name = "mock-1.0.1";
674 buildInputs = with self; [];
674 buildInputs = with self; [];
675 doCheck = false;
675 doCheck = false;
676 propagatedBuildInputs = with self; [];
676 propagatedBuildInputs = with self; [];
677 src = fetchurl {
677 src = fetchurl {
678 url = "https://pypi.python.org/packages/15/45/30273ee91feb60dabb8fbb2da7868520525f02cf910279b3047182feed80/mock-1.0.1.zip";
678 url = "https://pypi.python.org/packages/15/45/30273ee91feb60dabb8fbb2da7868520525f02cf910279b3047182feed80/mock-1.0.1.zip";
679 md5 = "869f08d003c289a97c1a6610faf5e913";
679 md5 = "869f08d003c289a97c1a6610faf5e913";
680 };
680 };
681 };
681 };
682 msgpack-python = super.buildPythonPackage {
682 msgpack-python = super.buildPythonPackage {
683 name = "msgpack-python-0.4.6";
683 name = "msgpack-python-0.4.6";
684 buildInputs = with self; [];
684 buildInputs = with self; [];
685 doCheck = false;
685 doCheck = false;
686 propagatedBuildInputs = with self; [];
686 propagatedBuildInputs = with self; [];
687 src = fetchurl {
687 src = fetchurl {
688 url = "https://pypi.python.org/packages/15/ce/ff2840885789ef8035f66cd506ea05bdb228340307d5e71a7b1e3f82224c/msgpack-python-0.4.6.tar.gz";
688 url = "https://pypi.python.org/packages/15/ce/ff2840885789ef8035f66cd506ea05bdb228340307d5e71a7b1e3f82224c/msgpack-python-0.4.6.tar.gz";
689 md5 = "8b317669314cf1bc881716cccdaccb30";
689 md5 = "8b317669314cf1bc881716cccdaccb30";
690 };
690 };
691 };
691 };
692 nose = super.buildPythonPackage {
692 nose = super.buildPythonPackage {
693 name = "nose-1.3.6";
693 name = "nose-1.3.6";
694 buildInputs = with self; [];
694 buildInputs = with self; [];
695 doCheck = false;
695 doCheck = false;
696 propagatedBuildInputs = with self; [];
696 propagatedBuildInputs = with self; [];
697 src = fetchurl {
697 src = fetchurl {
698 url = "https://pypi.python.org/packages/70/c7/469e68148d17a0d3db5ed49150242fd70a74a8147b8f3f8b87776e028d99/nose-1.3.6.tar.gz";
698 url = "https://pypi.python.org/packages/70/c7/469e68148d17a0d3db5ed49150242fd70a74a8147b8f3f8b87776e028d99/nose-1.3.6.tar.gz";
699 md5 = "0ca546d81ca8309080fc80cb389e7a16";
699 md5 = "0ca546d81ca8309080fc80cb389e7a16";
700 };
700 };
701 };
701 };
702 objgraph = super.buildPythonPackage {
702 objgraph = super.buildPythonPackage {
703 name = "objgraph-2.0.0";
703 name = "objgraph-2.0.0";
704 buildInputs = with self; [];
704 buildInputs = with self; [];
705 doCheck = false;
705 doCheck = false;
706 propagatedBuildInputs = with self; [];
706 propagatedBuildInputs = with self; [];
707 src = fetchurl {
707 src = fetchurl {
708 url = "https://pypi.python.org/packages/d7/33/ace750b59247496ed769b170586c5def7202683f3d98e737b75b767ff29e/objgraph-2.0.0.tar.gz";
708 url = "https://pypi.python.org/packages/d7/33/ace750b59247496ed769b170586c5def7202683f3d98e737b75b767ff29e/objgraph-2.0.0.tar.gz";
709 md5 = "25b0d5e5adc74aa63ead15699614159c";
709 md5 = "25b0d5e5adc74aa63ead15699614159c";
710 };
710 };
711 };
711 };
712 packaging = super.buildPythonPackage {
712 packaging = super.buildPythonPackage {
713 name = "packaging-15.2";
713 name = "packaging-15.2";
714 buildInputs = with self; [];
714 buildInputs = with self; [];
715 doCheck = false;
715 doCheck = false;
716 propagatedBuildInputs = with self; [];
716 propagatedBuildInputs = with self; [];
717 src = fetchurl {
717 src = fetchurl {
718 url = "https://pypi.python.org/packages/24/c4/185da1304f07047dc9e0c46c31db75c0351bd73458ac3efad7da3dbcfbe1/packaging-15.2.tar.gz";
718 url = "https://pypi.python.org/packages/24/c4/185da1304f07047dc9e0c46c31db75c0351bd73458ac3efad7da3dbcfbe1/packaging-15.2.tar.gz";
719 md5 = "c16093476f6ced42128bf610e5db3784";
719 md5 = "c16093476f6ced42128bf610e5db3784";
720 };
720 };
721 };
721 };
722 paramiko = super.buildPythonPackage {
722 paramiko = super.buildPythonPackage {
723 name = "paramiko-1.15.1";
723 name = "paramiko-1.15.1";
724 buildInputs = with self; [];
724 buildInputs = with self; [];
725 doCheck = false;
725 doCheck = false;
726 propagatedBuildInputs = with self; [pycrypto ecdsa];
726 propagatedBuildInputs = with self; [pycrypto ecdsa];
727 src = fetchurl {
727 src = fetchurl {
728 url = "https://pypi.python.org/packages/04/2b/a22d2a560c1951abbbf95a0628e245945565f70dc082d9e784666887222c/paramiko-1.15.1.tar.gz";
728 url = "https://pypi.python.org/packages/04/2b/a22d2a560c1951abbbf95a0628e245945565f70dc082d9e784666887222c/paramiko-1.15.1.tar.gz";
729 md5 = "48c274c3f9b1282932567b21f6acf3b5";
729 md5 = "48c274c3f9b1282932567b21f6acf3b5";
730 };
730 };
731 };
731 };
732 pep8 = super.buildPythonPackage {
732 pep8 = super.buildPythonPackage {
733 name = "pep8-1.5.7";
733 name = "pep8-1.5.7";
734 buildInputs = with self; [];
734 buildInputs = with self; [];
735 doCheck = false;
735 doCheck = false;
736 propagatedBuildInputs = with self; [];
736 propagatedBuildInputs = with self; [];
737 src = fetchurl {
737 src = fetchurl {
738 url = "https://pypi.python.org/packages/8b/de/259f5e735897ada1683489dd514b2a1c91aaa74e5e6b68f80acf128a6368/pep8-1.5.7.tar.gz";
738 url = "https://pypi.python.org/packages/8b/de/259f5e735897ada1683489dd514b2a1c91aaa74e5e6b68f80acf128a6368/pep8-1.5.7.tar.gz";
739 md5 = "f6adbdd69365ecca20513c709f9b7c93";
739 md5 = "f6adbdd69365ecca20513c709f9b7c93";
740 };
740 };
741 };
741 };
742 psutil = super.buildPythonPackage {
742 psutil = super.buildPythonPackage {
743 name = "psutil-2.2.1";
743 name = "psutil-2.2.1";
744 buildInputs = with self; [];
744 buildInputs = with self; [];
745 doCheck = false;
745 doCheck = false;
746 propagatedBuildInputs = with self; [];
746 propagatedBuildInputs = with self; [];
747 src = fetchurl {
747 src = fetchurl {
748 url = "https://pypi.python.org/packages/df/47/ee54ef14dd40f8ce831a7581001a5096494dc99fe71586260ca6b531fe86/psutil-2.2.1.tar.gz";
748 url = "https://pypi.python.org/packages/df/47/ee54ef14dd40f8ce831a7581001a5096494dc99fe71586260ca6b531fe86/psutil-2.2.1.tar.gz";
749 md5 = "1a2b58cd9e3a53528bb6148f0c4d5244";
749 md5 = "1a2b58cd9e3a53528bb6148f0c4d5244";
750 };
750 };
751 };
751 };
752 psycopg2 = super.buildPythonPackage {
752 psycopg2 = super.buildPythonPackage {
753 name = "psycopg2-2.6";
753 name = "psycopg2-2.6";
754 buildInputs = with self; [];
754 buildInputs = with self; [];
755 doCheck = false;
755 doCheck = false;
756 propagatedBuildInputs = with self; [];
756 propagatedBuildInputs = with self; [];
757 src = fetchurl {
757 src = fetchurl {
758 url = "https://pypi.python.org/packages/dd/c7/9016ff8ff69da269b1848276eebfb264af5badf6b38caad805426771f04d/psycopg2-2.6.tar.gz";
758 url = "https://pypi.python.org/packages/dd/c7/9016ff8ff69da269b1848276eebfb264af5badf6b38caad805426771f04d/psycopg2-2.6.tar.gz";
759 md5 = "fbbb039a8765d561a1c04969bbae7c74";
759 md5 = "fbbb039a8765d561a1c04969bbae7c74";
760 };
760 };
761 };
761 };
762 py = super.buildPythonPackage {
762 py = super.buildPythonPackage {
763 name = "py-1.4.29";
763 name = "py-1.4.29";
764 buildInputs = with self; [];
764 buildInputs = with self; [];
765 doCheck = false;
765 doCheck = false;
766 propagatedBuildInputs = with self; [];
766 propagatedBuildInputs = with self; [];
767 src = fetchurl {
767 src = fetchurl {
768 url = "https://pypi.python.org/packages/2a/bc/a1a4a332ac10069b8e5e25136a35e08a03f01fd6ab03d819889d79a1fd65/py-1.4.29.tar.gz";
768 url = "https://pypi.python.org/packages/2a/bc/a1a4a332ac10069b8e5e25136a35e08a03f01fd6ab03d819889d79a1fd65/py-1.4.29.tar.gz";
769 md5 = "c28e0accba523a29b35a48bb703fb96c";
769 md5 = "c28e0accba523a29b35a48bb703fb96c";
770 };
770 };
771 };
771 };
772 py-bcrypt = super.buildPythonPackage {
772 py-bcrypt = super.buildPythonPackage {
773 name = "py-bcrypt-0.4";
773 name = "py-bcrypt-0.4";
774 buildInputs = with self; [];
774 buildInputs = with self; [];
775 doCheck = false;
775 doCheck = false;
776 propagatedBuildInputs = with self; [];
776 propagatedBuildInputs = with self; [];
777 src = fetchurl {
777 src = fetchurl {
778 url = "https://pypi.python.org/packages/68/b1/1c3068c5c4d2e35c48b38dcc865301ebfdf45f54507086ac65ced1fd3b3d/py-bcrypt-0.4.tar.gz";
778 url = "https://pypi.python.org/packages/68/b1/1c3068c5c4d2e35c48b38dcc865301ebfdf45f54507086ac65ced1fd3b3d/py-bcrypt-0.4.tar.gz";
779 md5 = "dd8b367d6b716a2ea2e72392525f4e36";
779 md5 = "dd8b367d6b716a2ea2e72392525f4e36";
780 };
780 };
781 };
781 };
782 pycrypto = super.buildPythonPackage {
782 pycrypto = super.buildPythonPackage {
783 name = "pycrypto-2.6.1";
783 name = "pycrypto-2.6.1";
784 buildInputs = with self; [];
784 buildInputs = with self; [];
785 doCheck = false;
785 doCheck = false;
786 propagatedBuildInputs = with self; [];
786 propagatedBuildInputs = with self; [];
787 src = fetchurl {
787 src = fetchurl {
788 url = "https://pypi.python.org/packages/60/db/645aa9af249f059cc3a368b118de33889219e0362141e75d4eaf6f80f163/pycrypto-2.6.1.tar.gz";
788 url = "https://pypi.python.org/packages/60/db/645aa9af249f059cc3a368b118de33889219e0362141e75d4eaf6f80f163/pycrypto-2.6.1.tar.gz";
789 md5 = "55a61a054aa66812daf5161a0d5d7eda";
789 md5 = "55a61a054aa66812daf5161a0d5d7eda";
790 };
790 };
791 };
791 };
792 pycurl = super.buildPythonPackage {
792 pycurl = super.buildPythonPackage {
793 name = "pycurl-7.19.5";
793 name = "pycurl-7.19.5";
794 buildInputs = with self; [];
794 buildInputs = with self; [];
795 doCheck = false;
795 doCheck = false;
796 propagatedBuildInputs = with self; [];
796 propagatedBuildInputs = with self; [];
797 src = fetchurl {
797 src = fetchurl {
798 url = "https://pypi.python.org/packages/6c/48/13bad289ef6f4869b1d8fc11ae54de8cfb3cc4a2eb9f7419c506f763be46/pycurl-7.19.5.tar.gz";
798 url = "https://pypi.python.org/packages/6c/48/13bad289ef6f4869b1d8fc11ae54de8cfb3cc4a2eb9f7419c506f763be46/pycurl-7.19.5.tar.gz";
799 md5 = "47b4eac84118e2606658122104e62072";
799 md5 = "47b4eac84118e2606658122104e62072";
800 };
800 };
801 };
801 };
802 pyflakes = super.buildPythonPackage {
802 pyflakes = super.buildPythonPackage {
803 name = "pyflakes-0.8.1";
803 name = "pyflakes-0.8.1";
804 buildInputs = with self; [];
804 buildInputs = with self; [];
805 doCheck = false;
805 doCheck = false;
806 propagatedBuildInputs = with self; [];
806 propagatedBuildInputs = with self; [];
807 src = fetchurl {
807 src = fetchurl {
808 url = "https://pypi.python.org/packages/75/22/a90ec0252f4f87f3ffb6336504de71fe16a49d69c4538dae2f12b9360a38/pyflakes-0.8.1.tar.gz";
808 url = "https://pypi.python.org/packages/75/22/a90ec0252f4f87f3ffb6336504de71fe16a49d69c4538dae2f12b9360a38/pyflakes-0.8.1.tar.gz";
809 md5 = "905fe91ad14b912807e8fdc2ac2e2c23";
809 md5 = "905fe91ad14b912807e8fdc2ac2e2c23";
810 };
810 };
811 };
811 };
812 pyparsing = super.buildPythonPackage {
812 pyparsing = super.buildPythonPackage {
813 name = "pyparsing-1.5.7";
813 name = "pyparsing-1.5.7";
814 buildInputs = with self; [];
814 buildInputs = with self; [];
815 doCheck = false;
815 doCheck = false;
816 propagatedBuildInputs = with self; [];
816 propagatedBuildInputs = with self; [];
817 src = fetchurl {
817 src = fetchurl {
818 url = "https://pypi.python.org/packages/2e/26/e8fb5b4256a5f5036be7ce115ef8db8d06bc537becfbdc46c6af008314ee/pyparsing-1.5.7.zip";
818 url = "https://pypi.python.org/packages/2e/26/e8fb5b4256a5f5036be7ce115ef8db8d06bc537becfbdc46c6af008314ee/pyparsing-1.5.7.zip";
819 md5 = "b86854857a368d6ccb4d5b6e76d0637f";
819 md5 = "b86854857a368d6ccb4d5b6e76d0637f";
820 };
820 };
821 };
821 };
822 pyramid = super.buildPythonPackage {
822 pyramid = super.buildPythonPackage {
823 name = "pyramid-1.6.1";
823 name = "pyramid-1.6.1";
824 buildInputs = with self; [];
824 buildInputs = with self; [];
825 doCheck = false;
825 doCheck = false;
826 propagatedBuildInputs = with self; [setuptools WebOb repoze.lru zope.interface zope.deprecation venusian translationstring PasteDeploy];
826 propagatedBuildInputs = with self; [setuptools WebOb repoze.lru zope.interface zope.deprecation venusian translationstring PasteDeploy];
827 src = fetchurl {
827 src = fetchurl {
828 url = "https://pypi.python.org/packages/30/b3/fcc4a2a4800cbf21989e00454b5828cf1f7fe35c63e0810b350e56d4c475/pyramid-1.6.1.tar.gz";
828 url = "https://pypi.python.org/packages/30/b3/fcc4a2a4800cbf21989e00454b5828cf1f7fe35c63e0810b350e56d4c475/pyramid-1.6.1.tar.gz";
829 md5 = "b18688ff3cc33efdbb098a35b45dd122";
829 md5 = "b18688ff3cc33efdbb098a35b45dd122";
830 };
830 };
831 };
831 };
832 pyramid-beaker = super.buildPythonPackage {
832 pyramid-beaker = super.buildPythonPackage {
833 name = "pyramid-beaker-0.8";
833 name = "pyramid-beaker-0.8";
834 buildInputs = with self; [];
834 buildInputs = with self; [];
835 doCheck = false;
835 doCheck = false;
836 propagatedBuildInputs = with self; [pyramid Beaker];
836 propagatedBuildInputs = with self; [pyramid Beaker];
837 src = fetchurl {
837 src = fetchurl {
838 url = "https://pypi.python.org/packages/d9/6e/b85426e00fd3d57f4545f74e1c3828552d8700f13ededeef9233f7bca8be/pyramid_beaker-0.8.tar.gz";
838 url = "https://pypi.python.org/packages/d9/6e/b85426e00fd3d57f4545f74e1c3828552d8700f13ededeef9233f7bca8be/pyramid_beaker-0.8.tar.gz";
839 md5 = "22f14be31b06549f80890e2c63a93834";
839 md5 = "22f14be31b06549f80890e2c63a93834";
840 };
840 };
841 };
841 };
842 pyramid-debugtoolbar = super.buildPythonPackage {
842 pyramid-debugtoolbar = super.buildPythonPackage {
843 name = "pyramid-debugtoolbar-2.4.2";
843 name = "pyramid-debugtoolbar-2.4.2";
844 buildInputs = with self; [];
844 buildInputs = with self; [];
845 doCheck = false;
845 doCheck = false;
846 propagatedBuildInputs = with self; [pyramid pyramid-mako repoze.lru Pygments];
846 propagatedBuildInputs = with self; [pyramid pyramid-mako repoze.lru Pygments];
847 src = fetchurl {
847 src = fetchurl {
848 url = "https://pypi.python.org/packages/89/00/ed5426ee41ed747ba3ffd30e8230841a6878286ea67d480b1444d24f06a2/pyramid_debugtoolbar-2.4.2.tar.gz";
848 url = "https://pypi.python.org/packages/89/00/ed5426ee41ed747ba3ffd30e8230841a6878286ea67d480b1444d24f06a2/pyramid_debugtoolbar-2.4.2.tar.gz";
849 md5 = "073ea67086cc4bd5decc3a000853642d";
849 md5 = "073ea67086cc4bd5decc3a000853642d";
850 };
850 };
851 };
851 };
852 pyramid-jinja2 = super.buildPythonPackage {
852 pyramid-jinja2 = super.buildPythonPackage {
853 name = "pyramid-jinja2-2.5";
853 name = "pyramid-jinja2-2.5";
854 buildInputs = with self; [];
854 buildInputs = with self; [];
855 doCheck = false;
855 doCheck = false;
856 propagatedBuildInputs = with self; [pyramid zope.deprecation Jinja2 MarkupSafe];
856 propagatedBuildInputs = with self; [pyramid zope.deprecation Jinja2 MarkupSafe];
857 src = fetchurl {
857 src = fetchurl {
858 url = "https://pypi.python.org/packages/a1/80/595e26ffab7deba7208676b6936b7e5a721875710f982e59899013cae1ed/pyramid_jinja2-2.5.tar.gz";
858 url = "https://pypi.python.org/packages/a1/80/595e26ffab7deba7208676b6936b7e5a721875710f982e59899013cae1ed/pyramid_jinja2-2.5.tar.gz";
859 md5 = "07cb6547204ac5e6f0b22a954ccee928";
859 md5 = "07cb6547204ac5e6f0b22a954ccee928";
860 };
860 };
861 };
861 };
862 pyramid-mako = super.buildPythonPackage {
862 pyramid-mako = super.buildPythonPackage {
863 name = "pyramid-mako-1.0.2";
863 name = "pyramid-mako-1.0.2";
864 buildInputs = with self; [];
864 buildInputs = with self; [];
865 doCheck = false;
865 doCheck = false;
866 propagatedBuildInputs = with self; [pyramid Mako];
866 propagatedBuildInputs = with self; [pyramid Mako];
867 src = fetchurl {
867 src = fetchurl {
868 url = "https://pypi.python.org/packages/f1/92/7e69bcf09676d286a71cb3bbb887b16595b96f9ba7adbdc239ffdd4b1eb9/pyramid_mako-1.0.2.tar.gz";
868 url = "https://pypi.python.org/packages/f1/92/7e69bcf09676d286a71cb3bbb887b16595b96f9ba7adbdc239ffdd4b1eb9/pyramid_mako-1.0.2.tar.gz";
869 md5 = "ee25343a97eb76bd90abdc2a774eb48a";
869 md5 = "ee25343a97eb76bd90abdc2a774eb48a";
870 };
870 };
871 };
871 };
872 pysqlite = super.buildPythonPackage {
872 pysqlite = super.buildPythonPackage {
873 name = "pysqlite-2.6.3";
873 name = "pysqlite-2.6.3";
874 buildInputs = with self; [];
874 buildInputs = with self; [];
875 doCheck = false;
875 doCheck = false;
876 propagatedBuildInputs = with self; [];
876 propagatedBuildInputs = with self; [];
877 src = fetchurl {
877 src = fetchurl {
878 url = "https://pypi.python.org/packages/5c/a6/1c429cd4c8069cf4bfbd0eb4d592b3f4042155a8202df83d7e9b93aa3dc2/pysqlite-2.6.3.tar.gz";
878 url = "https://pypi.python.org/packages/5c/a6/1c429cd4c8069cf4bfbd0eb4d592b3f4042155a8202df83d7e9b93aa3dc2/pysqlite-2.6.3.tar.gz";
879 md5 = "7ff1cedee74646b50117acff87aa1cfa";
879 md5 = "7ff1cedee74646b50117acff87aa1cfa";
880 };
880 };
881 };
881 };
882 pytest = super.buildPythonPackage {
882 pytest = super.buildPythonPackage {
883 name = "pytest-2.8.5";
883 name = "pytest-2.8.5";
884 buildInputs = with self; [];
884 buildInputs = with self; [];
885 doCheck = false;
885 doCheck = false;
886 propagatedBuildInputs = with self; [py];
886 propagatedBuildInputs = with self; [py];
887 src = fetchurl {
887 src = fetchurl {
888 url = "https://pypi.python.org/packages/b1/3d/d7ea9b0c51e0cacded856e49859f0a13452747491e842c236bbab3714afe/pytest-2.8.5.zip";
888 url = "https://pypi.python.org/packages/b1/3d/d7ea9b0c51e0cacded856e49859f0a13452747491e842c236bbab3714afe/pytest-2.8.5.zip";
889 md5 = "8493b06f700862f1294298d6c1b715a9";
889 md5 = "8493b06f700862f1294298d6c1b715a9";
890 };
890 };
891 };
891 };
892 pytest-catchlog = super.buildPythonPackage {
892 pytest-catchlog = super.buildPythonPackage {
893 name = "pytest-catchlog-1.2.2";
893 name = "pytest-catchlog-1.2.2";
894 buildInputs = with self; [];
894 buildInputs = with self; [];
895 doCheck = false;
895 doCheck = false;
896 propagatedBuildInputs = with self; [py pytest];
896 propagatedBuildInputs = with self; [py pytest];
897 src = fetchurl {
897 src = fetchurl {
898 url = "https://pypi.python.org/packages/f2/2b/2faccdb1a978fab9dd0bf31cca9f6847fbe9184a0bdcc3011ac41dd44191/pytest-catchlog-1.2.2.zip";
898 url = "https://pypi.python.org/packages/f2/2b/2faccdb1a978fab9dd0bf31cca9f6847fbe9184a0bdcc3011ac41dd44191/pytest-catchlog-1.2.2.zip";
899 md5 = "09d890c54c7456c818102b7ff8c182c8";
899 md5 = "09d890c54c7456c818102b7ff8c182c8";
900 };
900 };
901 };
901 };
902 pytest-cov = super.buildPythonPackage {
902 pytest-cov = super.buildPythonPackage {
903 name = "pytest-cov-1.8.1";
903 name = "pytest-cov-1.8.1";
904 buildInputs = with self; [];
904 buildInputs = with self; [];
905 doCheck = false;
905 doCheck = false;
906 propagatedBuildInputs = with self; [py pytest coverage cov-core];
906 propagatedBuildInputs = with self; [py pytest coverage cov-core];
907 src = fetchurl {
907 src = fetchurl {
908 url = "https://pypi.python.org/packages/11/4b/b04646e97f1721878eb21e9f779102d84dd044d324382263b1770a3e4838/pytest-cov-1.8.1.tar.gz";
908 url = "https://pypi.python.org/packages/11/4b/b04646e97f1721878eb21e9f779102d84dd044d324382263b1770a3e4838/pytest-cov-1.8.1.tar.gz";
909 md5 = "76c778afa2494088270348be42d759fc";
909 md5 = "76c778afa2494088270348be42d759fc";
910 };
910 };
911 };
911 };
912 pytest-profiling = super.buildPythonPackage {
912 pytest-profiling = super.buildPythonPackage {
913 name = "pytest-profiling-1.0.1";
913 name = "pytest-profiling-1.0.1";
914 buildInputs = with self; [];
914 buildInputs = with self; [];
915 doCheck = false;
915 doCheck = false;
916 propagatedBuildInputs = with self; [six pytest gprof2dot];
916 propagatedBuildInputs = with self; [six pytest gprof2dot];
917 src = fetchurl {
917 src = fetchurl {
918 url = "https://pypi.python.org/packages/d8/67/8ffab73406e22870e07fa4dc8dce1d7689b26dba8efd00161c9b6fc01ec0/pytest-profiling-1.0.1.tar.gz";
918 url = "https://pypi.python.org/packages/d8/67/8ffab73406e22870e07fa4dc8dce1d7689b26dba8efd00161c9b6fc01ec0/pytest-profiling-1.0.1.tar.gz";
919 md5 = "354404eb5b3fd4dc5eb7fffbb3d9b68b";
919 md5 = "354404eb5b3fd4dc5eb7fffbb3d9b68b";
920 };
920 };
921 };
921 };
922 pytest-runner = super.buildPythonPackage {
922 pytest-runner = super.buildPythonPackage {
923 name = "pytest-runner-2.7.1";
923 name = "pytest-runner-2.7.1";
924 buildInputs = with self; [];
924 buildInputs = with self; [];
925 doCheck = false;
925 doCheck = false;
926 propagatedBuildInputs = with self; [];
926 propagatedBuildInputs = with self; [];
927 src = fetchurl {
927 src = fetchurl {
928 url = "https://pypi.python.org/packages/99/6b/c4ff4418d3424d4475b7af60724fd4a5cdd91ed8e489dc9443281f0052bc/pytest-runner-2.7.1.tar.gz";
928 url = "https://pypi.python.org/packages/99/6b/c4ff4418d3424d4475b7af60724fd4a5cdd91ed8e489dc9443281f0052bc/pytest-runner-2.7.1.tar.gz";
929 md5 = "e56f0bc8d79a6bd91772b44ef4215c7e";
929 md5 = "e56f0bc8d79a6bd91772b44ef4215c7e";
930 };
930 };
931 };
931 };
932 pytest-timeout = super.buildPythonPackage {
932 pytest-timeout = super.buildPythonPackage {
933 name = "pytest-timeout-0.4";
933 name = "pytest-timeout-0.4";
934 buildInputs = with self; [];
934 buildInputs = with self; [];
935 doCheck = false;
935 doCheck = false;
936 propagatedBuildInputs = with self; [pytest];
936 propagatedBuildInputs = with self; [pytest];
937 src = fetchurl {
937 src = fetchurl {
938 url = "https://pypi.python.org/packages/24/48/5f6bd4b8026a26e1dd427243d560a29a0f1b24a5c7cffca4bf049a7bb65b/pytest-timeout-0.4.tar.gz";
938 url = "https://pypi.python.org/packages/24/48/5f6bd4b8026a26e1dd427243d560a29a0f1b24a5c7cffca4bf049a7bb65b/pytest-timeout-0.4.tar.gz";
939 md5 = "03b28aff69cbbfb959ed35ade5fde262";
939 md5 = "03b28aff69cbbfb959ed35ade5fde262";
940 };
940 };
941 };
941 };
942 python-dateutil = super.buildPythonPackage {
942 python-dateutil = super.buildPythonPackage {
943 name = "python-dateutil-1.5";
943 name = "python-dateutil-1.5";
944 buildInputs = with self; [];
944 buildInputs = with self; [];
945 doCheck = false;
945 doCheck = false;
946 propagatedBuildInputs = with self; [];
946 propagatedBuildInputs = with self; [];
947 src = fetchurl {
947 src = fetchurl {
948 url = "https://pypi.python.org/packages/b4/7c/df59c89a753eb33c7c44e1dd42de0e9bc2ccdd5a4d576e0bfad97cc280cb/python-dateutil-1.5.tar.gz";
948 url = "https://pypi.python.org/packages/b4/7c/df59c89a753eb33c7c44e1dd42de0e9bc2ccdd5a4d576e0bfad97cc280cb/python-dateutil-1.5.tar.gz";
949 md5 = "0dcb1de5e5cad69490a3b6ab63f0cfa5";
949 md5 = "0dcb1de5e5cad69490a3b6ab63f0cfa5";
950 };
950 };
951 };
951 };
952 python-editor = super.buildPythonPackage {
952 python-editor = super.buildPythonPackage {
953 name = "python-editor-1.0";
953 name = "python-editor-1.0.1";
954 buildInputs = with self; [];
954 buildInputs = with self; [];
955 doCheck = false;
955 doCheck = false;
956 propagatedBuildInputs = with self; [];
956 propagatedBuildInputs = with self; [];
957 src = fetchurl {
957 src = fetchurl {
958 url = "https://pypi.python.org/packages/f5/d9/01eb441489c8bd2adb33ee4f3aea299a3db531a584cb39c57a0ecf516d9c/python-editor-1.0.tar.gz";
958 url = "https://pypi.python.org/packages/2b/c0/df7b87d5cf016f82eab3b05cd35f53287c1178ad8c42bfb6fa61b89b22f6/python-editor-1.0.1.tar.gz";
959 md5 = "a5ead611360b17b52507297d8590b4e8";
959 md5 = "e1fa63535b40e022fa4fd646fd8b511a";
960 };
960 };
961 };
961 };
962 python-ldap = super.buildPythonPackage {
962 python-ldap = super.buildPythonPackage {
963 name = "python-ldap-2.4.19";
963 name = "python-ldap-2.4.19";
964 buildInputs = with self; [];
964 buildInputs = with self; [];
965 doCheck = false;
965 doCheck = false;
966 propagatedBuildInputs = with self; [setuptools];
966 propagatedBuildInputs = with self; [setuptools];
967 src = fetchurl {
967 src = fetchurl {
968 url = "https://pypi.python.org/packages/42/81/1b64838c82e64f14d4e246ff00b52e650a35c012551b891ada2b85d40737/python-ldap-2.4.19.tar.gz";
968 url = "https://pypi.python.org/packages/42/81/1b64838c82e64f14d4e246ff00b52e650a35c012551b891ada2b85d40737/python-ldap-2.4.19.tar.gz";
969 md5 = "b941bf31d09739492aa19ef679e94ae3";
969 md5 = "b941bf31d09739492aa19ef679e94ae3";
970 };
970 };
971 };
971 };
972 python-memcached = super.buildPythonPackage {
972 python-memcached = super.buildPythonPackage {
973 name = "python-memcached-1.57";
973 name = "python-memcached-1.57";
974 buildInputs = with self; [];
974 buildInputs = with self; [];
975 doCheck = false;
975 doCheck = false;
976 propagatedBuildInputs = with self; [six];
976 propagatedBuildInputs = with self; [six];
977 src = fetchurl {
977 src = fetchurl {
978 url = "https://pypi.python.org/packages/52/9d/eebc0dcbc5c7c66840ad207dfc1baa376dadb74912484bff73819cce01e6/python-memcached-1.57.tar.gz";
978 url = "https://pypi.python.org/packages/52/9d/eebc0dcbc5c7c66840ad207dfc1baa376dadb74912484bff73819cce01e6/python-memcached-1.57.tar.gz";
979 md5 = "de21f64b42b2d961f3d4ad7beb5468a1";
979 md5 = "de21f64b42b2d961f3d4ad7beb5468a1";
980 };
980 };
981 };
981 };
982 python-pam = super.buildPythonPackage {
982 python-pam = super.buildPythonPackage {
983 name = "python-pam-1.8.2";
983 name = "python-pam-1.8.2";
984 buildInputs = with self; [];
984 buildInputs = with self; [];
985 doCheck = false;
985 doCheck = false;
986 propagatedBuildInputs = with self; [];
986 propagatedBuildInputs = with self; [];
987 src = fetchurl {
987 src = fetchurl {
988 url = "https://pypi.python.org/packages/de/8c/f8f5d38b4f26893af267ea0b39023d4951705ab0413a39e0cf7cf4900505/python-pam-1.8.2.tar.gz";
988 url = "https://pypi.python.org/packages/de/8c/f8f5d38b4f26893af267ea0b39023d4951705ab0413a39e0cf7cf4900505/python-pam-1.8.2.tar.gz";
989 md5 = "db71b6b999246fb05d78ecfbe166629d";
989 md5 = "db71b6b999246fb05d78ecfbe166629d";
990 };
990 };
991 };
991 };
992 pytz = super.buildPythonPackage {
992 pytz = super.buildPythonPackage {
993 name = "pytz-2015.4";
993 name = "pytz-2015.4";
994 buildInputs = with self; [];
994 buildInputs = with self; [];
995 doCheck = false;
995 doCheck = false;
996 propagatedBuildInputs = with self; [];
996 propagatedBuildInputs = with self; [];
997 src = fetchurl {
997 src = fetchurl {
998 url = "https://pypi.python.org/packages/7e/1a/f43b5c92df7b156822030fed151327ea096bcf417e45acc23bd1df43472f/pytz-2015.4.zip";
998 url = "https://pypi.python.org/packages/7e/1a/f43b5c92df7b156822030fed151327ea096bcf417e45acc23bd1df43472f/pytz-2015.4.zip";
999 md5 = "233f2a2b370d03f9b5911700cc9ebf3c";
999 md5 = "233f2a2b370d03f9b5911700cc9ebf3c";
1000 };
1000 };
1001 };
1001 };
1002 pyzmq = super.buildPythonPackage {
1002 pyzmq = super.buildPythonPackage {
1003 name = "pyzmq-14.6.0";
1003 name = "pyzmq-14.6.0";
1004 buildInputs = with self; [];
1004 buildInputs = with self; [];
1005 doCheck = false;
1005 doCheck = false;
1006 propagatedBuildInputs = with self; [];
1006 propagatedBuildInputs = with self; [];
1007 src = fetchurl {
1007 src = fetchurl {
1008 url = "https://pypi.python.org/packages/8a/3b/5463d5a9d712cd8bbdac335daece0d69f6a6792da4e3dd89956c0db4e4e6/pyzmq-14.6.0.tar.gz";
1008 url = "https://pypi.python.org/packages/8a/3b/5463d5a9d712cd8bbdac335daece0d69f6a6792da4e3dd89956c0db4e4e6/pyzmq-14.6.0.tar.gz";
1009 md5 = "395b5de95a931afa5b14c9349a5b8024";
1009 md5 = "395b5de95a931afa5b14c9349a5b8024";
1010 };
1010 };
1011 };
1011 };
1012 recaptcha-client = super.buildPythonPackage {
1012 recaptcha-client = super.buildPythonPackage {
1013 name = "recaptcha-client-1.0.6";
1013 name = "recaptcha-client-1.0.6";
1014 buildInputs = with self; [];
1014 buildInputs = with self; [];
1015 doCheck = false;
1015 doCheck = false;
1016 propagatedBuildInputs = with self; [];
1016 propagatedBuildInputs = with self; [];
1017 src = fetchurl {
1017 src = fetchurl {
1018 url = "https://pypi.python.org/packages/0a/ea/5f2fbbfd894bdac1c68ef8d92019066cfcf9fbff5fe3d728d2b5c25c8db4/recaptcha-client-1.0.6.tar.gz";
1018 url = "https://pypi.python.org/packages/0a/ea/5f2fbbfd894bdac1c68ef8d92019066cfcf9fbff5fe3d728d2b5c25c8db4/recaptcha-client-1.0.6.tar.gz";
1019 md5 = "74228180f7e1fb76c4d7089160b0d919";
1019 md5 = "74228180f7e1fb76c4d7089160b0d919";
1020 };
1020 };
1021 };
1021 };
1022 repoze.lru = super.buildPythonPackage {
1022 repoze.lru = super.buildPythonPackage {
1023 name = "repoze.lru-0.6";
1023 name = "repoze.lru-0.6";
1024 buildInputs = with self; [];
1024 buildInputs = with self; [];
1025 doCheck = false;
1025 doCheck = false;
1026 propagatedBuildInputs = with self; [];
1026 propagatedBuildInputs = with self; [];
1027 src = fetchurl {
1027 src = fetchurl {
1028 url = "https://pypi.python.org/packages/6e/1e/aa15cc90217e086dc8769872c8778b409812ff036bf021b15795638939e4/repoze.lru-0.6.tar.gz";
1028 url = "https://pypi.python.org/packages/6e/1e/aa15cc90217e086dc8769872c8778b409812ff036bf021b15795638939e4/repoze.lru-0.6.tar.gz";
1029 md5 = "2c3b64b17a8e18b405f55d46173e14dd";
1029 md5 = "2c3b64b17a8e18b405f55d46173e14dd";
1030 };
1030 };
1031 };
1031 };
1032 requests = super.buildPythonPackage {
1032 requests = super.buildPythonPackage {
1033 name = "requests-2.9.1";
1033 name = "requests-2.9.1";
1034 buildInputs = with self; [];
1034 buildInputs = with self; [];
1035 doCheck = false;
1035 doCheck = false;
1036 propagatedBuildInputs = with self; [];
1036 propagatedBuildInputs = with self; [];
1037 src = fetchurl {
1037 src = fetchurl {
1038 url = "https://pypi.python.org/packages/f9/6d/07c44fb1ebe04d069459a189e7dab9e4abfe9432adcd4477367c25332748/requests-2.9.1.tar.gz";
1038 url = "https://pypi.python.org/packages/f9/6d/07c44fb1ebe04d069459a189e7dab9e4abfe9432adcd4477367c25332748/requests-2.9.1.tar.gz";
1039 md5 = "0b7f480d19012ec52bab78292efd976d";
1039 md5 = "0b7f480d19012ec52bab78292efd976d";
1040 };
1040 };
1041 };
1041 };
1042 rhodecode-enterprise-ce = super.buildPythonPackage {
1042 rhodecode-enterprise-ce = super.buildPythonPackage {
1043 name = "rhodecode-enterprise-ce-4.1.0";
1043 name = "rhodecode-enterprise-ce-4.1.1";
1044 buildInputs = with self; [WebTest configobj cssselect flake8 lxml mock pytest pytest-cov pytest-runner];
1044 buildInputs = with self; [WebTest configobj cssselect flake8 lxml mock pytest pytest-cov pytest-runner];
1045 doCheck = true;
1045 doCheck = true;
1046 propagatedBuildInputs = with self; [Babel Beaker FormEncode Mako Markdown MarkupSafe MySQL-python Paste PasteDeploy PasteScript Pygments Pylons Pyro4 Routes SQLAlchemy Tempita URLObject WebError WebHelpers WebHelpers2 WebOb WebTest Whoosh alembic amqplib anyjson appenlight-client authomatic backport-ipaddress celery colander decorator docutils gunicorn infrae.cache ipython iso8601 kombu msgpack-python packaging psycopg2 pycrypto pycurl pyparsing pyramid pyramid-debugtoolbar pyramid-mako pyramid-beaker pysqlite python-dateutil python-ldap python-memcached python-pam recaptcha-client repoze.lru requests simplejson waitress zope.cachedescriptors psutil py-bcrypt];
1046 propagatedBuildInputs = with self; [Babel Beaker FormEncode Mako Markdown MarkupSafe MySQL-python Paste PasteDeploy PasteScript Pygments Pylons Pyro4 Routes SQLAlchemy Tempita URLObject WebError WebHelpers WebHelpers2 WebOb WebTest Whoosh alembic amqplib anyjson appenlight-client authomatic backport-ipaddress celery colander decorator docutils gunicorn infrae.cache ipython iso8601 kombu msgpack-python packaging psycopg2 pycrypto pycurl pyparsing pyramid pyramid-debugtoolbar pyramid-mako pyramid-beaker pysqlite python-dateutil python-ldap python-memcached python-pam recaptcha-client repoze.lru requests simplejson waitress zope.cachedescriptors psutil py-bcrypt];
1047 src = ./.;
1047 src = ./.;
1048 };
1048 };
1049 rhodecode-tools = super.buildPythonPackage {
1049 rhodecode-tools = super.buildPythonPackage {
1050 name = "rhodecode-tools-0.8.3";
1050 name = "rhodecode-tools-0.8.3";
1051 buildInputs = with self; [];
1051 buildInputs = with self; [];
1052 doCheck = false;
1052 doCheck = false;
1053 propagatedBuildInputs = with self; [click future six Mako MarkupSafe requests Whoosh elasticsearch elasticsearch-dsl];
1053 propagatedBuildInputs = with self; [click future six Mako MarkupSafe requests Whoosh elasticsearch elasticsearch-dsl];
1054 src = fetchurl {
1054 src = fetchurl {
1055 url = "https://code.rhodecode.com/rhodecode-tools-ce/archive/v0.8.3.zip";
1055 url = "https://code.rhodecode.com/rhodecode-tools-ce/archive/v0.8.3.zip";
1056 md5 = "9acdfd71b8ddf4056057065f37ab9ccb";
1056 md5 = "9acdfd71b8ddf4056057065f37ab9ccb";
1057 };
1057 };
1058 };
1058 };
1059 serpent = super.buildPythonPackage {
1059 serpent = super.buildPythonPackage {
1060 name = "serpent-1.12";
1060 name = "serpent-1.12";
1061 buildInputs = with self; [];
1061 buildInputs = with self; [];
1062 doCheck = false;
1062 doCheck = false;
1063 propagatedBuildInputs = with self; [];
1063 propagatedBuildInputs = with self; [];
1064 src = fetchurl {
1064 src = fetchurl {
1065 url = "https://pypi.python.org/packages/3b/19/1e0e83b47c09edaef8398655088036e7e67386b5c48770218ebb339fbbd5/serpent-1.12.tar.gz";
1065 url = "https://pypi.python.org/packages/3b/19/1e0e83b47c09edaef8398655088036e7e67386b5c48770218ebb339fbbd5/serpent-1.12.tar.gz";
1066 md5 = "05869ac7b062828b34f8f927f0457b65";
1066 md5 = "05869ac7b062828b34f8f927f0457b65";
1067 };
1067 };
1068 };
1068 };
1069 setproctitle = super.buildPythonPackage {
1069 setproctitle = super.buildPythonPackage {
1070 name = "setproctitle-1.1.8";
1070 name = "setproctitle-1.1.8";
1071 buildInputs = with self; [];
1071 buildInputs = with self; [];
1072 doCheck = false;
1072 doCheck = false;
1073 propagatedBuildInputs = with self; [];
1073 propagatedBuildInputs = with self; [];
1074 src = fetchurl {
1074 src = fetchurl {
1075 url = "https://pypi.python.org/packages/33/c3/ad367a4f4f1ca90468863ae727ac62f6edb558fc09a003d344a02cfc6ea6/setproctitle-1.1.8.tar.gz";
1075 url = "https://pypi.python.org/packages/33/c3/ad367a4f4f1ca90468863ae727ac62f6edb558fc09a003d344a02cfc6ea6/setproctitle-1.1.8.tar.gz";
1076 md5 = "728f4c8c6031bbe56083a48594027edd";
1076 md5 = "728f4c8c6031bbe56083a48594027edd";
1077 };
1077 };
1078 };
1078 };
1079 setuptools = super.buildPythonPackage {
1079 setuptools = super.buildPythonPackage {
1080 name = "setuptools-20.8.1";
1080 name = "setuptools-20.8.1";
1081 buildInputs = with self; [];
1081 buildInputs = with self; [];
1082 doCheck = false;
1082 doCheck = false;
1083 propagatedBuildInputs = with self; [];
1083 propagatedBuildInputs = with self; [];
1084 src = fetchurl {
1084 src = fetchurl {
1085 url = "https://pypi.python.org/packages/c4/19/c1bdc88b53da654df43770f941079dbab4e4788c2dcb5658fb86259894c7/setuptools-20.8.1.zip";
1085 url = "https://pypi.python.org/packages/c4/19/c1bdc88b53da654df43770f941079dbab4e4788c2dcb5658fb86259894c7/setuptools-20.8.1.zip";
1086 md5 = "fe58a5cac0df20bb83942b252a4b0543";
1086 md5 = "fe58a5cac0df20bb83942b252a4b0543";
1087 };
1087 };
1088 };
1088 };
1089 setuptools-scm = super.buildPythonPackage {
1089 setuptools-scm = super.buildPythonPackage {
1090 name = "setuptools-scm-1.11.0";
1090 name = "setuptools-scm-1.11.0";
1091 buildInputs = with self; [];
1091 buildInputs = with self; [];
1092 doCheck = false;
1092 doCheck = false;
1093 propagatedBuildInputs = with self; [];
1093 propagatedBuildInputs = with self; [];
1094 src = fetchurl {
1094 src = fetchurl {
1095 url = "https://pypi.python.org/packages/cd/5f/e3a038292358058d83d764a47d09114aa5a8003ed4529518f9e580f1a94f/setuptools_scm-1.11.0.tar.gz";
1095 url = "https://pypi.python.org/packages/cd/5f/e3a038292358058d83d764a47d09114aa5a8003ed4529518f9e580f1a94f/setuptools_scm-1.11.0.tar.gz";
1096 md5 = "4c5c896ba52e134bbc3507bac6400087";
1096 md5 = "4c5c896ba52e134bbc3507bac6400087";
1097 };
1097 };
1098 };
1098 };
1099 simplejson = super.buildPythonPackage {
1099 simplejson = super.buildPythonPackage {
1100 name = "simplejson-3.7.2";
1100 name = "simplejson-3.7.2";
1101 buildInputs = with self; [];
1101 buildInputs = with self; [];
1102 doCheck = false;
1102 doCheck = false;
1103 propagatedBuildInputs = with self; [];
1103 propagatedBuildInputs = with self; [];
1104 src = fetchurl {
1104 src = fetchurl {
1105 url = "https://pypi.python.org/packages/6d/89/7f13f099344eea9d6722779a1f165087cb559598107844b1ac5dbd831fb1/simplejson-3.7.2.tar.gz";
1105 url = "https://pypi.python.org/packages/6d/89/7f13f099344eea9d6722779a1f165087cb559598107844b1ac5dbd831fb1/simplejson-3.7.2.tar.gz";
1106 md5 = "a5fc7d05d4cb38492285553def5d4b46";
1106 md5 = "a5fc7d05d4cb38492285553def5d4b46";
1107 };
1107 };
1108 };
1108 };
1109 six = super.buildPythonPackage {
1109 six = super.buildPythonPackage {
1110 name = "six-1.9.0";
1110 name = "six-1.9.0";
1111 buildInputs = with self; [];
1111 buildInputs = with self; [];
1112 doCheck = false;
1112 doCheck = false;
1113 propagatedBuildInputs = with self; [];
1113 propagatedBuildInputs = with self; [];
1114 src = fetchurl {
1114 src = fetchurl {
1115 url = "https://pypi.python.org/packages/16/64/1dc5e5976b17466fd7d712e59cbe9fb1e18bec153109e5ba3ed6c9102f1a/six-1.9.0.tar.gz";
1115 url = "https://pypi.python.org/packages/16/64/1dc5e5976b17466fd7d712e59cbe9fb1e18bec153109e5ba3ed6c9102f1a/six-1.9.0.tar.gz";
1116 md5 = "476881ef4012262dfc8adc645ee786c4";
1116 md5 = "476881ef4012262dfc8adc645ee786c4";
1117 };
1117 };
1118 };
1118 };
1119 subprocess32 = super.buildPythonPackage {
1119 subprocess32 = super.buildPythonPackage {
1120 name = "subprocess32-3.2.6";
1120 name = "subprocess32-3.2.6";
1121 buildInputs = with self; [];
1121 buildInputs = with self; [];
1122 doCheck = false;
1122 doCheck = false;
1123 propagatedBuildInputs = with self; [];
1123 propagatedBuildInputs = with self; [];
1124 src = fetchurl {
1124 src = fetchurl {
1125 url = "https://pypi.python.org/packages/28/8d/33ccbff51053f59ae6c357310cac0e79246bbed1d345ecc6188b176d72c3/subprocess32-3.2.6.tar.gz";
1125 url = "https://pypi.python.org/packages/28/8d/33ccbff51053f59ae6c357310cac0e79246bbed1d345ecc6188b176d72c3/subprocess32-3.2.6.tar.gz";
1126 md5 = "754c5ab9f533e764f931136974b618f1";
1126 md5 = "754c5ab9f533e764f931136974b618f1";
1127 };
1127 };
1128 };
1128 };
1129 supervisor = super.buildPythonPackage {
1129 supervisor = super.buildPythonPackage {
1130 name = "supervisor-3.1.3";
1130 name = "supervisor-3.1.3";
1131 buildInputs = with self; [];
1131 buildInputs = with self; [];
1132 doCheck = false;
1132 doCheck = false;
1133 propagatedBuildInputs = with self; [meld3];
1133 propagatedBuildInputs = with self; [meld3];
1134 src = fetchurl {
1134 src = fetchurl {
1135 url = "https://pypi.python.org/packages/a6/41/65ad5bd66230b173eb4d0b8810230f3a9c59ef52ae066e540b6b99895db7/supervisor-3.1.3.tar.gz";
1135 url = "https://pypi.python.org/packages/a6/41/65ad5bd66230b173eb4d0b8810230f3a9c59ef52ae066e540b6b99895db7/supervisor-3.1.3.tar.gz";
1136 md5 = "aad263c4fbc070de63dd354864d5e552";
1136 md5 = "aad263c4fbc070de63dd354864d5e552";
1137 };
1137 };
1138 };
1138 };
1139 transifex-client = super.buildPythonPackage {
1139 transifex-client = super.buildPythonPackage {
1140 name = "transifex-client-0.10";
1140 name = "transifex-client-0.10";
1141 buildInputs = with self; [];
1141 buildInputs = with self; [];
1142 doCheck = false;
1142 doCheck = false;
1143 propagatedBuildInputs = with self; [];
1143 propagatedBuildInputs = with self; [];
1144 src = fetchurl {
1144 src = fetchurl {
1145 url = "https://pypi.python.org/packages/f3/4e/7b925192aee656fb3e04fa6381c8b3dc40198047c3b4a356f6cfd642c809/transifex-client-0.10.tar.gz";
1145 url = "https://pypi.python.org/packages/f3/4e/7b925192aee656fb3e04fa6381c8b3dc40198047c3b4a356f6cfd642c809/transifex-client-0.10.tar.gz";
1146 md5 = "5549538d84b8eede6b254cd81ae024fa";
1146 md5 = "5549538d84b8eede6b254cd81ae024fa";
1147 };
1147 };
1148 };
1148 };
1149 translationstring = super.buildPythonPackage {
1149 translationstring = super.buildPythonPackage {
1150 name = "translationstring-1.3";
1150 name = "translationstring-1.3";
1151 buildInputs = with self; [];
1151 buildInputs = with self; [];
1152 doCheck = false;
1152 doCheck = false;
1153 propagatedBuildInputs = with self; [];
1153 propagatedBuildInputs = with self; [];
1154 src = fetchurl {
1154 src = fetchurl {
1155 url = "https://pypi.python.org/packages/5e/eb/bee578cc150b44c653b63f5ebe258b5d0d812ddac12497e5f80fcad5d0b4/translationstring-1.3.tar.gz";
1155 url = "https://pypi.python.org/packages/5e/eb/bee578cc150b44c653b63f5ebe258b5d0d812ddac12497e5f80fcad5d0b4/translationstring-1.3.tar.gz";
1156 md5 = "a4b62e0f3c189c783a1685b3027f7c90";
1156 md5 = "a4b62e0f3c189c783a1685b3027f7c90";
1157 };
1157 };
1158 };
1158 };
1159 trollius = super.buildPythonPackage {
1159 trollius = super.buildPythonPackage {
1160 name = "trollius-1.0.4";
1160 name = "trollius-1.0.4";
1161 buildInputs = with self; [];
1161 buildInputs = with self; [];
1162 doCheck = false;
1162 doCheck = false;
1163 propagatedBuildInputs = with self; [futures];
1163 propagatedBuildInputs = with self; [futures];
1164 src = fetchurl {
1164 src = fetchurl {
1165 url = "https://pypi.python.org/packages/aa/e6/4141db437f55e6ee7a3fb69663239e3fde7841a811b4bef293145ad6c836/trollius-1.0.4.tar.gz";
1165 url = "https://pypi.python.org/packages/aa/e6/4141db437f55e6ee7a3fb69663239e3fde7841a811b4bef293145ad6c836/trollius-1.0.4.tar.gz";
1166 md5 = "3631a464d49d0cbfd30ab2918ef2b783";
1166 md5 = "3631a464d49d0cbfd30ab2918ef2b783";
1167 };
1167 };
1168 };
1168 };
1169 uWSGI = super.buildPythonPackage {
1169 uWSGI = super.buildPythonPackage {
1170 name = "uWSGI-2.0.11.2";
1170 name = "uWSGI-2.0.11.2";
1171 buildInputs = with self; [];
1171 buildInputs = with self; [];
1172 doCheck = false;
1172 doCheck = false;
1173 propagatedBuildInputs = with self; [];
1173 propagatedBuildInputs = with self; [];
1174 src = fetchurl {
1174 src = fetchurl {
1175 url = "https://pypi.python.org/packages/9b/78/918db0cfab0546afa580c1e565209c49aaf1476bbfe491314eadbe47c556/uwsgi-2.0.11.2.tar.gz";
1175 url = "https://pypi.python.org/packages/9b/78/918db0cfab0546afa580c1e565209c49aaf1476bbfe491314eadbe47c556/uwsgi-2.0.11.2.tar.gz";
1176 md5 = "1f02dcbee7f6f61de4b1fd68350cf16f";
1176 md5 = "1f02dcbee7f6f61de4b1fd68350cf16f";
1177 };
1177 };
1178 };
1178 };
1179 urllib3 = super.buildPythonPackage {
1179 urllib3 = super.buildPythonPackage {
1180 name = "urllib3-1.15.1";
1180 name = "urllib3-1.16";
1181 buildInputs = with self; [];
1181 buildInputs = with self; [];
1182 doCheck = false;
1182 doCheck = false;
1183 propagatedBuildInputs = with self; [];
1183 propagatedBuildInputs = with self; [];
1184 src = fetchurl {
1184 src = fetchurl {
1185 url = "https://pypi.python.org/packages/49/26/a7d12ea00cb4b9fa1e13b5980e5a04a1fe7c477eb8f657ce0b757a7a497d/urllib3-1.15.1.tar.gz";
1185 url = "https://pypi.python.org/packages/3b/f0/e763169124e3f5db0926bc3dbfcd580a105f9ca44cf5d8e6c7a803c9f6b5/urllib3-1.16.tar.gz";
1186 md5 = "5be254b0dbb55d1307ede99e1895c8dd";
1186 md5 = "fcaab1c5385c57deeb7053d3d7d81d59";
1187 };
1187 };
1188 };
1188 };
1189 venusian = super.buildPythonPackage {
1189 venusian = super.buildPythonPackage {
1190 name = "venusian-1.0";
1190 name = "venusian-1.0";
1191 buildInputs = with self; [];
1191 buildInputs = with self; [];
1192 doCheck = false;
1192 doCheck = false;
1193 propagatedBuildInputs = with self; [];
1193 propagatedBuildInputs = with self; [];
1194 src = fetchurl {
1194 src = fetchurl {
1195 url = "https://pypi.python.org/packages/86/20/1948e0dfc4930ddde3da8c33612f6a5717c0b4bc28f591a5c5cf014dd390/venusian-1.0.tar.gz";
1195 url = "https://pypi.python.org/packages/86/20/1948e0dfc4930ddde3da8c33612f6a5717c0b4bc28f591a5c5cf014dd390/venusian-1.0.tar.gz";
1196 md5 = "dccf2eafb7113759d60c86faf5538756";
1196 md5 = "dccf2eafb7113759d60c86faf5538756";
1197 };
1197 };
1198 };
1198 };
1199 waitress = super.buildPythonPackage {
1199 waitress = super.buildPythonPackage {
1200 name = "waitress-0.8.9";
1200 name = "waitress-0.8.9";
1201 buildInputs = with self; [];
1201 buildInputs = with self; [];
1202 doCheck = false;
1202 doCheck = false;
1203 propagatedBuildInputs = with self; [setuptools];
1203 propagatedBuildInputs = with self; [setuptools];
1204 src = fetchurl {
1204 src = fetchurl {
1205 url = "https://pypi.python.org/packages/ee/65/fc9dee74a909a1187ca51e4f15ad9c4d35476e4ab5813f73421505c48053/waitress-0.8.9.tar.gz";
1205 url = "https://pypi.python.org/packages/ee/65/fc9dee74a909a1187ca51e4f15ad9c4d35476e4ab5813f73421505c48053/waitress-0.8.9.tar.gz";
1206 md5 = "da3f2e62b3676be5dd630703a68e2a04";
1206 md5 = "da3f2e62b3676be5dd630703a68e2a04";
1207 };
1207 };
1208 };
1208 };
1209 wsgiref = super.buildPythonPackage {
1209 wsgiref = super.buildPythonPackage {
1210 name = "wsgiref-0.1.2";
1210 name = "wsgiref-0.1.2";
1211 buildInputs = with self; [];
1211 buildInputs = with self; [];
1212 doCheck = false;
1212 doCheck = false;
1213 propagatedBuildInputs = with self; [];
1213 propagatedBuildInputs = with self; [];
1214 src = fetchurl {
1214 src = fetchurl {
1215 url = "https://pypi.python.org/packages/41/9e/309259ce8dff8c596e8c26df86dbc4e848b9249fd36797fd60be456f03fc/wsgiref-0.1.2.zip";
1215 url = "https://pypi.python.org/packages/41/9e/309259ce8dff8c596e8c26df86dbc4e848b9249fd36797fd60be456f03fc/wsgiref-0.1.2.zip";
1216 md5 = "29b146e6ebd0f9fb119fe321f7bcf6cb";
1216 md5 = "29b146e6ebd0f9fb119fe321f7bcf6cb";
1217 };
1217 };
1218 };
1218 };
1219 zope.cachedescriptors = super.buildPythonPackage {
1219 zope.cachedescriptors = super.buildPythonPackage {
1220 name = "zope.cachedescriptors-4.0.0";
1220 name = "zope.cachedescriptors-4.0.0";
1221 buildInputs = with self; [];
1221 buildInputs = with self; [];
1222 doCheck = false;
1222 doCheck = false;
1223 propagatedBuildInputs = with self; [setuptools];
1223 propagatedBuildInputs = with self; [setuptools];
1224 src = fetchurl {
1224 src = fetchurl {
1225 url = "https://pypi.python.org/packages/40/33/694b6644c37f28553f4b9f20b3c3a20fb709a22574dff20b5bdffb09ecd5/zope.cachedescriptors-4.0.0.tar.gz";
1225 url = "https://pypi.python.org/packages/40/33/694b6644c37f28553f4b9f20b3c3a20fb709a22574dff20b5bdffb09ecd5/zope.cachedescriptors-4.0.0.tar.gz";
1226 md5 = "8d308de8c936792c8e758058fcb7d0f0";
1226 md5 = "8d308de8c936792c8e758058fcb7d0f0";
1227 };
1227 };
1228 };
1228 };
1229 zope.deprecation = super.buildPythonPackage {
1229 zope.deprecation = super.buildPythonPackage {
1230 name = "zope.deprecation-4.1.2";
1230 name = "zope.deprecation-4.1.2";
1231 buildInputs = with self; [];
1231 buildInputs = with self; [];
1232 doCheck = false;
1232 doCheck = false;
1233 propagatedBuildInputs = with self; [setuptools];
1233 propagatedBuildInputs = with self; [setuptools];
1234 src = fetchurl {
1234 src = fetchurl {
1235 url = "https://pypi.python.org/packages/c1/d3/3919492d5e57d8dd01b36f30b34fc8404a30577392b1eb817c303499ad20/zope.deprecation-4.1.2.tar.gz";
1235 url = "https://pypi.python.org/packages/c1/d3/3919492d5e57d8dd01b36f30b34fc8404a30577392b1eb817c303499ad20/zope.deprecation-4.1.2.tar.gz";
1236 md5 = "e9a663ded58f4f9f7881beb56cae2782";
1236 md5 = "e9a663ded58f4f9f7881beb56cae2782";
1237 };
1237 };
1238 };
1238 };
1239 zope.event = super.buildPythonPackage {
1239 zope.event = super.buildPythonPackage {
1240 name = "zope.event-4.0.3";
1240 name = "zope.event-4.0.3";
1241 buildInputs = with self; [];
1241 buildInputs = with self; [];
1242 doCheck = false;
1242 doCheck = false;
1243 propagatedBuildInputs = with self; [setuptools];
1243 propagatedBuildInputs = with self; [setuptools];
1244 src = fetchurl {
1244 src = fetchurl {
1245 url = "https://pypi.python.org/packages/c1/29/91ba884d7d6d96691df592e9e9c2bfa57a47040ec1ff47eff18c85137152/zope.event-4.0.3.tar.gz";
1245 url = "https://pypi.python.org/packages/c1/29/91ba884d7d6d96691df592e9e9c2bfa57a47040ec1ff47eff18c85137152/zope.event-4.0.3.tar.gz";
1246 md5 = "9a3780916332b18b8b85f522bcc3e249";
1246 md5 = "9a3780916332b18b8b85f522bcc3e249";
1247 };
1247 };
1248 };
1248 };
1249 zope.interface = super.buildPythonPackage {
1249 zope.interface = super.buildPythonPackage {
1250 name = "zope.interface-4.1.3";
1250 name = "zope.interface-4.1.3";
1251 buildInputs = with self; [];
1251 buildInputs = with self; [];
1252 doCheck = false;
1252 doCheck = false;
1253 propagatedBuildInputs = with self; [setuptools];
1253 propagatedBuildInputs = with self; [setuptools];
1254 src = fetchurl {
1254 src = fetchurl {
1255 url = "https://pypi.python.org/packages/9d/81/2509ca3c6f59080123c1a8a97125eb48414022618cec0e64eb1313727bfe/zope.interface-4.1.3.tar.gz";
1255 url = "https://pypi.python.org/packages/9d/81/2509ca3c6f59080123c1a8a97125eb48414022618cec0e64eb1313727bfe/zope.interface-4.1.3.tar.gz";
1256 md5 = "9ae3d24c0c7415deb249dd1a132f0f79";
1256 md5 = "9ae3d24c0c7415deb249dd1a132f0f79";
1257 };
1257 };
1258 };
1258 };
1259
1259
1260 ### Test requirements
1260 ### Test requirements
1261
1261
1262
1262
1263 }
1263 }
@@ -1,1 +1,1 b''
1 4.2.0 No newline at end of file
1 4.2.0
@@ -1,182 +1,188 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2012-2016 RhodeCode GmbH
3 # Copyright (C) 2012-2016 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
7 # (only), as published by the Free Software Foundation.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU Affero General Public License
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
16 #
17 # This program is dual-licensed. If you wish to learn more about the
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
20
21 import colander
21 import colander
22 import formencode.htmlfill
22 import formencode.htmlfill
23 import logging
23 import logging
24
24
25 from pyramid.httpexceptions import HTTPFound
25 from pyramid.httpexceptions import HTTPFound
26 from pyramid.renderers import render
26 from pyramid.renderers import render
27 from pyramid.response import Response
27 from pyramid.response import Response
28
28
29 from rhodecode.authentication.base import get_auth_cache_manager
29 from rhodecode.authentication.base import get_auth_cache_manager
30 from rhodecode.authentication.interface import IAuthnPluginRegistry
30 from rhodecode.authentication.interface import IAuthnPluginRegistry
31 from rhodecode.lib import auth
31 from rhodecode.lib import auth
32 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator
32 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator
33 from rhodecode.model.forms import AuthSettingsForm
33 from rhodecode.model.forms import AuthSettingsForm
34 from rhodecode.model.meta import Session
34 from rhodecode.model.meta import Session
35 from rhodecode.model.settings import SettingsModel
35 from rhodecode.model.settings import SettingsModel
36 from rhodecode.translation import _
36 from rhodecode.translation import _
37
37
38 log = logging.getLogger(__name__)
38 log = logging.getLogger(__name__)
39
39
40
40
41 class AuthnPluginViewBase(object):
41 class AuthnPluginViewBase(object):
42
42
43 def __init__(self, context, request):
43 def __init__(self, context, request):
44 self.request = request
44 self.request = request
45 self.context = context
45 self.context = context
46 self.plugin = context.plugin
46 self.plugin = context.plugin
47 self._rhodecode_user = request.user
47
48
49 @LoginRequired()
50 @HasPermissionAllDecorator('hg.admin')
48 def settings_get(self, defaults=None, errors=None):
51 def settings_get(self, defaults=None, errors=None):
49 """
52 """
50 View that displays the plugin settings as a form.
53 View that displays the plugin settings as a form.
51 """
54 """
52 defaults = defaults or {}
55 defaults = defaults or {}
53 errors = errors or {}
56 errors = errors or {}
54 schema = self.plugin.get_settings_schema()
57 schema = self.plugin.get_settings_schema()
55
58
56 # Get default values for the form.
59 # Get default values for the form.
57 for node in schema:
60 for node in schema:
58 db_value = self.plugin.get_setting_by_name(node.name)
61 db_value = self.plugin.get_setting_by_name(node.name)
59 defaults.setdefault(node.name, db_value)
62 defaults.setdefault(node.name, db_value)
60
63
61 template_context = {
64 template_context = {
62 'defaults': defaults,
65 'defaults': defaults,
63 'errors': errors,
66 'errors': errors,
64 'plugin': self.context.plugin,
67 'plugin': self.context.plugin,
65 'resource': self.context,
68 'resource': self.context,
66 }
69 }
67
70
68 return template_context
71 return template_context
69
72
73 @LoginRequired()
74 @HasPermissionAllDecorator('hg.admin')
75 @auth.CSRFRequired()
70 def settings_post(self):
76 def settings_post(self):
71 """
77 """
72 View that validates and stores the plugin settings.
78 View that validates and stores the plugin settings.
73 """
79 """
74 schema = self.plugin.get_settings_schema()
80 schema = self.plugin.get_settings_schema()
75 try:
81 try:
76 valid_data = schema.deserialize(self.request.params)
82 valid_data = schema.deserialize(self.request.params)
77 except colander.Invalid, e:
83 except colander.Invalid, e:
78 # Display error message and display form again.
84 # Display error message and display form again.
79 self.request.session.flash(
85 self.request.session.flash(
80 _('Errors exist when saving plugin settings. '
86 _('Errors exist when saving plugin settings. '
81 'Please check the form inputs.'),
87 'Please check the form inputs.'),
82 queue='error')
88 queue='error')
83 defaults = schema.flatten(self.request.params)
89 defaults = schema.flatten(self.request.params)
84 return self.settings_get(errors=e.asdict(), defaults=defaults)
90 return self.settings_get(errors=e.asdict(), defaults=defaults)
85
91
86 # Store validated data.
92 # Store validated data.
87 for name, value in valid_data.items():
93 for name, value in valid_data.items():
88 self.plugin.create_or_update_setting(name, value)
94 self.plugin.create_or_update_setting(name, value)
89 Session.commit()
95 Session.commit()
90
96
91 # Display success message and redirect.
97 # Display success message and redirect.
92 self.request.session.flash(
98 self.request.session.flash(
93 _('Auth settings updated successfully.'),
99 _('Auth settings updated successfully.'),
94 queue='success')
100 queue='success')
95 redirect_to = self.request.resource_path(
101 redirect_to = self.request.resource_path(
96 self.context, route_name='auth_home')
102 self.context, route_name='auth_home')
97 return HTTPFound(redirect_to)
103 return HTTPFound(redirect_to)
98
104
99
105
100 # TODO: Ongoing migration in these views.
106 # TODO: Ongoing migration in these views.
101 # - Maybe we should also use a colander schema for these views.
107 # - Maybe we should also use a colander schema for these views.
102 class AuthSettingsView(object):
108 class AuthSettingsView(object):
103 def __init__(self, context, request):
109 def __init__(self, context, request):
104 self.context = context
110 self.context = context
105 self.request = request
111 self.request = request
106
112
107 # TODO: Move this into a utility function. It is needed in all view
113 # TODO: Move this into a utility function. It is needed in all view
108 # classes during migration. Maybe a mixin?
114 # classes during migration. Maybe a mixin?
109
115
110 # Some of the decorators rely on this attribute to be present on the
116 # Some of the decorators rely on this attribute to be present on the
111 # class of the decorated method.
117 # class of the decorated method.
112 self._rhodecode_user = request.user
118 self._rhodecode_user = request.user
113
119
114 @LoginRequired()
120 @LoginRequired()
115 @HasPermissionAllDecorator('hg.admin')
121 @HasPermissionAllDecorator('hg.admin')
116 def index(self, defaults=None, errors=None, prefix_error=False):
122 def index(self, defaults=None, errors=None, prefix_error=False):
117 defaults = defaults or {}
123 defaults = defaults or {}
118 authn_registry = self.request.registry.getUtility(IAuthnPluginRegistry)
124 authn_registry = self.request.registry.getUtility(IAuthnPluginRegistry)
119 enabled_plugins = SettingsModel().get_auth_plugins()
125 enabled_plugins = SettingsModel().get_auth_plugins()
120
126
121 # Create template context and render it.
127 # Create template context and render it.
122 template_context = {
128 template_context = {
123 'resource': self.context,
129 'resource': self.context,
124 'available_plugins': authn_registry.get_plugins(),
130 'available_plugins': authn_registry.get_plugins(),
125 'enabled_plugins': enabled_plugins,
131 'enabled_plugins': enabled_plugins,
126 }
132 }
127 html = render('rhodecode:templates/admin/auth/auth_settings.html',
133 html = render('rhodecode:templates/admin/auth/auth_settings.html',
128 template_context,
134 template_context,
129 request=self.request)
135 request=self.request)
130
136
131 # Create form default values and fill the form.
137 # Create form default values and fill the form.
132 form_defaults = {
138 form_defaults = {
133 'auth_plugins': ','.join(enabled_plugins)
139 'auth_plugins': ','.join(enabled_plugins)
134 }
140 }
135 form_defaults.update(defaults)
141 form_defaults.update(defaults)
136 html = formencode.htmlfill.render(
142 html = formencode.htmlfill.render(
137 html,
143 html,
138 defaults=form_defaults,
144 defaults=form_defaults,
139 errors=errors,
145 errors=errors,
140 prefix_error=prefix_error,
146 prefix_error=prefix_error,
141 encoding="UTF-8",
147 encoding="UTF-8",
142 force_defaults=False)
148 force_defaults=False)
143
149
144 return Response(html)
150 return Response(html)
145
151
146 @LoginRequired()
152 @LoginRequired()
147 @HasPermissionAllDecorator('hg.admin')
153 @HasPermissionAllDecorator('hg.admin')
148 @auth.CSRFRequired()
154 @auth.CSRFRequired()
149 def auth_settings(self):
155 def auth_settings(self):
150 try:
156 try:
151 form = AuthSettingsForm()()
157 form = AuthSettingsForm()()
152 form_result = form.to_python(self.request.params)
158 form_result = form.to_python(self.request.params)
153 plugins = ','.join(form_result['auth_plugins'])
159 plugins = ','.join(form_result['auth_plugins'])
154 setting = SettingsModel().create_or_update_setting(
160 setting = SettingsModel().create_or_update_setting(
155 'auth_plugins', plugins)
161 'auth_plugins', plugins)
156 Session().add(setting)
162 Session().add(setting)
157 Session().commit()
163 Session().commit()
158
164
159 cache_manager = get_auth_cache_manager()
165 cache_manager = get_auth_cache_manager()
160 cache_manager.clear()
166 cache_manager.clear()
161 self.request.session.flash(
167 self.request.session.flash(
162 _('Auth settings updated successfully.'),
168 _('Auth settings updated successfully.'),
163 queue='success')
169 queue='success')
164 except formencode.Invalid as errors:
170 except formencode.Invalid as errors:
165 e = errors.error_dict or {}
171 e = errors.error_dict or {}
166 self.request.session.flash(
172 self.request.session.flash(
167 _('Errors exist when saving plugin setting. '
173 _('Errors exist when saving plugin setting. '
168 'Please check the form inputs.'),
174 'Please check the form inputs.'),
169 queue='error')
175 queue='error')
170 return self.index(
176 return self.index(
171 defaults=errors.value,
177 defaults=errors.value,
172 errors=e,
178 errors=e,
173 prefix_error=False)
179 prefix_error=False)
174 except Exception:
180 except Exception:
175 log.exception('Exception in auth_settings')
181 log.exception('Exception in auth_settings')
176 self.request.session.flash(
182 self.request.session.flash(
177 _('Error occurred during update of auth settings.'),
183 _('Error occurred during update of auth settings.'),
178 queue='error')
184 queue='error')
179
185
180 redirect_to = self.request.resource_path(
186 redirect_to = self.request.resource_path(
181 self.context, route_name='auth_home')
187 self.context, route_name='auth_home')
182 return HTTPFound(redirect_to)
188 return HTTPFound(redirect_to)
@@ -1,337 +1,339 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2016 RhodeCode GmbH
3 # Copyright (C) 2016-2016 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
7 # (only), as published by the Free Software Foundation.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU Affero General Public License
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
16 #
17 # This program is dual-licensed. If you wish to learn more about the
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
20
21 import datetime
21 import datetime
22 import formencode
22 import formencode
23 import logging
23 import logging
24 import urlparse
24 import urlparse
25
25
26 from pylons import url
26 from pylons import url
27 from pyramid.httpexceptions import HTTPFound
27 from pyramid.httpexceptions import HTTPFound
28 from pyramid.view import view_config
28 from pyramid.view import view_config
29 from recaptcha.client.captcha import submit
29 from recaptcha.client.captcha import submit
30
30
31 from rhodecode.authentication.base import authenticate, HTTP_TYPE
31 from rhodecode.authentication.base import authenticate, HTTP_TYPE
32 from rhodecode.events import UserRegistered
32 from rhodecode.events import UserRegistered
33 from rhodecode.lib.auth import (
33 from rhodecode.lib.auth import (
34 AuthUser, HasPermissionAnyDecorator, CSRFRequired)
34 AuthUser, HasPermissionAnyDecorator, CSRFRequired)
35 from rhodecode.lib.base import get_ip_addr
35 from rhodecode.lib.base import get_ip_addr
36 from rhodecode.lib.exceptions import UserCreationError
36 from rhodecode.lib.exceptions import UserCreationError
37 from rhodecode.lib.utils2 import safe_str
37 from rhodecode.lib.utils2 import safe_str
38 from rhodecode.model.db import User
38 from rhodecode.model.db import User
39 from rhodecode.model.forms import LoginForm, RegisterForm, PasswordResetForm
39 from rhodecode.model.forms import LoginForm, RegisterForm, PasswordResetForm
40 from rhodecode.model.login_session import LoginSession
40 from rhodecode.model.login_session import LoginSession
41 from rhodecode.model.meta import Session
41 from rhodecode.model.meta import Session
42 from rhodecode.model.settings import SettingsModel
42 from rhodecode.model.settings import SettingsModel
43 from rhodecode.model.user import UserModel
43 from rhodecode.model.user import UserModel
44 from rhodecode.translation import _
44 from rhodecode.translation import _
45
45
46
46
47 log = logging.getLogger(__name__)
47 log = logging.getLogger(__name__)
48
48
49
49
50 def _store_user_in_session(session, username, remember=False):
50 def _store_user_in_session(session, username, remember=False):
51 user = User.get_by_username(username, case_insensitive=True)
51 user = User.get_by_username(username, case_insensitive=True)
52 auth_user = AuthUser(user.user_id)
52 auth_user = AuthUser(user.user_id)
53 auth_user.set_authenticated()
53 auth_user.set_authenticated()
54 cs = auth_user.get_cookie_store()
54 cs = auth_user.get_cookie_store()
55 session['rhodecode_user'] = cs
55 session['rhodecode_user'] = cs
56 user.update_lastlogin()
56 user.update_lastlogin()
57 Session().commit()
57 Session().commit()
58
58
59 # If they want to be remembered, update the cookie
59 # If they want to be remembered, update the cookie
60 if remember:
60 if remember:
61 _year = (datetime.datetime.now() +
61 _year = (datetime.datetime.now() +
62 datetime.timedelta(seconds=60 * 60 * 24 * 365))
62 datetime.timedelta(seconds=60 * 60 * 24 * 365))
63 session._set_cookie_expires(_year)
63 session._set_cookie_expires(_year)
64
64
65 session.save()
65 session.save()
66
66
67 log.info('user %s is now authenticated and stored in '
67 log.info('user %s is now authenticated and stored in '
68 'session, session attrs %s', username, cs)
68 'session, session attrs %s', username, cs)
69
69
70 # dumps session attrs back to cookie
70 # dumps session attrs back to cookie
71 session._update_cookie_out()
71 session._update_cookie_out()
72 # we set new cookie
72 # we set new cookie
73 headers = None
73 headers = None
74 if session.request['set_cookie']:
74 if session.request['set_cookie']:
75 # send set-cookie headers back to response to update cookie
75 # send set-cookie headers back to response to update cookie
76 headers = [('Set-Cookie', session.request['cookie_out'])]
76 headers = [('Set-Cookie', session.request['cookie_out'])]
77 return headers
77 return headers
78
78
79
79
80 def get_came_from(request):
80 def get_came_from(request):
81 came_from = safe_str(request.GET.get('came_from', ''))
81 came_from = safe_str(request.GET.get('came_from', ''))
82 parsed = urlparse.urlparse(came_from)
82 parsed = urlparse.urlparse(came_from)
83 allowed_schemes = ['http', 'https']
83 allowed_schemes = ['http', 'https']
84 if parsed.scheme and parsed.scheme not in allowed_schemes:
84 if parsed.scheme and parsed.scheme not in allowed_schemes:
85 log.error('Suspicious URL scheme detected %s for url %s' %
85 log.error('Suspicious URL scheme detected %s for url %s' %
86 (parsed.scheme, parsed))
86 (parsed.scheme, parsed))
87 came_from = url('home')
87 came_from = url('home')
88 elif parsed.netloc and request.host != parsed.netloc:
88 elif parsed.netloc and request.host != parsed.netloc:
89 log.error('Suspicious NETLOC detected %s for url %s server url '
89 log.error('Suspicious NETLOC detected %s for url %s server url '
90 'is: %s' % (parsed.netloc, parsed, request.host))
90 'is: %s' % (parsed.netloc, parsed, request.host))
91 came_from = url('home')
91 came_from = url('home')
92 elif any(bad_str in parsed.path for bad_str in ('\r', '\n')):
92 elif any(bad_str in parsed.path for bad_str in ('\r', '\n')):
93 log.error('Header injection detected `%s` for url %s server url ' %
93 log.error('Header injection detected `%s` for url %s server url ' %
94 (parsed.path, parsed))
94 (parsed.path, parsed))
95 came_from = url('home')
95 came_from = url('home')
96
96
97 return came_from or url('home')
97 return came_from or url('home')
98
98
99
99
100 class LoginView(object):
100 class LoginView(object):
101
101
102 def __init__(self, context, request):
102 def __init__(self, context, request):
103 self.request = request
103 self.request = request
104 self.context = context
104 self.context = context
105 self.session = request.session
105 self.session = request.session
106 self._rhodecode_user = request.user
106 self._rhodecode_user = request.user
107
107
108 def _get_template_context(self):
108 def _get_template_context(self):
109 return {
109 return {
110 'came_from': get_came_from(self.request),
110 'came_from': get_came_from(self.request),
111 'defaults': {},
111 'defaults': {},
112 'errors': {},
112 'errors': {},
113 }
113 }
114
114
115 @view_config(
115 @view_config(
116 route_name='login', request_method='GET',
116 route_name='login', request_method='GET',
117 renderer='rhodecode:templates/login.html')
117 renderer='rhodecode:templates/login.html')
118 def login(self):
118 def login(self):
119 came_from = get_came_from(self.request)
119 came_from = get_came_from(self.request)
120 user = self.request.user
120 user = self.request.user
121
121
122 # redirect if already logged in
122 # redirect if already logged in
123 if user.is_authenticated and not user.is_default and user.ip_allowed:
123 if user.is_authenticated and not user.is_default and user.ip_allowed:
124 raise HTTPFound(came_from)
124 raise HTTPFound(came_from)
125
125
126 # check if we use headers plugin, and try to login using it.
126 # check if we use headers plugin, and try to login using it.
127 try:
127 try:
128 log.debug('Running PRE-AUTH for headers based authentication')
128 log.debug('Running PRE-AUTH for headers based authentication')
129 auth_info = authenticate(
129 auth_info = authenticate(
130 '', '', self.request.environ, HTTP_TYPE, skip_missing=True)
130 '', '', self.request.environ, HTTP_TYPE, skip_missing=True)
131 if auth_info:
131 if auth_info:
132 headers = _store_user_in_session(
132 headers = _store_user_in_session(
133 self.session, auth_info.get('username'))
133 self.session, auth_info.get('username'))
134 raise HTTPFound(came_from, headers=headers)
134 raise HTTPFound(came_from, headers=headers)
135 except UserCreationError as e:
135 except UserCreationError as e:
136 log.error(e)
136 log.error(e)
137 self.session.flash(e, queue='error')
137 self.session.flash(e, queue='error')
138
138
139 return self._get_template_context()
139 return self._get_template_context()
140
140
141 @view_config(
141 @view_config(
142 route_name='login', request_method='POST',
142 route_name='login', request_method='POST',
143 renderer='rhodecode:templates/login.html')
143 renderer='rhodecode:templates/login.html')
144 def login_post(self):
144 def login_post(self):
145 came_from = get_came_from(self.request)
145 came_from = get_came_from(self.request)
146 session = self.request.session
146 session = self.request.session
147 login_form = LoginForm()()
147 login_form = LoginForm()()
148
148
149 try:
149 try:
150 session.invalidate()
150 session.invalidate()
151 form_result = login_form.to_python(self.request.params)
151 form_result = login_form.to_python(self.request.params)
152 # form checks for username/password, now we're authenticated
152 # form checks for username/password, now we're authenticated
153 headers = _store_user_in_session(
153 headers = _store_user_in_session(
154 self.session,
154 self.session,
155 username=form_result['username'],
155 username=form_result['username'],
156 remember=form_result['remember'])
156 remember=form_result['remember'])
157 raise HTTPFound(came_from, headers=headers)
157 raise HTTPFound(came_from, headers=headers)
158 except formencode.Invalid as errors:
158 except formencode.Invalid as errors:
159 defaults = errors.value
159 defaults = errors.value
160 # remove password from filling in form again
160 # remove password from filling in form again
161 del defaults['password']
161 del defaults['password']
162 render_ctx = self._get_template_context()
162 render_ctx = self._get_template_context()
163 render_ctx.update({
163 render_ctx.update({
164 'errors': errors.error_dict,
164 'errors': errors.error_dict,
165 'defaults': defaults,
165 'defaults': defaults,
166 })
166 })
167 return render_ctx
167 return render_ctx
168
168
169 except UserCreationError as e:
169 except UserCreationError as e:
170 # headers auth or other auth functions that create users on
170 # headers auth or other auth functions that create users on
171 # the fly can throw this exception signaling that there's issue
171 # the fly can throw this exception signaling that there's issue
172 # with user creation, explanation should be provided in
172 # with user creation, explanation should be provided in
173 # Exception itself
173 # Exception itself
174 session.flash(e, queue='error')
174 session.flash(e, queue='error')
175 return self._get_template_context()
175 return self._get_template_context()
176
176
177 @CSRFRequired()
177 @CSRFRequired()
178 @view_config(route_name='logout', request_method='POST')
178 @view_config(route_name='logout', request_method='POST')
179 def logout(self):
179 def logout(self):
180 LoginSession().destroy_user_session()
180 LoginSession().destroy_user_session()
181 return HTTPFound(url('home'))
181 return HTTPFound(url('home'))
182
182
183 @HasPermissionAnyDecorator(
183 @HasPermissionAnyDecorator(
184 'hg.admin', 'hg.register.auto_activate', 'hg.register.manual_activate')
184 'hg.admin', 'hg.register.auto_activate', 'hg.register.manual_activate')
185 @view_config(
185 @view_config(
186 route_name='register', request_method='GET',
186 route_name='register', request_method='GET',
187 renderer='rhodecode:templates/register.html',)
187 renderer='rhodecode:templates/register.html',)
188 def register(self, defaults=None, errors=None):
188 def register(self, defaults=None, errors=None):
189 defaults = defaults or {}
189 defaults = defaults or {}
190 errors = errors or {}
190 errors = errors or {}
191
191
192 settings = SettingsModel().get_all_settings()
192 settings = SettingsModel().get_all_settings()
193 captcha_public_key = settings.get('rhodecode_captcha_public_key')
193 captcha_public_key = settings.get('rhodecode_captcha_public_key')
194 captcha_private_key = settings.get('rhodecode_captcha_private_key')
194 captcha_private_key = settings.get('rhodecode_captcha_private_key')
195 captcha_active = bool(captcha_private_key)
195 captcha_active = bool(captcha_private_key)
196 register_message = settings.get('rhodecode_register_message') or ''
196 register_message = settings.get('rhodecode_register_message') or ''
197 auto_active = 'hg.register.auto_activate' in User.get_default_user()\
197 auto_active = 'hg.register.auto_activate' in User.get_default_user()\
198 .AuthUser.permissions['global']
198 .AuthUser.permissions['global']
199
199
200 render_ctx = self._get_template_context()
200 render_ctx = self._get_template_context()
201 render_ctx.update({
201 render_ctx.update({
202 'defaults': defaults,
202 'defaults': defaults,
203 'errors': errors,
203 'errors': errors,
204 'auto_active': auto_active,
204 'auto_active': auto_active,
205 'captcha_active': captcha_active,
205 'captcha_active': captcha_active,
206 'captcha_public_key': captcha_public_key,
206 'captcha_public_key': captcha_public_key,
207 'register_message': register_message,
207 'register_message': register_message,
208 })
208 })
209 return render_ctx
209 return render_ctx
210
210
211 @HasPermissionAnyDecorator(
212 'hg.admin', 'hg.register.auto_activate', 'hg.register.manual_activate')
211 @view_config(
213 @view_config(
212 route_name='register', request_method='POST',
214 route_name='register', request_method='POST',
213 renderer='rhodecode:templates/register.html')
215 renderer='rhodecode:templates/register.html')
214 def register_post(self):
216 def register_post(self):
215 captcha_private_key = SettingsModel().get_setting_by_name(
217 captcha_private_key = SettingsModel().get_setting_by_name(
216 'rhodecode_captcha_private_key')
218 'rhodecode_captcha_private_key')
217 captcha_active = bool(captcha_private_key)
219 captcha_active = bool(captcha_private_key)
218 auto_active = 'hg.register.auto_activate' in User.get_default_user()\
220 auto_active = 'hg.register.auto_activate' in User.get_default_user()\
219 .AuthUser.permissions['global']
221 .AuthUser.permissions['global']
220
222
221 register_form = RegisterForm()()
223 register_form = RegisterForm()()
222 try:
224 try:
223 form_result = register_form.to_python(self.request.params)
225 form_result = register_form.to_python(self.request.params)
224 form_result['active'] = auto_active
226 form_result['active'] = auto_active
225
227
226 if captcha_active:
228 if captcha_active:
227 response = submit(
229 response = submit(
228 self.request.params.get('recaptcha_challenge_field'),
230 self.request.params.get('recaptcha_challenge_field'),
229 self.request.params.get('recaptcha_response_field'),
231 self.request.params.get('recaptcha_response_field'),
230 private_key=captcha_private_key,
232 private_key=captcha_private_key,
231 remoteip=get_ip_addr(self.request.environ))
233 remoteip=get_ip_addr(self.request.environ))
232 if captcha_active and not response.is_valid:
234 if captcha_active and not response.is_valid:
233 _value = form_result
235 _value = form_result
234 _msg = _('bad captcha')
236 _msg = _('bad captcha')
235 error_dict = {'recaptcha_field': _msg}
237 error_dict = {'recaptcha_field': _msg}
236 raise formencode.Invalid(_msg, _value, None,
238 raise formencode.Invalid(_msg, _value, None,
237 error_dict=error_dict)
239 error_dict=error_dict)
238
240
239 new_user = UserModel().create_registration(form_result)
241 new_user = UserModel().create_registration(form_result)
240 event = UserRegistered(user=new_user, session=self.session)
242 event = UserRegistered(user=new_user, session=self.session)
241 self.request.registry.notify(event)
243 self.request.registry.notify(event)
242 self.session.flash(
244 self.session.flash(
243 _('You have successfully registered with RhodeCode'),
245 _('You have successfully registered with RhodeCode'),
244 queue='success')
246 queue='success')
245 Session().commit()
247 Session().commit()
246
248
247 redirect_ro = self.request.route_path('login')
249 redirect_ro = self.request.route_path('login')
248 raise HTTPFound(redirect_ro)
250 raise HTTPFound(redirect_ro)
249
251
250 except formencode.Invalid as errors:
252 except formencode.Invalid as errors:
251 del errors.value['password']
253 del errors.value['password']
252 del errors.value['password_confirmation']
254 del errors.value['password_confirmation']
253 return self.register(
255 return self.register(
254 defaults=errors.value, errors=errors.error_dict)
256 defaults=errors.value, errors=errors.error_dict)
255
257
256 except UserCreationError as e:
258 except UserCreationError as e:
257 # container auth or other auth functions that create users on
259 # container auth or other auth functions that create users on
258 # the fly can throw this exception signaling that there's issue
260 # the fly can throw this exception signaling that there's issue
259 # with user creation, explanation should be provided in
261 # with user creation, explanation should be provided in
260 # Exception itself
262 # Exception itself
261 self.session.flash(e, queue='error')
263 self.session.flash(e, queue='error')
262 return self.register()
264 return self.register()
263
265
264 @view_config(
266 @view_config(
265 route_name='reset_password', request_method=('GET', 'POST'),
267 route_name='reset_password', request_method=('GET', 'POST'),
266 renderer='rhodecode:templates/password_reset.html')
268 renderer='rhodecode:templates/password_reset.html')
267 def password_reset(self):
269 def password_reset(self):
268 settings = SettingsModel().get_all_settings()
270 settings = SettingsModel().get_all_settings()
269 captcha_private_key = settings.get('rhodecode_captcha_private_key')
271 captcha_private_key = settings.get('rhodecode_captcha_private_key')
270 captcha_active = bool(captcha_private_key)
272 captcha_active = bool(captcha_private_key)
271 captcha_public_key = settings.get('rhodecode_captcha_public_key')
273 captcha_public_key = settings.get('rhodecode_captcha_public_key')
272
274
273 render_ctx = {
275 render_ctx = {
274 'captcha_active': captcha_active,
276 'captcha_active': captcha_active,
275 'captcha_public_key': captcha_public_key,
277 'captcha_public_key': captcha_public_key,
276 'defaults': {},
278 'defaults': {},
277 'errors': {},
279 'errors': {},
278 }
280 }
279
281
280 if self.request.POST:
282 if self.request.POST:
281 password_reset_form = PasswordResetForm()()
283 password_reset_form = PasswordResetForm()()
282 try:
284 try:
283 form_result = password_reset_form.to_python(
285 form_result = password_reset_form.to_python(
284 self.request.params)
286 self.request.params)
285 if captcha_active:
287 if captcha_active:
286 response = submit(
288 response = submit(
287 self.request.params.get('recaptcha_challenge_field'),
289 self.request.params.get('recaptcha_challenge_field'),
288 self.request.params.get('recaptcha_response_field'),
290 self.request.params.get('recaptcha_response_field'),
289 private_key=captcha_private_key,
291 private_key=captcha_private_key,
290 remoteip=get_ip_addr(self.request.environ))
292 remoteip=get_ip_addr(self.request.environ))
291 if captcha_active and not response.is_valid:
293 if captcha_active and not response.is_valid:
292 _value = form_result
294 _value = form_result
293 _msg = _('bad captcha')
295 _msg = _('bad captcha')
294 error_dict = {'recaptcha_field': _msg}
296 error_dict = {'recaptcha_field': _msg}
295 raise formencode.Invalid(_msg, _value, None,
297 raise formencode.Invalid(_msg, _value, None,
296 error_dict=error_dict)
298 error_dict=error_dict)
297
299
298 # Generate reset URL and send mail.
300 # Generate reset URL and send mail.
299 user_email = form_result['email']
301 user_email = form_result['email']
300 user = User.get_by_email(user_email)
302 user = User.get_by_email(user_email)
301 password_reset_url = self.request.route_url(
303 password_reset_url = self.request.route_url(
302 'reset_password_confirmation',
304 'reset_password_confirmation',
303 _query={'key': user.api_key})
305 _query={'key': user.api_key})
304 UserModel().reset_password_link(
306 UserModel().reset_password_link(
305 form_result, password_reset_url)
307 form_result, password_reset_url)
306
308
307 # Display success message and redirect.
309 # Display success message and redirect.
308 self.session.flash(
310 self.session.flash(
309 _('Your password reset link was sent'),
311 _('Your password reset link was sent'),
310 queue='success')
312 queue='success')
311 return HTTPFound(self.request.route_path('login'))
313 return HTTPFound(self.request.route_path('login'))
312
314
313 except formencode.Invalid as errors:
315 except formencode.Invalid as errors:
314 render_ctx.update({
316 render_ctx.update({
315 'defaults': errors.value,
317 'defaults': errors.value,
316 'errors': errors.error_dict,
318 'errors': errors.error_dict,
317 })
319 })
318
320
319 return render_ctx
321 return render_ctx
320
322
321 @view_config(route_name='reset_password_confirmation',
323 @view_config(route_name='reset_password_confirmation',
322 request_method='GET')
324 request_method='GET')
323 def password_reset_confirmation(self):
325 def password_reset_confirmation(self):
324 if self.request.GET and self.request.GET.get('key'):
326 if self.request.GET and self.request.GET.get('key'):
325 try:
327 try:
326 user = User.get_by_auth_token(self.request.GET.get('key'))
328 user = User.get_by_auth_token(self.request.GET.get('key'))
327 data = {'email': user.email}
329 data = {'email': user.email}
328 UserModel().reset_password(data)
330 UserModel().reset_password(data)
329 self.session.flash(
331 self.session.flash(
330 _('Your password reset was successful, '
332 _('Your password reset was successful, '
331 'a new password has been sent to your email'),
333 'a new password has been sent to your email'),
332 queue='success')
334 queue='success')
333 except Exception as e:
335 except Exception as e:
334 log.error(e)
336 log.error(e)
335 return HTTPFound(self.request.route_path('reset_password'))
337 return HTTPFound(self.request.route_path('reset_password'))
336
338
337 return HTTPFound(self.request.route_path('login'))
339 return HTTPFound(self.request.route_path('login'))
General Comments 0
You need to be logged in to leave comments. Login now