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