Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9b1b9e73c5 | ||
|
|
0fc60eedfb | ||
|
|
9e19833421 | ||
|
|
31318340e2 | ||
|
|
6cef27e69c | ||
|
|
4f6ab86491 | ||
|
|
4147867098 | ||
|
|
a0dead1586 | ||
|
|
0afc18fd24 | ||
|
|
9f695c783e | ||
|
|
15263ea1d6 | ||
|
|
693c5cd5e4 | ||
|
|
cc3f045efa | ||
|
|
43806a26e7 | ||
|
|
cb4c4b3eb5 | ||
|
|
39558267b9 | ||
|
|
59a3c5a6e6 | ||
|
|
2c9eeccc0e | ||
|
|
7576d85dba | ||
|
|
579f0d752f | ||
|
|
65e9cc2127 | ||
|
|
dc2fd49ecb | ||
|
|
a380ae69d5 | ||
|
|
0b84911d38 | ||
|
|
e64c556f84 | ||
|
|
18644e027e | ||
|
|
65642c029c | ||
|
|
11540a6132 | ||
|
|
a6e728316b | ||
|
|
4cb5e3c674 | ||
|
|
d918a6b2e2 | ||
|
|
d721451d15 | ||
|
|
c5aaebd4a8 | ||
|
|
4c1dbf4e40 | ||
|
|
c20c055788 | ||
|
|
44c13f9fa3 | ||
|
|
ae44a9e0ac | ||
|
|
97ba47f339 | ||
|
|
8671b897d0 | ||
|
|
1a3361a1bb | ||
|
|
9ac438d05a | ||
|
|
18e45ab994 | ||
|
|
f00090846e | ||
|
|
6590de030c | ||
|
|
714fcc5202 | ||
|
|
becc947556 | ||
|
|
d547a955ac | ||
|
|
97e0736d8e | ||
|
|
20db6daa65 | ||
|
|
3aefb5f6de | ||
|
|
30818cdf5e | ||
|
|
4089cf2145 | ||
|
|
d7893c5292 | ||
|
|
cdd3f6ed00 | ||
|
|
e44254346c | ||
|
|
adf82c1267 | ||
|
|
4d98b72702 | ||
|
|
f02240acd3 | ||
|
|
cabef57851 | ||
|
|
98ad12a06c | ||
|
|
d454eb2fe7 | ||
|
|
0facbe04ef | ||
|
|
8f9f4aae32 | ||
|
|
d5bfaf83ee | ||
|
|
9e46c3cbc4 | ||
|
|
d431206e30 | ||
|
|
6adfb8b944 | ||
|
|
0c8ccaac9a | ||
|
|
4f0ee4543b | ||
|
|
1383d13334 | ||
|
|
1b260c4b84 | ||
|
|
0ff586a1ca | ||
|
|
95adb233f7 | ||
|
|
e7f2e494af | ||
|
|
ded9e5886d | ||
|
|
d2757294af | ||
|
|
39da6a68fe | ||
|
|
8e4bc72fca | ||
|
|
bc481e954c | ||
|
|
e4ba924dc1 | ||
|
|
193510b57d | ||
|
|
88ad882d83 | ||
|
|
a90c4f7953 | ||
|
|
0c2d97b9db | ||
|
|
1c77fdd9e1 | ||
|
|
681bc9755e | ||
|
|
31e992696c | ||
|
|
813411a408 | ||
|
|
1702d1ac1f | ||
|
|
022a2af8b1 | ||
|
|
d46d16bc2b | ||
|
|
ae3ff2313d | ||
|
|
669586f15e | ||
|
|
46fbcc8d22 | ||
|
|
178f94af8c | ||
|
|
2f6b3a0bda | ||
|
|
97b70eff9f | ||
|
|
3efa77b57a | ||
|
|
48977ba04c | ||
|
|
94e3271481 | ||
|
|
04f6e7ee38 | ||
|
|
15c9e685c8 | ||
|
|
b00463bdf4 | ||
|
|
c17e642f1f | ||
|
|
a2e118ec50 | ||
|
|
45bda63ed3 | ||
|
|
c909af4a86 | ||
|
|
b5a7c7e30f | ||
|
|
6594e7a607 | ||
|
|
4d8dedeb27 | ||
|
|
b0e3e386e7 | ||
|
|
ad4870e338 | ||
|
|
c1f0bc3a6d | ||
|
|
887d4cc136 | ||
|
|
bbe787b7b4 | ||
|
|
7341988b01 | ||
|
|
44eb880108 | ||
|
|
c01f860009 | ||
|
|
f9315a8cc7 | ||
|
|
40918f44fd | ||
|
|
9fdb586d03 | ||
|
|
448c398341 | ||
|
|
618c322603 | ||
|
|
b5c9ed633b | ||
|
|
80342a22f5 | ||
|
|
c999b16a27 | ||
|
|
9bda793d46 | ||
|
|
5e9fbdd24f | ||
|
|
446e641e64 | ||
|
|
7d53ec6d71 | ||
|
|
7b0cf5bc12 | ||
|
|
a82034d516 | ||
|
|
4973361136 | ||
|
|
3b69d4bf7b | ||
|
|
fd5e14ea0d | ||
|
|
9fc3b2bc26 | ||
|
|
19cc977917 | ||
|
|
ce481d9002 | ||
|
|
2421a31b25 | ||
|
|
94c79820b9 | ||
|
|
80b38a743f | ||
|
|
af01b45852 | ||
|
|
a2de6f12d1 | ||
|
|
2af81d2e7a | ||
|
|
0f691f2757 | ||
|
|
be021db3d3 | ||
|
|
acd0ebd09d | ||
|
|
3d5e594070 | ||
|
|
58247e3d6b | ||
|
|
9f35635233 | ||
|
|
2119bacd22 | ||
|
|
d55fab540c | ||
|
|
1344c50f85 | ||
|
|
e8d97f5706 | ||
|
|
35704f3527 | ||
|
|
96fb5b0755 | ||
|
|
81f017a7c0 | ||
|
|
aca3d43f0a | ||
|
|
5a898cc80a | ||
|
|
bfb3a320bd | ||
|
|
c0b1e387b1 | ||
|
|
c175e6340d | ||
|
|
3a5f7b05df | ||
|
|
26babd7e96 | ||
|
|
349088a96e | ||
|
|
a4ff77bdb9 | ||
|
|
8f70d3a802 | ||
|
|
89021b6409 | ||
|
|
4a078705b3 | ||
|
|
6eea834777 | ||
|
|
b863ff048e | ||
|
|
79a4693f34 | ||
|
|
0f0a62ef7f | ||
|
|
cc8a21aedf | ||
|
|
38fff6fb91 | ||
|
|
e87a2bf0d5 | ||
|
|
6b3cdb5a99 | ||
|
|
e2191175da | ||
|
|
4a7f15bb04 | ||
|
|
e6c58c3c6f | ||
|
|
bb2407b468 | ||
|
|
07e809acb3 | ||
|
|
7714b5dc7b | ||
|
|
ca85d9adab | ||
|
|
41a9f12024 | ||
|
|
669691bbea | ||
|
|
6ac38e7c56 | ||
|
|
359758804b | ||
|
|
9400a0c7a1 | ||
|
|
ea34d1b3a0 | ||
|
|
72e9921901 | ||
|
|
d6af8279bc | ||
|
|
cd005b01c0 | ||
|
|
fa04c23bbf | ||
|
|
6ecc09f286 | ||
|
|
4b0f6aff73 | ||
|
|
c451f57d4e | ||
|
|
721cb2b90a | ||
|
|
01d5302a2d | ||
|
|
706324b9c6 | ||
|
|
244d3c68eb | ||
|
|
fcfa8aa917 | ||
|
|
8438a432e9 | ||
|
|
9d5e0b24f7 | ||
|
|
4480acd6f7 | ||
|
|
cd1ce28639 | ||
|
|
bf5fbd8b09 | ||
|
|
515e284c22 | ||
|
|
f98548827a | ||
|
|
b67e57f275 | ||
|
|
7005fb655c | ||
|
|
b9189771d0 | ||
|
|
b15211064d | ||
|
|
30ea9ac56b | ||
|
|
dab4950f14 | ||
|
|
0fce3655d5 | ||
|
|
91504fbc2c | ||
|
|
4b17684980 | ||
|
|
675245eb15 | ||
|
|
3494fa2d0d | ||
|
|
87a593845c | ||
|
|
b9d80fcdc7 | ||
|
|
3f7d085f73 | ||
|
|
d57dd72780 | ||
|
|
a8d1d5cfcf | ||
|
|
8857e3d521 | ||
|
|
3b1a5be1be | ||
|
|
c9a63a8524 | ||
|
|
cd967d2551 | ||
|
|
92b5247f9f | ||
|
|
45a5b436c8 | ||
|
|
bfd385f969 | ||
|
|
f693fe6b2a | ||
|
|
b040159a9b | ||
|
|
f3af2a1999 | ||
|
|
f613a4cc99 | ||
|
|
e4a96125a6 | ||
|
|
e48074ff54 | ||
|
|
2ed122a534 | ||
|
|
65c0d9b18b | ||
|
|
6702694590 | ||
|
|
6f0d4d039e | ||
|
|
1325b0e48f | ||
|
|
7421eb8068 | ||
|
|
6c7a9a4030 | ||
|
|
ba0a143717 | ||
|
|
28bcb5ed6c | ||
|
|
44fd637a1f | ||
|
|
f13aed1a84 | ||
|
|
cb3de825f2 | ||
|
|
fd4c775710 | ||
|
|
3e550b3e97 | ||
|
|
7a543250f9 | ||
|
|
a071f07634 | ||
|
|
a078f860d2 | ||
|
|
2bfd7a2467 | ||
|
|
55c9392de4 | ||
|
|
7991b555ff | ||
|
|
eab7815c24 | ||
|
|
79c09de103 | ||
|
|
24daa335b6 | ||
|
|
812ba9d52b | ||
|
|
00fb3b56cc | ||
|
|
3644d081f6 | ||
|
|
f05c46b3f1 | ||
|
|
13e76fe278 | ||
|
|
0906ae28c1 | ||
|
|
04905adb89 | ||
|
|
9767109d4e | ||
|
|
a57919bc4d | ||
|
|
c7c94d1f8f | ||
|
|
817e6c3313 | ||
|
|
a23f4c5c88 | ||
|
|
eac9768549 | ||
|
|
a42fb6b558 | ||
|
|
879e825b61 | ||
|
|
07f4310153 | ||
|
|
10c67e5be3 | ||
|
|
1279d5ddaa | ||
|
|
2af15e4b27 | ||
|
|
3096fcf045 | ||
|
|
831492448a | ||
|
|
a5284e846c | ||
|
|
22accaced3 | ||
|
|
f92d97f36e | ||
|
|
4f0a16a24c | ||
|
|
72dade793a | ||
|
|
8addc54015 | ||
|
|
25ab6f9a07 | ||
|
|
b853f72e0c | ||
|
|
449a658521 | ||
|
|
7776a22533 | ||
|
|
554eccc14a | ||
|
|
8cd6928da3 | ||
|
|
8c28be1041 | ||
|
|
810aa8f4f3 | ||
|
|
8e5be952bf | ||
|
|
5a560fee8a | ||
|
|
21819ffc5d | ||
|
|
1f8bdd6061 | ||
|
|
523c813439 | ||
|
|
7ee638bc36 | ||
|
|
76c515d3af | ||
|
|
1c8ce00657 | ||
|
|
0f4bbecd2a | ||
|
|
e292f5a869 | ||
|
|
da25c6f843 | ||
|
|
5122fbe110 | ||
|
|
dee3a3b655 | ||
|
|
4e2bcd22d9 | ||
|
|
17890027a6 | ||
|
|
5e93804525 | ||
|
|
778070dd8a | ||
|
|
74ecc762f3 | ||
|
|
63f7b35cf8 | ||
|
|
0c3f4601cc | ||
|
|
9f0760c887 | ||
|
|
6d787d3e7e | ||
|
|
f79b04884c | ||
|
|
23af844d5b | ||
|
|
ea7d82acf9 | ||
|
|
f492148958 | ||
|
|
8414e638ec | ||
|
|
0193db35b6 | ||
|
|
b891723bab | ||
|
|
1d8aa5672e | ||
|
|
0def24381e | ||
|
|
b441e99e95 | ||
|
|
40ceb92195 | ||
|
|
38cac5dd58 | ||
|
|
b64bf54f3e | ||
|
|
5d9fc2e9af | ||
|
|
9c970632c5 | ||
|
|
58c32f5a05 | ||
|
|
8961060461 | ||
|
|
5f290544e0 | ||
|
|
7f4dc7ed42 | ||
|
|
101b74398f | ||
|
|
a36366ac61 | ||
|
|
55afa0f31d | ||
|
|
892471d8e5 | ||
|
|
4334ae38ed | ||
|
|
be2ef9b626 | ||
|
|
954e84db3c | ||
|
|
8e63c8f937 | ||
|
|
93f26540e6 | ||
|
|
08150f3a9d | ||
|
|
c9ad41288f | ||
|
|
46d3fd92c9 | ||
|
|
564f07e354 | ||
|
|
5618350c0b | ||
|
|
77808c958c | ||
|
|
c121589499 | ||
|
|
18d2cc4f12 | ||
|
|
50193471d6 | ||
|
|
7ef19ecf47 | ||
|
|
098da4124f | ||
|
|
b39788f883 | ||
|
|
ae803727e9 | ||
|
|
f2dca4698c | ||
|
|
b940837c51 | ||
|
|
481b6455f3 | ||
|
|
b5b3fda329 | ||
|
|
a634c055c4 | ||
|
|
6a4012bfcc | ||
|
|
befa55d0e1 | ||
|
|
e31a9005ba | ||
|
|
aaa379ead0 | ||
|
|
c31ac85bfa | ||
|
|
33ada924e8 | ||
|
|
211462ecbc | ||
|
|
ae12b74620 | ||
|
|
66c3855e23 | ||
|
|
343f295b6b | ||
|
|
f90dbb9321 | ||
|
|
5ab85ee20e | ||
|
|
0c0830c1df | ||
|
|
4a8a41de91 | ||
|
|
9afa21cd30 | ||
|
|
d1d3c171fd | ||
|
|
a7c6268d2c | ||
|
|
409495cc70 | ||
|
|
0460ffdb28 | ||
|
|
cbb9a1fdbe | ||
|
|
ba603528d7 | ||
|
|
9069f06857 | ||
|
|
8f76efeb2f | ||
|
|
4fb8333299 | ||
|
|
6b9d7af4ed | ||
|
|
7c1f6c2195 | ||
|
|
90f8f223b9 | ||
|
|
d06a1a68a0 | ||
|
|
af7a922cac | ||
|
|
a6d4e2340e | ||
|
|
ecdd7f6733 | ||
|
|
d407bdbbbc | ||
|
|
ef06262393 | ||
|
|
0328ed49b9 | ||
|
|
0719af011b | ||
|
|
14bd35e348 | ||
|
|
8740fea7c1 | ||
|
|
45969c7628 | ||
|
|
698286dbe0 | ||
|
|
d238b5e86d | ||
|
|
d16b5899e8 | ||
|
|
76b035b800 | ||
|
|
3bb8d5e235 | ||
|
|
8fe3934c6e | ||
|
|
ec7c8f0248 | ||
|
|
147b2d889d | ||
|
|
ca330a99e2 | ||
|
|
2eeb1e74b2 | ||
|
|
d4e68e6c18 | ||
|
|
356643d509 | ||
|
|
9a957c907a | ||
|
|
d97ef82bb7 | ||
|
|
a751c0e03a | ||
|
|
4c50c69fbb | ||
|
|
b1f77b9c4a | ||
|
|
2db2737e86 | ||
|
|
b7f2991246 | ||
|
|
c4483b4587 | ||
|
|
9c63b7c71b | ||
|
|
a443631f11 | ||
|
|
d15f13dcbd | ||
|
|
1518cbd16e | ||
|
|
65cd2233f3 | ||
|
|
8ac1a8cc05 | ||
|
|
d369310a5c | ||
|
|
1d15871a69 | ||
|
|
35e7f4265b | ||
|
|
bb0be8a523 | ||
|
|
6684754a47 | ||
|
|
c214999e27 | ||
|
|
9e1ce571e4 | ||
|
|
2b968814c5 | ||
|
|
8abff891c3 | ||
|
|
e8189636b3 | ||
|
|
795886d2f2 | ||
|
|
d17f3bedd3 | ||
|
|
9311e7c94f | ||
|
|
10193dd014 | ||
|
|
bc44bb0fe9 | ||
|
|
e980c5d762 | ||
|
|
6a497b3894 | ||
|
|
317d910cd3 | ||
|
|
6248fb89b3 | ||
|
|
51f5e40b37 | ||
|
|
ad048a8d5b | ||
|
|
7b4a0515be | ||
|
|
3d9d9448aa | ||
|
|
e90000545b | ||
|
|
dc248dbbde | ||
|
|
ea01ec0f0e | ||
|
|
cf0c62f0c4 | ||
|
|
ddc6da53b3 | ||
|
|
bb40239ed0 | ||
|
|
a2aa738f19 | ||
|
|
c2ae4776a2 | ||
|
|
c0e1987b66 | ||
|
|
344f7cc5df | ||
|
|
b7118a7d44 | ||
|
|
dea15ab6bd | ||
|
|
b1f74213c6 | ||
|
|
5b92d712f4 | ||
|
|
1122ad65ec | ||
|
|
ab410b6707 | ||
|
|
5f9094e7d1 | ||
|
|
fb4c749115 | ||
|
|
3a1c03894f | ||
|
|
b171a92449 | ||
|
|
e5a8319f0b | ||
|
|
8f79000d2d | ||
|
|
a4e926b637 | ||
|
|
8ffc89def2 | ||
|
|
92cef0b811 | ||
|
|
ad684bfdfc | ||
|
|
ccc1de2595 | ||
|
|
16b37b1061 | ||
|
|
10a39fd52c | ||
|
|
97385d3310 | ||
|
|
8a2c0c320e | ||
|
|
cea9145400 | ||
|
|
cf5f1c9c6e | ||
|
|
1c69eb4ce4 | ||
|
|
918971cab8 | ||
|
|
c1a534bee2 | ||
|
|
41f5dfaffc | ||
|
|
c60fffc34a | ||
|
|
d05aceb3f3 | ||
|
|
9dbf0bbbcd | ||
|
|
cb2c5aae48 | ||
|
|
10af0102f4 | ||
|
|
a2663fc8dd | ||
|
|
fb5e6e927f | ||
|
|
4bbe6ed195 | ||
|
|
69fa34b3c5 | ||
|
|
b49de3eccb | ||
|
|
b1f51c30a6 | ||
|
|
63a049d336 | ||
|
|
05fdf963af | ||
|
|
9b9b79ed58 | ||
|
|
97cf2475cf | ||
|
|
e363ee0994 | ||
|
|
473960a394 | ||
|
|
5ff925d583 | ||
|
|
ef60909d4c | ||
|
|
97b22438fa | ||
|
|
3eba79d6c5 | ||
|
|
b747ac27cb | ||
|
|
fcf7b1a025 | ||
|
|
f02735de81 | ||
|
|
4c15575194 | ||
|
|
bb6e130bfe | ||
|
|
e4526f4725 | ||
|
|
ec8d9a3714 | ||
|
|
96f4c944c1 | ||
|
|
cc66524e1f | ||
|
|
ea07c9dcd8 | ||
|
|
7c5c27f556 | ||
|
|
7a94b2dbd6 | ||
|
|
b8cfc9630f | ||
|
|
563239147f | ||
|
|
70d701db5b | ||
|
|
683f8ebdc7 | ||
|
|
b20d963f56 | ||
|
|
df653f9f78 | ||
|
|
7614955591 | ||
|
|
8a1b37e8ec | ||
|
|
8eadfe3d79 | ||
|
|
b9120ddce4 | ||
|
|
4bf840abf3 | ||
|
|
90dbf440c7 | ||
|
|
e46f920929 | ||
|
|
6ebed79500 | ||
|
|
9357a37509 | ||
|
|
f02676f264 | ||
|
|
cac8e89670 | ||
|
|
9e9fde2e8f | ||
|
|
a0b62b1392 | ||
|
|
db1a788082 | ||
|
|
5a93299fc3 | ||
|
|
f84ac09e31 | ||
|
|
c1cdb365f1 | ||
|
|
45e8e20eae | ||
|
|
0eefcd7d4f | ||
|
|
4ce3ebf1fd | ||
|
|
d454389356 | ||
|
|
65bc1062f5 | ||
|
|
6e347619f4 | ||
|
|
980aedf314 | ||
|
|
3a608f3fde | ||
|
|
4946ebf154 | ||
|
|
361700734f | ||
|
|
2d606e6836 | ||
|
|
1dfb6824a3 | ||
|
|
aba8d8f871 | ||
|
|
3788ec3f9a | ||
|
|
3b56ed3cfd | ||
|
|
62c4711f8e | ||
|
|
1b08152594 | ||
|
|
292a71e8bb | ||
|
|
ec21e81f19 | ||
|
|
5e18932429 | ||
|
|
2da5b2191f | ||
|
|
4369f2742b | ||
|
|
424ea22334 | ||
|
|
d22b93caf4 | ||
|
|
88d2216780 | ||
|
|
9e41d679c4 | ||
|
|
30e32c07b9 | ||
|
|
03a464efd9 | ||
|
|
bd485d37c9 | ||
|
|
e27f82b610 | ||
|
|
69d00a50a6 | ||
|
|
55afa4f2ea | ||
|
|
c625be0a4a | ||
|
|
4bd8b96dc9 | ||
|
|
46d5035437 | ||
|
|
ca87312c49 | ||
|
|
b3e791b4d4 | ||
|
|
4d0389db7b | ||
|
|
54866ecef5 | ||
|
|
9147929204 | ||
|
|
828a4d7a60 | ||
|
|
062de22fde | ||
|
|
91be7eb3dc | ||
|
|
0368d83484 | ||
|
|
532ddf1d9a | ||
|
|
8824742a4c | ||
|
|
dd3055836a | ||
|
|
9a5e9c5e69 | ||
|
|
ed42c3e489 | ||
|
|
1ceb587875 | ||
|
|
117a0b9849 | ||
|
|
af31e2e079 | ||
|
|
52c1ba67e3 | ||
|
|
b442f005a9 | ||
|
|
9557c46dcf | ||
|
|
e233a14eec | ||
|
|
60093e81b0 | ||
|
|
f8d012ac56 | ||
|
|
1fe2877a14 | ||
|
|
db4446b023 | ||
|
|
556de70f20 | ||
|
|
6026b5996c | ||
|
|
1d6de8e0a8 | ||
|
|
902f228565 | ||
|
|
e8a7c0257e | ||
|
|
53d251bed5 | ||
|
|
c8d4e03ead | ||
|
|
a4ba43f77b | ||
|
|
4ddb7dea28 | ||
|
|
997c5103a7 | ||
|
|
c8b0686c2f | ||
|
|
2365c34ce3 | ||
|
|
400f27ef55 | ||
|
|
cdedbaa1e9 | ||
|
|
16540936db | ||
|
|
adbeaffa39 | ||
|
|
c173beac43 | ||
|
|
e9e3906357 | ||
|
|
0d5e1ba1d3 | ||
|
|
83ed22f64e | ||
|
|
c573003167 | ||
|
|
6acb695660 | ||
|
|
cb87a32775 | ||
|
|
5d4ef568a1 | ||
|
|
ebda5cb2bc | ||
|
|
3710d43cfc | ||
|
|
9981ae4d5f | ||
|
|
56295371a4 | ||
|
|
9caea58a3c | ||
|
|
bd923806be | ||
|
|
6fc307cf7b | ||
|
|
a0a9e92fc1 | ||
|
|
2d5f558b54 | ||
|
|
ffdff5490a | ||
|
|
ea20769242 | ||
|
|
335f76665b | ||
|
|
1c410638da | ||
|
|
b8afb04de8 | ||
|
|
ee2c4f339a | ||
|
|
62a9c460e4 | ||
|
|
ba0e51ad02 | ||
|
|
5aa719daf5 | ||
|
|
a99014ad26 | ||
|
|
7ac570f4e9 | ||
|
|
6280ca5d36 | ||
|
|
96286844fb | ||
|
|
b39b6d9715 | ||
|
|
ff7b78bb6a | ||
|
|
728d634672 | ||
|
|
f500ea46d4 | ||
|
|
0cdfe3d57b | ||
|
|
a1d38d6633 | ||
|
|
7c906c8b89 | ||
|
|
bb7594f6c5 | ||
|
|
91045b918f | ||
|
|
7644b1693e | ||
|
|
95a5b2eea2 | ||
|
|
c75cd39282 | ||
|
|
76ad8258f5 | ||
|
|
b81810bb02 | ||
|
|
c1f47cdc44 | ||
|
|
27cfdb6ac4 | ||
|
|
64d6691e61 | ||
|
|
95b3ca839a | ||
|
|
9bf964b918 | ||
|
|
dcf0a7ccc9 | ||
|
|
dd9a3c8b7e | ||
|
|
3f8bf01b20 | ||
|
|
5a9b1a0a33 | ||
|
|
e342e68737 | ||
|
|
0ab37d9538 | ||
|
|
08ff08c4e6 | ||
|
|
02d488c458 | ||
|
|
267e891a9e | ||
|
|
af85a2cf25 | ||
|
|
536ca3ec34 | ||
|
|
ec28f5c494 | ||
|
|
4daada1142 | ||
|
|
a221e0cbee | ||
|
|
34f3220d1a | ||
|
|
e93c49fb8c | ||
|
|
aa3f671d86 | ||
|
|
515cc6b829 | ||
|
|
8d174225f7 | ||
|
|
3cd0b78edb | ||
|
|
5140564fc5 | ||
|
|
b465c9f9d5 | ||
|
|
4599dcd988 | ||
|
|
d115b4216c | ||
|
|
14bdfd3321 | ||
|
|
3dd857aa9f | ||
|
|
e7d14c028b | ||
|
|
c99d34aecc | ||
|
|
0207a17afa | ||
|
|
c03a7e2f90 | ||
|
|
73b049f361 | ||
|
|
1a5a974c06 | ||
|
|
5695fe34f0 | ||
|
|
9354417f76 | ||
|
|
f2e44f96d6 | ||
|
|
6e7ad1d7b8 | ||
|
|
2ccc707059 | ||
|
|
32d7efc55d | ||
|
|
30490a0c5c | ||
|
|
fb93e83f96 | ||
|
|
4c1102026d | ||
|
|
fb03c15223 | ||
|
|
63b589170c | ||
|
|
7185d4d8c1 | ||
|
|
2b0d098027 | ||
|
|
ddbddf6c2f | ||
|
|
fcfaa63f33 | ||
|
|
29c1874bc1 | ||
|
|
f497aa7fcf | ||
|
|
242dca7365 | ||
|
|
d91f7381e1 | ||
|
|
5ddd7f0a6f | ||
|
|
bad0af15f6 | ||
|
|
37acdc0cc6 | ||
|
|
d7cc15c85d | ||
|
|
380c78b758 | ||
|
|
1f1e65dcb5 | ||
|
|
06237a48c4 | ||
|
|
930d4dcdd0 | ||
|
|
f6f82a1be1 | ||
|
|
b640820052 | ||
|
|
6fafba0772 | ||
|
|
be0003927a | ||
|
|
2cb2484cd0 | ||
|
|
0015a265a9 | ||
|
|
8fa903f17a | ||
|
|
12ff451f4b | ||
|
|
6d61f9d0ef | ||
|
|
63cefe0862 | ||
|
|
7a85625743 | ||
|
|
bf3a24e515 | ||
|
|
21e2e5e2af | ||
|
|
4378a8a792 | ||
|
|
5188b64704 | ||
|
|
1532cecb25 | ||
|
|
128ff10ade | ||
|
|
22af4db51d | ||
|
|
a98f45f875 | ||
|
|
523cb34119 | ||
|
|
c02b79f0c3 | ||
|
|
24b037c307 | ||
|
|
8d6a19aeb2 | ||
|
|
bd933ca43d | ||
|
|
fa08472392 | ||
|
|
676b2ef54b | ||
|
|
22d872c7e5 | ||
|
|
353a66f44c | ||
|
|
c5a7c8d8f9 | ||
|
|
689dfcd83e | ||
|
|
e08fdc42cf | ||
|
|
8f7b82fdb3 | ||
|
|
30ff19b271 | ||
|
|
c574a97cad | ||
|
|
42ff4aa0d8 | ||
|
|
5e7de996e0 | ||
|
|
fcd960149d | ||
|
|
52ba4bb0ea | ||
|
|
f6dc70dd9b | ||
|
|
c43aa3545f | ||
|
|
f5368f988e | ||
|
|
8e48a816f8 | ||
|
|
c86a4467d3 | ||
|
|
afef829571 | ||
|
|
9c41f48786 | ||
|
|
f4e5de995c | ||
|
|
9202be6fba | ||
|
|
70a4e06f18 | ||
|
|
73f2da5087 | ||
|
|
f241c008d4 | ||
|
|
32823d8288 | ||
|
|
9920b7592d | ||
|
|
7e4c533357 | ||
|
|
fee2c667b3 | ||
|
|
d1e73c8f79 | ||
|
|
ebc9d98a87 | ||
|
|
3cf2ca4347 | ||
|
|
06f5a32c48 | ||
|
|
a058a39976 | ||
|
|
35cb9ee529 | ||
|
|
c75eab9e73 | ||
|
|
f0e59ca617 | ||
|
|
d01750601b | ||
|
|
1bbfd80c24 | ||
|
|
2b21c8ec8d | ||
|
|
a9600faa9f | ||
|
|
b1b295f700 | ||
|
|
6f39f96799 | ||
|
|
07afe71f37 | ||
|
|
b06df4740b | ||
|
|
5347bd03f1 | ||
|
|
d354e4f767 | ||
|
|
d964970c9e | ||
|
|
caef44d4f9 | ||
|
|
bfcda54fa2 | ||
|
|
f9eb2c5a0a | ||
|
|
411ef4549e | ||
|
|
3a05be49f6 | ||
|
|
ca18d164e3 | ||
|
|
b92e169b69 | ||
|
|
f6c1ae20c9 | ||
|
|
882f42de8f | ||
|
|
fdf7d5661d | ||
|
|
c8e64ac4f7 | ||
|
|
cabe9603c2 | ||
|
|
da1751dc1b | ||
|
|
abca14d9ae | ||
|
|
304ae277fe | ||
|
|
ce0180a23a | ||
|
|
0e93162080 | ||
|
|
96de4348fa | ||
|
|
6ced9dd235 | ||
|
|
7aef84ae90 | ||
|
|
e2da57f448 | ||
|
|
1bfd5bc20a | ||
|
|
d0047e6e5b | ||
|
|
7c8ecbe126 | ||
|
|
90955bdcab | ||
|
|
eda7e27394 | ||
|
|
d2b4099cdb | ||
|
|
b6947c5f25 | ||
|
|
1e7315d4a8 | ||
|
|
792b313891 | ||
|
|
d7ace92c04 | ||
|
|
a56030b6c1 | ||
|
|
568c33d7d6 | ||
|
|
9291d38bb5 | ||
|
|
ef8f10c42d | ||
|
|
33271c8386 | ||
|
|
fc7c4432e9 | ||
|
|
1a2d11560f | ||
|
|
04a7d9a92d | ||
|
|
fabc3a5db1 | ||
|
|
b83673f1c8 | ||
|
|
25f16b5315 | ||
|
|
ba21ce887a | ||
|
|
c4ffbf4b2b | ||
|
|
5764482acd | ||
|
|
24531b85c6 | ||
|
|
1b0e08cfa0 | ||
|
|
b8ca2a1e97 | ||
|
|
e59cb43b0b | ||
|
|
fe4713ad88 | ||
|
|
2cbca7a43d | ||
|
|
43c97bd8cc | ||
|
|
d2dd3d0ac6 | ||
|
|
71fb544eaa | ||
|
|
6324ed7a9c | ||
|
|
2323b07d07 | ||
|
|
23595c0608 | ||
|
|
291e7ebb57 | ||
|
|
eebc3418f9 | ||
|
|
7794090bfe | ||
|
|
867caae3da | ||
|
|
2f06fe4d2a | ||
|
|
d0098a878a | ||
|
|
b41e89586c | ||
|
|
ee7db631ee | ||
|
|
bd13035a17 | ||
|
|
b388f41f80 | ||
|
|
c6c54ad98d | ||
|
|
9f5391bbc0 | ||
|
|
a9ec60e4b9 | ||
|
|
22ca52a1cb | ||
|
|
1deee02eff | ||
|
|
b56cfb372d | ||
|
|
b27f2a59f4 | ||
|
|
c8367e257f | ||
|
|
d7a38b5350 | ||
|
|
62d37702a9 | ||
|
|
db02948e08 | ||
|
|
74fc2a2d85 | ||
|
|
7b1351daa3 | ||
|
|
0ac1298501 | ||
|
|
a317c223c4 | ||
|
|
faf76ac715 | ||
|
|
ffe118c45a | ||
|
|
3ece96ae08 | ||
|
|
e53a175740 | ||
|
|
e91cf7f6ac | ||
|
|
2b05b92de8 | ||
|
|
019d3e07b5 | ||
|
|
80ba8c2992 | ||
|
|
e3046845bf | ||
|
|
18ca3bb1c1 | ||
|
|
b8f52ed76a | ||
|
|
851053e4ec | ||
|
|
662abd29cb | ||
|
|
5f1566db49 | ||
|
|
045f5b4578 | ||
|
|
3560337b40 | ||
|
|
a63b8ca9ca | ||
|
|
c7985e8881 | ||
|
|
1425a46c00 | ||
|
|
a69bc44314 | ||
|
|
1268d76ae8 | ||
|
|
651c92c175 | ||
|
|
0f2df1b46c | ||
|
|
7319574f30 | ||
|
|
f90d871fb6 | ||
|
|
b9821f1c21 | ||
|
|
019211cb80 | ||
|
|
52ca6af024 | ||
|
|
bc9e3427a0 | ||
|
|
cc4d27c6d2 | ||
|
|
54dabd979b | ||
|
|
b687977663 | ||
|
|
180c508d83 | ||
|
|
3e85f5bf39 | ||
|
|
0001e35400 | ||
|
|
23165d9382 | ||
|
|
3ae5774404 | ||
|
|
1abc31895e | ||
|
|
bce7bd7fa7 | ||
|
|
6fc70fbc55 | ||
|
|
ec429af686 | ||
|
|
bf86becc5e | ||
|
|
e11aa24b7d | ||
|
|
510142ad2d | ||
|
|
c5ecf80b65 | ||
|
|
6eb361d8f7 | ||
|
|
fc739f242d | ||
|
|
e56f588dea | ||
|
|
3f266a188a | ||
|
|
0ee551de71 | ||
|
|
e1bcd86e5e | ||
|
|
7dc40f68db | ||
|
|
b16fc6b19a | ||
|
|
ad2b332fa0 | ||
|
|
adb0c08933 | ||
|
|
22e2b4864f | ||
|
|
2fea9495b3 | ||
|
|
7115c44cb8 | ||
|
|
1f767c3497 | ||
|
|
d33871db98 | ||
|
|
09bae08dfa | ||
|
|
9ced73cf1d | ||
|
|
8a137691ff | ||
|
|
0d9cb51021 | ||
|
|
7de90f18cc | ||
|
|
3448db8e67 | ||
|
|
859636e6e0 | ||
|
|
dec6afa0f1 | ||
|
|
a511682ce1 | ||
|
|
755a860011 | ||
|
|
6a81420fc0 | ||
|
|
3173d75dad | ||
|
|
fa019e8960 | ||
|
|
f52c981316 | ||
|
|
b17358e761 | ||
|
|
d16ad52a56 | ||
|
|
c9b41a4343 | ||
|
|
f02fe585c8 | ||
|
|
8affdbdc86 | ||
|
|
bb5a613ad2 | ||
|
|
a61e388498 | ||
|
|
15e5b1a2f0 | ||
|
|
d72752f453 | ||
|
|
863140fec9 | ||
|
|
d67af48f29 | ||
|
|
16540d32ae | ||
|
|
b18a2a7aa3 | ||
|
|
6801ed07d8 | ||
|
|
693dce0e6c | ||
|
|
783d049668 | ||
|
|
e1cd36771e | ||
|
|
f62c8f6489 | ||
|
|
12107da9bd | ||
|
|
33ebb0ce84 | ||
|
|
3d1dfadc18 | ||
|
|
9f2e135e80 | ||
|
|
c404db4a08 | ||
|
|
96eee74f56 | ||
|
|
5713ec1365 | ||
|
|
2f881085ef | ||
|
|
bd6b719c32 | ||
|
|
7b2afa109e | ||
|
|
30ffb3492a | ||
|
|
8dae3f832d | ||
|
|
23f34e0f80 | ||
|
|
c61e0e11bb | ||
|
|
d1ac7981dd | ||
|
|
04caa5f4e4 | ||
|
|
28d320e5ac | ||
|
|
6a13c33c70 | ||
|
|
827ea1808a | ||
|
|
4357edb1d4 | ||
|
|
18d97c0609 | ||
|
|
9d7e009c0f | ||
|
|
094646d5ba | ||
|
|
7549f77edc | ||
|
|
2b0943b57d | ||
|
|
5ee2ab9b6b | ||
|
|
c6f3bda227 | ||
|
|
54b98b4e05 | ||
|
|
8e9a190fef | ||
|
|
6e0e48e150 | ||
|
|
db21f663fe | ||
|
|
fe5a1c6a8d | ||
|
|
554640b103 | ||
|
|
8332106754 | ||
|
|
ba1a28f47a | ||
|
|
aa149d2e7b | ||
|
|
c58c6157e9 | ||
|
|
056ffa300a | ||
|
|
a5f883c2f0 | ||
|
|
d450d48e99 | ||
|
|
0aa87fed63 | ||
|
|
70cc551bba | ||
|
|
5953377060 | ||
|
|
78cf7e0622 | ||
|
|
b44f82c13c | ||
|
|
5a478302f4 | ||
|
|
8fe14215e1 | ||
|
|
1621825166 | ||
|
|
b87d3fb481 | ||
|
|
6af2e859ac | ||
|
|
88cfa5ef2a | ||
|
|
fb22a8843e | ||
|
|
913d6331c6 | ||
|
|
529dda0e6d | ||
|
|
a1a6cd0d07 | ||
|
|
35c893d47a | ||
|
|
88e554fb7e | ||
|
|
99e2397981 | ||
|
|
6394953a17 | ||
|
|
b6d68f97d6 | ||
|
|
c7019930fd | ||
|
|
74024301a5 | ||
|
|
1b15818ab6 | ||
|
|
1f100bbe88 | ||
|
|
a48b008f99 | ||
|
|
c94c192e17 | ||
|
|
7ec816bf73 | ||
|
|
0d9e5985e4 | ||
|
|
fd16eb767e | ||
|
|
b31bfdaaf5 | ||
|
|
90bcc9b08b | ||
|
|
5f67edbf87 | ||
|
|
3d6be9a383 | ||
|
|
093e8b356e | ||
|
|
d575d8053f | ||
|
|
43d4c2831d | ||
|
|
50497b3c1f | ||
|
|
55a0dbeb86 | ||
|
|
49b40a1cf3 | ||
|
|
2f1f2dccc1 | ||
|
|
36518ecbeb | ||
|
|
a4cef60c49 | ||
|
|
28e773f9a7 | ||
|
|
96ee377279 | ||
|
|
5247981fa8 | ||
|
|
4152c72de5 | ||
|
|
ea6714e89b | ||
|
|
ab066397b2 | ||
|
|
5a63fddf02 | ||
|
|
8c514df120 | ||
|
|
510e8d70d7 | ||
|
|
0eab35842d | ||
|
|
108aeb0ee1 | ||
|
|
752bb7e048 | ||
|
|
46610d59ce | ||
|
|
9e897dcc46 | ||
|
|
b5603d6956 | ||
|
|
2bb3485827 | ||
|
|
ccb976e233 | ||
|
|
f0efd80e44 | ||
|
|
0be4abe9c2 | ||
|
|
d10774b3ae | ||
|
|
b7208616cd | ||
|
|
37bc09169f | ||
|
|
cdaf4f651b | ||
|
|
1cc2decfdd | ||
|
|
ce979d2945 | ||
|
|
e9eb1689e2 | ||
|
|
a451796562 | ||
|
|
5aa27fc562 | ||
|
|
0f446833c0 | ||
|
|
dc23087847 | ||
|
|
cb9c2a8ef9 | ||
|
|
28084cf99a | ||
|
|
b37ed1c1e0 | ||
|
|
5d439bdc30 | ||
|
|
b484955005 | ||
|
|
3f4330d9b1 | ||
|
|
654626d519 | ||
|
|
b9a1056503 | ||
|
|
ca0313c514 | ||
|
|
98353bc18a | ||
|
|
fb357eb241 | ||
|
|
32a9d36934 | ||
|
|
1a83487221 | ||
|
|
295084976b | ||
|
|
6cda7a29fc | ||
|
|
d053900032 | ||
|
|
17f495e9c5 | ||
|
|
c7943b8977 | ||
|
|
dd32a90844 | ||
|
|
6aa5edc7ff | ||
|
|
4b2ba185ae | ||
|
|
71ec15190b | ||
|
|
b716df1a05 | ||
|
|
3a66f5e330 | ||
|
|
d552eb2eeb | ||
|
|
ea9ae52e10 | ||
|
|
de2337dfe3 | ||
|
|
ec0d7e6ecf | ||
|
|
e707cfc67c | ||
|
|
8d5c82c531 | ||
|
|
c3c5df6394 | ||
|
|
3124fd90b9 | ||
|
|
72739ebb97 | ||
|
|
255cb5e1de | ||
|
|
39c94b8dcf | ||
|
|
a2a011f007 | ||
|
|
5af380223a | ||
|
|
1da32b81cf | ||
|
|
1ea379180a | ||
|
|
b1e5ed4018 | ||
|
|
ca3d050a0b | ||
|
|
5d2967abdf | ||
|
|
161b2271b3 | ||
|
|
3ea3d1a5f8 | ||
|
|
013c94cdf6 | ||
|
|
6a8423bd88 | ||
|
|
addbb78151 | ||
|
|
7798e49d8a | ||
|
|
f6789eaf39 | ||
|
|
fd0f48f028 | ||
|
|
c13b4f18f7 | ||
|
|
418e753684 | ||
|
|
67840e9481 | ||
|
|
03eb760cd7 | ||
|
|
41c40974a3 | ||
|
|
90098648df | ||
|
|
9a6ce11f09 | ||
|
|
00f1ab4393 | ||
|
|
d404e40508 | ||
|
|
7119d53a86 | ||
|
|
b6a496aae5 | ||
|
|
2afb8a5a96 | ||
|
|
ecaed07a3d | ||
|
|
efcc2cf249 | ||
|
|
30ec8e645b | ||
|
|
bd5db6b48e | ||
|
|
3a1ba53a4b | ||
|
|
44d81b897a | ||
|
|
ab95dfa7cd | ||
|
|
5623db50fa | ||
|
|
6b9ebb6dc5 | ||
|
|
647ac1f84b | ||
|
|
e2e843d2ed | ||
|
|
e24b644a09 | ||
|
|
d5381d7b36 | ||
|
|
c3a33c3795 | ||
|
|
f7c0f0341b | ||
|
|
4e4f515ef1 | ||
|
|
9f7fd68728 | ||
|
|
3f5bc60406 | ||
|
|
66fa7a1ea9 | ||
|
|
afa4d11c88 | ||
|
|
0cfb9681e6 | ||
|
|
321b9c5999 | ||
|
|
3d9024561c | ||
|
|
1d5e4d7090 | ||
|
|
484f53224d | ||
|
|
b49b8b4778 | ||
|
|
a03994d587 | ||
|
|
3c0b58322a | ||
|
|
6dd9af61fd | ||
|
|
48a4277ea2 | ||
|
|
7731b96bcf | ||
|
|
54a6dee35d | ||
|
|
efbe8bd857 | ||
|
|
5ae3d5afdc | ||
|
|
dca071cb6f | ||
|
|
238c04ff68 | ||
|
|
1702f9cb19 | ||
|
|
76d619fb34 | ||
|
|
66dd7d4337 | ||
|
|
344def2b3d | ||
|
|
40c09a5d80 | ||
|
|
0b0fddb886 | ||
|
|
d9f83927e1 | ||
|
|
d8d85815ad | ||
|
|
4d569d3f7d | ||
|
|
db699de008 | ||
|
|
10aa5d4c8c | ||
|
|
06eaf803b5 | ||
|
|
dc448f0033 | ||
|
|
63a5e953ba | ||
|
|
0f725d0d68 | ||
|
|
d61a4529f3 | ||
|
|
aadde5a791 | ||
|
|
ca5efcc032 | ||
|
|
a13c77d836 | ||
|
|
85edef0802 | ||
|
|
b3841e19d2 | ||
|
|
8d40ec9c1d | ||
|
|
eaadd12c0e | ||
|
|
1b780e3178 | ||
|
|
ae597dac7f | ||
|
|
83cd22077e | ||
|
|
6cd25ff346 | ||
|
|
1a1bb7abd7 | ||
|
|
66aeff12fc | ||
|
|
d5cdcf9285 | ||
|
|
48d2ea7424 | ||
|
|
4222430988 | ||
|
|
e95809a442 | ||
|
|
85ee2ca272 | ||
|
|
45dd57e49e | ||
|
|
e68ab9c746 | ||
|
|
c98aa8e5af | ||
|
|
89c4e562ee | ||
|
|
72f5d51ca4 | ||
|
|
3cab47a13d | ||
|
|
19e7871355 | ||
|
|
f99d5d6b34 | ||
|
|
90ed2b0c51 | ||
|
|
64c7fdf057 | ||
|
|
aa2ff6e3f2 | ||
|
|
5b19b606c4 | ||
|
|
700a639c8e | ||
|
|
ab987cd740 | ||
|
|
7cdef717d0 | ||
|
|
626baf5705 | ||
|
|
2841fbbf61 | ||
|
|
b142fa9f7e | ||
|
|
6ab5c9d116 | ||
|
|
80a77b256e | ||
|
|
de5546c713 | ||
|
|
1f07dc517e | ||
|
|
3841025ffc | ||
|
|
f7c364d34b | ||
|
|
669cb6547d | ||
|
|
9d4e854723 | ||
|
|
a9f4585a36 | ||
|
|
deaee3f6a8 | ||
|
|
7a35973bbf | ||
|
|
a0b0584be8 | ||
|
|
66d9ead746 | ||
|
|
8945dffb0c | ||
|
|
101aef7474 | ||
|
|
d026b39988 | ||
|
|
2b99fd0ba6 | ||
|
|
4ab78a096b | ||
|
|
9c5ba437de | ||
|
|
b41490a6f6 | ||
|
|
563934dcac | ||
|
|
e8702e757e | ||
|
|
f4595ced2d | ||
|
|
6cc29e4527 | ||
|
|
485719ca1f | ||
|
|
940024823e | ||
|
|
187140f083 | ||
|
|
89cbe815a7 | ||
|
|
3d28d1c2a7 | ||
|
|
8a638c6115 | ||
|
|
a71cd3058a | ||
|
|
720ce51dcd | ||
|
|
727993dd45 | ||
|
|
40a82aa2dd | ||
|
|
5e12803efa | ||
|
|
8ffa5bbbcb | ||
|
|
f502708f7a | ||
|
|
ec82c6b8af | ||
|
|
417c94470f | ||
|
|
396f4449d8 | ||
|
|
27e0f08ee9 | ||
|
|
c0ad842851 | ||
|
|
2348709622 | ||
|
|
5f727f6e6e | ||
|
|
d42dfeb268 | ||
|
|
610cef4bb9 | ||
|
|
812e2535c0 | ||
|
|
2ad2a6c77f | ||
|
|
f99a1406bb | ||
|
|
662261c590 | ||
|
|
fd1495effe | ||
|
|
6150be51b1 | ||
|
|
0c2d0178db | ||
|
|
0b4df40f60 | ||
|
|
b7ac9b8757 | ||
|
|
5e88150ee3 | ||
|
|
309b051dbb | ||
|
|
759de1e911 | ||
|
|
6a1a44b493 | ||
|
|
828aa493a6 | ||
|
|
6c5227b6b3 | ||
|
|
3ea23a97ed | ||
|
|
f7b5922fd9 | ||
|
|
8bee93c236 | ||
|
|
8e6e7ed4cc | ||
|
|
2c156e850a | ||
|
|
6fff0f5eee | ||
|
|
29201be7f0 | ||
|
|
f667c6224f | ||
|
|
ab6f0fd62d | ||
|
|
da23a195ab | ||
|
|
b1ec80793c | ||
|
|
55cd08865f | ||
|
|
4efd08a66f | ||
|
|
ded6b0579d | ||
|
|
534e8a629e | ||
|
|
b42436909f | ||
|
|
b30c1af78a | ||
|
|
d984652ab7 | ||
|
|
440885cee2 | ||
|
|
547ad1e9dc | ||
|
|
e7e875bb7b | ||
|
|
c41f9972c3 | ||
|
|
be76f61c96 | ||
|
|
ffca891f57 | ||
|
|
40d3ff40f6 | ||
|
|
b8b2eadf2e | ||
|
|
ec16dc8cec | ||
|
|
e8a2b3b10f | ||
|
|
bcb6e477cf | ||
|
|
823dbdfcc1 | ||
|
|
9cfffa8a78 | ||
|
|
862543a12c | ||
|
|
6e20017723 | ||
|
|
e7fd8ee0b7 | ||
|
|
554fe30288 | ||
|
|
3fbd80728d | ||
|
|
1fb81bec39 | ||
|
|
2e0e559c59 | ||
|
|
68f63dc89b | ||
|
|
d8417955b3 | ||
|
|
f4cc813740 | ||
|
|
39f5c04f94 | ||
|
|
f1fcb886a0 | ||
|
|
7b373ecb71 | ||
|
|
c9fc88e8de | ||
|
|
92ade120af | ||
|
|
613252f210 | ||
|
|
db99f6f34a | ||
|
|
768dbf5bd3 | ||
|
|
305e7906b9 | ||
|
|
0fc03982c8 | ||
|
|
dea823f575 | ||
|
|
44d0b21eb9 | ||
|
|
58cff21ced | ||
|
|
78cc80714d | ||
|
|
67ad20ce5a | ||
|
|
db116d0a07 | ||
|
|
5f7befcfbd | ||
|
|
dbcbc5eb95 | ||
|
|
2be3037ed3 | ||
|
|
eb1a3da363 | ||
|
|
fd9b100423 | ||
|
|
3c8c25d680 | ||
|
|
a0e26dfc2d | ||
|
|
49f7d6bab1 | ||
|
|
358ec48d8a | ||
|
|
afbbfd7e46 | ||
|
|
45391c7cc8 | ||
|
|
2fc2275495 | ||
|
|
b6bba49d47 | ||
|
|
887f02f859 | ||
|
|
a5ef1c8e3b | ||
|
|
cac6633bf7 | ||
|
|
738059f56a | ||
|
|
ef7b1c1454 | ||
|
|
cf30f1b255 | ||
|
|
4c4462987e | ||
|
|
d21af5b277 | ||
|
|
a72cdcfd90 | ||
|
|
0e3f7a0706 | ||
|
|
15622d2e92 | ||
|
|
554bb815c9 | ||
|
|
8c14e64909 | ||
|
|
b1d3e8faaa | ||
|
|
9784c198e3 | ||
|
|
642a9c5c94 | ||
|
|
c83bdbd14e | ||
|
|
6880727e4f | ||
|
|
db2ef362af | ||
|
|
233f0cfd0d | ||
|
|
3340398cd7 | ||
|
|
d2d07a3fc1 | ||
|
|
1b9e7daca5 | ||
|
|
68e8cd64f1 | ||
|
|
3b053b5d60 | ||
|
|
74284193dc | ||
|
|
c9a7b2394d | ||
|
|
6d79d3352c | ||
|
|
508b3e1db7 | ||
|
|
34a71b5e2d | ||
|
|
49fb0c90ad | ||
|
|
82bb245d43 | ||
|
|
fa480b0bc3 | ||
|
|
05d351cd68 | ||
|
|
60b6fd11f9 | ||
|
|
f5003bb07a | ||
|
|
3bc94b2794 | ||
|
|
8960f91c7b | ||
|
|
b52cf468af | ||
|
|
4031b49d77 | ||
|
|
7afb5072c7 | ||
|
|
0a2f810264 | ||
|
|
afcbfccdc4 | ||
|
|
037215da47 | ||
|
|
ac736c6deb | ||
|
|
9ada6555e4 | ||
|
|
0cd5e0869d | ||
|
|
e478e836a2 | ||
|
|
369681d76d | ||
|
|
d8cf6810b8 | ||
|
|
b6a00269af | ||
|
|
8f267a19c4 | ||
|
|
59d9645f33 | ||
|
|
ab985d90f7 | ||
|
|
1894c4b855 | ||
|
|
c2109e9744 | ||
|
|
7755a58bb3 | ||
|
|
1b0890ae6e | ||
|
|
78540624ae | ||
|
|
1db243e236 | ||
|
|
9cca0dcce8 | ||
|
|
c9f05b0299 | ||
|
|
9224e0c3f2 | ||
|
|
8fb24e5315 | ||
|
|
92557c8225 | ||
|
|
33e6975ac4 | ||
|
|
e02309bc44 | ||
|
|
a6269d77ae | ||
|
|
ad6ed03f0d | ||
|
|
e3a9044164 | ||
|
|
9a781c0f2b | ||
|
|
00eb0d8a85 | ||
|
|
722fb1fb91 | ||
|
|
9182e7a882 | ||
|
|
49c82bcd65 | ||
|
|
87a1a861b8 | ||
|
|
c17e191815 | ||
|
|
dbf7a3f72d | ||
|
|
fc3efaed3d | ||
|
|
314278ac69 | ||
|
|
7356c122de | ||
|
|
664a0bc812 | ||
|
|
bee9f00da8 | ||
|
|
c3d1d959b2 | ||
|
|
7bb465df07 | ||
|
|
25ca7fe6fe | ||
|
|
566f030902 | ||
|
|
37e3f95538 | ||
|
|
830b6f120d | ||
|
|
addb7dfd3a | ||
|
|
87d2b22446 | ||
|
|
a1559c5802 | ||
|
|
9453009de6 | ||
|
|
199aceefc1 | ||
|
|
f0aca3374f | ||
|
|
bb326e4030 | ||
|
|
23c46f150f | ||
|
|
2d990499d2 | ||
|
|
a15bed17d8 | ||
|
|
fd808a85df | ||
|
|
931eefd260 | ||
|
|
1d4d52c9c9 | ||
|
|
97bcdfd73a | ||
|
|
ebcd7a16a9 | ||
|
|
7002dcec0e | ||
|
|
d29d543e95 | ||
|
|
653b8826d4 | ||
|
|
57072adc57 | ||
|
|
d02035a1a1 | ||
|
|
7265736ce2 | ||
|
|
0534080b83 | ||
|
|
edfc09c755 | ||
|
|
b2c2762f06 | ||
|
|
c90a0592dd | ||
|
|
b85baefad9 | ||
|
|
f8fce42df7 | ||
|
|
1e6fa4159a | ||
|
|
a8bc251a94 | ||
|
|
d8ba67e2e3 | ||
|
|
141bf7f0a3 | ||
|
|
b464d5a5b7 | ||
|
|
1b496525b1 | ||
|
|
a70524bb74 | ||
|
|
fea2dec9f7 | ||
|
|
dd99652087 | ||
|
|
f42984612f | ||
|
|
22dca58c9a | ||
|
|
450101be8e | ||
|
|
fe14686586 | ||
|
|
0c3c90af6a | ||
|
|
3a9c8d9c0f | ||
|
|
c16f051e5b | ||
|
|
ec1608ba19 | ||
|
|
74fb16a758 | ||
|
|
6cf7b7b606 | ||
|
|
6dcec8a176 | ||
|
|
9c7786d06b | ||
|
|
52a796ef92 | ||
|
|
ae2eefc6bf | ||
|
|
148e099f58 | ||
|
|
d7f27b8ae7 | ||
|
|
0351f37e67 | ||
|
|
69bac57058 | ||
|
|
cbcac3af70 | ||
|
|
2b030a5e87 | ||
|
|
8eb15627bf | ||
|
|
9a5e8172d6 | ||
|
|
ae8bf7b60d | ||
|
|
c292b896e3 | ||
|
|
f35b7283c0 | ||
|
|
b746581d5a | ||
|
|
d93a8d41d2 | ||
|
|
e27466b8a6 | ||
|
|
90ca080b1e | ||
|
|
9a89a9beac | ||
|
|
0f94ac864b | ||
|
|
f6b345632f | ||
|
|
5db296c542 | ||
|
|
eb45052021 | ||
|
|
43cee04283 | ||
|
|
5cab46f2a1 | ||
|
|
08443a452d | ||
|
|
dcb934fb45 | ||
|
|
68c80d619d | ||
|
|
fa2d2ba91c | ||
|
|
58a4874632 | ||
|
|
a973276ad6 | ||
|
|
515e7f3dab | ||
|
|
07486b27a7 | ||
|
|
358301338c | ||
|
|
6ebac86632 | ||
|
|
bc176bfbf2 | ||
|
|
e46141adf9 | ||
|
|
61c33a7038 | ||
|
|
83cf74b71b | ||
|
|
0038f9d43e | ||
|
|
8e24ce9f30 | ||
|
|
529026f0f4 | ||
|
|
5b0ac94211 | ||
|
|
5ab33643c8 | ||
|
|
88e72ff62a | ||
|
|
2df3282840 | ||
|
|
171f94b9ea | ||
|
|
feb27b919b | ||
|
|
1641b10e79 | ||
|
|
98ff3b0677 | ||
|
|
15923fceaf | ||
|
|
0553e5b50e | ||
|
|
f83803ffad | ||
|
|
d5291b57ab | ||
|
|
3709dcedd2 | ||
|
|
2b83928cab | ||
|
|
e9dcabae7d | ||
|
|
4845237eba | ||
|
|
eb2c2ea0a0 | ||
|
|
be7390424a | ||
|
|
1ebc4dfad2 | ||
|
|
341a35410d | ||
|
|
7250e27ba1 | ||
|
|
d6c34a0142 | ||
|
|
00377325f0 | ||
|
|
34edf3e724 | ||
|
|
31a695f73f | ||
|
|
c6a22d237b | ||
|
|
9cb7fd0a00 | ||
|
|
f7bd69fad4 | ||
|
|
178925cd56 | ||
|
|
de88f3bde9 | ||
|
|
9c98db6fa6 | ||
|
|
e69a22748f | ||
|
|
a40b55d8d4 | ||
|
|
b5809db9eb | ||
|
|
fa9c91de83 | ||
|
|
ceb48bd472 | ||
|
|
9861a33c72 | ||
|
|
ddb61d75ca | ||
|
|
edeb237777 | ||
|
|
e5f9358cf9 | ||
|
|
a2d70980d8 | ||
|
|
5daf7e5a9b | ||
|
|
6b606aaa24 | ||
|
|
a001a10bac | ||
|
|
8860c9a1dd | ||
|
|
5af9fe0a3e | ||
|
|
e821955c97 | ||
|
|
3884878efb | ||
|
|
56716e7a20 | ||
|
|
cd58e034ca | ||
|
|
0ad9e3b707 | ||
|
|
9f8134a51b | ||
|
|
94096d0276 | ||
|
|
ad0b9a08c6 | ||
|
|
fa501eff6d | ||
|
|
6e8fbf5f8e | ||
|
|
869b430ba6 | ||
|
|
d7e100ac71 | ||
|
|
617aa3627a | ||
|
|
266208c13d | ||
|
|
632493f654 | ||
|
|
f9afeb51f8 | ||
|
|
eb33b3fd5c | ||
|
|
43fc70695d | ||
|
|
093ca1b506 | ||
|
|
d01bb00ca2 | ||
|
|
fb52fac9cc | ||
|
|
8a5c79d05b | ||
|
|
ce968db278 | ||
|
|
d241c9f7cb | ||
|
|
ecba8d44a9 | ||
|
|
ba385cf5b1 | ||
|
|
ab88eca645 | ||
|
|
ddf4465c00 | ||
|
|
1c3f113122 | ||
|
|
3ff4176e1f | ||
|
|
a3dfc9f621 | ||
|
|
222364e040 | ||
|
|
e5568aaa82 | ||
|
|
47dcc8badd | ||
|
|
6a0198aff5 | ||
|
|
b7c7a3468a | ||
|
|
118424d686 | ||
|
|
4e0cdaddf7 | ||
|
|
249f13f4bc | ||
|
|
030203effd | ||
|
|
334e150638 | ||
|
|
308f790f3c | ||
|
|
d47dbc604e | ||
|
|
96d193f7dd | ||
|
|
3e94ca4f45 | ||
|
|
d16033a417 | ||
|
|
cab9afee44 | ||
|
|
1041e42f8d | ||
|
|
6ed30dfbfe | ||
|
|
329f22f72c | ||
|
|
8ac8164b06 | ||
|
|
4e719c5858 | ||
|
|
6577c656be | ||
|
|
f76ec47fe3 | ||
|
|
50cd630127 | ||
|
|
7085e05388 | ||
|
|
3962a80192 | ||
|
|
4079288a51 | ||
|
|
6dfd16b62a | ||
|
|
4067c89260 | ||
|
|
dcce7fc39a | ||
|
|
0a95246cb0 | ||
|
|
eecaf85df6 | ||
|
|
13061671f8 | ||
|
|
c2900480d7 | ||
|
|
fb65fdf25e | ||
|
|
92e1213fe2 | ||
|
|
d21b3b4b8a | ||
|
|
c1945c9429 | ||
|
|
1d56e253d7 | ||
|
|
a3df5c465e | ||
|
|
5491456985 | ||
|
|
ca80e47f3d | ||
|
|
929a5289e2 | ||
|
|
814f5d9448 | ||
|
|
f5e6fb6fbd | ||
|
|
423f305fd0 | ||
|
|
9cc6c4ee3e | ||
|
|
ccb0d25939 | ||
|
|
8d5855c93a | ||
|
|
9724bfb20e | ||
|
|
611aa6391a | ||
|
|
001ca98855 | ||
|
|
0e84b4b269 | ||
|
|
3c51815d78 | ||
|
|
9969cd4c8c | ||
|
|
4ea9b1182f | ||
|
|
257501ce37 | ||
|
|
eb802838ee | ||
|
|
c309588ae4 | ||
|
|
e527f49d73 | ||
|
|
2bbe361783 | ||
|
|
6c7de5a0b0 | ||
|
|
113268b12a | ||
|
|
96d4de8277 | ||
|
|
10d5b48643 | ||
|
|
b3a8047ba3 | ||
|
|
9bd008021d | ||
|
|
2915dc75d3 | ||
|
|
e4d0e03078 | ||
|
|
3785a4b5db | ||
|
|
f7f9e23246 | ||
|
|
945437e04d | ||
|
|
4d25413229 | ||
|
|
dacff1fc09 | ||
|
|
4262511f91 | ||
|
|
57b7018a83 | ||
|
|
d2999307d8 | ||
|
|
a528df0b2e | ||
|
|
c4c9024ee0 | ||
|
|
6bdde2379e | ||
|
|
dac059e85e | ||
|
|
a3d20386fc | ||
|
|
9c3e4cf03a | ||
|
|
0630f4e298 | ||
|
|
dde46a4ee4 | ||
|
|
3b0d1ab410 | ||
|
|
3ae625077f | ||
|
|
e36a3f9e33 | ||
|
|
7e5726a247 | ||
|
|
8ec67ea190 | ||
|
|
9d793348e2 | ||
|
|
715daf6824 | ||
|
|
7db563066b | ||
|
|
b9fd6e5c68 | ||
|
|
68f2f0c400 | ||
|
|
c400743bc3 | ||
|
|
e1fe556abb | ||
|
|
ffe3faeb5f | ||
|
|
2f4f7711dc | ||
|
|
ecc6de6a02 | ||
|
|
8d94f99e4e | ||
|
|
1fedbd105e | ||
|
|
68e1b496f1 | ||
|
|
3283ce144c | ||
|
|
3843406ba9 | ||
|
|
fbb6efa5cf | ||
|
|
3812548447 | ||
|
|
a16e51ad7b | ||
|
|
a709e7ba56 | ||
|
|
f09ecfd458 | ||
|
|
c31193b45c | ||
|
|
1ef131354f | ||
|
|
70fd93ac8f | ||
|
|
e70f8e8c51 | ||
|
|
55349d8e2f | ||
|
|
8d923a5765 | ||
|
|
845effd5ed | ||
|
|
e5afc3ede8 | ||
|
|
22cfb6ddab | ||
|
|
5bcc8f750b | ||
|
|
608e3245e0 | ||
|
|
c7074d5e4d | ||
|
|
7898e4aac3 | ||
|
|
6673743406 | ||
|
|
c10584a068 | ||
|
|
c8e34a9c24 | ||
|
|
3ca4e928da | ||
|
|
8846dbf6a1 | ||
|
|
a90028441a | ||
|
|
5a4148b712 | ||
|
|
2c798909d7 | ||
|
|
b163ddca76 | ||
|
|
1fa2b5ad28 | ||
|
|
9f7f495961 | ||
|
|
0214613182 | ||
|
|
51dfb71063 | ||
|
|
ef8d8bf094 | ||
|
|
e5f974a390 | ||
|
|
56abad1f27 | ||
|
|
d4f1da3018 | ||
|
|
146f9584d9 | ||
|
|
9f2c0d52f1 | ||
|
|
e2c5647c26 | ||
|
|
e038c0afad | ||
|
|
3d1dcd063b | ||
|
|
49a5b3025b | ||
|
|
28f76bc9e3 | ||
|
|
f6867bc2d9 | ||
|
|
19d674b4e5 | ||
|
|
e6bed63344 | ||
|
|
85c721393e | ||
|
|
e57309770c | ||
|
|
911fb4e226 | ||
|
|
9d71ec6821 | ||
|
|
2475e42c16 | ||
|
|
7cb1d74aa8 | ||
|
|
a3f671544d | ||
|
|
7772fdc556 | ||
|
|
80fe196b5a | ||
|
|
e76bcf0ea9 | ||
|
|
f498421515 | ||
|
|
d05eb2aa6e | ||
|
|
d2bbc9adaf | ||
|
|
16ea8462c8 | ||
|
|
2095889eff | ||
|
|
aacfdb62bb | ||
|
|
64af8ae88f | ||
|
|
92a66c0d11 | ||
|
|
d9ef136111 | ||
|
|
def270c298 | ||
|
|
f25e92d443 | ||
|
|
91c88d56eb | ||
|
|
5145272415 | ||
|
|
f3d97a1107 | ||
|
|
360f778ade | ||
|
|
57aff944b3 | ||
|
|
f72056eff6 | ||
|
|
4d15bc4375 | ||
|
|
8939abb370 | ||
|
|
4dcadcf78f | ||
|
|
a1f2442d35 | ||
|
|
fcc9bc51f6 | ||
|
|
aab147ac3c | ||
|
|
560f049825 | ||
|
|
4b4fa2361b | ||
|
|
0b8328a876 | ||
|
|
b2fb74555c | ||
|
|
91c891b32f | ||
|
|
853c065e01 | ||
|
|
bd9c1e525a | ||
|
|
4e073be361 | ||
|
|
3c4336d25c | ||
|
|
990f1b1ea9 | ||
|
|
cd627963e6 | ||
|
|
e4421db04e | ||
|
|
c7b4060fa7 | ||
|
|
549f3f27dc | ||
|
|
7f97301e06 | ||
|
|
4911f3f2f1 | ||
|
|
802bb67324 | ||
|
|
d0a5bf7485 | ||
|
|
d1da96a46c | ||
|
|
2f36ee450c | ||
|
|
daa8707822 | ||
|
|
1c2ad3b331 | ||
|
|
c1ac4f4b8b | ||
|
|
084c22c282 | ||
|
|
084f19c212 | ||
|
|
d7c00f2240 | ||
|
|
fdc895a1db | ||
|
|
0b7eefd862 | ||
|
|
3849108cae | ||
|
|
ac04b183a6 | ||
|
|
b27a976712 | ||
|
|
7b01c196d1 | ||
|
|
4dd04a8a92 | ||
|
|
9be9b05d42 | ||
|
|
711a2573c0 | ||
|
|
e22f45c878 | ||
|
|
a28e32f78b | ||
|
|
228387bf4f | ||
|
|
176bf74d49 | ||
|
|
686ff2bfeb | ||
|
|
ef90f698d5 | ||
|
|
5885464341 | ||
|
|
e7c8b08a43 | ||
|
|
5ff910baa6 | ||
|
|
0d99d9fc9e | ||
|
|
15a3241437 | ||
|
|
b870074e5c | ||
|
|
8675b833ed | ||
|
|
9e5c6cc5be | ||
|
|
bc38d3c8f5 | ||
|
|
a244adfb4b | ||
|
|
b94b473736 | ||
|
|
4f97fb6310 | ||
|
|
c08d5773e8 | ||
|
|
06f6e83c3c | ||
|
|
3f1b2ec50f | ||
|
|
4ec117b943 | ||
|
|
1dc9c59768 | ||
|
|
ac8ac3a07e | ||
|
|
89cabf6006 | ||
|
|
50b9a3d230 | ||
|
|
aaa1bbddd2 | ||
|
|
cccd7c2d33 | ||
|
|
57447cb0cf | ||
|
|
8a7a723289 | ||
|
|
e7b92202f2 | ||
|
|
2b51006819 | ||
|
|
2fbec9ab8f | ||
|
|
4867235e02 | ||
|
|
796c8ff979 | ||
|
|
923857b957 | ||
|
|
071b39f39b | ||
|
|
1233eea690 | ||
|
|
ad3f34b8f1 | ||
|
|
8a06a98b18 | ||
|
|
75cf1f1844 | ||
|
|
0962d0b7fb | ||
|
|
fdce26f7a8 | ||
|
|
4ffb597954 | ||
|
|
d259939263 | ||
|
|
4ce0ab1800 | ||
|
|
2123e485d8 | ||
|
|
a26d8245ab | ||
|
|
8ff38c9669 | ||
|
|
29c15cde1d | ||
|
|
750f593f03 | ||
|
|
daab23eb6e | ||
|
|
40591357b4 | ||
|
|
275363de2b | ||
|
|
9c592383c7 | ||
|
|
462788f6c5 | ||
|
|
5a42b18325 | ||
|
|
23f2f23ac3 | ||
|
|
3446a85bca | ||
|
|
fc33fe8f44 | ||
|
|
4861f67f84 | ||
|
|
039f5c25c5 | ||
|
|
6bbd0c2736 | ||
|
|
d017aacf6d | ||
|
|
f2a8bad6fd | ||
|
|
297b4167e9 | ||
|
|
794c0c1b3e | ||
|
|
b3f67561b1 | ||
|
|
78c378522c | ||
|
|
c90779265a | ||
|
|
4da505ca1f | ||
|
|
eea0fc4b26 | ||
|
|
c7a7890148 | ||
|
|
1a20488a0d | ||
|
|
558b4ed4cd | ||
|
|
4141e2b5d6 | ||
|
|
3167e454e7 | ||
|
|
be93995a3b | ||
|
|
498774d47e | ||
|
|
32847ed4f7 | ||
|
|
7650e6de95 | ||
|
|
4350ddaec0 | ||
|
|
c7ac700355 | ||
|
|
4a2215793d | ||
|
|
4e50aee372 | ||
|
|
8120f75ace | ||
|
|
33ed6dd806 | ||
|
|
322202b7e7 | ||
|
|
c3f2868805 | ||
|
|
2b145f6e6b | ||
|
|
897c1f3766 | ||
|
|
b887c0cf0b | ||
|
|
b2990c8b1a | ||
|
|
7fafe4ae7f | ||
|
|
6036609a3e | ||
|
|
1528d5d67b | ||
|
|
155c2f4919 | ||
|
|
cf89cbbff4 | ||
|
|
8b66bf15f0 | ||
|
|
44e5fc96fc | ||
|
|
f0237e4ec8 | ||
|
|
ba80c083ab | ||
|
|
9e45d82049 | ||
|
|
d7f4e2cc7a | ||
|
|
671fb02434 | ||
|
|
3db78d41eb | ||
|
|
5e3ad2af44 | ||
|
|
2576690f63 | ||
|
|
3a2fd8e6c8 | ||
|
|
485d629fc2 | ||
|
|
cb2232bfbd | ||
|
|
ac08356843 | ||
|
|
a7dddda495 | ||
|
|
3b0935a68b | ||
|
|
903b33e511 | ||
|
|
f897882299 | ||
|
|
aec1cbc81f | ||
|
|
b16b8b6f7f | ||
|
|
2764926ea9 | ||
|
|
2f1cd20a16 | ||
|
|
8ba850fc3f | ||
|
|
6072fa2962 | ||
|
|
f905a6e9dc | ||
|
|
beccf647b7 | ||
|
|
21387a5b8b | ||
|
|
ff05f5d121 | ||
|
|
f01b61c4c9 | ||
|
|
f1337d563e | ||
|
|
b2dd147a2d | ||
|
|
11b5d7d9d0 | ||
|
|
1427dc976f | ||
|
|
05008158ee | ||
|
|
6a3ef83060 | ||
|
|
af7c29330d | ||
|
|
20ad8b8b71 | ||
|
|
3058edfb8f | ||
|
|
bafdf36bf3 | ||
|
|
0f952cfe5f | ||
|
|
0e3198a0a6 | ||
|
|
0881673037 | ||
|
|
a1aebca4d3 | ||
|
|
1e657f0121 | ||
|
|
9cfb1e8afd | ||
|
|
7b62588d7e | ||
|
|
d3925f371b | ||
|
|
192303adb1 | ||
|
|
258a645aa1 | ||
|
|
14b6cc5650 | ||
|
|
9d2ed04ed4 | ||
|
|
3c4080eb08 | ||
|
|
dd598d6c2f | ||
|
|
80965dd5e3 | ||
|
|
e3e9182293 | ||
|
|
81b8b4c775 | ||
|
|
8a2d4d5448 | ||
|
|
06509d79d2 | ||
|
|
b11ba2e870 | ||
|
|
6002dbe5d6 | ||
|
|
0991667c49 | ||
|
|
661b2b87a7 | ||
|
|
2384a5cb7f | ||
|
|
7872d38fb5 | ||
|
|
6577e4e851 | ||
|
|
a019949628 | ||
|
|
487fc8e4af | ||
|
|
ded1292495 | ||
|
|
2ae0ee0804 | ||
|
|
f308343fb0 | ||
|
|
c9fda71db5 | ||
|
|
651ba90c6f | ||
|
|
ef7034893d | ||
|
|
d5f5f5495b | ||
|
|
8412b4d0cc | ||
|
|
96c4d07c0d | ||
|
|
8a819785c5 | ||
|
|
3cba7e727e | ||
|
|
1b34f47ec9 | ||
|
|
709038cc0a | ||
|
|
071e84a2a5 | ||
|
|
d7d2bd2fe8 | ||
|
|
842fb69dde | ||
|
|
be3a091002 | ||
|
|
b2c0e1ee1d | ||
|
|
2780f6f032 | ||
|
|
0616d22aec | ||
|
|
5b7ecc5fb2 | ||
|
|
4b8e525003 | ||
|
|
ff1c10fcee | ||
|
|
8199074678 | ||
|
|
dece9f381e | ||
|
|
4e8f57cbd9 | ||
|
|
cdda1ee79e | ||
|
|
4d82cc86c1 | ||
|
|
74da553542 | ||
|
|
4a49bdf352 | ||
|
|
2f8ceb3bc5 | ||
|
|
4c5d8f84e7 | ||
|
|
0acbcc31cd | ||
|
|
3bfb2147f5 | ||
|
|
47b3b3d97c | ||
|
|
9350bd4849 | ||
|
|
d38f9bbe36 | ||
|
|
115101dc77 | ||
|
|
e976bbe66b | ||
|
|
748028a7f4 | ||
|
|
49be6a6c16 | ||
|
|
fff1d9e4a3 | ||
|
|
9fbdd6a05b | ||
|
|
64ac8fccbd | ||
|
|
e85608ae61 | ||
|
|
09d2499399 | ||
|
|
be8ba6603d | ||
|
|
092ef99b0d | ||
|
|
84900fa3c9 | ||
|
|
0e09f84ab6 | ||
|
|
fed9258070 | ||
|
|
a02644c39e | ||
|
|
d0463c05b2 | ||
|
|
1068e75902 | ||
|
|
4a93d6866a | ||
|
|
f7724c4f06 | ||
|
|
e33094a3d6 | ||
|
|
98295289f0 | ||
|
|
2905b1b40c | ||
|
|
56eee69ebf | ||
|
|
5e4283909b | ||
|
|
aeaf0447d5 | ||
|
|
bad7d9b960 | ||
|
|
e15e36566c | ||
|
|
901c2ebf32 | ||
|
|
fd3b52a7f8 | ||
|
|
60cf316e16 | ||
|
|
b6667e6da8 | ||
|
|
7377cef7ff | ||
|
|
b1a4ed556f | ||
|
|
e6ab9cb597 | ||
|
|
a0b585fc25 | ||
|
|
db1a42d5e5 | ||
|
|
db9c5bd369 | ||
|
|
bee3c154ef | ||
|
|
0d8d8817f4 | ||
|
|
6169e192f7 | ||
|
|
6864183739 | ||
|
|
2f84135dd9 | ||
|
|
b83f9fcfda | ||
|
|
de771e8117 | ||
|
|
cb5a993f41 | ||
|
|
ae83fe9ac4 | ||
|
|
3d6335ce7c | ||
|
|
31bbd7707e | ||
|
|
5e110aec52 | ||
|
|
8a4f96e619 | ||
|
|
4334488891 | ||
|
|
96893b2c26 | ||
|
|
91bbe402bb | ||
|
|
0e8111a19e | ||
|
|
95c978b705 | ||
|
|
366c11428e | ||
|
|
30b67b29df | ||
|
|
17487cd40d | ||
|
|
0e2b840837 | ||
|
|
0676afd6fd | ||
|
|
59b1f20926 | ||
|
|
dad67c761a | ||
|
|
0f8a29daeb | ||
|
|
1f7cdfc8eb | ||
|
|
c37ac11955 | ||
|
|
7a2acc2532 | ||
|
|
71fae9efce | ||
|
|
3a8a7c911e | ||
|
|
83f1be5670 | ||
|
|
ad55b3f1fd | ||
|
|
5e0dddffce | ||
|
|
9bc25ea9ff | ||
|
|
d8fd45d545 | ||
|
|
70b3d03235 | ||
|
|
27d0090d10 | ||
|
|
4830a6fbf2 | ||
|
|
71f43c0669 | ||
|
|
90883e5926 | ||
|
|
ecdc6088f4 | ||
|
|
f6a46cd5ff | ||
|
|
d5324315d5 | ||
|
|
5e23048a74 | ||
|
|
8eccb87375 | ||
|
|
0f506fc47c | ||
|
|
3143ee397b | ||
|
|
7b6f5dff48 | ||
|
|
2877daa369 | ||
|
|
d3c03601c9 | ||
|
|
5179224e6d | ||
|
|
b9aedb9bf5 | ||
|
|
5dd56a8d94 | ||
|
|
6db57e9cd2 | ||
|
|
de608f208f | ||
|
|
9f0be17b74 | ||
|
|
c8a8415ce8 | ||
|
|
9bcb669fda | ||
|
|
c38c7e6c4e | ||
|
|
0209b24bcf | ||
|
|
e5e1837ce8 | ||
|
|
9cdb9f1600 | ||
|
|
344c2e85c4 | ||
|
|
0c7f333ec1 | ||
|
|
01a2981ed4 | ||
|
|
4a06f92c32 | ||
|
|
3d71278d8a | ||
|
|
7452551877 | ||
|
|
0d95b7e6ee | ||
|
|
0c672d4024 | ||
|
|
c1dd059fa7 | ||
|
|
1e7d41df2b | ||
|
|
1ef2f4f1fd | ||
|
|
816e6b3e5f | ||
|
|
7102bc2126 | ||
|
|
35ca046916 | ||
|
|
9a7587ea68 | ||
|
|
52a138ed18 | ||
|
|
e2592a23b4 | ||
|
|
b94d758bf1 | ||
|
|
aa6339bc75 | ||
|
|
3f58332dc0 | ||
|
|
9b9c046e6d | ||
|
|
0d29ba9314 | ||
|
|
fb7f42f4ba | ||
|
|
760de8ed64 | ||
|
|
e1f4c1fb67 | ||
|
|
29b8979bdb | ||
|
|
560aef2a1d | ||
|
|
b45134512a | ||
|
|
95d01663a7 | ||
|
|
e6e542b14f | ||
|
|
b930458679 | ||
|
|
87870448c6 | ||
|
|
c562133e9f | ||
|
|
72cacb43d2 | ||
|
|
4fd95881dc | ||
|
|
5766476fa1 | ||
|
|
6675963f7b | ||
|
|
efdabad37e | ||
|
|
dbd7c8e065 | ||
|
|
800ea7d055 | ||
|
|
ffe21ee7a6 | ||
|
|
4e7c1ae48a | ||
|
|
fc7c6d5697 | ||
|
|
f479e0dd31 | ||
|
|
8869b0a650 | ||
|
|
c6c99eacc3 | ||
|
|
8436692e88 | ||
|
|
e4357d2988 | ||
|
|
3af2c7153f | ||
|
|
5c2bab1fb6 | ||
|
|
2d051d7ff4 | ||
|
|
26127e8fde | ||
|
|
b4453c6237 | ||
|
|
e61e595d21 | ||
|
|
b607ff2318 | ||
|
|
a256fe355f | ||
|
|
f424aef3c3 | ||
|
|
94e1de3cf8 | ||
|
|
5001a0d16f | ||
|
|
ac864ceaf4 | ||
|
|
8d954bbfc3 | ||
|
|
68b5581eb5 | ||
|
|
b48be44134 | ||
|
|
54c10e0f97 | ||
|
|
6411045b62 | ||
|
|
de07e0dfc1 | ||
|
|
2a4c4b86c8 | ||
|
|
8bf47a940b | ||
|
|
2819285076 | ||
|
|
400c038555 | ||
|
|
07e61fc00f | ||
|
|
093b3590e9 | ||
|
|
3582aa2023 | ||
|
|
28dffafd3d | ||
|
|
3a233f6cfa | ||
|
|
543f6b9606 | ||
|
|
837ed7fb5e | ||
|
|
9ee964165b | ||
|
|
2fa604df3a | ||
|
|
272c0a35e5 | ||
|
|
7447071cc4 | ||
|
|
e87f82f65c | ||
|
|
0ae599a94d | ||
|
|
9c26839d15 | ||
|
|
0206fa024b | ||
|
|
7e2fbfacac | ||
|
|
ec55c1573b | ||
|
|
5ce35c1726 | ||
|
|
667396904c | ||
|
|
1f265ee370 | ||
|
|
ed354d8646 | ||
|
|
672f093e15 | ||
|
|
16ff6cef08 | ||
|
|
b00eca75af | ||
|
|
60c4a912cd | ||
|
|
ce01842e2d | ||
|
|
bc929ce463 | ||
|
|
bc8eeb25e3 | ||
|
|
b10eca0dcb | ||
|
|
279d275c1c | ||
|
|
14d24f496e | ||
|
|
776f39922e | ||
|
|
3d86a99e55 | ||
|
|
bb946b34a8 | ||
|
|
632a8568bb | ||
|
|
29a2080772 | ||
|
|
bddb8ea651 | ||
|
|
327ea4e019 | ||
|
|
d788830df6 | ||
|
|
d73fddc481 | ||
|
|
1251313f9c | ||
|
|
d2c37b1d68 | ||
|
|
b60c4a3191 | ||
|
|
d777cde5fc | ||
|
|
3bd84e3698 | ||
|
|
8ee069be65 | ||
|
|
d85dce1708 | ||
|
|
b92c4653f1 | ||
|
|
f8b4e40d22 | ||
|
|
409ce3f51e | ||
|
|
827e7985d4 | ||
|
|
323c8ba98e | ||
|
|
c9570aab55 | ||
|
|
b5bf585f99 | ||
|
|
9fb7bc06de | ||
|
|
292c93658d | ||
|
|
6e583abbc2 | ||
|
|
533719efb9 | ||
|
|
c4fc83c179 | ||
|
|
46387d9dd6 | ||
|
|
d79a3d8705 | ||
|
|
95e91329a2 | ||
|
|
088bb60e17 | ||
|
|
55297ac68b | ||
|
|
ec09c58519 | ||
|
|
30eeee1e32 | ||
|
|
a836bc6ce6 | ||
|
|
0a826c5239 | ||
|
|
4fd41a4707 | ||
|
|
57e586575a | ||
|
|
be86c1e8ea | ||
|
|
712ef6499f | ||
|
|
838917c148 | ||
|
|
a609d93836 | ||
|
|
b452d0744a | ||
|
|
2d2fdb5743 | ||
|
|
3afeeeb7c5 | ||
|
|
089d76a613 | ||
|
|
bbccff76f8 | ||
|
|
d6178047eb | ||
|
|
2bd0f0d90d | ||
|
|
f50907f109 | ||
|
|
58f070949c | ||
|
|
eef199582a | ||
|
|
37e6826371 | ||
|
|
c9df8f007d | ||
|
|
92c374be8a | ||
|
|
f356063e90 | ||
|
|
3ca82dae7f | ||
|
|
0d04e5f68b | ||
|
|
62dff4c955 | ||
|
|
3a2c0f8b93 | ||
|
|
139845cf60 | ||
|
|
5aaa8bde77 | ||
|
|
67b05a140e | ||
|
|
abb0114f94 | ||
|
|
cc8a946e78 | ||
|
|
ba4565bae3 | ||
|
|
fb8da0f51c | ||
|
|
e574daa490 | ||
|
|
7bdb3895e2 | ||
|
|
ac44f2bd00 | ||
|
|
897e86c3bb | ||
|
|
f17d4303b5 | ||
|
|
11c0b934bf | ||
|
|
091a21f769 | ||
|
|
09db0843f7 | ||
|
|
1991189e71 | ||
|
|
0109ab141f | ||
|
|
f7ecbc2dab | ||
|
|
5a1cdb4e03 | ||
|
|
ea6a3b65fd | ||
|
|
6bdc56a351 | ||
|
|
da6bd89383 | ||
|
|
0da6403d86 | ||
|
|
05ba91cde5 | ||
|
|
04a82409fe | ||
|
|
ba64a96eba | ||
|
|
886ca03a18 | ||
|
|
97d733a25f | ||
|
|
acd9fa0951 | ||
|
|
9c46c107f3 | ||
|
|
e389f4ef9e | ||
|
|
73184a1efd | ||
|
|
21a659ef85 | ||
|
|
8e643026b2 | ||
|
|
c172a50d38 | ||
|
|
b973db10ca | ||
|
|
84b07ad923 | ||
|
|
f52268ba3c | ||
|
|
81c36b1d26 |
+1
-2
@@ -52,5 +52,4 @@ applications/*/*.py[oc]
|
|||||||
applications/examples/static/epydoc
|
applications/examples/static/epydoc
|
||||||
applications/examples/static/sphinx
|
applications/examples/static/sphinx
|
||||||
applications/admin/cron/cron.master
|
applications/admin/cron/cron.master
|
||||||
|
HOWTO-web2py-devel
|
||||||
|
|
||||||
|
|||||||
+38
@@ -0,0 +1,38 @@
|
|||||||
|
language: python
|
||||||
|
|
||||||
|
python:
|
||||||
|
- '2.5'
|
||||||
|
- '2.6'
|
||||||
|
- '2.7'
|
||||||
|
- 'pypy'
|
||||||
|
install:
|
||||||
|
- pip install -e . --use-mirrors
|
||||||
|
env:
|
||||||
|
- DB=sqlite:memory
|
||||||
|
- DB=mysql://root:@localhost/test_w2p
|
||||||
|
- DB=postgres://postgres:@localhost/test_w2p
|
||||||
|
before_script:
|
||||||
|
- if [[ $TRAVIS_PYTHON_VERSION != '2.7' ]]; then pip install --use-mirrors unittest2; fi
|
||||||
|
- if [[ $TRAVIS_PYTHON_VERSION == '2.7' ]]; then pip install --use-mirrors coverage; fi;
|
||||||
|
- if [[ $TRAVIS_PYTHON_VERSION == '2.7' ]]; then pip install --use-mirrors python-coveralls; fi
|
||||||
|
- if [[ $DB == postgres* ]]; then pip install --use-mirrors psycopg2; fi;
|
||||||
|
- if [[ $TRAVIS_PYTHON_VERSION == '2.5' ]]; then pip install --use-mirrors pysqlite; fi
|
||||||
|
- if [[ $DB == mysql* ]]; then mysql -e 'create database test_w2p;'; fi
|
||||||
|
- if [[ $DB == postgres* ]]; then psql -c 'create database test_w2p;' -U postgres; fi
|
||||||
|
#Temporal solution to travis issue #155
|
||||||
|
- sudo chmod 777 /dev/shm
|
||||||
|
- sudo rm -rf /dev/shm && sudo ln -s /run/shm /dev/shm
|
||||||
|
matrix:
|
||||||
|
exclude:
|
||||||
|
- python: 'pypy'
|
||||||
|
env: DB=postgres://postgres:@localhost/test_w2p
|
||||||
|
- python: 'pypy'
|
||||||
|
env: DB=mysql://root:@localhost/test_w2p
|
||||||
|
|
||||||
|
script: export COVERAGE_PROCESS_START=gluon/tests/coverage.ini; ./web2py.py --run_system_tests --with_coverage
|
||||||
|
after_success:
|
||||||
|
- if [[ $TRAVIS_PYTHON_VERSION == '2.7' ]]; then coverage combine; fi
|
||||||
|
- if [[ $TRAVIS_PYTHON_VERSION == '2.7' ]]; then coveralls --config_file=gluon/tests/coverage.ini; fi
|
||||||
|
|
||||||
|
notifications:
|
||||||
|
email: true
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
web2py is an open source full-stack framework for agile development
|
||||||
|
of secure database-driven web-based applications, written and programmable in
|
||||||
|
Python.
|
||||||
|
|
||||||
|
Created by Massimo Di Pierro <mdipierro@cs.depaul.edu>
|
||||||
|
|
||||||
@@ -1,3 +1,91 @@
|
|||||||
|
## 2.4.7
|
||||||
|
|
||||||
|
- pypy support, thanks Niphlod
|
||||||
|
- more bug fixes
|
||||||
|
- ...
|
||||||
|
|
||||||
|
## 2.4.6
|
||||||
|
|
||||||
|
- better tests
|
||||||
|
- new ANY_OF and IS_IPV6 validators
|
||||||
|
- new custom save option
|
||||||
|
- many small bug fixes
|
||||||
|
|
||||||
|
## 2.4.5
|
||||||
|
|
||||||
|
- travis.ci integration (thanks Marc Abramowitz and Niphlod). Passes all tests (thanks Niplod).
|
||||||
|
- IS_DATE and IS_DATETIME can specify timezone
|
||||||
|
|
||||||
|
## 2.4.1- 2.4.3
|
||||||
|
|
||||||
|
- 2D GEO API: geoPoint, getLine, geoPolygon
|
||||||
|
- support for 'json' field type in DAL
|
||||||
|
- schema export with db.as_json/as_xml, thanks Alan
|
||||||
|
- graph representation of models
|
||||||
|
- admin based on bootstrap, thanks Paolo
|
||||||
|
- support for semantic versioning
|
||||||
|
- new bootstrap based admin, thanks Paolo
|
||||||
|
- improved scheduler (and change in scheduler field names), thanks Niphlod
|
||||||
|
- graphiz support added to adm, thanks Jose
|
||||||
|
- on_failure in grid
|
||||||
|
- db.table.field.abs()
|
||||||
|
- better wiki
|
||||||
|
- geoPoint, getLine, geoPolygon
|
||||||
|
- better reporting of 500 ajax errors
|
||||||
|
- better grid
|
||||||
|
- improved/fixed mongodb support
|
||||||
|
- improved parse_as_rest(patterns=...), thanks Denes
|
||||||
|
- improved IMAP DAL support, thanks Alan
|
||||||
|
- improved security when cookies in sessions
|
||||||
|
- Row.as_xml, as_json, as_dict, as_yaml thanks Alan
|
||||||
|
- smarted custom_import
|
||||||
|
- setup-ubuntu-12-04-redmine-unicorn-web2py-uwsgi-nginx.sh
|
||||||
|
- added support for motor and pulsar servers, thanks Niphlod
|
||||||
|
- added json-rpc2 support
|
||||||
|
- added pypyodbc.py driver
|
||||||
|
- allow auth.settings.ondelete='CASCADE'
|
||||||
|
- new syntax IS_EXPR(lambda value: ...
|
||||||
|
- using google for QR codes (although Graph API will be deprecated in 2015)
|
||||||
|
- upgraded fpdf to 1.7.1
|
||||||
|
- bug fixes (including issues with calendar.js and archive tables)
|
||||||
|
|
||||||
|
## 2.3.1 - 2.3.2
|
||||||
|
|
||||||
|
- new virtual fields syntax:
|
||||||
|
``db.define_table('person',Field('name'),Field.Virtual('namey',lambda row: row.person.name+'y'))``
|
||||||
|
- db.thing(name='Cohen',_orderby=db.thing.name), thanks Yair
|
||||||
|
- made many modules Python 3.3 friendly (compile but not tested)
|
||||||
|
- better welcome css, thanks Paolo
|
||||||
|
- jQuery 1.8.3
|
||||||
|
- Bootstrap 2.2.2
|
||||||
|
- Modernizr 2.6.2 (custom full options)
|
||||||
|
- integration with analyitics.js (0.2.0)
|
||||||
|
- better scheduler, thanks Niphlod
|
||||||
|
- page and media preview in wiki, thanks Niphlod
|
||||||
|
- create new auth.wiki page from slug model, thanks Nico
|
||||||
|
- conditional menus with auth.wiki(menugroups=['wiki_editor'])
|
||||||
|
- better security in grid/smartgrid
|
||||||
|
- allow LOADing multiple grids, thanks Niphlod
|
||||||
|
- auth.settings.login_onfail, thanks Yair
|
||||||
|
- better handling of session files for speed
|
||||||
|
- added heroku support (experimental)
|
||||||
|
- added rocket support for IPV6, thanks Chirs Winebrinner
|
||||||
|
- more customizable menus with MENU(li_first, li_last..)
|
||||||
|
- added support for paymentech (gluon/contrib/paymentech.py)
|
||||||
|
- fixed broken cron
|
||||||
|
- fixed possible xss with share.js
|
||||||
|
- many bug fixes. Closed more than 50 tickets since 2.2.1
|
||||||
|
|
||||||
|
## 2.2.1
|
||||||
|
|
||||||
|
- session.connect(cookie_key='secret', compression_level=9) stores sessions in cookies
|
||||||
|
- T.is_writable = False prevents T from dynamically updating langauge files
|
||||||
|
- all code is more PEP8 compliant
|
||||||
|
- better custom_importer behaviour (now works per app, is smalled and faster)
|
||||||
|
- fixed some bugs
|
||||||
|
- upgraded feedparser.py and rss2.py
|
||||||
|
- codemirror has autoresize
|
||||||
|
|
||||||
## 2.1.0
|
## 2.1.0
|
||||||
|
|
||||||
- overall faster web2py
|
- overall faster web2py
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
Web2py is Licensed under the LGPL license version 3
|
Web2py is Licensed under the LGPL license version 3
|
||||||
(http://www.gnu.org/licenses/lgpl.html)
|
(http://www.gnu.org/licenses/lgpl.html)
|
||||||
|
|
||||||
Copyrighted (c) by Massimo Di Pierro (2007-2011)
|
Copyrighted (c) by Massimo Di Pierro (2007-2013)
|
||||||
|
|
||||||
### On Commercial Redistribution
|
### On Commercial Redistribution
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,8 @@ update:
|
|||||||
wget -O gluon/contrib/simplejsonrpc.py http://rad2py.googlecode.com/hg/ide2py/simplejsonrpc.py
|
wget -O gluon/contrib/simplejsonrpc.py http://rad2py.googlecode.com/hg/ide2py/simplejsonrpc.py
|
||||||
echo "remember that pymysql was tweaked"
|
echo "remember that pymysql was tweaked"
|
||||||
src:
|
src:
|
||||||
echo 'Version 2.1.1 ('`date +%Y-%m-%d\ %H:%M:%S`') stable' > VERSION
|
### Use semantic versioning
|
||||||
|
echo 'Version 2.4.7-stable+timestamp.'`date +%Y.%m.%d.%H.%M.%S` > VERSION
|
||||||
### rm -f all junk files
|
### rm -f all junk files
|
||||||
make clean
|
make clean
|
||||||
### clean up baisc apps
|
### clean up baisc apps
|
||||||
@@ -43,6 +44,8 @@ src:
|
|||||||
rm -f applications/admin/uploads/*
|
rm -f applications/admin/uploads/*
|
||||||
rm -f applications/welcome/uploads/*
|
rm -f applications/welcome/uploads/*
|
||||||
rm -f applications/examples/uploads/*
|
rm -f applications/examples/uploads/*
|
||||||
|
### make epydoc
|
||||||
|
make epydoc
|
||||||
### make welcome layout and appadmin the default
|
### make welcome layout and appadmin the default
|
||||||
cp applications/welcome/views/appadmin.html applications/admin/views
|
cp applications/welcome/views/appadmin.html applications/admin/views
|
||||||
cp applications/welcome/views/appadmin.html applications/examples/views
|
cp applications/welcome/views/appadmin.html applications/examples/views
|
||||||
@@ -51,21 +54,19 @@ src:
|
|||||||
### build web2py_src.zip
|
### build web2py_src.zip
|
||||||
echo '' > NEWINSTALL
|
echo '' > NEWINSTALL
|
||||||
mv web2py_src.zip web2py_src_old.zip | echo 'no old'
|
mv web2py_src.zip web2py_src_old.zip | echo 'no old'
|
||||||
cd ..; zip -r web2py/web2py_src.zip web2py/gluon/*.py web2py/gluon/contrib/* web2py/splashlogo.gif web2py/*.py web2py/README.markdown web2py/LICENSE web2py/CHANGELOG web2py/NEWINSTALL web2py/VERSION web2py/Makefile web2py/epydoc.css web2py/epydoc.conf web2py/app.example.yaml web2py/logging.example.conf web2py_exe.conf web2py/queue.example.yaml MANIFEST.in w2p_apps w2p_clone w2p_run startweb2py web2py/scripts/*.sh web2py/scripts/*.py web2py/applications/admin web2py/applications/examples/ web2py/applications/welcome web2py/applications/__init__.py web2py/site-packages/__init__.py web2py/gluon/tests/*.sh web2py/gluon/tests/*.py
|
cd ..; zip -r web2py/web2py_src.zip web2py/gluon/*.py web2py/gluon/contrib/* web2py/splashlogo.gif web2py/*.py web2py/README.markdown web2py/LICENSE web2py/CHANGELOG web2py/NEWINSTALL web2py/VERSION web2py/Makefile web2py/epydoc.css web2py/epydoc.conf web2py/app.example.yaml web2py/logging.example.conf web2py/queue.example.yaml web2py/MANIFEST.in web2py/w2p_apps web2py/w2p_clone web2py/w2p_run web2py/web2py.cio web2py/web2py.gif web2py/scripts/*.sh web2py/scripts/*.py web2py/applications/admin web2py/applications/examples/ web2py/applications/welcome web2py/applications/__init__.py web2py/site-packages/__init__.py web2py/gluon/tests/*.sh web2py/gluon/tests/*.py
|
||||||
|
|
||||||
mdp:
|
mdp:
|
||||||
make epydoc
|
|
||||||
make src
|
make src
|
||||||
make app
|
make app
|
||||||
make win
|
make win
|
||||||
app:
|
app:
|
||||||
echo 'did you uncomment import_all in gluon/main.py?'
|
python2.7 -c 'import compileall; compileall.compile_dir("gluon/")'
|
||||||
python2.5 -c 'import compileall; compileall.compile_dir("gluon/")'
|
|
||||||
#python web2py.py -S welcome -R __exit__.py
|
#python web2py.py -S welcome -R __exit__.py
|
||||||
#cd ../web2py_osx/site-packages/; unzip ../site-packages.zip
|
#cd ../web2py_osx/site-packages/; unzip ../site-packages.zip
|
||||||
find gluon -path '*.pyc' -exec cp {} ../web2py_osx/site-packages/{} \;
|
find gluon -path '*.pyc' -exec cp {} ../web2py_osx/site-packages/{} \;
|
||||||
cd ../web2py_osx/site-packages/; zip -r ../site-packages.zip *
|
cd ../web2py_osx/site-packages/; zip -r ../site-packages.zip *
|
||||||
mv ../web2py_osx/site-packages.zip ../web2py_osx/web2py/web2py.app/Contents/Resources/lib/python2.5
|
mv ../web2py_osx/site-packages.zip ../web2py_osx/web2py/web2py.app/Contents/Resources/lib/python2.7
|
||||||
cp README.markdown ../web2py_osx/web2py/web2py.app/Contents/Resources
|
cp README.markdown ../web2py_osx/web2py/web2py.app/Contents/Resources
|
||||||
cp NEWINSTALL ../web2py_osx/web2py/web2py.app/Contents/Resources
|
cp NEWINSTALL ../web2py_osx/web2py/web2py.app/Contents/Resources
|
||||||
cp LICENSE ../web2py_osx/web2py/web2py.app/Contents/Resources
|
cp LICENSE ../web2py_osx/web2py/web2py.app/Contents/Resources
|
||||||
@@ -84,7 +85,6 @@ app:
|
|||||||
cd ../web2py_osx; zip -r web2py_osx.zip web2py
|
cd ../web2py_osx; zip -r web2py_osx.zip web2py
|
||||||
mv ../web2py_osx/web2py_osx.zip .
|
mv ../web2py_osx/web2py_osx.zip .
|
||||||
win:
|
win:
|
||||||
echo 'did you uncomment import_all in gluon/main.py?'
|
|
||||||
python2.7 -c 'import compileall; compileall.compile_dir("gluon/")'
|
python2.7 -c 'import compileall; compileall.compile_dir("gluon/")'
|
||||||
#cd ../web2py_win/library/; unzip ../library.zip
|
#cd ../web2py_win/library/; unzip ../library.zip
|
||||||
find gluon -path '*.pyc' -exec cp {} ../web2py_win/library/{} \;
|
find gluon -path '*.pyc' -exec cp {} ../web2py_win/library/{} \;
|
||||||
@@ -108,18 +108,17 @@ win:
|
|||||||
cd ../web2py_win; zip -r web2py_win.zip web2py
|
cd ../web2py_win; zip -r web2py_win.zip web2py
|
||||||
mv ../web2py_win/web2py_win.zip .
|
mv ../web2py_win/web2py_win.zip .
|
||||||
run:
|
run:
|
||||||
python2.5 web2py.py -a hello
|
python2.7 web2py.py -a hello
|
||||||
commit:
|
commit:
|
||||||
python web2py.py --run_system_tests
|
python web2py.py --run_system_tests
|
||||||
make src
|
make src
|
||||||
echo '' > NEWINSTALL
|
echo '' > NEWINSTALL
|
||||||
hg commit -m "$(S)"
|
hg commit -m "$(S)"
|
||||||
#bzr commit -m "$(S)"
|
|
||||||
git commit -a -m "$(S)"
|
git commit -a -m "$(S)"
|
||||||
push:
|
push:
|
||||||
hg push
|
hg push
|
||||||
git push
|
git push
|
||||||
git push mdipierro
|
git push --tags
|
||||||
tag:
|
tag:
|
||||||
git tag -l '$(S)'
|
git tag -l '$(S)'
|
||||||
hg tag -l '$(S)'
|
hg tag -l '$(S)'
|
||||||
@@ -130,5 +129,5 @@ pip:
|
|||||||
# after upload clean Web2py sources with rm -R ./dist
|
# after upload clean Web2py sources with rm -R ./dist
|
||||||
# http://guide.python-distribute.org/creation.html
|
# http://guide.python-distribute.org/creation.html
|
||||||
python setup.py sdist
|
python setup.py sdist
|
||||||
python setup.py register
|
sudo python setup.py register
|
||||||
python setup.py sdist upload
|
sudo python setup.py sdist upload
|
||||||
|
|||||||
@@ -6,6 +6,13 @@ It is written and programmable in Python. LGPLv3 License
|
|||||||
|
|
||||||
Learn more at http://web2py.com
|
Learn more at http://web2py.com
|
||||||
|
|
||||||
|
|
||||||
|
## Tests
|
||||||
|
|
||||||
|
[](https://travis-ci.org/web2py/web2py)
|
||||||
|
|
||||||
|
[](https://coveralls.io/r/web2py/web2py)
|
||||||
|
|
||||||
## Installation Instructions
|
## Installation Instructions
|
||||||
|
|
||||||
To start web2py there is NO NEED to install it. Just unzip and do:
|
To start web2py there is NO NEED to install it. Just unzip and do:
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
Version 2.1.1 (2012-10-15 06:40:52) stable
|
Version 2.4.7-stable+timestamp.2013.05.25.10.38.02
|
||||||
|
|||||||
-10
@@ -1,10 +0,0 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
+62
-25
@@ -9,12 +9,15 @@ License: LGPLv3 (http://www.gnu.org/licenses/lgpl.html)
|
|||||||
This file is based, although a rewrite, on MIT-licensed code from the Bottle web framework.
|
This file is based, although a rewrite, on MIT-licensed code from the Bottle web framework.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import os, sys, optparse, urllib
|
import os
|
||||||
|
import sys
|
||||||
|
import optparse
|
||||||
|
import urllib
|
||||||
|
|
||||||
path = os.path.dirname(os.path.abspath(__file__))
|
path = os.path.dirname(os.path.abspath(__file__))
|
||||||
os.chdir(path)
|
os.chdir(path)
|
||||||
sys.path = [path] + [p for p in sys.path if not p == path]
|
sys.path = [path] + [p for p in sys.path if not p == path]
|
||||||
import gluon.main
|
|
||||||
from gluon.fileutils import read_file, write_file
|
|
||||||
|
|
||||||
class Servers:
|
class Servers:
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@@ -30,8 +33,10 @@ class Servers:
|
|||||||
@staticmethod
|
@staticmethod
|
||||||
def wsgiref(app, address, **options): # pragma: no cover
|
def wsgiref(app, address, **options): # pragma: no cover
|
||||||
from wsgiref.simple_server import make_server, WSGIRequestHandler
|
from wsgiref.simple_server import make_server, WSGIRequestHandler
|
||||||
|
|
||||||
class QuietHandler(WSGIRequestHandler):
|
class QuietHandler(WSGIRequestHandler):
|
||||||
def log_request(*args, **kw): pass
|
def log_request(*args, **kw):
|
||||||
|
pass
|
||||||
options['handler_class'] = QuietHandler
|
options['handler_class'] = QuietHandler
|
||||||
srv = make_server(address[0], address[1], app, **options)
|
srv = make_server(address[0], address[1], app, **options)
|
||||||
srv.serve_forever()
|
srv.serve_forever()
|
||||||
@@ -76,19 +81,19 @@ class Servers:
|
|||||||
from fapws import base
|
from fapws import base
|
||||||
evwsgi.start(address[0], str(address[1]))
|
evwsgi.start(address[0], str(address[1]))
|
||||||
evwsgi.set_base_module(base)
|
evwsgi.set_base_module(base)
|
||||||
|
|
||||||
def app(environ, start_response):
|
def app(environ, start_response):
|
||||||
environ['wsgi.multiprocess'] = False
|
environ['wsgi.multiprocess'] = False
|
||||||
return app(environ, start_response)
|
return app(environ, start_response)
|
||||||
evwsgi.wsgi_cb(('', app))
|
evwsgi.wsgi_cb(('', app))
|
||||||
evwsgi.run()
|
evwsgi.run()
|
||||||
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def gevent(app, address, **options):
|
def gevent(app, address, **options):
|
||||||
from gevent import monkey; monkey.patch_all()
|
|
||||||
from gevent import pywsgi
|
from gevent import pywsgi
|
||||||
from gevent.pool import Pool
|
from gevent.pool import Pool
|
||||||
pywsgi.WSGIServer(address, app, spawn = 'workers' in options and Pool(int(options.workers)) or 'default').serve_forever()
|
pywsgi.WSGIServer(address, app, spawn='workers' in options and Pool(
|
||||||
|
int(options.workers)) or 'default').serve_forever()
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def bjoern(app, address, **options):
|
def bjoern(app, address, **options):
|
||||||
@@ -129,9 +134,11 @@ class Servers:
|
|||||||
config = {'bind': "%s:%d" % address}
|
config = {'bind': "%s:%d" % address}
|
||||||
config.update(options)
|
config.update(options)
|
||||||
sys.argv = ['anyserver.py']
|
sys.argv = ['anyserver.py']
|
||||||
|
|
||||||
class GunicornApplication(Application):
|
class GunicornApplication(Application):
|
||||||
def init(self, parser, opts, args):
|
def init(self, parser, opts, args):
|
||||||
return config
|
return config
|
||||||
|
|
||||||
def load(self):
|
def load(self):
|
||||||
return app
|
return app
|
||||||
g = GunicornApplication()
|
g = GunicornApplication()
|
||||||
@@ -152,8 +159,30 @@ class Servers:
|
|||||||
"tcp://127.0.0.1:9996")
|
"tcp://127.0.0.1:9996")
|
||||||
mongrel2_handler(app, conn, debug=False)
|
mongrel2_handler(app, conn, debug=False)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def motor(app, address, **options):
|
||||||
|
#https://github.com/rpedroso/motor
|
||||||
|
import motor
|
||||||
|
app = motor.WSGIContainer(app)
|
||||||
|
http_server = motor.HTTPServer(app)
|
||||||
|
http_server.listen(address=address[0], port=address[1])
|
||||||
|
#http_server.start(2)
|
||||||
|
motor.IOLoop.instance().start()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def pulsar(app, address, **options):
|
||||||
|
from pulsar.apps import wsgi
|
||||||
|
sys.argv = ['anyserver.py']
|
||||||
|
s = wsgi.WSGIServer(callable=app, bind="%s:%d" % address)
|
||||||
|
s.start()
|
||||||
|
|
||||||
def run(servername, ip, port, softcron=True, logging=False, profiler=None):
|
def run(servername, ip, port, softcron=True, logging=False, profiler=None):
|
||||||
|
if servername == 'gevent':
|
||||||
|
from gevent import monkey
|
||||||
|
monkey.patch_all()
|
||||||
|
|
||||||
|
import gluon.main
|
||||||
|
|
||||||
if logging:
|
if logging:
|
||||||
application = gluon.main.appfactory(wsgiapp=gluon.main.wsgibase,
|
application = gluon.main.appfactory(wsgiapp=gluon.main.wsgibase,
|
||||||
logfilename='httpserver.log',
|
logfilename='httpserver.log',
|
||||||
@@ -165,6 +194,7 @@ def run(servername,ip,port,softcron=True,logging=False,profiler=None):
|
|||||||
global_settings.web2py_crontype = 'soft'
|
global_settings.web2py_crontype = 'soft'
|
||||||
getattr(Servers, servername)(application, (ip, int(port)))
|
getattr(Servers, servername)(application, (ip, int(port)))
|
||||||
|
|
||||||
|
|
||||||
def mongrel2_handler(application, conn, debug=False):
|
def mongrel2_handler(application, conn, debug=False):
|
||||||
"""
|
"""
|
||||||
Based on :
|
Based on :
|
||||||
@@ -190,14 +220,17 @@ def mongrel2_handler(application,conn,debug=False):
|
|||||||
# and responses. Unless I have missed something.
|
# and responses. Unless I have missed something.
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
if debug: print "WAITING FOR REQUEST"
|
if debug:
|
||||||
|
print "WAITING FOR REQUEST"
|
||||||
|
|
||||||
# receive a request
|
# receive a request
|
||||||
req = conn.recv()
|
req = conn.recv()
|
||||||
if debug: print "REQUEST BODY: %r\n" % req.body
|
if debug:
|
||||||
|
print "REQUEST BODY: %r\n" % req.body
|
||||||
|
|
||||||
if req.is_disconnect():
|
if req.is_disconnect():
|
||||||
if debug: print "DISCONNECT"
|
if debug:
|
||||||
|
print "DISCONNECT"
|
||||||
continue # effectively ignore the disconnect from the client
|
continue # effectively ignore the disconnect from the client
|
||||||
|
|
||||||
# Set a couple of environment attributes a.k.a. header attributes
|
# Set a couple of environment attributes a.k.a. header attributes
|
||||||
@@ -217,11 +250,13 @@ def mongrel2_handler(application,conn,debug=False):
|
|||||||
environ['QUERY_STRING'] = environ['URI'].split('?')[1]
|
environ['QUERY_STRING'] = environ['URI'].split('?')[1]
|
||||||
else:
|
else:
|
||||||
environ['QUERY_STRING'] = ''
|
environ['QUERY_STRING'] = ''
|
||||||
if environ.has_key('Content-Length'):
|
if 'Content-Length' in environ:
|
||||||
environ['CONTENT_LENGTH'] = environ['Content-Length'] # necessary for POST to work with Django
|
environ['CONTENT_LENGTH'] = environ[
|
||||||
|
'Content-Length'] # necessary for POST to work with Django
|
||||||
environ['wsgi.input'] = req.body
|
environ['wsgi.input'] = req.body
|
||||||
|
|
||||||
if debug: print "ENVIRON: %r\n" % environ
|
if debug:
|
||||||
|
print "ENVIRON: %r\n" % environ
|
||||||
|
|
||||||
# SimpleHandler needs file-like stream objects for
|
# SimpleHandler needs file-like stream objects for
|
||||||
# requests, errors and responses
|
# requests, errors and responses
|
||||||
@@ -230,7 +265,8 @@ def mongrel2_handler(application,conn,debug=False):
|
|||||||
respIO = StringIO.StringIO()
|
respIO = StringIO.StringIO()
|
||||||
|
|
||||||
# execute the application
|
# execute the application
|
||||||
handler = SimpleHandler(reqIO, respIO, errIO, environ, multithread = False, multiprocess = False)
|
handler = SimpleHandler(reqIO, respIO, errIO, environ,
|
||||||
|
multithread=False, multiprocess=False)
|
||||||
handler.run(application)
|
handler.run(application)
|
||||||
|
|
||||||
# Get the response and filter out the response (=data) itself,
|
# Get the response and filter out the response (=data) itself,
|
||||||
@@ -254,16 +290,20 @@ def mongrel2_handler(application,conn,debug=False):
|
|||||||
errors = errIO.getvalue()
|
errors = errIO.getvalue()
|
||||||
|
|
||||||
# return the response
|
# return the response
|
||||||
if debug: print "RESPONSE: %r\n" % response
|
if debug:
|
||||||
|
print "RESPONSE: %r\n" % response
|
||||||
if errors:
|
if errors:
|
||||||
if debug: print "ERRORS: %r" % errors
|
if debug:
|
||||||
|
print "ERRORS: %r" % errors
|
||||||
data = "%s\r\n\r\n%s" % (data, errors)
|
data = "%s\r\n\r\n%s" % (data, errors)
|
||||||
conn.reply_http(req, data, code = code, status = status, headers = headers)
|
conn.reply_http(
|
||||||
|
req, data, code=code, status=status, headers=headers)
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
usage = "python anyserver.py -s tornado -i 127.0.0.1 -p 8000 -l -P"
|
usage = "python anyserver.py -s tornado -i 127.0.0.1 -p 8000 -l -P"
|
||||||
try:
|
try:
|
||||||
version = read_file('VERSION')
|
version = open('VERSION','r')
|
||||||
except IOError:
|
except IOError:
|
||||||
version = ''
|
version = ''
|
||||||
parser = optparse.OptionParser(usage, None, optparse.Option, version)
|
parser = optparse.OptionParser(usage, None, optparse.Option, version)
|
||||||
@@ -300,13 +340,10 @@ def main():
|
|||||||
dest='workers',
|
dest='workers',
|
||||||
help='number of workers number')
|
help='number of workers number')
|
||||||
(options, args) = parser.parse_args()
|
(options, args) = parser.parse_args()
|
||||||
print 'starting %s on %s:%s...' % (options.server,options.ip,options.port)
|
print 'starting %s on %s:%s...' % (
|
||||||
run(options.server,options.ip,options.port,logging=options.logging,profiler=options.profiler)
|
options.server, options.ip, options.port)
|
||||||
|
run(options.server, options.ip, options.port,
|
||||||
|
logging=options.logging, profiler=options.profiler)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
main()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -21,6 +21,10 @@ default_expiration: "24h" # for static files
|
|||||||
|
|
||||||
handlers:
|
handlers:
|
||||||
|
|
||||||
|
# Warning! Static mapping - below - isn't compatible with
|
||||||
|
# the parametric router's language logic.
|
||||||
|
# You cannot use them together.
|
||||||
|
|
||||||
- url: /(?P<a>.+?)/static/(?P<b>.+)
|
- url: /(?P<a>.+?)/static/(?P<b>.+)
|
||||||
static_files: applications/\1/static/\2
|
static_files: applications/\1/static/\2
|
||||||
upload: applications/(.+?)/static/(.+)
|
upload: applications/(.+?)/static/(.+)
|
||||||
|
|||||||
@@ -2,8 +2,3 @@ def webapp_add_wsgi_middleware(app):
|
|||||||
from google.appengine.ext.appstats import recording
|
from google.appengine.ext.appstats import recording
|
||||||
app = recording.appstats_wsgi_middleware(app)
|
app = recording.appstats_wsgi_middleware(app)
|
||||||
return app
|
return app
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,11 @@ import copy
|
|||||||
import gluon.contenttype
|
import gluon.contenttype
|
||||||
import gluon.fileutils
|
import gluon.fileutils
|
||||||
|
|
||||||
|
try:
|
||||||
|
import pygraphviz as pgv
|
||||||
|
except ImportError:
|
||||||
|
pgv = None
|
||||||
|
|
||||||
response.subtitle = 'Database Administration (appadmin)'
|
response.subtitle = 'Database Administration (appadmin)'
|
||||||
|
|
||||||
# ## critical --- make a copy of the environment
|
# ## critical --- make a copy of the environment
|
||||||
@@ -49,6 +54,10 @@ response.menu = [[T('design'), False, URL('admin', 'default', 'design',
|
|||||||
# ## auxiliary functions
|
# ## auxiliary functions
|
||||||
# ###########################################################
|
# ###########################################################
|
||||||
|
|
||||||
|
if False and request.tickets_db:
|
||||||
|
from gluon.restricted import TicketStorage
|
||||||
|
ts = TicketStorage()
|
||||||
|
ts._get_table(request.tickets_db, ts.tablename, request.application)
|
||||||
|
|
||||||
def get_databases(request):
|
def get_databases(request):
|
||||||
dbs = {}
|
dbs = {}
|
||||||
@@ -102,17 +111,16 @@ def query_by_table_type(tablename,db,request=request):
|
|||||||
cond = '>0'
|
cond = '>0'
|
||||||
if firstkey.type in ['string', 'text']:
|
if firstkey.type in ['string', 'text']:
|
||||||
cond = '!=""'
|
cond = '!=""'
|
||||||
qry = '%s.%s.%s%s' % (request.args[0], request.args[1], firstkey.name, cond)
|
qry = '%s.%s.%s%s' % (
|
||||||
|
request.args[0], request.args[1], firstkey.name, cond)
|
||||||
else:
|
else:
|
||||||
qry = '%s.%s.id>0' % tuple(request.args[:2])
|
qry = '%s.%s.id>0' % tuple(request.args[:2])
|
||||||
return qry
|
return qry
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# ##########################################################
|
# ##########################################################
|
||||||
# ## list all databases and tables
|
# ## list all databases and tables
|
||||||
# ###########################################################
|
# ###########################################################
|
||||||
|
|
||||||
def index():
|
def index():
|
||||||
return dict(databases=databases)
|
return dict(databases=databases)
|
||||||
|
|
||||||
@@ -140,6 +148,7 @@ def download():
|
|||||||
db = get_database(request)
|
db = get_database(request)
|
||||||
return response.download(request, db)
|
return response.download(request, db)
|
||||||
|
|
||||||
|
|
||||||
def csv():
|
def csv():
|
||||||
import gluon.contenttype
|
import gluon.contenttype
|
||||||
response.headers['Content-Type'] = \
|
response.headers['Content-Type'] = \
|
||||||
@@ -156,6 +165,7 @@ def csv():
|
|||||||
def import_csv(table, file):
|
def import_csv(table, file):
|
||||||
table.import_from_csv_file(file)
|
table.import_from_csv_file(file)
|
||||||
|
|
||||||
|
|
||||||
def select():
|
def select():
|
||||||
import re
|
import re
|
||||||
db = get_database(request)
|
db = get_database(request)
|
||||||
@@ -192,7 +202,8 @@ def select():
|
|||||||
session.last_query = request.vars.query
|
session.last_query = request.vars.query
|
||||||
form = FORM(TABLE(TR(T('Query:'), '', INPUT(_style='width:400px',
|
form = FORM(TABLE(TR(T('Query:'), '', INPUT(_style='width:400px',
|
||||||
_name='query', _value=request.vars.query or '',
|
_name='query', _value=request.vars.query or '',
|
||||||
requires=IS_NOT_EMPTY(error_message=T("Cannot be empty")))), TR(T('Update:'),
|
requires=IS_NOT_EMPTY(
|
||||||
|
error_message=T("Cannot be empty")))), TR(T('Update:'),
|
||||||
INPUT(_name='update_check', _type='checkbox',
|
INPUT(_name='update_check', _type='checkbox',
|
||||||
value=False), INPUT(_style='width:400px',
|
value=False), INPUT(_style='width:400px',
|
||||||
_name='update_fields', _value=request.vars.update_fields
|
_name='update_fields', _value=request.vars.update_fields
|
||||||
@@ -200,13 +211,14 @@ def select():
|
|||||||
_class='delete', _type='checkbox', value=False), ''),
|
_class='delete', _type='checkbox', value=False), ''),
|
||||||
TR('', '', INPUT(_type='submit', _value=T('submit')))),
|
TR('', '', INPUT(_type='submit', _value=T('submit')))),
|
||||||
_action=URL(r=request, args=request.args))
|
_action=URL(r=request, args=request.args))
|
||||||
|
|
||||||
|
tb = None
|
||||||
if form.accepts(request.vars, formname=None):
|
if form.accepts(request.vars, formname=None):
|
||||||
regex = re.compile(request.args[0] + '\.(?P<table>\w+)\..+')
|
regex = re.compile(request.args[0] + '\.(?P<table>\w+)\..+')
|
||||||
match = regex.match(form.vars.query.strip())
|
match = regex.match(form.vars.query.strip())
|
||||||
if match:
|
if match:
|
||||||
table = match.group('table')
|
table = match.group('table')
|
||||||
try:
|
try:
|
||||||
tb = None
|
|
||||||
nrows = db(query).count()
|
nrows = db(query).count()
|
||||||
if form.vars.update_check and form.vars.update_fields:
|
if form.vars.update_check and form.vars.update_fields:
|
||||||
db(query).update(**eval_in_global_env('dict(%s)'
|
db(query).update(**eval_in_global_env('dict(%s)'
|
||||||
@@ -217,9 +229,11 @@ def select():
|
|||||||
response.flash = T('%s %%{row} deleted', nrows)
|
response.flash = T('%s %%{row} deleted', nrows)
|
||||||
nrows = db(query).count()
|
nrows = db(query).count()
|
||||||
if orderby:
|
if orderby:
|
||||||
rows = db(query,ignore_common_filters=True).select(limitby=(start, stop), orderby=eval_in_global_env(orderby))
|
rows = db(query, ignore_common_filters=True).select(limitby=(
|
||||||
|
start, stop), orderby=eval_in_global_env(orderby))
|
||||||
else:
|
else:
|
||||||
rows = db(query,ignore_common_filters=True).select(limitby=(start, stop))
|
rows = db(query, ignore_common_filters=True).select(
|
||||||
|
limitby=(start, stop))
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
import traceback
|
import traceback
|
||||||
tb = traceback.format_exc()
|
tb = traceback.format_exc()
|
||||||
@@ -265,12 +279,15 @@ def update():
|
|||||||
(db, table) = get_table(request)
|
(db, table) = get_table(request)
|
||||||
keyed = hasattr(db[table], '_primarykey')
|
keyed = hasattr(db[table], '_primarykey')
|
||||||
record = None
|
record = None
|
||||||
|
db[table]._common_filter = None
|
||||||
if keyed:
|
if keyed:
|
||||||
key = [f for f in request.vars if f in db[table]._primarykey]
|
key = [f for f in request.vars if f in db[table]._primarykey]
|
||||||
if key:
|
if key:
|
||||||
record = db(db[table][key[0]] == request.vars[key[0]], ignore_common_filters=True).select().first()
|
record = db(db[table][key[0]] == request.vars[key[
|
||||||
|
0]]).select().first()
|
||||||
else:
|
else:
|
||||||
record = db(db[table].id == request.args(2),ignore_common_filters=True).select().first()
|
record = db(db[table].id == request.args(
|
||||||
|
2)).select().first()
|
||||||
|
|
||||||
if not record:
|
if not record:
|
||||||
qry = query_by_table_type(table, db)
|
qry = query_by_table_type(table, db)
|
||||||
@@ -282,7 +299,8 @@ def update():
|
|||||||
for k in db[table]._primarykey:
|
for k in db[table]._primarykey:
|
||||||
db[table][k].writable = False
|
db[table][k].writable = False
|
||||||
|
|
||||||
form = SQLFORM(db[table], record, deletable=True, delete_label=T('Check to delete'),
|
form = SQLFORM(
|
||||||
|
db[table], record, deletable=True, delete_label=T('Check to delete'),
|
||||||
ignore_rw=ignore_rw and not keyed,
|
ignore_rw=ignore_rw and not keyed,
|
||||||
linkto=URL('select',
|
linkto=URL('select',
|
||||||
args=request.args[:1]), upload=URL(r=request,
|
args=request.args[:1]), upload=URL(r=request,
|
||||||
@@ -304,11 +322,18 @@ def update():
|
|||||||
def state():
|
def state():
|
||||||
return dict()
|
return dict()
|
||||||
|
|
||||||
|
|
||||||
def ccache():
|
def ccache():
|
||||||
|
cache.ram.initialize()
|
||||||
|
cache.disk.initialize()
|
||||||
|
|
||||||
form = FORM(
|
form = FORM(
|
||||||
P(TAG.BUTTON(T("Clear CACHE?"), _type="submit", _name="yes", _value="yes")),
|
P(TAG.BUTTON(
|
||||||
P(TAG.BUTTON(T("Clear RAM"), _type="submit", _name="ram", _value="ram")),
|
T("Clear CACHE?"), _type="submit", _name="yes", _value="yes")),
|
||||||
P(TAG.BUTTON(T("Clear DISK"), _type="submit", _name="disk", _value="disk")),
|
P(TAG.BUTTON(
|
||||||
|
T("Clear RAM"), _type="submit", _name="ram", _value="ram")),
|
||||||
|
P(TAG.BUTTON(
|
||||||
|
T("Clear DISK"), _type="submit", _name="disk", _value="disk")),
|
||||||
)
|
)
|
||||||
|
|
||||||
if form.accepts(request.vars, session):
|
if form.accepts(request.vars, session):
|
||||||
@@ -332,11 +357,16 @@ def ccache():
|
|||||||
redirect(URL(r=request))
|
redirect(URL(r=request))
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from guppy import hpy; hp=hpy()
|
from guppy import hpy
|
||||||
|
hp = hpy()
|
||||||
except ImportError:
|
except ImportError:
|
||||||
hp = False
|
hp = False
|
||||||
|
|
||||||
import shelve, os, copy, time, math
|
import shelve
|
||||||
|
import os
|
||||||
|
import copy
|
||||||
|
import time
|
||||||
|
import math
|
||||||
from gluon import portalocker
|
from gluon import portalocker
|
||||||
|
|
||||||
ram = {
|
ram = {
|
||||||
@@ -363,7 +393,7 @@ def ccache():
|
|||||||
|
|
||||||
return (hours, minutes, seconds)
|
return (hours, minutes, seconds)
|
||||||
|
|
||||||
for key, value in cache.ram.storage.items():
|
for key, value in cache.ram.storage.iteritems():
|
||||||
if isinstance(value, dict):
|
if isinstance(value, dict):
|
||||||
ram['hits'] = value['hit_total'] - value['misses']
|
ram['hits'] = value['hit_total'] - value['misses']
|
||||||
ram['misses'] = value['misses']
|
ram['misses'] = value['misses']
|
||||||
@@ -379,11 +409,13 @@ def ccache():
|
|||||||
if value[0] < ram['oldest']:
|
if value[0] < ram['oldest']:
|
||||||
ram['oldest'] = value[0]
|
ram['oldest'] = value[0]
|
||||||
ram['keys'].append((key, GetInHMS(time.time() - value[0])))
|
ram['keys'].append((key, GetInHMS(time.time() - value[0])))
|
||||||
|
folder = os.path.join(request.folder,'cache')
|
||||||
locker = open(os.path.join(request.folder,
|
if not os.path.exists(folder):
|
||||||
'cache/cache.lock'), 'a')
|
os.mkdir(folder)
|
||||||
|
locker = open(os.path.join(folder, 'cache.lock'), 'a')
|
||||||
portalocker.lock(locker, portalocker.LOCK_EX)
|
portalocker.lock(locker, portalocker.LOCK_EX)
|
||||||
disk_storage = shelve.open(os.path.join(request.folder, 'cache/cache.shelve'))
|
disk_storage = shelve.open(
|
||||||
|
os.path.join(folder, 'cache.shelve'))
|
||||||
try:
|
try:
|
||||||
for key, value in disk_storage.items():
|
for key, value in disk_storage.items():
|
||||||
if isinstance(value, dict):
|
if isinstance(value, dict):
|
||||||
@@ -414,7 +446,8 @@ def ccache():
|
|||||||
total['misses'] = ram['misses'] + disk['misses']
|
total['misses'] = ram['misses'] + disk['misses']
|
||||||
total['keys'] = ram['keys'] + disk['keys']
|
total['keys'] = ram['keys'] + disk['keys']
|
||||||
try:
|
try:
|
||||||
total['ratio'] = total['hits'] * 100 / (total['hits'] + total['misses'])
|
total['ratio'] = total['hits'] * 100 / (total['hits'] +
|
||||||
|
total['misses'])
|
||||||
except (KeyError, ZeroDivisionError):
|
except (KeyError, ZeroDivisionError):
|
||||||
total['ratio'] = 0
|
total['ratio'] = 0
|
||||||
|
|
||||||
@@ -442,4 +475,101 @@ def ccache():
|
|||||||
ram=ram, disk=disk, object_stats=hp != False)
|
ram=ram, disk=disk, object_stats=hp != False)
|
||||||
|
|
||||||
|
|
||||||
|
def table_template(table):
|
||||||
|
from gluon.html import TR, TD, TABLE, TAG
|
||||||
|
|
||||||
|
def FONT(*args, **kwargs):
|
||||||
|
return TAG.font(*args, **kwargs)
|
||||||
|
|
||||||
|
def types(field):
|
||||||
|
f_type = field.type
|
||||||
|
if not isinstance(f_type,str):
|
||||||
|
return ' '
|
||||||
|
elif f_type == 'string':
|
||||||
|
return field.length
|
||||||
|
elif f_type == 'id':
|
||||||
|
return B('pk')
|
||||||
|
elif f_type.startswith('reference') or \
|
||||||
|
f_type.startswith('list:reference'):
|
||||||
|
return B('fk')
|
||||||
|
else:
|
||||||
|
return ' '
|
||||||
|
|
||||||
|
# This is horribe HTML but the only one graphiz understands
|
||||||
|
rows = []
|
||||||
|
cellpadding = 4
|
||||||
|
color = "#000000"
|
||||||
|
bgcolor = "#FFFFFF"
|
||||||
|
face = "Helvetica"
|
||||||
|
face_bold = "Helvetica Bold"
|
||||||
|
border = 0
|
||||||
|
|
||||||
|
rows.append(TR(TD(FONT(table, _face=face_bold, _color=bgcolor),
|
||||||
|
_colspan=3, _cellpadding=cellpadding,
|
||||||
|
_align="center", _bgcolor=color)))
|
||||||
|
for row in db[table]:
|
||||||
|
rows.append(TR(TD(FONT(row.name, _color=color, _face=face_bold),
|
||||||
|
_align="left", _cellpadding=cellpadding,
|
||||||
|
_border=border),
|
||||||
|
TD(FONT(row.type, _color=color, _face=face),
|
||||||
|
_align="left", _cellpadding=cellpadding,
|
||||||
|
_border=border),
|
||||||
|
TD(FONT(types(row), _color=color, _face=face),
|
||||||
|
_align="center", _cellpadding=cellpadding,
|
||||||
|
_border=border)))
|
||||||
|
return "< %s >" % TABLE(*rows, **dict(_bgcolor=bgcolor, _border=1,
|
||||||
|
_cellborder=0, _cellspacing=0)
|
||||||
|
).xml()
|
||||||
|
|
||||||
|
|
||||||
|
def bg_graph_model():
|
||||||
|
graph = pgv.AGraph(layout='dot', directed=True, strict=False, rankdir='LR')
|
||||||
|
|
||||||
|
subgraphs = dict()
|
||||||
|
for tablename in db.tables:
|
||||||
|
if hasattr(db[tablename],'_meta_graphmodel'):
|
||||||
|
meta_graphmodel = db[tablename]._meta_graphmodel
|
||||||
|
else:
|
||||||
|
meta_graphmodel = dict(group='Undefined', color='#ECECEC')
|
||||||
|
|
||||||
|
group = meta_graphmodel['group'].replace(' ', '')
|
||||||
|
if not subgraphs.has_key(group):
|
||||||
|
subgraphs[group] = dict(meta=meta_graphmodel, tables=[])
|
||||||
|
subgraphs[group]['tables'].append(tablename)
|
||||||
|
else:
|
||||||
|
subgraphs[group]['tables'].append(tablename)
|
||||||
|
|
||||||
|
graph.add_node(tablename, name=tablename, shape='plaintext',
|
||||||
|
label=table_template(tablename))
|
||||||
|
|
||||||
|
for n, key in enumerate(subgraphs.iterkeys()):
|
||||||
|
graph.subgraph(nbunch=subgraphs[key]['tables'],
|
||||||
|
name='cluster%d' % n,
|
||||||
|
style='filled',
|
||||||
|
color=subgraphs[key]['meta']['color'],
|
||||||
|
label=subgraphs[key]['meta']['group'])
|
||||||
|
|
||||||
|
for tablename in db.tables:
|
||||||
|
for field in db[tablename]:
|
||||||
|
f_type = field.type
|
||||||
|
if isinstance(f_type,str) and (
|
||||||
|
f_type.startswith('reference') or
|
||||||
|
f_type.startswith('list:reference')):
|
||||||
|
referenced_table = f_type.split()[1].split('.')[0]
|
||||||
|
n1 = graph.get_node(tablename)
|
||||||
|
n2 = graph.get_node(referenced_table)
|
||||||
|
graph.add_edge(n1, n2, color="#4C4C4C", label='')
|
||||||
|
|
||||||
|
graph.layout()
|
||||||
|
#return graph.draw(format='png', prog='dot')
|
||||||
|
if not request.args:
|
||||||
|
return graph.draw(format='png', prog='dot')
|
||||||
|
else:
|
||||||
|
response.headers['Content-Disposition']='attachment;filename=graph.%s'%request.args(0)
|
||||||
|
if request.args(0) == 'dot':
|
||||||
|
return graph.string()
|
||||||
|
else:
|
||||||
|
return graph.draw(format=request.args(0), prog='dot')
|
||||||
|
|
||||||
|
def graph_model():
|
||||||
|
return dict(databases=databases, pgv=pgv)
|
||||||
|
|||||||
@@ -5,7 +5,8 @@ import gluon.contrib.shell
|
|||||||
import gluon.dal
|
import gluon.dal
|
||||||
import gluon.html
|
import gluon.html
|
||||||
import gluon.validators
|
import gluon.validators
|
||||||
import code, thread
|
import code
|
||||||
|
import thread
|
||||||
from gluon.debug import communicate, web_debugger, qdb_debugger
|
from gluon.debug import communicate, web_debugger, qdb_debugger
|
||||||
import pydoc
|
import pydoc
|
||||||
|
|
||||||
@@ -16,6 +17,7 @@ if DEMO_MODE or MULTI_USER_MODE:
|
|||||||
|
|
||||||
FE = 10 ** 9
|
FE = 10 ** 9
|
||||||
|
|
||||||
|
|
||||||
def index():
|
def index():
|
||||||
app = request.args(0) or 'admin'
|
app = request.args(0) or 'admin'
|
||||||
reset()
|
reset()
|
||||||
@@ -23,6 +25,7 @@ def index():
|
|||||||
data = communicate()
|
data = communicate()
|
||||||
return dict(app=app, data=data)
|
return dict(app=app, data=data)
|
||||||
|
|
||||||
|
|
||||||
def callback():
|
def callback():
|
||||||
app = request.args[0]
|
app = request.args[0]
|
||||||
command = request.vars.statement
|
command = request.vars.statement
|
||||||
@@ -31,6 +34,7 @@ def callback():
|
|||||||
k = len(session['debug_commands:' + app]) - 1
|
k = len(session['debug_commands:' + app]) - 1
|
||||||
return '[%i] %s%s\n' % (k + 1, command, output)
|
return '[%i] %s%s\n' % (k + 1, command, output)
|
||||||
|
|
||||||
|
|
||||||
def reset():
|
def reset():
|
||||||
app = request.args(0) or 'admin'
|
app = request.args(0) or 'admin'
|
||||||
session['debug_commands:' + app] = []
|
session['debug_commands:' + app] = []
|
||||||
@@ -81,26 +85,32 @@ def interact():
|
|||||||
f_globals=f_globals, f_locals=f_locals,
|
f_globals=f_globals, f_locals=f_locals,
|
||||||
exception=web_debugger.exception_info)
|
exception=web_debugger.exception_info)
|
||||||
|
|
||||||
|
|
||||||
def step():
|
def step():
|
||||||
web_debugger.do_step()
|
web_debugger.do_step()
|
||||||
redirect(URL("interact"))
|
redirect(URL("interact"))
|
||||||
|
|
||||||
|
|
||||||
def next():
|
def next():
|
||||||
web_debugger.do_next()
|
web_debugger.do_next()
|
||||||
redirect(URL("interact"))
|
redirect(URL("interact"))
|
||||||
|
|
||||||
|
|
||||||
def cont():
|
def cont():
|
||||||
web_debugger.do_continue()
|
web_debugger.do_continue()
|
||||||
redirect(URL("interact"))
|
redirect(URL("interact"))
|
||||||
|
|
||||||
|
|
||||||
def ret():
|
def ret():
|
||||||
web_debugger.do_return()
|
web_debugger.do_return()
|
||||||
redirect(URL("interact"))
|
redirect(URL("interact"))
|
||||||
|
|
||||||
|
|
||||||
def stop():
|
def stop():
|
||||||
web_debugger.do_quit()
|
web_debugger.do_quit()
|
||||||
redirect(URL("interact"))
|
redirect(URL("interact"))
|
||||||
|
|
||||||
|
|
||||||
def execute():
|
def execute():
|
||||||
app = request.args[0]
|
app = request.args[0]
|
||||||
command = request.vars.statement
|
command = request.vars.statement
|
||||||
@@ -166,6 +176,8 @@ def toggle_breakpoint():
|
|||||||
try:
|
try:
|
||||||
filename = os.path.join(request.env['applications_parent'],
|
filename = os.path.join(request.env['applications_parent'],
|
||||||
'applications', request.vars.filename)
|
'applications', request.vars.filename)
|
||||||
|
# normalize path name: replace slashes, references, etc...
|
||||||
|
filename = os.path.normpath(os.path.normcase(filename))
|
||||||
if not request.vars.data:
|
if not request.vars.data:
|
||||||
# ace send us the line number!
|
# ace send us the line number!
|
||||||
lineno = int(request.vars.sel_start) + 1
|
lineno = int(request.vars.sel_start) + 1
|
||||||
@@ -182,6 +194,8 @@ def toggle_breakpoint():
|
|||||||
if lineno is not None:
|
if lineno is not None:
|
||||||
for bp in qdb_debugger.do_list_breakpoint():
|
for bp in qdb_debugger.do_list_breakpoint():
|
||||||
no, bp_filename, bp_lineno, temporary, enabled, hits, cond = bp
|
no, bp_filename, bp_lineno, temporary, enabled, hits, cond = bp
|
||||||
|
# normalize path name: replace slashes, references, etc...
|
||||||
|
bp_filename = os.path.normpath(os.path.normcase(bp_filename))
|
||||||
if filename == bp_filename and lineno == bp_lineno:
|
if filename == bp_filename and lineno == bp_lineno:
|
||||||
err = qdb_debugger.do_clear_breakpoint(filename, lineno)
|
err = qdb_debugger.do_clear_breakpoint(filename, lineno)
|
||||||
response.flash = T("Removed Breakpoint on %s at line %s", (
|
response.flash = T("Removed Breakpoint on %s at line %s", (
|
||||||
@@ -199,3 +213,25 @@ def toggle_breakpoint():
|
|||||||
session.flash = str(e)
|
session.flash = str(e)
|
||||||
return response.json({'ok': ok, 'lineno': lineno})
|
return response.json({'ok': ok, 'lineno': lineno})
|
||||||
|
|
||||||
|
def list_breakpoints():
|
||||||
|
"Return a list of linenumbers for current breakpoints"
|
||||||
|
|
||||||
|
breakpoints = []
|
||||||
|
ok = None
|
||||||
|
try:
|
||||||
|
filename = os.path.join(request.env['applications_parent'],
|
||||||
|
'applications', request.vars.filename)
|
||||||
|
# normalize path name: replace slashes, references, etc...
|
||||||
|
filename = os.path.normpath(os.path.normcase(filename))
|
||||||
|
for bp in qdb_debugger.do_list_breakpoint():
|
||||||
|
no, bp_filename, bp_lineno, temporary, enabled, hits, cond = bp
|
||||||
|
# normalize path name: replace slashes, references, etc...
|
||||||
|
bp_filename = os.path.normpath(os.path.normcase(bp_filename))
|
||||||
|
if filename == bp_filename:
|
||||||
|
breakpoints.append(bp_lineno)
|
||||||
|
ok = True
|
||||||
|
except Exception, e:
|
||||||
|
session.flash = str(e)
|
||||||
|
ok = False
|
||||||
|
return response.json({'ok': ok, 'breakpoints': breakpoints})
|
||||||
|
|
||||||
|
|||||||
@@ -15,17 +15,19 @@ from glob import glob
|
|||||||
import shutil
|
import shutil
|
||||||
import platform
|
import platform
|
||||||
try:
|
try:
|
||||||
from git import *
|
import git
|
||||||
|
if git.__version__ < '0.3.1':
|
||||||
|
raise ImportError("Your version of git is %s. Upgrade to 0.3.1 or better." % git.__version__)
|
||||||
have_git = True
|
have_git = True
|
||||||
except ImportError:
|
except ImportError, e:
|
||||||
have_git = False
|
have_git = False
|
||||||
GIT_MISSING = 'requires gitpython module, but not installed or incompatible version'
|
GIT_MISSING = 'Requires gitpython module, but not installed or incompatible version: %s' % e
|
||||||
|
|
||||||
from gluon.languages import (read_possible_languages, read_dict, write_dict,
|
from gluon.languages import (read_possible_languages, read_dict, write_dict,
|
||||||
read_plural_dict, write_plural_dict)
|
read_plural_dict, write_plural_dict)
|
||||||
|
|
||||||
|
|
||||||
if DEMO_MODE and request.function in ['change_password','pack','pack_plugin','upgrade_web2py','uninstall','cleanup','compile_app','remove_compiled_app','delete','delete_plugin','create_file','upload_file','update_languages','reload_routes','git_push','git_pull']:
|
if DEMO_MODE and request.function in ['change_password', 'pack', 'pack_custom','pack_plugin', 'upgrade_web2py', 'uninstall', 'cleanup', 'compile_app', 'remove_compiled_app', 'delete', 'delete_plugin', 'create_file', 'upload_file', 'update_languages', 'reload_routes', 'git_push', 'git_pull']:
|
||||||
session.flash = T('disabled in demo mode')
|
session.flash = T('disabled in demo mode')
|
||||||
redirect(URL('site'))
|
redirect(URL('site'))
|
||||||
|
|
||||||
@@ -39,26 +41,33 @@ if FILTER_APPS and request.args(0) and not request.args(0) in FILTER_APPS:
|
|||||||
redirect(URL('site'))
|
redirect(URL('site'))
|
||||||
|
|
||||||
|
|
||||||
if not session.token: session.token = web2py_uuid()
|
if not session.token:
|
||||||
|
session.token = web2py_uuid()
|
||||||
|
|
||||||
|
|
||||||
def count_lines(data):
|
def count_lines(data):
|
||||||
return len([line for line in data.split('\n') if line.strip() and not line.startswith('#')])
|
return len([line for line in data.split('\n') if line.strip() and not line.startswith('#')])
|
||||||
|
|
||||||
|
|
||||||
def log_progress(app, mode='EDIT', filename=None, progress=0):
|
def log_progress(app, mode='EDIT', filename=None, progress=0):
|
||||||
progress_file = os.path.join(apath(app, r=request), 'progress.log')
|
progress_file = os.path.join(apath(app, r=request), 'progress.log')
|
||||||
now = str(request.now)[:19]
|
now = str(request.now)[:19]
|
||||||
if not os.path.exists(progress_file):
|
if not os.path.exists(progress_file):
|
||||||
safe_open(progress_file, 'w').write('[%s] START\n' % now)
|
safe_open(progress_file, 'w').write('[%s] START\n' % now)
|
||||||
if filename:
|
if filename:
|
||||||
safe_open(progress_file,'a').write('[%s] %s %s: %s\n' % (now,mode,filename,progress))
|
safe_open(progress_file, 'a').write(
|
||||||
|
'[%s] %s %s: %s\n' % (now, mode, filename, progress))
|
||||||
|
|
||||||
|
|
||||||
def safe_open(a, b):
|
def safe_open(a, b):
|
||||||
if DEMO_MODE and ('w' in b or 'a' in b):
|
if DEMO_MODE and ('w' in b or 'a' in b):
|
||||||
class tmp:
|
class tmp:
|
||||||
def write(self,data): pass
|
def write(self, data):
|
||||||
|
pass
|
||||||
return tmp()
|
return tmp()
|
||||||
return open(a, b)
|
return open(a, b)
|
||||||
|
|
||||||
|
|
||||||
def safe_read(a, b='r'):
|
def safe_read(a, b='r'):
|
||||||
safe_file = safe_open(a, b)
|
safe_file = safe_open(a, b)
|
||||||
try:
|
try:
|
||||||
@@ -66,6 +75,7 @@ def safe_read(a, b='r'):
|
|||||||
finally:
|
finally:
|
||||||
safe_file.close()
|
safe_file.close()
|
||||||
|
|
||||||
|
|
||||||
def safe_write(a, value, b='w'):
|
def safe_write(a, value, b='w'):
|
||||||
safe_file = safe_open(a, b)
|
safe_file = safe_open(a, b)
|
||||||
try:
|
try:
|
||||||
@@ -73,14 +83,16 @@ def safe_write(a, value, b='w'):
|
|||||||
finally:
|
finally:
|
||||||
safe_file.close()
|
safe_file.close()
|
||||||
|
|
||||||
|
|
||||||
def get_app(name=None):
|
def get_app(name=None):
|
||||||
app = name or request.args(0)
|
app = name or request.args(0)
|
||||||
if app and (not MULTI_USER_MODE or is_manager() or \
|
if app and (not MULTI_USER_MODE or is_manager() or
|
||||||
db(db.app.name == app)(db.app.owner == auth.user.id).count()):
|
db(db.app.name == app)(db.app.owner == auth.user.id).count()):
|
||||||
return app
|
return app
|
||||||
session.flash = T('App does not exist or your are not authorized')
|
session.flash = T('App does not exist or your are not authorized')
|
||||||
redirect(URL('site'))
|
redirect(URL('site'))
|
||||||
|
|
||||||
|
|
||||||
def index():
|
def index():
|
||||||
""" Index handler """
|
""" Index handler """
|
||||||
|
|
||||||
@@ -126,7 +138,7 @@ def check_version():
|
|||||||
session.forget()
|
session.forget()
|
||||||
session._unlock(response)
|
session._unlock(response)
|
||||||
|
|
||||||
new_version, version_number = check_new_version(request.env.web2py_version,
|
new_version, version = check_new_version(request.env.web2py_version,
|
||||||
WEB2PY_VERSION_URL)
|
WEB2PY_VERSION_URL)
|
||||||
|
|
||||||
if new_version == -1:
|
if new_version == -1:
|
||||||
@@ -134,11 +146,10 @@ def check_version():
|
|||||||
elif new_version != True:
|
elif new_version != True:
|
||||||
return A(T('web2py is up to date'), _href=WEB2PY_URL)
|
return A(T('web2py is up to date'), _href=WEB2PY_URL)
|
||||||
elif platform.system().lower() in ('windows', 'win32', 'win64') and os.path.exists("web2py.exe"):
|
elif platform.system().lower() in ('windows', 'win32', 'win64') and os.path.exists("web2py.exe"):
|
||||||
return SPAN('You should upgrade to version %s.%s.%s' % version_number[:3])
|
return SPAN('You should upgrade to %s' % version.split('(')[0])
|
||||||
else:
|
else:
|
||||||
return sp_button(URL('upgrade_web2py'), T('upgrade now')) \
|
return sp_button(URL('upgrade_web2py'), T('upgrade now to %s') % version.split('(')[0])
|
||||||
+ XML(' <strong class="upgrade_version">%s.%s.%s</strong>' \
|
|
||||||
% version_number[:3])
|
|
||||||
|
|
||||||
def logout():
|
def logout():
|
||||||
""" Logout handler """
|
""" Logout handler """
|
||||||
@@ -151,11 +162,14 @@ def logout():
|
|||||||
def change_password():
|
def change_password():
|
||||||
|
|
||||||
if session.pam_user:
|
if session.pam_user:
|
||||||
session.flash = T('PAM authenticated user, cannot change password here')
|
session.flash = T(
|
||||||
|
'PAM authenticated user, cannot change password here')
|
||||||
redirect(URL('site'))
|
redirect(URL('site'))
|
||||||
form = SQLFORM.factory(Field('current_admin_password', 'password'),
|
form = SQLFORM.factory(Field('current_admin_password', 'password'),
|
||||||
Field('new_admin_password','password',requires=IS_STRONG()),
|
Field('new_admin_password',
|
||||||
Field('new_admin_password_again','password'))
|
'password', requires=IS_STRONG()),
|
||||||
|
Field('new_admin_password_again', 'password'),
|
||||||
|
_class="span4 well")
|
||||||
if form.accepts(request.vars):
|
if form.accepts(request.vars):
|
||||||
if not verify_password(request.vars.current_admin_password):
|
if not verify_password(request.vars.current_admin_password):
|
||||||
form.errors.current_admin_password = T('invalid password')
|
form.errors.current_admin_password = T('invalid password')
|
||||||
@@ -163,7 +177,8 @@ def change_password():
|
|||||||
form.errors.new_admin_password_again = T('no match')
|
form.errors.new_admin_password_again = T('no match')
|
||||||
else:
|
else:
|
||||||
path = abspath('parameters_%s.py' % request.env.server_port)
|
path = abspath('parameters_%s.py' % request.env.server_port)
|
||||||
safe_write(path, 'password="%s"' % CRYPT()(request.vars.new_admin_password)[0])
|
safe_write(path, 'password="%s"' % CRYPT()(
|
||||||
|
request.vars.new_admin_password)[0])
|
||||||
session.flash = T('password changed')
|
session.flash = T('password changed')
|
||||||
redirect(URL('site'))
|
redirect(URL('site'))
|
||||||
return dict(form=form)
|
return dict(form=form)
|
||||||
@@ -223,10 +238,10 @@ def site():
|
|||||||
redirect(URL(r=request))
|
redirect(URL(r=request))
|
||||||
target = os.path.join(apath(r=request), form_update.vars.name)
|
target = os.path.join(apath(r=request), form_update.vars.name)
|
||||||
try:
|
try:
|
||||||
new_repo = Repo.clone_from(form_update.vars.url,target)
|
new_repo = git.Repo.clone_from(form_update.vars.url, target)
|
||||||
session.flash = T('new application "%s" imported',
|
session.flash = T('new application "%s" imported',
|
||||||
form_update.vars.name)
|
form_update.vars.name)
|
||||||
except GitCommandError, err:
|
except git.GitCommandError, err:
|
||||||
session.flash = T('Invalid git repository specified.')
|
session.flash = T('Invalid git repository specified.')
|
||||||
redirect(URL(r=request))
|
redirect(URL(r=request))
|
||||||
|
|
||||||
@@ -295,8 +310,10 @@ def report_progress(app):
|
|||||||
matches = regex.findall(open(progress_file, 'r').read())
|
matches = regex.findall(open(progress_file, 'r').read())
|
||||||
events, counter = [], 0
|
events, counter = [], 0
|
||||||
for m in matches:
|
for m in matches:
|
||||||
if not m: continue
|
if not m:
|
||||||
days = -(request.now - datetime.datetime.strptime(m[0],'%Y-%m-%d %H:%M:%S')).days
|
continue
|
||||||
|
days = -(request.now - datetime.datetime.strptime(m[0],
|
||||||
|
'%Y-%m-%d %H:%M:%S')).days
|
||||||
counter += int(m[1])
|
counter += int(m[1])
|
||||||
events.append([days, counter])
|
events.append([days, counter])
|
||||||
return events
|
return events
|
||||||
@@ -338,6 +355,34 @@ def pack_plugin():
|
|||||||
session.flash = T('internal error')
|
session.flash = T('internal error')
|
||||||
redirect(URL('plugin', args=request.args))
|
redirect(URL('plugin', args=request.args))
|
||||||
|
|
||||||
|
def pack_custom():
|
||||||
|
app = get_app()
|
||||||
|
base = apath(app, r=request)
|
||||||
|
if request.post_vars.file:
|
||||||
|
files = request.post_vars.file
|
||||||
|
files = [files] if not isinstance(files,list) else files
|
||||||
|
fname = 'web2py.app.%s.w2p' % app
|
||||||
|
try:
|
||||||
|
filename = app_pack(app, request, raise_ex=True, filenames=files)
|
||||||
|
except Exception, e:
|
||||||
|
filename = None
|
||||||
|
if filename:
|
||||||
|
response.headers['Content-Type'] = 'application/w2p'
|
||||||
|
disposition = 'attachment; filename=%s' % fname
|
||||||
|
response.headers['Content-Disposition'] = disposition
|
||||||
|
return safe_read(filename, 'rb')
|
||||||
|
else:
|
||||||
|
session.flash = T('internal error: %s' % e)
|
||||||
|
redirect(URL(args=request.args))
|
||||||
|
def ignore(fs):
|
||||||
|
return [f for f in fs if not (
|
||||||
|
f[:1] in '#' or f.endswith('~') or f.endswith('.bak'))]
|
||||||
|
files = {}
|
||||||
|
for (r,d,f) in os.walk(base):
|
||||||
|
files[r] = {'folders':ignore(d),'files':ignore(f)}
|
||||||
|
return locals()
|
||||||
|
|
||||||
|
|
||||||
def upgrade_web2py():
|
def upgrade_web2py():
|
||||||
dialog = FORM.confirm(T('Upgrade'),
|
dialog = FORM.confirm(T('Upgrade'),
|
||||||
{T('Cancel'): URL('site')})
|
{T('Cancel'): URL('site')})
|
||||||
@@ -350,11 +395,16 @@ def upgrade_web2py():
|
|||||||
redirect(URL('site'))
|
redirect(URL('site'))
|
||||||
return dict(dialog=dialog)
|
return dict(dialog=dialog)
|
||||||
|
|
||||||
|
|
||||||
def uninstall():
|
def uninstall():
|
||||||
app = get_app()
|
app = get_app()
|
||||||
|
|
||||||
dialog = FORM.confirm(T('Uninstall'),
|
dialog = FORM.confirm(T('Uninstall'),
|
||||||
{T('Cancel'): URL('site')})
|
{T('Cancel'): URL('site')})
|
||||||
|
dialog['_id'] = 'confirm_form'
|
||||||
|
dialog['_class'] = 'well'
|
||||||
|
for component in dialog.components:
|
||||||
|
component['_class'] = 'btn'
|
||||||
|
|
||||||
if dialog.accepted:
|
if dialog.accepted:
|
||||||
if MULTI_USER_MODE:
|
if MULTI_USER_MODE:
|
||||||
@@ -407,6 +457,7 @@ def remove_compiled_app():
|
|||||||
session.flash = T('compiled application removed')
|
session.flash = T('compiled application removed')
|
||||||
redirect(URL('site'))
|
redirect(URL('site'))
|
||||||
|
|
||||||
|
|
||||||
def delete():
|
def delete():
|
||||||
""" Object delete handler """
|
""" Object delete handler """
|
||||||
app = get_app()
|
app = get_app()
|
||||||
@@ -432,6 +483,7 @@ def delete():
|
|||||||
redirect(URL(sender, anchor=request.vars.id2))
|
redirect(URL(sender, anchor=request.vars.id2))
|
||||||
return dict(filename=filename, sender=sender)
|
return dict(filename=filename, sender=sender)
|
||||||
|
|
||||||
|
|
||||||
def delete():
|
def delete():
|
||||||
""" Object delete handler """
|
""" Object delete handler """
|
||||||
app = get_app()
|
app = get_app()
|
||||||
@@ -458,6 +510,7 @@ def delete():
|
|||||||
redirect(URL(sender, anchor=request.vars.id2))
|
redirect(URL(sender, anchor=request.vars.id2))
|
||||||
return dict(dialog=dialog, filename=filename)
|
return dict(dialog=dialog, filename=filename)
|
||||||
|
|
||||||
|
|
||||||
def enable():
|
def enable():
|
||||||
app = get_app()
|
app = get_app()
|
||||||
filename = os.path.join(apath(app, r=request), 'DISABLED')
|
filename = os.path.join(apath(app, r=request), 'DISABLED')
|
||||||
@@ -470,6 +523,7 @@ def enable():
|
|||||||
safe_open(filename, 'wb').write(time.ctime())
|
safe_open(filename, 'wb').write(time.ctime())
|
||||||
return SPAN(T('Enable'), _style='color:red')
|
return SPAN(T('Enable'), _style='color:red')
|
||||||
|
|
||||||
|
|
||||||
def peek():
|
def peek():
|
||||||
""" Visualize object code """
|
""" Visualize object code """
|
||||||
app = get_app(request.vars.app)
|
app = get_app(request.vars.app)
|
||||||
@@ -491,6 +545,7 @@ def peek():
|
|||||||
data=data,
|
data=data,
|
||||||
extension=extension)
|
extension=extension)
|
||||||
|
|
||||||
|
|
||||||
def test():
|
def test():
|
||||||
""" Execute controller tests """
|
""" Execute controller tests """
|
||||||
app = get_app()
|
app = get_app()
|
||||||
@@ -499,16 +554,20 @@ def test():
|
|||||||
else:
|
else:
|
||||||
file = '.*\.py'
|
file = '.*\.py'
|
||||||
|
|
||||||
controllers = listdir(apath('%s/controllers/' % app, r=request), file + '$')
|
controllers = listdir(
|
||||||
|
apath('%s/controllers/' % app, r=request), file + '$')
|
||||||
|
|
||||||
return dict(app=app, controllers=controllers)
|
return dict(app=app, controllers=controllers)
|
||||||
|
|
||||||
|
|
||||||
def keepalive():
|
def keepalive():
|
||||||
return ''
|
return ''
|
||||||
|
|
||||||
|
|
||||||
def search():
|
def search():
|
||||||
keywords = request.vars.keywords or ''
|
keywords = request.vars.keywords or ''
|
||||||
app = get_app()
|
app = get_app()
|
||||||
|
|
||||||
def match(filename, keywords):
|
def match(filename, keywords):
|
||||||
filename = os.path.join(apath(app, r=request), filename)
|
filename = os.path.join(apath(app, r=request), filename)
|
||||||
if keywords in read_file(filename, 'rb'):
|
if keywords in read_file(filename, 'rb'):
|
||||||
@@ -518,14 +577,17 @@ def search():
|
|||||||
files1 = glob(os.path.join(path, '*/*.py'))
|
files1 = glob(os.path.join(path, '*/*.py'))
|
||||||
files2 = glob(os.path.join(path, '*/*.html'))
|
files2 = glob(os.path.join(path, '*/*.html'))
|
||||||
files3 = glob(os.path.join(path, '*/*/*.html'))
|
files3 = glob(os.path.join(path, '*/*/*.html'))
|
||||||
files=[x[len(path)+1:].replace('\\','/') for x in files1+files2+files3 if match(x,keywords)]
|
files = [x[len(path) + 1:].replace(
|
||||||
|
'\\', '/') for x in files1 + files2 + files3 if match(x, keywords)]
|
||||||
return response.json(dict(files=files, message=T.M('Searching: **%s** %%{file}', len(files))))
|
return response.json(dict(files=files, message=T.M('Searching: **%s** %%{file}', len(files))))
|
||||||
|
|
||||||
|
|
||||||
def edit():
|
def edit():
|
||||||
""" File edit handler """
|
""" File edit handler """
|
||||||
# Load json only if it is ajax edited...
|
# Load json only if it is ajax edited...
|
||||||
app = get_app(request.vars.app)
|
app = get_app(request.vars.app)
|
||||||
filename = '/'.join(request.args)
|
filename = '/'.join(request.args)
|
||||||
|
response.title = request.args[-1]
|
||||||
if request.vars.app:
|
if request.vars.app:
|
||||||
path = abspath(filename)
|
path = abspath(filename)
|
||||||
else:
|
else:
|
||||||
@@ -590,7 +652,8 @@ def edit():
|
|||||||
data = request.vars.data.replace('\r\n', '\n').strip() + '\n'
|
data = request.vars.data.replace('\r\n', '\n').strip() + '\n'
|
||||||
safe_write(path, data)
|
safe_write(path, data)
|
||||||
lineno_new = count_lines(data)
|
lineno_new = count_lines(data)
|
||||||
log_progress(app,'EDIT',filename,progress=lineno_new-lineno_old)
|
log_progress(
|
||||||
|
app, 'EDIT', filename, progress=lineno_new - lineno_old)
|
||||||
file_hash = md5_hash(data)
|
file_hash = md5_hash(data)
|
||||||
saved_on = time.ctime(os.stat(path)[stat.ST_MTIME])
|
saved_on = time.ctime(os.stat(path)[stat.ST_MTIME])
|
||||||
response.flash = T('file saved on %s', saved_on)
|
response.flash = T('file saved on %s', saved_on)
|
||||||
@@ -605,32 +668,38 @@ def edit():
|
|||||||
code = request.vars.data.rstrip().replace('\r\n', '\n') + '\n'
|
code = request.vars.data.rstrip().replace('\r\n', '\n') + '\n'
|
||||||
compile(code, path, "exec", _ast.PyCF_ONLY_AST)
|
compile(code, path, "exec", _ast.PyCF_ONLY_AST)
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
|
# offset calculation is only used for textarea (start/stop)
|
||||||
start = sum([len(line) + 1 for l, line
|
start = sum([len(line) + 1 for l, line
|
||||||
in enumerate(request.vars.data.split("\n"))
|
in enumerate(request.vars.data.split("\n"))
|
||||||
if l < e.lineno - 1])
|
if l < e.lineno - 1])
|
||||||
if e.text and e.offset:
|
if e.text and e.offset:
|
||||||
offset = e.offset - (len(e.text) - len(e.text.splitlines()[-1]))
|
offset = e.offset - (len(e.text) - len(
|
||||||
|
e.text.splitlines()[-1]))
|
||||||
else:
|
else:
|
||||||
offset = 0
|
offset = 0
|
||||||
highlight = {'start': start, 'end': start + offset + 1, 'lineno': e.lineno}
|
highlight = {'start': start, 'end': start +
|
||||||
|
offset + 1, 'lineno': e.lineno, 'offset': offset}
|
||||||
try:
|
try:
|
||||||
ex_name = e.__class__.__name__
|
ex_name = e.__class__.__name__
|
||||||
except:
|
except:
|
||||||
ex_name = 'unknown exception!'
|
ex_name = 'unknown exception!'
|
||||||
response.flash = DIV(T('failed to compile file because:'), BR(),
|
response.flash = DIV(T('failed to compile file because:'), BR(),
|
||||||
B(ex_name), ' ' + T('at line %s', e.lineno),
|
B(ex_name), ' ' + T('at line %s', e.lineno),
|
||||||
offset and ' '+T('at char %s', offset) or '',
|
offset and ' ' +
|
||||||
|
T('at char %s', offset) or '',
|
||||||
PRE(str(e)))
|
PRE(str(e)))
|
||||||
|
|
||||||
if data_or_revert and request.args[1] == 'modules':
|
if data_or_revert and request.args[1] == 'modules':
|
||||||
# Lets try to reload the modules
|
# Lets try to reload the modules
|
||||||
try:
|
try:
|
||||||
mopath = '.'.join(request.args[2:])[:-3]
|
mopath = '.'.join(request.args[2:])[:-3]
|
||||||
exec 'import applications.%s.modules.%s' % (request.args[0], mopath)
|
exec 'import applications.%s.modules.%s' % (
|
||||||
|
request.args[0], mopath)
|
||||||
reload(sys.modules['applications.%s.modules.%s'
|
reload(sys.modules['applications.%s.modules.%s'
|
||||||
% (request.args[0], mopath)])
|
% (request.args[0], mopath)])
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
response.flash = DIV(T('failed to reload module because:'),PRE(str(e)))
|
response.flash = DIV(
|
||||||
|
T('failed to reload module because:'), PRE(str(e)))
|
||||||
|
|
||||||
edit_controller = None
|
edit_controller = None
|
||||||
editviewlinks = None
|
editviewlinks = None
|
||||||
@@ -639,7 +708,7 @@ def edit():
|
|||||||
cfilename = os.path.join(request.args[0], 'controllers',
|
cfilename = os.path.join(request.args[0], 'controllers',
|
||||||
request.args[2] + '.py')
|
request.args[2] + '.py')
|
||||||
if os.path.exists(apath(cfilename, r=request)):
|
if os.path.exists(apath(cfilename, r=request)):
|
||||||
edit_controller = URL('edit', args=[cfilename])
|
edit_controller = URL('edit',args=[cfilename.replace(os.sep, "/")])
|
||||||
view = request.args[3].replace('.html', '')
|
view = request.args[3].replace('.html', '')
|
||||||
view_link = URL(request.args[0], request.args[2], view)
|
view_link = URL(request.args[0], request.args[2], view)
|
||||||
elif filetype == 'python' and request.args[1] == 'controllers':
|
elif filetype == 'python' and request.args[1] == 'controllers':
|
||||||
@@ -660,7 +729,7 @@ def edit():
|
|||||||
for v in viewlist:
|
for v in viewlist:
|
||||||
vf = os.path.split(v)[-1]
|
vf = os.path.split(v)[-1]
|
||||||
vargs = "/".join([viewpath.replace(os.sep, "/"), vf])
|
vargs = "/".join([viewpath.replace(os.sep, "/"), vf])
|
||||||
editviewlinks.append(A(vf.split(".")[0],\
|
editviewlinks.append(A(vf.split(".")[0],
|
||||||
_href=URL('edit', args=[vargs])))
|
_href=URL('edit', args=[vargs])))
|
||||||
|
|
||||||
if len(request.args) > 2 and request.args[1] == 'controllers':
|
if len(request.args) > 2 and request.args[1] == 'controllers':
|
||||||
@@ -680,7 +749,7 @@ def edit():
|
|||||||
editarea_preferences['REPLACE_TAB_BY_SPACES'] = '4'
|
editarea_preferences['REPLACE_TAB_BY_SPACES'] = '4'
|
||||||
editarea_preferences['DISPLAY'] = 'onload'
|
editarea_preferences['DISPLAY'] = 'onload'
|
||||||
for key in editarea_preferences:
|
for key in editarea_preferences:
|
||||||
if globals().has_key(key):
|
if key in globals():
|
||||||
editarea_preferences[key] = globals()[key]
|
editarea_preferences[key] = globals()[key]
|
||||||
return dict(app=request.args[0],
|
return dict(app=request.args[0],
|
||||||
filename=filename,
|
filename=filename,
|
||||||
@@ -695,6 +764,7 @@ def edit():
|
|||||||
editarea_preferences=editarea_preferences,
|
editarea_preferences=editarea_preferences,
|
||||||
editviewlinks=editviewlinks)
|
editviewlinks=editviewlinks)
|
||||||
|
|
||||||
|
|
||||||
def resolve():
|
def resolve():
|
||||||
"""
|
"""
|
||||||
"""
|
"""
|
||||||
@@ -739,7 +809,7 @@ def resolve():
|
|||||||
return 'minus'
|
return 'minus'
|
||||||
|
|
||||||
if request.vars:
|
if request.vars:
|
||||||
c = '\n'.join([item[2:].rstrip() for (i, item) in enumerate(d) if item[0] \
|
c = '\n'.join([item[2:].rstrip() for (i, item) in enumerate(d) if item[0]
|
||||||
== ' ' or 'line%i' % i in request.vars])
|
== ' ' or 'line%i' % i in request.vars])
|
||||||
safe_write(path, c)
|
safe_write(path, c)
|
||||||
session.flash = 'files merged'
|
session.flash = 'files merged'
|
||||||
@@ -754,7 +824,8 @@ def resolve():
|
|||||||
diff = TABLE(*[TR(TD(gen_data(i, item)),
|
diff = TABLE(*[TR(TD(gen_data(i, item)),
|
||||||
TD(item[0]),
|
TD(item[0]),
|
||||||
TD(leading(item[2:]),
|
TD(leading(item[2:]),
|
||||||
TT(item[2:].rstrip())), _class=getclass(item))
|
TT(item[2:].rstrip())),
|
||||||
|
_class=getclass(item))
|
||||||
for (i, item) in enumerate(d) if item[0] != '?'])
|
for (i, item) in enumerate(d) if item[0] != '?'])
|
||||||
|
|
||||||
return dict(diff=diff, filename=filename)
|
return dict(diff=diff, filename=filename)
|
||||||
@@ -764,13 +835,15 @@ def edit_language():
|
|||||||
""" Edit language file """
|
""" Edit language file """
|
||||||
app = get_app()
|
app = get_app()
|
||||||
filename = '/'.join(request.args)
|
filename = '/'.join(request.args)
|
||||||
|
response.title = request.args[-1]
|
||||||
strings = read_dict(apath(filename, r=request))
|
strings = read_dict(apath(filename, r=request))
|
||||||
|
|
||||||
if '__corrupted__' in strings:
|
if '__corrupted__' in strings:
|
||||||
form = SPAN(strings['__corrupted__'], _class='error')
|
form = SPAN(strings['__corrupted__'], _class='error')
|
||||||
return dict(filename=filename, form=form)
|
return dict(filename=filename, form=form)
|
||||||
|
|
||||||
keys = sorted(strings.keys(),lambda x,y: cmp(unicode(x,'utf-8').lower(), unicode(y,'utf-8').lower()))
|
keys = sorted(strings.keys(), lambda x, y: cmp(
|
||||||
|
unicode(x, 'utf-8').lower(), unicode(y, 'utf-8').lower()))
|
||||||
rows = []
|
rows = []
|
||||||
rows.append(H2(T('Original/Translation')))
|
rows.append(H2(T('Original/Translation')))
|
||||||
|
|
||||||
@@ -796,27 +869,34 @@ def edit_language():
|
|||||||
# Making the short circuit compatible with <= python2.4
|
# Making the short circuit compatible with <= python2.4
|
||||||
k = (s != k) and k or B(k)
|
k = (s != k) and k or B(k)
|
||||||
|
|
||||||
rows.append(P(prefix, k, BR(), elem, TAG.BUTTON(T('delete'),
|
new_row = DIV(LABEL(prefix, k, _style="font-weight:normal;"),
|
||||||
_onclick='return delkey("%s")' % name), _id=name))
|
CAT(elem, '\n', TAG.BUTTON(
|
||||||
|
T('delete'),
|
||||||
|
_onclick='return delkey("%s")' % name,
|
||||||
|
_class='btn')), _id=name, _class='span6 well well-small')
|
||||||
|
|
||||||
rows.append(INPUT(_type='submit', _value=T('update')))
|
rows.append(DIV(new_row,_class="row-fluid"))
|
||||||
|
rows.append(DIV(INPUT(_type='submit', _value=T('update'), _class="btn btn-primary"), _class='controls'))
|
||||||
form = FORM(*rows)
|
form = FORM(*rows)
|
||||||
if form.accepts(request.vars, keepvalues=True):
|
if form.accepts(request.vars, keepvalues=True):
|
||||||
strs = dict()
|
strs = dict()
|
||||||
for key in keys:
|
for key in keys:
|
||||||
name = md5_hash(key)
|
name = md5_hash(key)
|
||||||
if form.vars[name]==chr(127): continue
|
if form.vars[name] == chr(127):
|
||||||
|
continue
|
||||||
strs[key] = form.vars[name]
|
strs[key] = form.vars[name]
|
||||||
write_dict(apath(filename, r=request), strs)
|
write_dict(apath(filename, r=request), strs)
|
||||||
session.flash = T('file saved on %(time)s', dict(time=time.ctime()))
|
session.flash = T('file saved on %(time)s', dict(time=time.ctime()))
|
||||||
redirect(URL(r=request, args=request.args))
|
redirect(URL(r=request, args=request.args))
|
||||||
return dict(app=request.args[0], filename=filename, form=form)
|
return dict(app=request.args[0], filename=filename, form=form)
|
||||||
|
|
||||||
|
|
||||||
def edit_plurals():
|
def edit_plurals():
|
||||||
""" Edit plurals file """
|
""" Edit plurals file """
|
||||||
app = get_app()
|
app = get_app()
|
||||||
filename = '/'.join(request.args)
|
filename = '/'.join(request.args)
|
||||||
plurals = read_plural_dict(apath(filename, r=request)) # plural forms dictionary
|
plurals = read_plural_dict(
|
||||||
|
apath(filename, r=request)) # plural forms dictionary
|
||||||
nplurals = int(request.vars.nplurals) - 1 # plural forms quantity
|
nplurals = int(request.vars.nplurals) - 1 # plural forms quantity
|
||||||
xnplurals = xrange(nplurals)
|
xnplurals = xrange(nplurals)
|
||||||
|
|
||||||
@@ -825,37 +905,41 @@ def edit_plurals():
|
|||||||
form = SPAN(plurals['__corrupted__'], _class='error')
|
form = SPAN(plurals['__corrupted__'], _class='error')
|
||||||
return dict(filename=filename, form=form)
|
return dict(filename=filename, form=form)
|
||||||
|
|
||||||
keys = sorted(plurals.keys(),lambda x,y: cmp(unicode(x,'utf-8').lower(), unicode(y,'utf-8').lower()))
|
keys = sorted(plurals.keys(), lambda x, y: cmp(
|
||||||
rows = []
|
unicode(x, 'utf-8').lower(), unicode(y, 'utf-8').lower()))
|
||||||
|
tab_rows = []
|
||||||
row=[T("Singular Form")]
|
|
||||||
row.extend([T("Plural Form #%s", n+1) for n in xnplurals])
|
|
||||||
table=TABLE(THEAD(TR(row)))
|
|
||||||
|
|
||||||
for key in keys:
|
for key in keys:
|
||||||
name = md5_hash(key)
|
name = md5_hash(key)
|
||||||
forms = plurals[key]
|
forms = plurals[key]
|
||||||
|
|
||||||
if len(forms) < nplurals:
|
if len(forms) < nplurals:
|
||||||
forms.extend(None for i in xrange(nplurals - len(forms)))
|
forms.extend(None for i in xrange(nplurals - len(forms)))
|
||||||
|
tab_col1 = DIV(CAT(LABEL(T("Singular Form")), B(key,
|
||||||
|
_class='fake-input')))
|
||||||
|
tab_inputs = [SPAN(LABEL(T("Plural Form #%s", n + 1)), INPUT(_type='text', _name=name + '_' + str(n), value=forms[n], _size=20), _class='span6') for n in xnplurals]
|
||||||
|
tab_col2 = DIV(CAT(*tab_inputs))
|
||||||
|
tab_col3 = DIV(CAT(LABEL(XML(' ')), TAG.BUTTON(T('delete'), _onclick='return delkey("%s")' % name, _class='btn'), _class='span6'))
|
||||||
|
tab_row = DIV(DIV(tab_col1, '\n', tab_col2, '\n', tab_col3, _class='well well-small'), _id=name, _class='row-fluid tab_row')
|
||||||
|
tab_rows.append(tab_row)
|
||||||
|
|
||||||
row = [B(key)]
|
tab_rows.append(DIV(TAG['button'](T('update'), _type='submit',
|
||||||
row.extend([INPUT(_type='text', _name=name+'_'+str(n), value=forms[n], _size=20) for n in xnplurals])
|
_class='btn btn-primary'),
|
||||||
row.append(TD(TAG.BUTTON(T('delete'), _onclick='return delkey("%s")' % name)))
|
_class='controls'))
|
||||||
rows.append(TR(row, _id=name))
|
tab_container = DIV(*tab_rows, **dict(_class="row-fluid"))
|
||||||
if rows:
|
|
||||||
table.append(TBODY(rows))
|
form = FORM(tab_container)
|
||||||
rows=[table, INPUT(_type='submit', _value=T('update'))]
|
|
||||||
form = FORM(*rows)
|
|
||||||
if form.accepts(request.vars, keepvalues=True):
|
if form.accepts(request.vars, keepvalues=True):
|
||||||
new_plurals = dict()
|
new_plurals = dict()
|
||||||
for key in keys:
|
for key in keys:
|
||||||
name = md5_hash(key)
|
name = md5_hash(key)
|
||||||
if form.vars[name+'_0']==chr(127): continue
|
if form.vars[name + '_0'] == chr(127):
|
||||||
new_plurals[key] = [form.vars[name+'_'+str(n)] for n in xnplurals]
|
continue
|
||||||
|
new_plurals[key] = [form.vars[name + '_' + str(n)]
|
||||||
|
for n in xnplurals]
|
||||||
write_plural_dict(apath(filename, r=request), new_plurals)
|
write_plural_dict(apath(filename, r=request), new_plurals)
|
||||||
session.flash = T('file saved on %(time)s', dict(time=time.ctime()))
|
session.flash = T('file saved on %(time)s', dict(time=time.ctime()))
|
||||||
redirect(URL(r=request, args=request.args, vars=dict(nplurals=request.vars.nplurals)))
|
redirect(URL(r=request, args=request.args, vars=dict(
|
||||||
|
nplurals=request.vars.nplurals)))
|
||||||
return dict(app=request.args[0], filename=filename, form=form)
|
return dict(app=request.args[0], filename=filename, form=form)
|
||||||
|
|
||||||
|
|
||||||
@@ -879,7 +963,7 @@ def design():
|
|||||||
if request.vars and not request.vars.token == session.token:
|
if request.vars and not request.vars.token == session.token:
|
||||||
redirect(URL('logout'))
|
redirect(URL('logout'))
|
||||||
|
|
||||||
if request.vars.pluginfile!=None and not isinstance(request.vars.pluginfile,str):
|
if request.vars.pluginfile is not None and not isinstance(request.vars.pluginfile, str):
|
||||||
filename = os.path.basename(request.vars.pluginfile.filename)
|
filename = os.path.basename(request.vars.pluginfile.filename)
|
||||||
if plugin_install(app, request.vars.pluginfile.file,
|
if plugin_install(app, request.vars.pluginfile.file,
|
||||||
request, filename):
|
request, filename):
|
||||||
@@ -893,7 +977,6 @@ def design():
|
|||||||
session.flash = T('plugin not specified')
|
session.flash = T('plugin not specified')
|
||||||
redirect(URL(r=request))
|
redirect(URL(r=request))
|
||||||
|
|
||||||
|
|
||||||
# If we have only pyc files it means that
|
# If we have only pyc files it means that
|
||||||
# we cannot design
|
# we cannot design
|
||||||
if os.path.exists(apath('%s/compiled' % app, r=request)):
|
if os.path.exists(apath('%s/compiled' % app, r=request)):
|
||||||
@@ -911,7 +994,8 @@ def design():
|
|||||||
defines[m].sort()
|
defines[m].sort()
|
||||||
|
|
||||||
# Get all controllers
|
# Get all controllers
|
||||||
controllers = sorted(listdir(apath('%s/controllers/' % app, r=request), '.*\.py$'))
|
controllers = sorted(
|
||||||
|
listdir(apath('%s/controllers/' % app, r=request), '.*\.py$'))
|
||||||
controllers = [x.replace('\\', '/') for x in controllers]
|
controllers = [x.replace('\\', '/') for x in controllers]
|
||||||
functions = {}
|
functions = {}
|
||||||
for c in controllers:
|
for c in controllers:
|
||||||
@@ -920,7 +1004,8 @@ def design():
|
|||||||
functions[c] = items
|
functions[c] = items
|
||||||
|
|
||||||
# Get all views
|
# Get all views
|
||||||
views = sorted(listdir(apath('%s/views/' % app, r=request), '[\w/\-]+(\.\w+)+$'))
|
views = sorted(
|
||||||
|
listdir(apath('%s/views/' % app, r=request), '[\w/\-]+(\.\w+)+$'))
|
||||||
views = [x.replace('\\', '/') for x in views if not x.endswith('.bak')]
|
views = [x.replace('\\', '/') for x in views if not x.endswith('.bak')]
|
||||||
extend = {}
|
extend = {}
|
||||||
include = {}
|
include = {}
|
||||||
@@ -950,22 +1035,25 @@ def design():
|
|||||||
statics.sort()
|
statics.sort()
|
||||||
|
|
||||||
# Get all languages
|
# Get all languages
|
||||||
|
langpath = os.path.join(apath(app, r=request),'languages')
|
||||||
languages = dict([(lang, info) for lang, info
|
languages = dict([(lang, info) for lang, info
|
||||||
in read_possible_languages(
|
in read_possible_languages(langpath).iteritems()
|
||||||
apath(app, r=request)).iteritems()
|
|
||||||
if info[2] != 0]) # info[2] is langfile_mtime:
|
if info[2] != 0]) # info[2] is langfile_mtime:
|
||||||
# get only existed files
|
# get only existed files
|
||||||
|
|
||||||
#Get crontab
|
#Get crontab
|
||||||
cronfolder = apath('%s/cron' % app, r=request)
|
cronfolder = apath('%s/cron' % app, r=request)
|
||||||
if not os.path.exists(cronfolder): os.mkdir(cronfolder)
|
if not os.path.exists(cronfolder):
|
||||||
|
os.mkdir(cronfolder)
|
||||||
crontab = apath('%s/cron/crontab' % app, r=request)
|
crontab = apath('%s/cron/crontab' % app, r=request)
|
||||||
if not os.path.exists(crontab):
|
if not os.path.exists(crontab):
|
||||||
safe_write(crontab, '#crontab')
|
safe_write(crontab, '#crontab')
|
||||||
|
|
||||||
plugins = []
|
plugins = []
|
||||||
|
|
||||||
def filter_plugins(items, plugins):
|
def filter_plugins(items, plugins):
|
||||||
plugins+=[item[7:].split('/')[0].split('.')[0] for item in items if item.startswith('plugin_')]
|
plugins += [item[7:].split('/')[0].split(
|
||||||
|
'.')[0] for item in items if item.startswith('plugin_')]
|
||||||
plugins[:] = list(set(plugins))
|
plugins[:] = list(set(plugins))
|
||||||
plugins.sort()
|
plugins.sort()
|
||||||
return [item for item in items if not item.startswith('plugin_')]
|
return [item for item in items if not item.startswith('plugin_')]
|
||||||
@@ -985,6 +1073,7 @@ def design():
|
|||||||
crontab=crontab,
|
crontab=crontab,
|
||||||
plugins=plugins)
|
plugins=plugins)
|
||||||
|
|
||||||
|
|
||||||
def delete_plugin():
|
def delete_plugin():
|
||||||
""" Object delete handler """
|
""" Object delete handler """
|
||||||
app = request.args(0)
|
app = request.args(0)
|
||||||
@@ -1014,6 +1103,7 @@ def delete_plugin():
|
|||||||
redirect(URL('design', args=request.args(0), anchor=request.vars.id2))
|
redirect(URL('design', args=request.args(0), anchor=request.vars.id2))
|
||||||
return dict(dialog=dialog, plugin=plugin)
|
return dict(dialog=dialog, plugin=plugin)
|
||||||
|
|
||||||
|
|
||||||
def plugin():
|
def plugin():
|
||||||
""" Application design handler """
|
""" Application design handler """
|
||||||
app = get_app()
|
app = get_app()
|
||||||
@@ -1040,7 +1130,8 @@ def plugin():
|
|||||||
defines[m].sort()
|
defines[m].sort()
|
||||||
|
|
||||||
# Get all controllers
|
# Get all controllers
|
||||||
controllers = sorted(listdir(apath('%s/controllers/' % app, r=request), '.*\.py$'))
|
controllers = sorted(
|
||||||
|
listdir(apath('%s/controllers/' % app, r=request), '.*\.py$'))
|
||||||
controllers = [x.replace('\\', '/') for x in controllers]
|
controllers = [x.replace('\\', '/') for x in controllers]
|
||||||
functions = {}
|
functions = {}
|
||||||
for c in controllers:
|
for c in controllers:
|
||||||
@@ -1049,7 +1140,8 @@ def plugin():
|
|||||||
functions[c] = items
|
functions[c] = items
|
||||||
|
|
||||||
# Get all views
|
# Get all views
|
||||||
views = sorted(listdir(apath('%s/views/' % app, r=request), '[\w/\-]+\.\w+$'))
|
views = sorted(
|
||||||
|
listdir(apath('%s/views/' % app, r=request), '[\w/\-]+\.\w+$'))
|
||||||
views = [x.replace('\\', '/') for x in views]
|
views = [x.replace('\\', '/') for x in views]
|
||||||
extend = {}
|
extend = {}
|
||||||
include = {}
|
include = {}
|
||||||
@@ -1195,7 +1287,8 @@ def create_file():
|
|||||||
if len(filename) == 5:
|
if len(filename) == 5:
|
||||||
raise SyntaxError
|
raise SyntaxError
|
||||||
|
|
||||||
msg = T('This is the %(filename)s template', dict(filename=filename))
|
msg = T(
|
||||||
|
'This is the %(filename)s template', dict(filename=filename))
|
||||||
if extension == 'html':
|
if extension == 'html':
|
||||||
text = dedent("""
|
text = dedent("""
|
||||||
{{extend 'layout.html'}}
|
{{extend 'layout.html'}}
|
||||||
@@ -1245,8 +1338,10 @@ def create_file():
|
|||||||
session.flash = T('file "%(filename)s" created',
|
session.flash = T('file "%(filename)s" created',
|
||||||
dict(filename=full_filename[len(path):]))
|
dict(filename=full_filename[len(path):]))
|
||||||
vars = {}
|
vars = {}
|
||||||
if request.vars.id: vars['id']=request.vars.id
|
if request.vars.id:
|
||||||
if request.vars.app: vars['app']=request.vars.app
|
vars['id'] = request.vars.id
|
||||||
|
if request.vars.app:
|
||||||
|
vars['app'] = request.vars.app
|
||||||
redirect(URL('edit',
|
redirect(URL('edit',
|
||||||
args=[os.path.join(request.vars.location, filename)], vars=vars))
|
args=[os.path.join(request.vars.location, filename)], vars=vars))
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
@@ -1319,7 +1414,8 @@ def errors():
|
|||||||
method = request.args(1) or 'new'
|
method = request.args(1) or 'new'
|
||||||
db_ready = {}
|
db_ready = {}
|
||||||
db_ready['status'] = get_ticket_storage(app)
|
db_ready['status'] = get_ticket_storage(app)
|
||||||
db_ready['errmessage'] = T("No ticket_storage.txt found under /private folder")
|
db_ready['errmessage'] = T(
|
||||||
|
"No ticket_storage.txt found under /private folder")
|
||||||
db_ready['errlink'] = "http://web2py.com/books/default/chapter/29/13#Collecting-tickets"
|
db_ready['errlink'] = "http://web2py.com/books/default/chapter/29/13#Collecting-tickets"
|
||||||
|
|
||||||
if method == 'new':
|
if method == 'new':
|
||||||
@@ -1334,7 +1430,8 @@ def errors():
|
|||||||
|
|
||||||
for fn in listdir(errors_path, '^[a-fA-F0-9.\-]+$'):
|
for fn in listdir(errors_path, '^[a-fA-F0-9.\-]+$'):
|
||||||
fullpath = os.path.join(errors_path, fn)
|
fullpath = os.path.join(errors_path, fn)
|
||||||
if not os.path.isfile(fullpath): continue
|
if not os.path.isfile(fullpath):
|
||||||
|
continue
|
||||||
try:
|
try:
|
||||||
fullpath_file = open(fullpath, 'r')
|
fullpath_file = open(fullpath, 'r')
|
||||||
try:
|
try:
|
||||||
@@ -1355,7 +1452,7 @@ def errors():
|
|||||||
hash2error[hash]['count'] += 1
|
hash2error[hash]['count'] += 1
|
||||||
except KeyError:
|
except KeyError:
|
||||||
error_lines = error['traceback'].split("\n")
|
error_lines = error['traceback'].split("\n")
|
||||||
last_line = error_lines[-2]
|
last_line = error_lines[-2] if len(error_lines)>1 else 'unknown'
|
||||||
error_causer = os.path.split(error['layer'])[1]
|
error_causer = os.path.split(error['layer'])[1]
|
||||||
hash2error[hash] = dict(count=1, pickel=error,
|
hash2error[hash] = dict(count=1, pickel=error,
|
||||||
causer=error_causer,
|
causer=error_causer,
|
||||||
@@ -1367,7 +1464,6 @@ def errors():
|
|||||||
|
|
||||||
return dict(errors=[x[1] for x in decorated], app=app, method=method, db_ready=db_ready)
|
return dict(errors=[x[1] for x in decorated], app=app, method=method, db_ready=db_ready)
|
||||||
|
|
||||||
|
|
||||||
elif method == 'dbnew':
|
elif method == 'dbnew':
|
||||||
errors_path = apath('%s/errors' % app, r=request)
|
errors_path = apath('%s/errors' % app, r=request)
|
||||||
tk_db, tk_table = get_ticket_storage(app)
|
tk_db, tk_table = get_ticket_storage(app)
|
||||||
@@ -1417,22 +1513,27 @@ def errors():
|
|||||||
tk_db.commit()
|
tk_db.commit()
|
||||||
tickets_ = tk_db(tk_table.id > 0).select(tk_table.ticket_id, tk_table.created_datetime, orderby=~tk_table.created_datetime)
|
tickets_ = tk_db(tk_table.id > 0).select(tk_table.ticket_id, tk_table.created_datetime, orderby=~tk_table.created_datetime)
|
||||||
tickets = [row.ticket_id for row in tickets_]
|
tickets = [row.ticket_id for row in tickets_]
|
||||||
times = dict([(row.ticket_id, row.created_datetime) for row in tickets_])
|
times = dict(
|
||||||
|
[(row.ticket_id, row.created_datetime) for row in tickets_])
|
||||||
|
|
||||||
return dict(app=app, tickets=tickets, method=method, times=times)
|
return dict(app=app, tickets=tickets, method=method, times=times)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
for item in request.vars:
|
for item in request.vars:
|
||||||
if item[:7] == 'delete_':
|
# delete_all} rows doesn't contain any ticket
|
||||||
|
# Remove anything else as requested
|
||||||
|
if item[:7] == 'delete_' and (not item == "delete_all}"):
|
||||||
os.unlink(apath('%s/errors/%s' % (app, item[7:]), r=request))
|
os.unlink(apath('%s/errors/%s' % (app, item[7:]), r=request))
|
||||||
func = lambda p: os.stat(apath('%s/errors/%s' % \
|
func = lambda p: os.stat(apath('%s/errors/%s' %
|
||||||
(app, p), r=request)).st_mtime
|
(app, p), r=request)).st_mtime
|
||||||
tickets = sorted(listdir(apath('%s/errors/' % app, r=request), '^\w.*'),
|
tickets = sorted(
|
||||||
|
listdir(apath('%s/errors/' % app, r=request), '^\w.*'),
|
||||||
key=func,
|
key=func,
|
||||||
reverse=True)
|
reverse=True)
|
||||||
|
|
||||||
return dict(app=app, tickets=tickets, method=method, db_ready=db_ready)
|
return dict(app=app, tickets=tickets, method=method, db_ready=db_ready)
|
||||||
|
|
||||||
|
|
||||||
def get_ticket_storage(app):
|
def get_ticket_storage(app):
|
||||||
private_folder = apath('%s/private' % app, r=request)
|
private_folder = apath('%s/private' % app, r=request)
|
||||||
ticket_file = os.path.join(private_folder, 'ticket_storage.txt')
|
ticket_file = os.path.join(private_folder, 'ticket_storage.txt')
|
||||||
@@ -1454,6 +1555,7 @@ def get_ticket_storage(app):
|
|||||||
)
|
)
|
||||||
return ticketsdb, ticketsdb.get(tablename)
|
return ticketsdb, ticketsdb.get(tablename)
|
||||||
|
|
||||||
|
|
||||||
def make_link(path):
|
def make_link(path):
|
||||||
""" Create a link from a path """
|
""" Create a link from a path """
|
||||||
tryFile = path.replace('\\', '/')
|
tryFile = path.replace('\\', '/')
|
||||||
@@ -1536,6 +1638,7 @@ def ticket():
|
|||||||
layer=e.layer,
|
layer=e.layer,
|
||||||
myversion=myversion)
|
myversion=myversion)
|
||||||
|
|
||||||
|
|
||||||
def ticketdb():
|
def ticketdb():
|
||||||
""" Ticket handler """
|
""" Ticket handler """
|
||||||
|
|
||||||
@@ -1559,10 +1662,12 @@ def ticketdb():
|
|||||||
layer=e.layer,
|
layer=e.layer,
|
||||||
myversion=myversion)
|
myversion=myversion)
|
||||||
|
|
||||||
|
|
||||||
def error():
|
def error():
|
||||||
""" Generate a ticket (for testing) """
|
""" Generate a ticket (for testing) """
|
||||||
raise RuntimeError('admin ticket generator at your service')
|
raise RuntimeError('admin ticket generator at your service')
|
||||||
|
|
||||||
|
|
||||||
def update_languages():
|
def update_languages():
|
||||||
""" Update available languages """
|
""" Update available languages """
|
||||||
|
|
||||||
@@ -1600,12 +1705,14 @@ def user():
|
|||||||
else:
|
else:
|
||||||
return dict(form=T("Disabled"))
|
return dict(form=T("Disabled"))
|
||||||
|
|
||||||
|
|
||||||
def reload_routes():
|
def reload_routes():
|
||||||
""" Reload routes.py """
|
""" Reload routes.py """
|
||||||
import gluon.rewrite
|
import gluon.rewrite
|
||||||
gluon.rewrite.load()
|
gluon.rewrite.load()
|
||||||
redirect(URL('site'))
|
redirect(URL('site'))
|
||||||
|
|
||||||
|
|
||||||
def manage_students():
|
def manage_students():
|
||||||
if not (MULTI_USER_MODE and is_manager()):
|
if not (MULTI_USER_MODE and is_manager()):
|
||||||
session.flash = T('Not Authorized')
|
session.flash = T('Not Authorized')
|
||||||
@@ -1614,6 +1721,7 @@ def manage_students():
|
|||||||
grid = SQLFORM.grid(db.auth_user)
|
grid = SQLFORM.grid(db.auth_user)
|
||||||
return locals()
|
return locals()
|
||||||
|
|
||||||
|
|
||||||
def bulk_register():
|
def bulk_register():
|
||||||
if not (MULTI_USER_MODE and is_manager()):
|
if not (MULTI_USER_MODE and is_manager()):
|
||||||
session.flash = T('Not Authorized')
|
session.flash = T('Not Authorized')
|
||||||
@@ -1634,6 +1742,7 @@ def bulk_register():
|
|||||||
# 2) should not prompt user at console
|
# 2) should not prompt user at console
|
||||||
# 3) should give option to force commit and not reuqire manual merge
|
# 3) should give option to force commit and not reuqire manual merge
|
||||||
|
|
||||||
|
|
||||||
def git_pull():
|
def git_pull():
|
||||||
""" Git Pull handler """
|
""" Git Pull handler """
|
||||||
app = get_app()
|
app = get_app()
|
||||||
@@ -1644,27 +1753,26 @@ def git_pull():
|
|||||||
{T('Cancel'): URL('site')})
|
{T('Cancel'): URL('site')})
|
||||||
if dialog.accepted:
|
if dialog.accepted:
|
||||||
try:
|
try:
|
||||||
repo = Repo(os.path.join(apath(r=request),app))
|
repo = git.Repo(os.path.join(apath(r=request), app))
|
||||||
origin = repo.remotes.origin
|
origin = repo.remotes.origin
|
||||||
origin.fetch()
|
origin.fetch()
|
||||||
origin.pull()
|
origin.pull()
|
||||||
session.flash = T("Application updated via git pull")
|
session.flash = T("Application updated via git pull")
|
||||||
redirect(URL('site'))
|
redirect(URL('site'))
|
||||||
except CheckoutError, message:
|
|
||||||
|
except git.CheckoutError:
|
||||||
session.flash = T("Pull failed, certain files could not be checked out. Check logs for details.")
|
session.flash = T("Pull failed, certain files could not be checked out. Check logs for details.")
|
||||||
redirect(URL('site'))
|
redirect(URL('site'))
|
||||||
except UnmergedEntriesError:
|
except git.UnmergedEntriesError:
|
||||||
session.flash = T("Pull is not possible because you have unmerged files. Fix them up in the work tree, and then try again.")
|
session.flash = T("Pull is not possible because you have unmerged files. Fix them up in the work tree, and then try again.")
|
||||||
redirect(URL('site'))
|
redirect(URL('site'))
|
||||||
|
except git.GitCommandError:
|
||||||
|
session.flash = T(
|
||||||
|
"Pull failed, git exited abnormally. See logs for details.")
|
||||||
|
redirect(URL('site'))
|
||||||
except AssertionError:
|
except AssertionError:
|
||||||
session.flash = T("Pull is not possible because you have unmerged files. Fix them up in the work tree, and then try again.")
|
session.flash = T("Pull is not possible because you have unmerged files. Fix them up in the work tree, and then try again.")
|
||||||
redirect(URL('site'))
|
redirect(URL('site'))
|
||||||
except GitCommandError, status:
|
|
||||||
session.flash = T("Pull failed, git exited abnormally. See logs for details.")
|
|
||||||
redirect(URL('site'))
|
|
||||||
except Exception,e:
|
|
||||||
session.flash = T("Pull failed, git exited abnormally. See logs for details.")
|
|
||||||
redirect(URL('site'))
|
|
||||||
elif 'cancel' in request.vars:
|
elif 'cancel' in request.vars:
|
||||||
redirect(URL('site'))
|
redirect(URL('site'))
|
||||||
return dict(app=app, dialog=dialog)
|
return dict(app=app, dialog=dialog)
|
||||||
@@ -1682,19 +1790,17 @@ def git_push():
|
|||||||
form.process()
|
form.process()
|
||||||
if form.accepted:
|
if form.accepted:
|
||||||
try:
|
try:
|
||||||
repo = Repo(os.path.join(apath(r=request),app))
|
repo = git.Repo(os.path.join(apath(r=request), app))
|
||||||
index = repo.index
|
index = repo.index
|
||||||
index.add([apath(r=request) + app + '/*'])
|
index.add([apath(r=request) + app + '/*'])
|
||||||
new_commit = index.commit(form.vars.changelog)
|
new_commit = index.commit(form.vars.changelog)
|
||||||
origin = repo.remotes.origin
|
origin = repo.remotes.origin
|
||||||
origin.push()
|
origin.push()
|
||||||
session.flash = T("Git repo updated with latest application changes.")
|
session.flash = T(
|
||||||
|
"Git repo updated with latest application changes.")
|
||||||
redirect(URL('site'))
|
redirect(URL('site'))
|
||||||
except UnmergedEntriesError:
|
except git.UnmergedEntriesError:
|
||||||
session.flash = T("Push failed, there are unmerged entries in the cache. Resolve merge issues manually and try again.")
|
session.flash = T("Push failed, there are unmerged entries in the cache. Resolve merge issues manually and try again.")
|
||||||
redirect(URL('site'))
|
redirect(URL('site'))
|
||||||
except Exception, e:
|
|
||||||
session.flash = T("Push failed, git exited abnormally. See logs for details.")
|
|
||||||
redirect(URL('site'))
|
|
||||||
return dict(app=app, form=form)
|
return dict(app=app, form=form)
|
||||||
|
|
||||||
|
|||||||
@@ -18,28 +18,34 @@ if MULTI_USER_MODE and not is_manager():
|
|||||||
|
|
||||||
forever = 10 ** 8
|
forever = 10 ** 8
|
||||||
|
|
||||||
|
|
||||||
def kill():
|
def kill():
|
||||||
p = cache.ram('gae_upload', lambda: None, forever)
|
p = cache.ram('gae_upload', lambda: None, forever)
|
||||||
if not p or p.poll()!=None:
|
if not p or p.poll() is not None:
|
||||||
return 'oops'
|
return 'oops'
|
||||||
os.kill(p.pid, signal.SIGKILL)
|
os.kill(p.pid, signal.SIGKILL)
|
||||||
cache.ram('gae_upload', lambda: None, -1)
|
cache.ram('gae_upload', lambda: None, -1)
|
||||||
|
|
||||||
|
|
||||||
class EXISTS(object):
|
class EXISTS(object):
|
||||||
def __init__(self, error_message='file not found'):
|
def __init__(self, error_message='file not found'):
|
||||||
self.error_message = error_message
|
self.error_message = error_message
|
||||||
|
|
||||||
def __call__(self, value):
|
def __call__(self, value):
|
||||||
if os.path.exists(value):
|
if os.path.exists(value):
|
||||||
return (value, None)
|
return (value, None)
|
||||||
return (value, self.error_message)
|
return (value, self.error_message)
|
||||||
|
|
||||||
|
|
||||||
def deploy():
|
def deploy():
|
||||||
regex = re.compile('^\w+$')
|
regex = re.compile('^\w+$')
|
||||||
apps = sorted(file for file in os.listdir(apath(r=request)) if regex.match(file))
|
apps = sorted(
|
||||||
|
file for file in os.listdir(apath(r=request)) if regex.match(file))
|
||||||
form = SQLFORM.factory(
|
form = SQLFORM.factory(
|
||||||
Field('appcfg', default=GAE_APPCFG, label=T('Path to appcfg.py'),
|
Field('appcfg', default=GAE_APPCFG, label=T('Path to appcfg.py'),
|
||||||
requires=EXISTS(error_message=T('file not found'))),
|
requires=EXISTS(error_message=T('file not found'))),
|
||||||
Field('google_application_id',requires=IS_MATCH('[\w\-]+'),label=T('Google Application Id')),
|
Field('google_application_id', requires=IS_MATCH(
|
||||||
|
'[\w\-]+'), label=T('Google Application Id')),
|
||||||
Field('applications', 'list:string',
|
Field('applications', 'list:string',
|
||||||
requires=IS_IN_SET(apps, multiple=True),
|
requires=IS_IN_SET(apps, multiple=True),
|
||||||
label=T('web2py apps to deploy')),
|
label=T('web2py apps to deploy')),
|
||||||
@@ -51,7 +57,7 @@ def deploy():
|
|||||||
kill()
|
kill()
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
ignore_apps = [item for item in apps \
|
ignore_apps = [item for item in apps
|
||||||
if not item in form.vars.applications]
|
if not item in form.vars.applications]
|
||||||
regex = re.compile('\(applications/\(.*')
|
regex = re.compile('\(applications/\(.*')
|
||||||
yaml = apath('../app.yaml', r=request)
|
yaml = apath('../app.yaml', r=request)
|
||||||
@@ -59,8 +65,10 @@ def deploy():
|
|||||||
example = apath('../app.example.yaml', r=request)
|
example = apath('../app.example.yaml', r=request)
|
||||||
shutil.copyfile(example, yaml)
|
shutil.copyfile(example, yaml)
|
||||||
data = read_file(yaml)
|
data = read_file(yaml)
|
||||||
data = re.sub('application:.*','application: %s' % form.vars.google_application_id,data)
|
data = re.sub('application:.*', 'application: %s' %
|
||||||
data = regex.sub('(applications/(%s)/.*)|' % '|'.join(ignore_apps),data)
|
form.vars.google_application_id, data)
|
||||||
|
data = regex.sub(
|
||||||
|
'(applications/(%s)/.*)|' % '|'.join(ignore_apps), data)
|
||||||
write_file(yaml, data)
|
write_file(yaml, data)
|
||||||
|
|
||||||
path = request.env.applications_parent
|
path = request.env.applications_parent
|
||||||
@@ -76,9 +84,10 @@ def deploy():
|
|||||||
fcntl.fcntl(p.stderr.fileno(), fcntl.F_SETFL, os.O_NONBLOCK)
|
fcntl.fcntl(p.stderr.fileno(), fcntl.F_SETFL, os.O_NONBLOCK)
|
||||||
return dict(form=form, command=cmd)
|
return dict(form=form, command=cmd)
|
||||||
|
|
||||||
|
|
||||||
def callback():
|
def callback():
|
||||||
p = cache.ram('gae_upload', lambda: None, forever)
|
p = cache.ram('gae_upload', lambda: None, forever)
|
||||||
if not p or p.poll()!=None:
|
if not p or p.poll() is not None:
|
||||||
return '<done/>'
|
return '<done/>'
|
||||||
try:
|
try:
|
||||||
output = p.stdout.read()
|
output = p.stdout.read()
|
||||||
@@ -89,5 +98,3 @@ def callback():
|
|||||||
except:
|
except:
|
||||||
errors = ''
|
errors = ''
|
||||||
return (output + errors).replace('\n', '<br/>')
|
return (output + errors).replace('\n', '<br/>')
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ sessions/*
|
|||||||
errors/*
|
errors/*
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
def hg_repo(path):
|
def hg_repo(path):
|
||||||
import os
|
import os
|
||||||
uio = ui.ui()
|
uio = ui.ui()
|
||||||
@@ -37,6 +38,7 @@ def hg_repo(path):
|
|||||||
write_file(hgignore, _hgignore_content)
|
write_file(hgignore, _hgignore_content)
|
||||||
return repo
|
return repo
|
||||||
|
|
||||||
|
|
||||||
def commit():
|
def commit():
|
||||||
app = request.args(0)
|
app = request.args(0)
|
||||||
path = apath(app, r=request)
|
path = apath(app, r=request)
|
||||||
@@ -63,6 +65,7 @@ def commit():
|
|||||||
changes = []
|
changes = []
|
||||||
return dict(form=form, files=files, changes=changes, repo=repo)
|
return dict(form=form, files=files, changes=changes, repo=repo)
|
||||||
|
|
||||||
|
|
||||||
def revision():
|
def revision():
|
||||||
app = request.args(0)
|
app = request.args(0)
|
||||||
path = apath(app, r=request)
|
path = apath(app, r=request)
|
||||||
@@ -80,5 +83,3 @@ def revision():
|
|||||||
desc=ctx.description(),
|
desc=ctx.description(),
|
||||||
form=form
|
form=form
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,21 @@
|
|||||||
import os
|
import os
|
||||||
|
try:
|
||||||
from distutils import dir_util
|
from distutils import dir_util
|
||||||
|
except ImportError:
|
||||||
|
session.flash = T('requires distutils, but not installed')
|
||||||
|
redirect(URL('default', 'site'))
|
||||||
try:
|
try:
|
||||||
from git import *
|
from git import *
|
||||||
except ImportError:
|
except ImportError:
|
||||||
session.flash = T('requires python-git, but not installed')
|
session.flash = T('requires python-git, but not installed')
|
||||||
redirect(URL('default', 'site'))
|
redirect(URL('default', 'site'))
|
||||||
|
|
||||||
|
|
||||||
def deploy():
|
def deploy():
|
||||||
apps = sorted(file for file in os.listdir(apath(r=request)))
|
apps = sorted(file for file in os.listdir(apath(r=request)))
|
||||||
form = SQLFORM.factory(
|
form = SQLFORM.factory(
|
||||||
Field('osrepo',default='/tmp',label=T('Path to local openshift repo root.'),
|
Field(
|
||||||
|
'osrepo', default='/tmp', label=T('Path to local openshift repo root.'),
|
||||||
requires=EXISTS(error_message=T('directory not found'))),
|
requires=EXISTS(error_message=T('directory not found'))),
|
||||||
Field('osname', default='web2py', label=T('WSGI reference name')),
|
Field('osname', default='web2py', label=T('WSGI reference name')),
|
||||||
Field('applications', 'list:string',
|
Field('applications', 'list:string',
|
||||||
@@ -23,7 +29,8 @@ def deploy():
|
|||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
ignore_apps = [item for item in apps if not item in form.vars.applications]
|
ignore_apps = [
|
||||||
|
item for item in apps if not item in form.vars.applications]
|
||||||
regex = re.compile('\(applications/\(.*')
|
regex = re.compile('\(applications/\(.*')
|
||||||
w2p_origin = os.getcwd()
|
w2p_origin = os.getcwd()
|
||||||
osrepo = form.vars.osrepo
|
osrepo = form.vars.osrepo
|
||||||
@@ -47,9 +54,11 @@ def deploy():
|
|||||||
#Git code ends here
|
#Git code ends here
|
||||||
return dict(form=form, command=cmd)
|
return dict(form=form, command=cmd)
|
||||||
|
|
||||||
|
|
||||||
class EXISTS(object):
|
class EXISTS(object):
|
||||||
def __init__(self, error_message='file not found'):
|
def __init__(self, error_message='file not found'):
|
||||||
self.error_message = error_message
|
self.error_message = error_message
|
||||||
|
|
||||||
def __call__(self, value):
|
def __call__(self, value):
|
||||||
if os.path.exists(value):
|
if os.path.exists(value):
|
||||||
return (value, None)
|
return (value, None)
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
response.files = response.files[:3]
|
response.files = response.files[:3]
|
||||||
response.menu = []
|
response.menu = []
|
||||||
|
|
||||||
|
|
||||||
def index():
|
def index():
|
||||||
return locals()
|
return locals()
|
||||||
|
|
||||||
|
|
||||||
def about():
|
def about():
|
||||||
return locals()
|
return locals()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
import sys
|
import sys
|
||||||
import cStringIO
|
import cStringIO
|
||||||
import gluon.contrib.shell
|
import gluon.contrib.shell
|
||||||
import code, thread
|
import code
|
||||||
|
import thread
|
||||||
from gluon.shell import env
|
from gluon.shell import env
|
||||||
|
|
||||||
if DEMO_MODE or MULTI_USER_MODE:
|
if DEMO_MODE or MULTI_USER_MODE:
|
||||||
@@ -10,16 +11,19 @@ if DEMO_MODE or MULTI_USER_MODE:
|
|||||||
|
|
||||||
FE = 10 ** 9
|
FE = 10 ** 9
|
||||||
|
|
||||||
|
|
||||||
def index():
|
def index():
|
||||||
app = request.args(0) or 'admin'
|
app = request.args(0) or 'admin'
|
||||||
reset()
|
reset()
|
||||||
return dict(app=app)
|
return dict(app=app)
|
||||||
|
|
||||||
|
|
||||||
def callback():
|
def callback():
|
||||||
app = request.args[0]
|
app = request.args[0]
|
||||||
command = request.vars.statement
|
command = request.vars.statement
|
||||||
escape = command[:1] != '!'
|
escape = command[:1] != '!'
|
||||||
history = session['history:'+app] = session.get('history:'+app,gluon.contrib.shell.History())
|
history = session['history:' + app] = session.get(
|
||||||
|
'history:' + app, gluon.contrib.shell.History())
|
||||||
if not escape:
|
if not escape:
|
||||||
command = command[1:]
|
command = command[1:]
|
||||||
if command == '%reset':
|
if command == '%reset':
|
||||||
@@ -31,17 +35,16 @@ def callback():
|
|||||||
except ValueError:
|
except ValueError:
|
||||||
return ''
|
return ''
|
||||||
session['commands:' + app].append(command)
|
session['commands:' + app].append(command)
|
||||||
environ=env(app,True)
|
environ = env(app, True, extra_request=dict(is_https=request.is_https))
|
||||||
output = gluon.contrib.shell.run(history, command, environ)
|
output = gluon.contrib.shell.run(history, command, environ)
|
||||||
k = len(session['commands:' + app]) - 1
|
k = len(session['commands:' + app]) - 1
|
||||||
#output = PRE(output)
|
#output = PRE(output)
|
||||||
#return TABLE(TR('In[%i]:'%k,PRE(command)),TR('Out[%i]:'%k,output))
|
#return TABLE(TR('In[%i]:'%k,PRE(command)),TR('Out[%i]:'%k,output))
|
||||||
return 'In [%i] : %s%s\n' % (k + 1, command, output)
|
return 'In [%i] : %s%s\n' % (k + 1, command, output)
|
||||||
|
|
||||||
|
|
||||||
def reset():
|
def reset():
|
||||||
app = request.args(0) or 'admin'
|
app = request.args(0) or 'admin'
|
||||||
session['commands:' + app] = []
|
session['commands:' + app] = []
|
||||||
session['history:' + app] = gluon.contrib.shell.History()
|
session['history:' + app] = gluon.contrib.shell.History()
|
||||||
return 'done'
|
return 'done'
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -2,10 +2,12 @@ import os
|
|||||||
from gluon.settings import global_settings, read_file
|
from gluon.settings import global_settings, read_file
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
def index():
|
def index():
|
||||||
app = request.args(0)
|
app = request.args(0)
|
||||||
return dict(app=app)
|
return dict(app=app)
|
||||||
|
|
||||||
|
|
||||||
def profiler():
|
def profiler():
|
||||||
"""
|
"""
|
||||||
to use the profiler start web2py with -F profiler.log
|
to use the profiler start web2py with -F profiler.log
|
||||||
@@ -27,5 +29,3 @@ def profiler():
|
|||||||
size += len(data)
|
size += len(data)
|
||||||
response.cookies[KEY] = size
|
response.cookies[KEY] = size
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -82,6 +82,7 @@ def install(app_name, filename, data, overwrite=True):
|
|||||||
|
|
||||||
return installed
|
return installed
|
||||||
|
|
||||||
|
|
||||||
@service.jsonrpc
|
@service.jsonrpc
|
||||||
def attach_debugger(host='localhost', port=6000, authkey='secret password'):
|
def attach_debugger(host='localhost', port=6000, authkey='secret password'):
|
||||||
import gluon.contrib.qdb as qdb
|
import gluon.contrib.qdb as qdb
|
||||||
@@ -124,7 +125,7 @@ def detach_debugger():
|
|||||||
gluon.debug.qdb_debugger = None
|
gluon.debug.qdb_debugger = None
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
def call():
|
def call():
|
||||||
session.forget()
|
session.forget()
|
||||||
return service()
|
return service()
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,15 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
import os, uuid, re, pickle, urllib, glob
|
import os
|
||||||
|
import uuid
|
||||||
|
import re
|
||||||
|
import pickle
|
||||||
|
import urllib
|
||||||
|
import glob
|
||||||
from gluon.admin import app_create, plugin_install
|
from gluon.admin import app_create, plugin_install
|
||||||
from gluon.fileutils import abspath, read_file, write_file
|
from gluon.fileutils import abspath, read_file, write_file
|
||||||
|
|
||||||
|
|
||||||
def reset(session):
|
def reset(session):
|
||||||
session.app = {
|
session.app = {
|
||||||
'name': '',
|
'name': '',
|
||||||
@@ -30,30 +36,33 @@ def reset(session):
|
|||||||
'page_error': '# Error: the document does not exist',
|
'page_error': '# Error: the document does not exist',
|
||||||
}
|
}
|
||||||
|
|
||||||
if not session.app: reset(session)
|
if not session.app:
|
||||||
|
reset(session)
|
||||||
|
|
||||||
|
|
||||||
def listify(x):
|
def listify(x):
|
||||||
if not isinstance(x, (list, tuple)):
|
if not isinstance(x, (list, tuple)):
|
||||||
return x and [x] or []
|
return x and [x] or []
|
||||||
return x
|
return x
|
||||||
|
|
||||||
|
|
||||||
def clean(name):
|
def clean(name):
|
||||||
return re.sub('\W+', '_', name.strip().lower())
|
return re.sub('\W+', '_', name.strip().lower())
|
||||||
|
|
||||||
|
|
||||||
def index():
|
def index():
|
||||||
response.view = 'wizard/step.html'
|
response.view = 'wizard/step.html'
|
||||||
reset(session)
|
reset(session)
|
||||||
apps = os.listdir(os.path.join(request.folder, '..'))
|
apps = os.listdir(os.path.join(request.folder, '..'))
|
||||||
form = SQLFORM.factory(Field('name', requires=[IS_NOT_EMPTY(),
|
form = SQLFORM.factory(Field('name', requires=[IS_NOT_EMPTY(),
|
||||||
IS_ALPHANUMERIC()]))
|
IS_ALPHANUMERIC()]), _class='span5 well well-small')
|
||||||
if form.accepts(request.vars):
|
if form.accepts(request.vars):
|
||||||
app = form.vars.name
|
app = form.vars.name
|
||||||
session.app['name'] = app
|
session.app['name'] = app
|
||||||
if MULTI_USER_MODE and db(db.app.name==app)\
|
if MULTI_USER_MODE and db(db.app.name == app)(db.app.owner != auth.user.id).count():
|
||||||
(db.app.owner!=auth.user.id).count():
|
|
||||||
session.flash = 'App belongs already to other user'
|
session.flash = 'App belongs already to other user'
|
||||||
elif app in apps:
|
elif app in apps:
|
||||||
meta = os.path.normpath(\
|
meta = os.path.normpath(
|
||||||
os.path.join(os.path.normpath(request.folder),
|
os.path.join(os.path.normpath(request.folder),
|
||||||
'..', app, 'wizard.metadata'))
|
'..', app, 'wizard.metadata'))
|
||||||
if os.path.exists(meta):
|
if os.path.exists(meta):
|
||||||
@@ -96,36 +105,44 @@ def step1():
|
|||||||
requires=IS_NOT_EMPTY()),
|
requires=IS_NOT_EMPTY()),
|
||||||
Field('subtitle', default=params.get('subtitle', None)),
|
Field('subtitle', default=params.get('subtitle', None)),
|
||||||
Field('author', default=params.get('author', None)),
|
Field('author', default=params.get('author', None)),
|
||||||
Field('author_email',default=params.get('author_email',None)),
|
Field(
|
||||||
|
'author_email', default=params.get('author_email', None)),
|
||||||
Field('keywords', default=params.get('keywords', None)),
|
Field('keywords', default=params.get('keywords', None)),
|
||||||
Field('description', 'text',
|
Field('description', 'text',
|
||||||
default=params.get('description', None)),
|
default=params.get('description', None)),
|
||||||
Field('layout_theme', requires=IS_IN_SET(themes),
|
Field('layout_theme', requires=IS_IN_SET(themes),
|
||||||
default=params.get('layout_theme', themes[0])),
|
default=params.get('layout_theme', themes[0])),
|
||||||
Field('database_uri',default=params.get('database_uri',None)),
|
Field(
|
||||||
Field('security_key',default=params.get('security_key',None)),
|
'database_uri', default=params.get('database_uri', None)),
|
||||||
Field('email_server',default=params.get('email_server',None)),
|
Field(
|
||||||
Field('email_sender',default=params.get('email_sender',None)),
|
'security_key', default=params.get('security_key', None)),
|
||||||
|
Field(
|
||||||
|
'email_server', default=params.get('email_server', None)),
|
||||||
|
Field(
|
||||||
|
'email_sender', default=params.get('email_sender', None)),
|
||||||
Field('email_login', default=params.get('email_login', None)),
|
Field('email_login', default=params.get('email_login', None)),
|
||||||
Field('login_method', requires=IS_IN_SET(('local', 'janrain')),
|
Field('login_method', requires=IS_IN_SET(('local', 'janrain')),
|
||||||
default=params.get('login_method', 'local')),
|
default=params.get('login_method', 'local')),
|
||||||
Field('login_config',default=params.get('login_config',None)),
|
Field(
|
||||||
Field('plugins','list:string',requires=IS_IN_SET(plugins,multiple=True)))
|
'login_config', default=params.get('login_config', None)),
|
||||||
|
Field('plugins', 'list:string', requires=IS_IN_SET(plugins, multiple=True)),
|
||||||
|
_class='span7 well well-small')
|
||||||
|
|
||||||
if form.accepts(request.vars):
|
if form.accepts(request.vars):
|
||||||
session.app['params'] = [(key, form.vars.get(key, None))
|
session.app['params'] = [(key, form.vars.get(key, None))
|
||||||
for key, value in session.app['params']]
|
for key, value in session.app['params']]
|
||||||
redirect(URL('step2'))
|
redirect(URL('step2') + '/#xwizard_form')
|
||||||
return dict(step='1: Setting Parameters', form=form)
|
return dict(step='1: Setting Parameters', form=form)
|
||||||
|
|
||||||
|
|
||||||
def step2():
|
def step2():
|
||||||
response.view = 'wizard/step.html'
|
response.view = 'wizard/step.html'
|
||||||
form = SQLFORM.factory(Field('table_names', 'list:string',
|
form = SQLFORM.factory(Field('table_names', 'list:string',
|
||||||
default=session.app['tables']))
|
default=session.app['tables']), _class="span7 well well-small")
|
||||||
if form.accepts(request.vars):
|
if form.accepts(request.vars):
|
||||||
table_names = [clean(t) for t in listify(form.vars.table_names) \
|
table_names = [clean(t) for t in listify(form.vars.table_names)
|
||||||
if t.strip()]
|
if t.strip()]
|
||||||
if [t for t in table_names if t.startswith('auth_') and \
|
if [t for t in table_names if t.startswith('auth_') and
|
||||||
not t == 'auth_user']:
|
not t == 'auth_user']:
|
||||||
form.error.table_names = \
|
form.error.table_names = \
|
||||||
T('invalid table names (auth_* tables already defined)')
|
T('invalid table names (auth_* tables already defined)')
|
||||||
@@ -141,19 +158,21 @@ def step2():
|
|||||||
session.app['page_' + name] = \
|
session.app['page_' + name] = \
|
||||||
'## Manage %s\n\n{{=form}}' % (table)
|
'## Manage %s\n\n{{=form}}' % (table)
|
||||||
if session.app['tables']:
|
if session.app['tables']:
|
||||||
redirect(URL('step3',args=0))
|
redirect(URL('step3', args=0) + '/#xwizard_form')
|
||||||
else:
|
else:
|
||||||
redirect(URL('step4'))
|
redirect(URL('step4') + '/#xwizard_form')
|
||||||
return dict(step='2: Tables', form=form)
|
return dict(step='2: Tables', form=form)
|
||||||
|
|
||||||
|
|
||||||
def step3():
|
def step3():
|
||||||
response.view = 'wizard/step.html'
|
response.view = 'wizard/step.html'
|
||||||
n=int(request.args(0) or 0)
|
n = int(request.args(-1) or 0)
|
||||||
m = len(session.app['tables'])
|
m = len(session.app['tables'])
|
||||||
if n>=m: redirect(URL('step2'))
|
if n >= m:
|
||||||
|
redirect(URL('step2'))
|
||||||
table = session.app['tables'][n]
|
table = session.app['tables'][n]
|
||||||
form = SQLFORM.factory(Field('field_names', 'list:string',
|
form = SQLFORM.factory(Field('field_names', 'list:string',
|
||||||
default=session.app.get('table_'+table,[])))
|
default=session.app.get('table_' + table, [])), _class="span7 well well-small")
|
||||||
if form.accepts(request.vars) and form.vars.field_names:
|
if form.accepts(request.vars) and form.vars.field_names:
|
||||||
fields = listify(form.vars.field_names)
|
fields = listify(form.vars.field_names)
|
||||||
if table == 'auth_user':
|
if table == 'auth_user':
|
||||||
@@ -169,46 +188,50 @@ def step3():
|
|||||||
response.flash = T('invalid circular reference')
|
response.flash = T('invalid circular reference')
|
||||||
else:
|
else:
|
||||||
if n < m - 1:
|
if n < m - 1:
|
||||||
redirect(URL('step3',args=n+1))
|
redirect(URL('step3', args=n + 1) + '/#xwizard_form')
|
||||||
else:
|
else:
|
||||||
redirect(URL('step4'))
|
redirect(URL('step4') + '/#xwizard_form')
|
||||||
return dict(step='3: Fields for table "%s" (%s of %s)' \
|
return dict(step='3: Fields for table "%s" (%s of %s)'
|
||||||
% (table, n + 1, m), table=table, form=form)
|
% (table, n + 1, m), table=table, form=form)
|
||||||
|
|
||||||
|
|
||||||
def step4():
|
def step4():
|
||||||
response.view = 'wizard/step.html'
|
response.view = 'wizard/step.html'
|
||||||
form = SQLFORM.factory(Field('pages', 'list:string',
|
form = SQLFORM.factory(Field('pages', 'list:string',
|
||||||
default=session.app['pages']))
|
default=session.app['pages']), _class="span7 well well-small")
|
||||||
if form.accepts(request.vars):
|
if form.accepts(request.vars):
|
||||||
session.app['pages'] = [clean(t)
|
session.app['pages'] = [clean(t)
|
||||||
for t in listify(form.vars.pages)
|
for t in listify(form.vars.pages)
|
||||||
if t.strip()]
|
if t.strip()]
|
||||||
if session.app['pages']:
|
if session.app['pages']:
|
||||||
redirect(URL('step5',args=0))
|
redirect(URL('step5', args=0) + '/#xwizard_form')
|
||||||
else:
|
else:
|
||||||
redirect(URL('step6'))
|
redirect(URL('step6') + '/#xwizard_form')
|
||||||
return dict(step='4: Pages', form=form)
|
return dict(step='4: Pages', form=form)
|
||||||
|
|
||||||
|
|
||||||
def step5():
|
def step5():
|
||||||
response.view = 'wizard/step.html'
|
response.view = 'wizard/step.html'
|
||||||
n=int(request.args(0) or 0)
|
n = int(request.args(-1) or 0)
|
||||||
m = len(session.app['pages'])
|
m = len(session.app['pages'])
|
||||||
if n>=m: redirect(URL('step4'))
|
if n >= m:
|
||||||
|
redirect(URL('step4'))
|
||||||
page = session.app['pages'][n]
|
page = session.app['pages'][n]
|
||||||
markmin_url = 'http://web2py.com/examples/static/markmin.html'
|
markmin_url = 'http://web2py.com/examples/static/markmin.html'
|
||||||
form = SQLFORM.factory(Field('content', 'text',
|
form = SQLFORM.factory(Field('content', 'text',
|
||||||
default=session.app.get('page_' + page, []),
|
default=session.app.get('page_' + page, []),
|
||||||
comment=A('use markmin',
|
comment=A('use markmin',
|
||||||
_href=markmin_url, _target='_blank')),
|
_href=markmin_url, _target='_blank')),
|
||||||
formstyle='table2cols')
|
formstyle='table2cols', _class="span7 well well-small")
|
||||||
if form.accepts(request.vars):
|
if form.accepts(request.vars):
|
||||||
session.app['page_' + page] = form.vars.content
|
session.app['page_' + page] = form.vars.content
|
||||||
if n < m - 1:
|
if n < m - 1:
|
||||||
redirect(URL('step5',args=n+1))
|
redirect(URL('step5', args=n + 1) + '/#xwizard_form')
|
||||||
else:
|
else:
|
||||||
redirect(URL('step6'))
|
redirect(URL('step6') + '/#xwizard_form')
|
||||||
return dict(step='5: View for page "%s" (%s of %s)' % (page, n + 1, m), form=form)
|
return dict(step='5: View for page "%s" (%s of %s)' % (page, n + 1, m), form=form)
|
||||||
|
|
||||||
|
|
||||||
def step6():
|
def step6():
|
||||||
response.view = 'wizard/step.html'
|
response.view = 'wizard/step.html'
|
||||||
params = dict(session.app['params'])
|
params = dict(session.app['params'])
|
||||||
@@ -220,7 +243,8 @@ def step6():
|
|||||||
Field('generate_menu', 'boolean', default=True),
|
Field('generate_menu', 'boolean', default=True),
|
||||||
Field('apply_layout', 'boolean', default=True),
|
Field('apply_layout', 'boolean', default=True),
|
||||||
Field('erase_database', 'boolean', default=True),
|
Field('erase_database', 'boolean', default=True),
|
||||||
Field('populate_database','boolean',default=True))
|
Field('populate_database', 'boolean', default=True),
|
||||||
|
_id="generate_form", _class="form-horizontal span7 well well-small")
|
||||||
if form.accepts(request.vars):
|
if form.accepts(request.vars):
|
||||||
if DEMO_MODE:
|
if DEMO_MODE:
|
||||||
session.flash = T('Application cannot be generated in demo mode')
|
session.flash = T('Application cannot be generated in demo mode')
|
||||||
@@ -230,9 +254,11 @@ def step6():
|
|||||||
redirect(URL('generated'))
|
redirect(URL('generated'))
|
||||||
return dict(step='6: Generate app "%s"' % app, form=form)
|
return dict(step='6: Generate app "%s"' % app, form=form)
|
||||||
|
|
||||||
|
|
||||||
def generated():
|
def generated():
|
||||||
return dict(app=session.app['name'])
|
return dict(app=session.app['name'])
|
||||||
|
|
||||||
|
|
||||||
def sort_tables(tables):
|
def sort_tables(tables):
|
||||||
import re
|
import re
|
||||||
regex = re.compile('(%s)' % '|'.join(tables))
|
regex = re.compile('(%s)' % '|'.join(tables))
|
||||||
@@ -245,6 +271,7 @@ def sort_tables(tables):
|
|||||||
tables = []
|
tables = []
|
||||||
if is_auth_user:
|
if is_auth_user:
|
||||||
tables.append('auth_user')
|
tables.append('auth_user')
|
||||||
|
|
||||||
def append(table, trail=[]):
|
def append(table, trail=[]):
|
||||||
if table in trail:
|
if table in trail:
|
||||||
raise RuntimeError
|
raise RuntimeError
|
||||||
@@ -253,12 +280,15 @@ def sort_tables(tables):
|
|||||||
append(t, trail=trail + [table])
|
append(t, trail=trail + [table])
|
||||||
if not table in tables:
|
if not table in tables:
|
||||||
tables.append(table)
|
tables.append(table)
|
||||||
for table in d: append(table)
|
for table in d:
|
||||||
|
append(table)
|
||||||
return tables
|
return tables
|
||||||
|
|
||||||
|
|
||||||
def make_table(table, fields):
|
def make_table(table, fields):
|
||||||
rawtable = table
|
rawtable = table
|
||||||
if table!='auth_user': table='t_'+table
|
if table != 'auth_user':
|
||||||
|
table = 't_' + table
|
||||||
s = ''
|
s = ''
|
||||||
s += '\n' + '#' * 40 + '\n'
|
s += '\n' + '#' * 40 + '\n'
|
||||||
s += "db.define_table('%s',\n" % table
|
s += "db.define_table('%s',\n" % table
|
||||||
@@ -277,11 +307,12 @@ def make_table(table,fields):
|
|||||||
has[key] = True
|
has[key] = True
|
||||||
tables = session.app['tables']
|
tables = session.app['tables']
|
||||||
refs = [t for t in tables if t in items]
|
refs = [t for t in tables if t in items]
|
||||||
items = items[:1] + [x for x in items[1:] \
|
items = items[:1] + [x for x in items[1:]
|
||||||
if not x in keys and not x in tables]
|
if not x in keys and not x in tables]
|
||||||
barename = name = '_'.join(items)
|
barename = name = '_'.join(items)
|
||||||
if table[:2] == 't_': name = 'f_' + name
|
if table[:2] == 't_': name = 'f_' + name
|
||||||
if first_field=='id': first_field=name
|
if first_field == 'id':
|
||||||
|
first_field = name
|
||||||
|
|
||||||
### determine field type
|
### determine field type
|
||||||
ftype = 'string'
|
ftype = 'string'
|
||||||
@@ -295,7 +326,8 @@ def make_table(table,fields):
|
|||||||
ftype = t
|
ftype = t
|
||||||
if refs:
|
if refs:
|
||||||
key = refs[0]
|
key = refs[0]
|
||||||
if not key=='auth_user': key='t_'+key
|
if not key == 'auth_user':
|
||||||
|
key = 't_' + key
|
||||||
if 'multiple' in has:
|
if 'multiple' in has:
|
||||||
ftype = 'list:reference %s' % key
|
ftype = 'list:reference %s' % key
|
||||||
else:
|
else:
|
||||||
@@ -352,17 +384,22 @@ def make_table(table,fields):
|
|||||||
s += " migrate=settings.migrate)\n\n"
|
s += " migrate=settings.migrate)\n\n"
|
||||||
if table == 'auth_user':
|
if table == 'auth_user':
|
||||||
s += """
|
s += """
|
||||||
db.auth_user.first_name.requires = IS_NOT_EMPTY(error_message=auth.messages.is_empty)
|
db.auth_user.first_name.requires = IS_NOT_EMPTY(
|
||||||
db.auth_user.last_name.requires = IS_NOT_EMPTY(error_message=auth.messages.is_empty)
|
error_message=auth.messages.is_empty)
|
||||||
db.auth_user.password.requires = CRYPT(key=auth.settings.hmac_key, min_length=4)
|
db.auth_user.last_name.requires = IS_NOT_EMPTY(
|
||||||
|
error_message=auth.messages.is_empty)
|
||||||
|
db.auth_user.password.requires = CRYPT(
|
||||||
|
key=auth.settings.hmac_key, min_length=4)
|
||||||
db.auth_user.username.requires = IS_NOT_IN_DB(db, db.auth_user.username)
|
db.auth_user.username.requires = IS_NOT_IN_DB(db, db.auth_user.username)
|
||||||
db.auth_user.email.requires = (IS_EMAIL(error_message=auth.messages.invalid_email),
|
db.auth_user.email.requires = (
|
||||||
|
IS_EMAIL(error_message=auth.messages.invalid_email),
|
||||||
IS_NOT_IN_DB(db, db.auth_user.email))
|
IS_NOT_IN_DB(db, db.auth_user.email))
|
||||||
"""
|
"""
|
||||||
else:
|
else:
|
||||||
s += "db.define_table('%s_archive',db.%s,Field('current_record','reference %s',readable=False,writable=False))\n" % (table, table, table)
|
s += "db.define_table('%s_archive',db.%s,Field('current_record','reference %s',readable=False,writable=False))\n" % (table, table, table)
|
||||||
return s
|
return s
|
||||||
|
|
||||||
|
|
||||||
def fix_db(filename):
|
def fix_db(filename):
|
||||||
params = dict(session.app['params'])
|
params = dict(session.app['params'])
|
||||||
content = read_file(filename, 'rb')
|
content = read_file(filename, 'rb')
|
||||||
@@ -370,7 +407,7 @@ def fix_db(filename):
|
|||||||
auth_user = make_table('auth_user', session.app['table_auth_user'])
|
auth_user = make_table('auth_user', session.app['table_auth_user'])
|
||||||
content = content.replace('sqlite://storage.sqlite',
|
content = content.replace('sqlite://storage.sqlite',
|
||||||
params['database_uri'])
|
params['database_uri'])
|
||||||
content = content.replace('auth.define_tables()',\
|
content = content.replace('auth.define_tables()',
|
||||||
auth_user + 'auth.define_tables(migrate = settings.migrate)')
|
auth_user + 'auth.define_tables(migrate = settings.migrate)')
|
||||||
content += """
|
content += """
|
||||||
mail.settings.server = settings.email_server
|
mail.settings.server = settings.email_server
|
||||||
@@ -380,7 +417,8 @@ mail.settings.login = settings.email_login
|
|||||||
if params['login_method'] == 'janrain':
|
if params['login_method'] == 'janrain':
|
||||||
content += """
|
content += """
|
||||||
from gluon.contrib.login_methods.rpx_account import RPXAccount
|
from gluon.contrib.login_methods.rpx_account import RPXAccount
|
||||||
auth.settings.actions_disabled=['register','change_password','request_reset_password']
|
auth.settings.actions_disabled=['register','change_password',
|
||||||
|
'request_reset_password']
|
||||||
auth.settings.login_form = RPXAccount(request,
|
auth.settings.login_form = RPXAccount(request,
|
||||||
api_key = settings.login_config.split(':')[-1],
|
api_key = settings.login_config.split(':')[-1],
|
||||||
domain = settings.login_config.split(':')[0],
|
domain = settings.login_config.split(':')[0],
|
||||||
@@ -388,6 +426,7 @@ auth.settings.login_form = RPXAccount(request,
|
|||||||
"""
|
"""
|
||||||
write_file(filename, content, 'wb')
|
write_file(filename, content, 'wb')
|
||||||
|
|
||||||
|
|
||||||
def make_menu(pages):
|
def make_menu(pages):
|
||||||
s = ''
|
s = ''
|
||||||
s += 'response.title = settings.title\n'
|
s += 'response.title = settings.title\n'
|
||||||
@@ -408,6 +447,7 @@ def make_menu(pages):
|
|||||||
s += ']'
|
s += ']'
|
||||||
return s
|
return s
|
||||||
|
|
||||||
|
|
||||||
def make_page(page, contents):
|
def make_page(page, contents):
|
||||||
if 'auth_user' in session.app['tables'] and not page in ('index', 'error'):
|
if 'auth_user' in session.app['tables'] and not page in ('index', 'error'):
|
||||||
s = "@auth.requires_login()\ndef %s():\n" % page
|
s = "@auth.requires_login()\ndef %s():\n" % page
|
||||||
@@ -421,11 +461,13 @@ def make_page(page,contents):
|
|||||||
s += " return dict()\n\n"
|
s += " return dict()\n\n"
|
||||||
return s
|
return s
|
||||||
|
|
||||||
|
|
||||||
def make_view(page, contents):
|
def make_view(page, contents):
|
||||||
s = "{{extend 'layout.html'}}\n\n"
|
s = "{{extend 'layout.html'}}\n\n"
|
||||||
s += str(MARKMIN(contents))
|
s += str(MARKMIN(contents))
|
||||||
return s
|
return s
|
||||||
|
|
||||||
|
|
||||||
def populate(tables):
|
def populate(tables):
|
||||||
s = 'from gluon.contrib.populate import populate\n'
|
s = 'from gluon.contrib.populate import populate\n'
|
||||||
s += 'if db(db.auth_user).isempty():\n'
|
s += 'if db(db.auth_user).isempty():\n'
|
||||||
@@ -434,6 +476,7 @@ def populate(tables):
|
|||||||
s += " populate(db.%s,10)\n" % t
|
s += " populate(db.%s,10)\n" % t
|
||||||
return s
|
return s
|
||||||
|
|
||||||
|
|
||||||
def create(options):
|
def create(options):
|
||||||
if DEMO_MODE:
|
if DEMO_MODE:
|
||||||
session.flash = T('disabled in demo mode')
|
session.flash = T('disabled in demo mode')
|
||||||
@@ -461,7 +504,8 @@ def create(options):
|
|||||||
if options.apply_layout and params['layout_theme'] != 'Default':
|
if options.apply_layout and params['layout_theme'] != 'Default':
|
||||||
try:
|
try:
|
||||||
fn = 'web2py.plugin.layout_%s.w2p' % params['layout_theme']
|
fn = 'web2py.plugin.layout_%s.w2p' % params['layout_theme']
|
||||||
theme = urllib.urlopen(LAYOUTS_APP+'/static/plugin_layouts/plugins/'+fn)
|
theme = urllib.urlopen(
|
||||||
|
LAYOUTS_APP + '/static/plugin_layouts/plugins/' + fn)
|
||||||
plugin_install(app, theme, request, fn)
|
plugin_install(app, theme, request, fn)
|
||||||
except:
|
except:
|
||||||
session.flash = T("unable to download layout")
|
session.flash = T("unable to download layout")
|
||||||
@@ -502,20 +546,23 @@ def create(options):
|
|||||||
|
|
||||||
### create newapp/models/db_wizard.py
|
### create newapp/models/db_wizard.py
|
||||||
if options.generate_model:
|
if options.generate_model:
|
||||||
model = os.path.join(request.folder,'..',app,'models','db_wizard.py')
|
model = os.path.join(
|
||||||
|
request.folder, '..', app, 'models', 'db_wizard.py')
|
||||||
file = open(model, 'wb')
|
file = open(model, 'wb')
|
||||||
try:
|
try:
|
||||||
file.write('### we prepend t_ to tablenames and f_ to fieldnames for disambiguity\n\n')
|
file.write('### we prepend t_ to tablenames and f_ to fieldnames for disambiguity\n\n')
|
||||||
tables = sort_tables(session.app['tables'])
|
tables = sort_tables(session.app['tables'])
|
||||||
for table in tables:
|
for table in tables:
|
||||||
if table=='auth_user': continue
|
if table == 'auth_user':
|
||||||
|
continue
|
||||||
file.write(make_table(table, session.app['table_' + table]))
|
file.write(make_table(table, session.app['table_' + table]))
|
||||||
finally:
|
finally:
|
||||||
file.close()
|
file.close()
|
||||||
|
|
||||||
model = os.path.join(request.folder, '..', app,
|
model = os.path.join(request.folder, '..', app,
|
||||||
'models', 'db_wizard_populate.py')
|
'models', 'db_wizard_populate.py')
|
||||||
if os.path.exists(model): os.unlink(model)
|
if os.path.exists(model):
|
||||||
|
os.unlink(model)
|
||||||
if options.populate_database and session.app['tables']:
|
if options.populate_database and session.app['tables']:
|
||||||
file = open(model, 'wb')
|
file = open(model, 'wb')
|
||||||
try:
|
try:
|
||||||
@@ -525,7 +572,8 @@ def create(options):
|
|||||||
|
|
||||||
### create newapp/controllers/default.py
|
### create newapp/controllers/default.py
|
||||||
if options.generate_controller:
|
if options.generate_controller:
|
||||||
controller = os.path.join(request.folder,'..',app,'controllers','default.py')
|
controller = os.path.join(
|
||||||
|
request.folder, '..', app, 'controllers', 'default.py')
|
||||||
file = open(controller, 'wb')
|
file = open(controller, 'wb')
|
||||||
try:
|
try:
|
||||||
file.write("""# -*- coding: utf-8 -*-
|
file.write("""# -*- coding: utf-8 -*-
|
||||||
@@ -536,17 +584,20 @@ def call(): return service()
|
|||||||
### end requires
|
### end requires
|
||||||
""")
|
""")
|
||||||
for page in session.app['pages']:
|
for page in session.app['pages']:
|
||||||
file.write(make_page(page,session.app.get('page_'+page,'')))
|
file.write(
|
||||||
|
make_page(page, session.app.get('page_' + page, '')))
|
||||||
finally:
|
finally:
|
||||||
file.close()
|
file.close()
|
||||||
|
|
||||||
### create newapp/views/default/*.html
|
### create newapp/views/default/*.html
|
||||||
if options.generate_views:
|
if options.generate_views:
|
||||||
for page in session.app['pages']:
|
for page in session.app['pages']:
|
||||||
view = os.path.join(request.folder,'..',app,'views','default',page+'.html')
|
view = os.path.join(
|
||||||
|
request.folder, '..', app, 'views', 'default', page + '.html')
|
||||||
file = open(view, 'wb')
|
file = open(view, 'wb')
|
||||||
try:
|
try:
|
||||||
file.write(make_view(page,session.app.get('page_'+page,'')))
|
file.write(
|
||||||
|
make_view(page, session.app.get('page_' + page, '')))
|
||||||
finally:
|
finally:
|
||||||
file.close()
|
file.close()
|
||||||
|
|
||||||
@@ -554,5 +605,3 @@ def call(): return service()
|
|||||||
path = os.path.join(request.folder, '..', app, 'databases', '*')
|
path = os.path.join(request.folder, '..', app, 'databases', '*')
|
||||||
for file in glob.glob(path):
|
for file in glob.glob(path):
|
||||||
os.unlink(file)
|
os.unlink(file)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -19,5 +19,3 @@ for filename in os.listdir(path):
|
|||||||
os.unlink(fullpath)
|
os.unlink(fullpath)
|
||||||
except:
|
except:
|
||||||
logging.exception('failure to check %s' % fullpath)
|
logging.exception('failure to check %s' % fullpath)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,480 @@
|
|||||||
|
# coding: utf8
|
||||||
|
{
|
||||||
|
'!langcode!': 'cs-cz',
|
||||||
|
'!langname!': 'čeština',
|
||||||
|
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': 'Kolonka "Upravit" je nepovinný výraz, například "pole1=\'nováhodnota\'". Výsledky databázového JOINu nemůžete mazat ani upravovat.',
|
||||||
|
'"User Exception" debug mode. An error ticket could be issued!': '"User Exception" debug mode. An error ticket could be issued!',
|
||||||
|
'%%{Row} in Table': '%%{řádek} v tabulce',
|
||||||
|
'%%{Row} selected': 'označených %%{řádek}',
|
||||||
|
'%s %%{row} deleted': '%s smazaných %%{záznam}',
|
||||||
|
'%s %%{row} updated': '%s upravených %%{záznam}',
|
||||||
|
'%s selected': '%s označených',
|
||||||
|
'%Y-%m-%d': '%d.%m.%Y',
|
||||||
|
'%Y-%m-%d %H:%M:%S': '%d.%m.%Y %H:%M:%S',
|
||||||
|
'(requires internet access)': '(vyžaduje připojení k internetu)',
|
||||||
|
'(requires internet access, experimental)': '(requires internet access, experimental)',
|
||||||
|
'(something like "it-it")': '(například "cs-cs")',
|
||||||
|
'@markmin\x01(file **gluon/contrib/plural_rules/%s.py** is not found)': '(soubor **gluon/contrib/plural_rules/%s.py** nenalezen)',
|
||||||
|
'@markmin\x01Searching: **%s** %%{file}': 'Hledání: **%s** %%{soubor}',
|
||||||
|
'About': 'O programu',
|
||||||
|
'About application': 'O aplikaci',
|
||||||
|
'Access Control': 'Řízení přístupu',
|
||||||
|
'Add breakpoint': 'Přidat bod přerušení',
|
||||||
|
'Additional code for your application': 'Další kód pro Vaši aplikaci',
|
||||||
|
'Admin design page': 'Admin design page',
|
||||||
|
'Admin language': 'jazyk rozhraní',
|
||||||
|
'Administrative interface': 'pro administrátorské rozhraní klikněte sem',
|
||||||
|
'Administrative Interface': 'Administrátorské rozhraní',
|
||||||
|
'administrative interface': 'rozhraní pro správu',
|
||||||
|
'Administrator Password:': 'Administrátorské heslo:',
|
||||||
|
'Ajax Recipes': 'Recepty s ajaxem',
|
||||||
|
'An error occured, please %s the page': 'An error occured, please %s the page',
|
||||||
|
'and rename it:': 'a přejmenovat na:',
|
||||||
|
'appadmin': 'appadmin',
|
||||||
|
'appadmin is disabled because insecure channel': 'appadmin je zakázaná bez zabezpečeného spojení',
|
||||||
|
'Application': 'Application',
|
||||||
|
'application "%s" uninstalled': 'application "%s" odinstalována',
|
||||||
|
'application compiled': 'aplikace zkompilována',
|
||||||
|
'Application name:': 'Název aplikace:',
|
||||||
|
'are not used': 'nepoužita',
|
||||||
|
'are not used yet': 'ještě nepoužita',
|
||||||
|
'Are you sure you want to delete this object?': 'Opravdu chcete odstranit tento objekt?',
|
||||||
|
'Are you sure you want to uninstall application "%s"?': 'Opravdu chcete odinstalovat aplikaci "%s"?',
|
||||||
|
'arguments': 'arguments',
|
||||||
|
'at char %s': 'at char %s',
|
||||||
|
'at line %s': 'at line %s',
|
||||||
|
'ATTENTION:': 'ATTENTION:',
|
||||||
|
'ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.': 'ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.',
|
||||||
|
'Available Databases and Tables': 'Dostupné databáze a tabulky',
|
||||||
|
'back': 'zpět',
|
||||||
|
'Back to wizard': 'Back to wizard',
|
||||||
|
'Basics': 'Basics',
|
||||||
|
'Begin': 'Začít',
|
||||||
|
'breakpoint': 'bod přerušení',
|
||||||
|
'Breakpoints': 'Body přerušení',
|
||||||
|
'breakpoints': 'body přerušení',
|
||||||
|
'Buy this book': 'Koupit web2py knihu',
|
||||||
|
'Cache': 'Cache',
|
||||||
|
'cache': 'cache',
|
||||||
|
'Cache Keys': 'Klíče cache',
|
||||||
|
'cache, errors and sessions cleaned': 'cache, chyby a relace byly pročištěny',
|
||||||
|
'can be a git repo': 'může to být git repo',
|
||||||
|
'Cancel': 'Storno',
|
||||||
|
'Cannot be empty': 'Nemůže být prázdné',
|
||||||
|
'Change Admin Password': 'Změnit heslo pro správu',
|
||||||
|
'Change admin password': 'Změnit heslo pro správu aplikací',
|
||||||
|
'Change password': 'Změna hesla',
|
||||||
|
'check all': 'vše označit',
|
||||||
|
'Check for upgrades': 'Zkusit aktualizovat',
|
||||||
|
'Check to delete': 'Označit ke smazání',
|
||||||
|
'Check to delete:': 'Označit ke smazání:',
|
||||||
|
'Checking for upgrades...': 'Zjišťuji, zda jsou k dispozici aktualizace...',
|
||||||
|
'Clean': 'Pročistit',
|
||||||
|
'Clear CACHE?': 'Vymazat CACHE?',
|
||||||
|
'Clear DISK': 'Vymazat DISK',
|
||||||
|
'Clear RAM': 'Vymazat RAM',
|
||||||
|
'Click row to expand traceback': 'Pro rozbalení stopy, klikněte na řádek',
|
||||||
|
'Click row to view a ticket': 'Pro zobrazení chyby (ticketu), klikněte na řádku...',
|
||||||
|
'Client IP': 'IP adresa klienta',
|
||||||
|
'code': 'code',
|
||||||
|
'Code listing': 'Code listing',
|
||||||
|
'collapse/expand all': 'vše sbalit/rozbalit',
|
||||||
|
'Community': 'Komunita',
|
||||||
|
'Compile': 'Zkompilovat',
|
||||||
|
'compiled application removed': 'zkompilovaná aplikace smazána',
|
||||||
|
'Components and Plugins': 'Komponenty a zásuvné moduly',
|
||||||
|
'Condition': 'Podmínka',
|
||||||
|
'continue': 'continue',
|
||||||
|
'Controller': 'Kontrolér (Controller)',
|
||||||
|
'Controllers': 'Kontroléry',
|
||||||
|
'controllers': 'kontroléry',
|
||||||
|
'Copyright': 'Copyright',
|
||||||
|
'Count': 'Počet',
|
||||||
|
'Create': 'Vytvořit',
|
||||||
|
'create file with filename:': 'vytvořit soubor s názvem:',
|
||||||
|
'created by': 'vytvořil',
|
||||||
|
'Created By': 'Vytvořeno - kým',
|
||||||
|
'Created On': 'Vytvořeno - kdy',
|
||||||
|
'crontab': 'crontab',
|
||||||
|
'Current request': 'Aktuální požadavek',
|
||||||
|
'Current response': 'Aktuální odpověď',
|
||||||
|
'Current session': 'Aktuální relace',
|
||||||
|
'currently running': 'právě běží',
|
||||||
|
'currently saved or': 'uloženo nebo',
|
||||||
|
'customize me!': 'upravte mě!',
|
||||||
|
'data uploaded': 'data nahrána',
|
||||||
|
'Database': 'Rozhraní databáze',
|
||||||
|
'Database %s select': 'databáze %s výběr',
|
||||||
|
'Database administration': 'Database administration',
|
||||||
|
'database administration': 'správa databáze',
|
||||||
|
'Date and Time': 'Datum a čas',
|
||||||
|
'day': 'den',
|
||||||
|
'db': 'db',
|
||||||
|
'DB Model': 'Databázový model',
|
||||||
|
'Debug': 'Ladění',
|
||||||
|
'defines tables': 'defines tables',
|
||||||
|
'Delete': 'Smazat',
|
||||||
|
'delete': 'smazat',
|
||||||
|
'delete all checked': 'smazat vše označené',
|
||||||
|
'delete plugin': 'delete plugin',
|
||||||
|
'Delete this file (you will be asked to confirm deletion)': 'Smazat tento soubor (budete požádán o potvrzení mazání)',
|
||||||
|
'Delete:': 'Smazat:',
|
||||||
|
'deleted after first hit': 'smazat po prvním dosažení',
|
||||||
|
'Demo': 'Demo',
|
||||||
|
'Deploy': 'Nahrát',
|
||||||
|
'Deploy on Google App Engine': 'Nahrát na Google App Engine',
|
||||||
|
'Deploy to OpenShift': 'Nahrát na OpenShift',
|
||||||
|
'Deployment Recipes': 'Postupy pro deployment',
|
||||||
|
'Description': 'Popis',
|
||||||
|
'design': 'návrh',
|
||||||
|
'Detailed traceback description': 'Podrobný výpis prostředí',
|
||||||
|
'details': 'podrobnosti',
|
||||||
|
'direction: ltr': 'směr: ltr',
|
||||||
|
'Disable': 'Zablokovat',
|
||||||
|
'DISK': 'DISK',
|
||||||
|
'Disk Cache Keys': 'Klíče diskové cache',
|
||||||
|
'Disk Cleared': 'Disk smazán',
|
||||||
|
'docs': 'dokumentace',
|
||||||
|
'Documentation': 'Dokumentace',
|
||||||
|
"Don't know what to do?": 'Nevíte kudy kam?',
|
||||||
|
'done!': 'hotovo!',
|
||||||
|
'Download': 'Stáhnout',
|
||||||
|
'download layouts': 'stáhnout moduly rozvržení stránky',
|
||||||
|
'download plugins': 'stáhnout zásuvné moduly',
|
||||||
|
'E-mail': 'E-mail',
|
||||||
|
'Edit': 'Upravit',
|
||||||
|
'edit all': 'edit all',
|
||||||
|
'Edit application': 'Správa aplikace',
|
||||||
|
'edit controller': 'edit controller',
|
||||||
|
'Edit current record': 'Upravit aktuální záznam',
|
||||||
|
'Edit Profile': 'Upravit profil',
|
||||||
|
'edit views:': 'upravit pohled:',
|
||||||
|
'Editing file "%s"': 'Úprava souboru "%s"',
|
||||||
|
'Editing Language file': 'Úprava jazykového souboru',
|
||||||
|
'Editing Plural Forms File': 'Editing Plural Forms File',
|
||||||
|
'Email and SMS': 'Email a SMS',
|
||||||
|
'Enable': 'Odblokovat',
|
||||||
|
'enter a number between %(min)g and %(max)g': 'zadejte číslo mezi %(min)g a %(max)g',
|
||||||
|
'enter an integer between %(min)g and %(max)g': 'zadejte celé číslo mezi %(min)g a %(max)g',
|
||||||
|
'Error': 'Chyba',
|
||||||
|
'Error logs for "%(app)s"': 'Seznam výskytu chyb pro aplikaci "%(app)s"',
|
||||||
|
'Error snapshot': 'Snapshot chyby',
|
||||||
|
'Error ticket': 'Ticket chyby',
|
||||||
|
'Errors': 'Chyby',
|
||||||
|
'Exception %(extype)s: %(exvalue)s': 'Exception %(extype)s: %(exvalue)s',
|
||||||
|
'Exception %s': 'Exception %s',
|
||||||
|
'Exception instance attributes': 'Prvky instance výjimky',
|
||||||
|
'Expand Abbreviation': 'Expand Abbreviation',
|
||||||
|
'export as csv file': 'exportovat do .csv souboru',
|
||||||
|
'exposes': 'vystavuje',
|
||||||
|
'exposes:': 'vystavuje funkce:',
|
||||||
|
'extends': 'rozšiřuje',
|
||||||
|
'failed to compile file because:': 'soubor se nepodařilo zkompilovat, protože:',
|
||||||
|
'FAQ': 'Často kladené dotazy',
|
||||||
|
'File': 'Soubor',
|
||||||
|
'file': 'soubor',
|
||||||
|
'file "%(filename)s" created': 'file "%(filename)s" created',
|
||||||
|
'file saved on %(time)s': 'soubor uložen %(time)s',
|
||||||
|
'file saved on %s': 'soubor uložen %s',
|
||||||
|
'Filename': 'Název souboru',
|
||||||
|
'filter': 'filtr',
|
||||||
|
'Find Next': 'Najít další',
|
||||||
|
'Find Previous': 'Najít předchozí',
|
||||||
|
'First name': 'Křestní jméno',
|
||||||
|
'Forgot username?': 'Zapomněl jste svoje přihlašovací jméno?',
|
||||||
|
'forgot username?': 'zapomněl jste svoje přihlašovací jméno?',
|
||||||
|
'Forms and Validators': 'Formuláře a validátory',
|
||||||
|
'Frames': 'Frames',
|
||||||
|
'Free Applications': 'Aplikace zdarma',
|
||||||
|
'Functions with no doctests will result in [passed] tests.': 'Functions with no doctests will result in [passed] tests.',
|
||||||
|
'Generate': 'Vytvořit',
|
||||||
|
'Get from URL:': 'Stáhnout z internetu:',
|
||||||
|
'Git Pull': 'Git Pull',
|
||||||
|
'Git Push': 'Git Push',
|
||||||
|
'Globals##debug': 'Globální proměnné',
|
||||||
|
'go!': 'OK!',
|
||||||
|
'Goto': 'Goto',
|
||||||
|
'graph model': 'graph model',
|
||||||
|
'Group %(group_id)s created': 'Skupina %(group_id)s vytvořena',
|
||||||
|
'Group ID': 'ID skupiny',
|
||||||
|
'Groups': 'Skupiny',
|
||||||
|
'Hello World': 'Ahoj světe',
|
||||||
|
'Help': 'Nápověda',
|
||||||
|
'Hide/Show Translated strings': 'Skrýt/Zobrazit přeložené texty',
|
||||||
|
'Hits': 'Kolikrát dosaženo',
|
||||||
|
'Home': 'Domovská stránka',
|
||||||
|
'honored only if the expression evaluates to true': 'brát v potaz jen když se tato podmínka vyhodnotí kladně',
|
||||||
|
'How did you get here?': 'Jak jste se sem vlastně dostal?',
|
||||||
|
'If start the upgrade, be patient, it may take a while to download': 'If start the upgrade, be patient, it may take a while to download',
|
||||||
|
'If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.\nA green title indicates that all tests (if defined) passed. In this case test results are not shown.': 'If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.\nA green title indicates that all tests (if defined) passed. In this case test results are not shown.',
|
||||||
|
'import': 'import',
|
||||||
|
'Import/Export': 'Import/Export',
|
||||||
|
'includes': 'zahrnuje',
|
||||||
|
'Index': 'Index',
|
||||||
|
'insert new': 'vložit nový záznam ',
|
||||||
|
'insert new %s': 'vložit nový záznam %s',
|
||||||
|
'inspect attributes': 'inspect attributes',
|
||||||
|
'Install': 'Instalovat',
|
||||||
|
'Installed applications': 'Nainstalované aplikace',
|
||||||
|
'Interaction at %s line %s': 'Interakce v %s, na řádce %s',
|
||||||
|
'Interactive console': 'Interaktivní příkazová řádka',
|
||||||
|
'Internal State': 'Vnitřní stav',
|
||||||
|
'Introduction': 'Úvod',
|
||||||
|
'Invalid email': 'Neplatný email',
|
||||||
|
'Invalid password': 'Nesprávné heslo',
|
||||||
|
'invalid password.': 'neplatné heslo',
|
||||||
|
'Invalid Query': 'Neplatný dotaz',
|
||||||
|
'invalid request': 'Neplatný požadavek',
|
||||||
|
'Is Active': 'Je aktivní',
|
||||||
|
'It is %s %%{day} today.': 'Dnes je to %s %%{den}.',
|
||||||
|
'Key': 'Klíč',
|
||||||
|
'Key bindings': 'Vazby klíčů',
|
||||||
|
'Key bindings for ZenCoding Plugin': 'Key bindings for ZenCoding Plugin',
|
||||||
|
'languages': 'jazyky',
|
||||||
|
'Languages': 'Jazyky',
|
||||||
|
'Last name': 'Příjmení',
|
||||||
|
'Last saved on:': 'Naposledy uloženo:',
|
||||||
|
'Layout': 'Rozvržení stránky (layout)',
|
||||||
|
'Layout Plugins': 'Moduly rozvržení stránky (Layout Plugins)',
|
||||||
|
'Layouts': 'Rozvržení stránek',
|
||||||
|
'License for': 'Licence pro',
|
||||||
|
'Line number': 'Číslo řádku',
|
||||||
|
'LineNo': 'Č.řádku',
|
||||||
|
'Live Chat': 'Online pokec',
|
||||||
|
'loading...': 'nahrávám...',
|
||||||
|
'locals': 'locals',
|
||||||
|
'Locals##debug': 'Lokální proměnné',
|
||||||
|
'Logged in': 'Přihlášení proběhlo úspěšně',
|
||||||
|
'Logged out': 'Odhlášení proběhlo úspěšně',
|
||||||
|
'Login': 'Přihlásit se',
|
||||||
|
'login': 'přihlásit se',
|
||||||
|
'Login to the Administrative Interface': 'Přihlásit se do Správce aplikací',
|
||||||
|
'logout': 'odhlásit se',
|
||||||
|
'Logout': 'Odhlásit se',
|
||||||
|
'Lost Password': 'Zapomněl jste heslo',
|
||||||
|
'Lost password?': 'Zapomněl jste heslo?',
|
||||||
|
'lost password?': 'zapomněl jste heslo?',
|
||||||
|
'Manage': 'Manage',
|
||||||
|
'Manage Cache': 'Manage Cache',
|
||||||
|
'Menu Model': 'Model rozbalovací nabídky',
|
||||||
|
'Models': 'Modely',
|
||||||
|
'models': 'modely',
|
||||||
|
'Modified By': 'Změněno - kým',
|
||||||
|
'Modified On': 'Změněno - kdy',
|
||||||
|
'Modules': 'Moduly',
|
||||||
|
'modules': 'moduly',
|
||||||
|
'My Sites': 'Správa aplikací',
|
||||||
|
'Name': 'Jméno',
|
||||||
|
'new application "%s" created': 'nová aplikace "%s" vytvořena',
|
||||||
|
'New Application Wizard': 'Nový průvodce aplikací',
|
||||||
|
'New application wizard': 'Nový průvodce aplikací',
|
||||||
|
'New password': 'Nové heslo',
|
||||||
|
'New Record': 'Nový záznam',
|
||||||
|
'new record inserted': 'nový záznam byl založen',
|
||||||
|
'New simple application': 'Vytvořit primitivní aplikaci',
|
||||||
|
'next': 'next',
|
||||||
|
'next 100 rows': 'dalších 100 řádků',
|
||||||
|
'No databases in this application': 'V této aplikaci nejsou žádné databáze',
|
||||||
|
'No Interaction yet': 'Ještě žádná interakce nenastala',
|
||||||
|
'No ticket_storage.txt found under /private folder': 'Soubor ticket_storage.txt v adresáři /private nenalezen',
|
||||||
|
'Object or table name': 'Objekt či tabulka',
|
||||||
|
'Old password': 'Původní heslo',
|
||||||
|
'online designer': 'online návrhář',
|
||||||
|
'Online examples': 'Příklady online',
|
||||||
|
'Open new app in new window': 'Open new app in new window',
|
||||||
|
'or alternatively': 'or alternatively',
|
||||||
|
'Or Get from URL:': 'Or Get from URL:',
|
||||||
|
'or import from csv file': 'nebo importovat z .csv souboru',
|
||||||
|
'Origin': 'Původ',
|
||||||
|
'Original/Translation': 'Originál/Překlad',
|
||||||
|
'Other Plugins': 'Ostatní moduly',
|
||||||
|
'Other Recipes': 'Ostatní zásuvné moduly',
|
||||||
|
'Overview': 'Přehled',
|
||||||
|
'Overwrite installed app': 'Přepsat instalovanou aplikaci',
|
||||||
|
'Pack all': 'Zabalit',
|
||||||
|
'Pack compiled': 'Zabalit zkompilované',
|
||||||
|
'pack plugin': 'pack plugin',
|
||||||
|
'password': 'heslo',
|
||||||
|
'Password': 'Heslo',
|
||||||
|
"Password fields don't match": 'Hesla se neshodují',
|
||||||
|
'Peeking at file': 'Peeking at file',
|
||||||
|
'Please': 'Prosím',
|
||||||
|
'Plugin "%s" in application': 'Plugin "%s" in application',
|
||||||
|
'plugins': 'zásuvné moduly',
|
||||||
|
'Plugins': 'Zásuvné moduly',
|
||||||
|
'Plural Form #%s': 'Plural Form #%s',
|
||||||
|
'Plural-Forms:': 'Množná čísla:',
|
||||||
|
'Powered by': 'Poháněno',
|
||||||
|
'Preface': 'Předmluva',
|
||||||
|
'previous 100 rows': 'předchozích 100 řádků',
|
||||||
|
'Private files': 'Soukromé soubory',
|
||||||
|
'private files': 'soukromé soubory',
|
||||||
|
'profile': 'profil',
|
||||||
|
'Project Progress': 'Vývoj projektu',
|
||||||
|
'Python': 'Python',
|
||||||
|
'Query:': 'Dotaz:',
|
||||||
|
'Quick Examples': 'Krátké příklady',
|
||||||
|
'RAM': 'RAM',
|
||||||
|
'RAM Cache Keys': 'Klíče RAM Cache',
|
||||||
|
'Ram Cleared': 'RAM smazána',
|
||||||
|
'Readme': 'Nápověda',
|
||||||
|
'Recipes': 'Postupy jak na to',
|
||||||
|
'Record': 'Záznam',
|
||||||
|
'record does not exist': 'záznam neexistuje',
|
||||||
|
'Record ID': 'ID záznamu',
|
||||||
|
'Record id': 'id záznamu',
|
||||||
|
'refresh': 'obnovte',
|
||||||
|
'register': 'registrovat',
|
||||||
|
'Register': 'Zaregistrovat se',
|
||||||
|
'Registration identifier': 'Registrační identifikátor',
|
||||||
|
'Registration key': 'Registrační klíč',
|
||||||
|
'reload': 'reload',
|
||||||
|
'Reload routes': 'Znovu nahrát cesty',
|
||||||
|
'Remember me (for 30 days)': 'Zapamatovat na 30 dní',
|
||||||
|
'Remove compiled': 'Odstranit zkompilované',
|
||||||
|
'Removed Breakpoint on %s at line %s': 'Bod přerušení smazán - soubor %s na řádce %s',
|
||||||
|
'Replace': 'Zaměnit',
|
||||||
|
'Replace All': 'Zaměnit vše',
|
||||||
|
'request': 'request',
|
||||||
|
'Reset Password key': 'Reset registračního klíče',
|
||||||
|
'response': 'response',
|
||||||
|
'restart': 'restart',
|
||||||
|
'restore': 'obnovit',
|
||||||
|
'Retrieve username': 'Získat přihlašovací jméno',
|
||||||
|
'return': 'return',
|
||||||
|
'revert': 'vrátit se k původnímu',
|
||||||
|
'Role': 'Role',
|
||||||
|
'Rows in Table': 'Záznamy v tabulce',
|
||||||
|
'Rows selected': 'Záznamů zobrazeno',
|
||||||
|
'rules are not defined': 'pravidla nejsou definována',
|
||||||
|
"Run tests in this file (to run all files, you may also use the button labelled 'test')": "Spustí testy v tomto souboru (ke spuštění všech testů, použijte tlačítko 'test')",
|
||||||
|
'Running on %s': 'Běží na %s',
|
||||||
|
'Save': 'Uložit',
|
||||||
|
'Save file:': 'Save file:',
|
||||||
|
'Save via Ajax': 'Uložit pomocí Ajaxu',
|
||||||
|
'Saved file hash:': 'hash uloženého souboru:',
|
||||||
|
'Semantic': 'Modul semantic',
|
||||||
|
'Services': 'Služby',
|
||||||
|
'session': 'session',
|
||||||
|
'session expired': 'session expired',
|
||||||
|
'Set Breakpoint on %s at line %s: %s': 'Bod přerušení nastaven v souboru %s na řádce %s: %s',
|
||||||
|
'shell': 'příkazová řádka',
|
||||||
|
'Singular Form': 'Singular Form',
|
||||||
|
'Site': 'Správa aplikací',
|
||||||
|
'Size of cache:': 'Velikost cache:',
|
||||||
|
'skip to generate': 'skip to generate',
|
||||||
|
'Sorry, could not find mercurial installed': 'Bohužel mercurial není nainstalován.',
|
||||||
|
'Start a new app': 'Vytvořit novou aplikaci',
|
||||||
|
'Start searching': 'Začít hledání',
|
||||||
|
'Start wizard': 'Spustit průvodce',
|
||||||
|
'state': 'stav',
|
||||||
|
'Static': 'Static',
|
||||||
|
'static': 'statické soubory',
|
||||||
|
'Static files': 'Statické soubory',
|
||||||
|
'Statistics': 'Statistika',
|
||||||
|
'Step': 'Step',
|
||||||
|
'step': 'step',
|
||||||
|
'stop': 'stop',
|
||||||
|
'Stylesheet': 'CSS styly',
|
||||||
|
'submit': 'odeslat',
|
||||||
|
'Submit': 'Odeslat',
|
||||||
|
'successful': 'úspěšně',
|
||||||
|
'Support': 'Podpora',
|
||||||
|
'Sure you want to delete this object?': 'Opravdu chcete smazat tento objekt?',
|
||||||
|
'Table': 'tabulka',
|
||||||
|
'Table name': 'Název tabulky',
|
||||||
|
'Temporary': 'Dočasný',
|
||||||
|
'test': 'test',
|
||||||
|
'Testing application': 'Testing application',
|
||||||
|
'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': '"Dotaz" je podmínka, například "db.tabulka1.pole1==\'hodnota\'". Podmínka "db.tabulka1.pole1==db.tabulka2.pole2" pak vytvoří SQL JOIN.',
|
||||||
|
'The application logic, each URL path is mapped in one exposed function in the controller': 'Logika aplikace: každá URL je mapována na funkci vystavovanou kontrolérem.',
|
||||||
|
'The Core': 'Jádro (The Core)',
|
||||||
|
'The data representation, define database tables and sets': 'Reprezentace dat: definovat tabulky databáze a záznamy',
|
||||||
|
'The output of the file is a dictionary that was rendered by the view %s': 'Výstup ze souboru je slovník, který se zobrazil v pohledu %s.',
|
||||||
|
'The presentations layer, views are also known as templates': 'Prezentační vrstva: pohledy či templaty (šablony)',
|
||||||
|
'The Views': 'Pohledy (The Views)',
|
||||||
|
'There are no controllers': 'There are no controllers',
|
||||||
|
'There are no modules': 'There are no modules',
|
||||||
|
'There are no plugins': 'Žádné moduly nejsou instalovány.',
|
||||||
|
'There are no private files': 'Žádné soukromé soubory neexistují.',
|
||||||
|
'There are no static files': 'There are no static files',
|
||||||
|
'There are no translators, only default language is supported': 'There are no translators, only default language is supported',
|
||||||
|
'There are no views': 'There are no views',
|
||||||
|
'These files are not served, they are only available from within your app': 'Tyto soubory jsou klientům nepřístupné. K dispozici jsou pouze v rámci aplikace.',
|
||||||
|
'These files are served without processing, your images go here': 'Tyto soubory jsou servírovány bez přídavné logiky, sem patří např. obrázky.',
|
||||||
|
'This App': 'Tato aplikace',
|
||||||
|
'This is a copy of the scaffolding application': 'Toto je kopie aplikace skelet.',
|
||||||
|
'This is an experimental feature and it needs more testing. If you decide to upgrade you do it at your own risk': 'This is an experimental feature and it needs more testing. If you decide to upgrade you do it at your own risk',
|
||||||
|
'This is the %(filename)s template': 'This is the %(filename)s template',
|
||||||
|
'this page to see if a breakpoint was hit and debug interaction is required.': 'tuto stránku, abyste uviděli, zda se dosáhlo bodu přerušení.',
|
||||||
|
'Ticket': 'Ticket',
|
||||||
|
'Ticket ID': 'Ticket ID',
|
||||||
|
'Time in Cache (h:m:s)': 'Čas v Cache (h:m:s)',
|
||||||
|
'Timestamp': 'Časové razítko',
|
||||||
|
'to previous version.': 'k předchozí verzi.',
|
||||||
|
'To create a plugin, name a file/folder plugin_[name]': 'Zásuvný modul vytvoříte tak, že pojmenujete soubor/adresář plugin_[jméno modulu]',
|
||||||
|
'To emulate a breakpoint programatically, write:': 'K nastavení bodu přerušení v kódu programu, napište:',
|
||||||
|
'to use the debugger!': ', abyste mohli ladící program používat!',
|
||||||
|
'toggle breakpoint': 'vyp./zap. bod přerušení',
|
||||||
|
'Toggle Fullscreen': 'Na celou obrazovku a zpět',
|
||||||
|
'too short': 'Příliš krátké',
|
||||||
|
'Traceback': 'Traceback',
|
||||||
|
'Translation strings for the application': 'Překlad textů pro aplikaci',
|
||||||
|
'try something like': 'try something like',
|
||||||
|
'Try the mobile interface': 'Zkuste rozhraní pro mobilní zařízení',
|
||||||
|
'try view': 'try view',
|
||||||
|
'Twitter': 'Twitter',
|
||||||
|
'Type python statement in here and hit Return (Enter) to execute it.': 'Type python statement in here and hit Return (Enter) to execute it.',
|
||||||
|
'Type some Python code in here and hit Return (Enter) to execute it.': 'Type some Python code in here and hit Return (Enter) to execute it.',
|
||||||
|
'Unable to check for upgrades': 'Unable to check for upgrades',
|
||||||
|
'unable to parse csv file': 'csv soubor nedá sa zpracovat',
|
||||||
|
'uncheck all': 'vše odznačit',
|
||||||
|
'Uninstall': 'Odinstalovat',
|
||||||
|
'update': 'aktualizovat',
|
||||||
|
'update all languages': 'aktualizovat všechny jazyky',
|
||||||
|
'Update:': 'Upravit:',
|
||||||
|
'Upgrade': 'Upgrade',
|
||||||
|
'upgrade now': 'upgrade now',
|
||||||
|
'upgrade now to %s': 'upgrade now to %s',
|
||||||
|
'upload': 'nahrát',
|
||||||
|
'Upload': 'Upload',
|
||||||
|
'Upload a package:': 'Nahrát balík:',
|
||||||
|
'Upload and install packed application': 'Nahrát a instalovat zabalenou aplikaci',
|
||||||
|
'upload file:': 'nahrát soubor:',
|
||||||
|
'upload plugin file:': 'nahrát soubor modulu:',
|
||||||
|
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Použijte (...)&(...) pro AND, (...)|(...) pro OR a ~(...) pro NOT pro sestavení složitějších dotazů.',
|
||||||
|
'User %(id)s Logged-in': 'Uživatel %(id)s přihlášen',
|
||||||
|
'User %(id)s Logged-out': 'Uživatel %(id)s odhlášen',
|
||||||
|
'User %(id)s Password changed': 'Uživatel %(id)s změnil heslo',
|
||||||
|
'User %(id)s Profile updated': 'Uživatel %(id)s upravil profil',
|
||||||
|
'User %(id)s Registered': 'Uživatel %(id)s se zaregistroval',
|
||||||
|
'User %(id)s Username retrieved': 'Uživatel %(id)s si nachal zaslat přihlašovací jméno',
|
||||||
|
'User ID': 'ID uživatele',
|
||||||
|
'Username': 'Přihlašovací jméno',
|
||||||
|
'variables': 'variables',
|
||||||
|
'Verify Password': 'Zopakujte heslo',
|
||||||
|
'Version': 'Verze',
|
||||||
|
'Version %s.%s.%s (%s) %s': 'Verze %s.%s.%s (%s) %s',
|
||||||
|
'Versioning': 'Verzování',
|
||||||
|
'Videos': 'Videa',
|
||||||
|
'View': 'Pohled (View)',
|
||||||
|
'Views': 'Pohledy',
|
||||||
|
'views': 'pohledy',
|
||||||
|
'Web Framework': 'Web Framework',
|
||||||
|
'web2py is up to date': 'Máte aktuální verzi web2py.',
|
||||||
|
'web2py online debugger': 'Ladící online web2py program',
|
||||||
|
'web2py Recent Tweets': 'Štěbetání na Twitteru o web2py',
|
||||||
|
'web2py upgrade': 'web2py upgrade',
|
||||||
|
'web2py upgraded; please restart it': 'web2py upgraded; please restart it',
|
||||||
|
'Welcome': 'Vítejte',
|
||||||
|
'Welcome to web2py': 'Vitejte ve web2py',
|
||||||
|
'Welcome to web2py!': 'Vítejte ve web2py!',
|
||||||
|
'Which called the function %s located in the file %s': 'která zavolala funkci %s v souboru (kontroléru) %s.',
|
||||||
|
'You are successfully running web2py': 'Úspěšně jste spustili web2py.',
|
||||||
|
'You can also set and remove breakpoint in the edit window, using the Toggle Breakpoint button': 'Nastavovat a mazat body přerušení je též možno v rámci editování zdrojového souboru přes tlačítko Vyp./Zap. bod přerušení',
|
||||||
|
'You can modify this application and adapt it to your needs': 'Tuto aplikaci si můžete upravit a přizpůsobit ji svým potřebám.',
|
||||||
|
'You need to set up and reach a': 'Je třeba nejprve nastavit a dojít až na',
|
||||||
|
'You visited the url %s': 'Navštívili jste stránku %s,',
|
||||||
|
'Your application will be blocked until you click an action button (next, step, continue, etc.)': 'Aplikace bude blokována než se klikne na jedno z tlačítek (další, krok, pokračovat, atd.)',
|
||||||
|
'Your can inspect variables using the console bellow': 'Níže pomocí příkazové řádky si můžete prohlédnout proměnné',
|
||||||
|
}
|
||||||
+159
-128
@@ -1,119 +1,126 @@
|
|||||||
# coding: utf8
|
# coding: utf8
|
||||||
|
# Translation by: Klaus Kappel <kkappel@yahoo.de>
|
||||||
{
|
{
|
||||||
'!langcode!': 'de',
|
'!langcode!': 'de',
|
||||||
'!langname!': 'Deutsch',
|
'!langname!': 'Deutsch',
|
||||||
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"Update" ist ein optionaler Ausdruck wie "Feld1 = \'newvalue". JOIN Ergebnisse können nicht aktualisiert oder gelöscht werden',
|
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"Update" ist ein optionaler Ausdruck wie "Feld1 = \'newvalue". JOIN Ergebnisse k?nnen nicht aktualisiert oder gel?scht werden',
|
||||||
'%s %%{row} deleted': '%s Zeilen gelöscht',
|
'%s %%{row} deleted': '%s %%{row} Zeilen gel?scht',
|
||||||
'%s %%{row} updated': '%s Zeilen aktualisiert',
|
'%s %%{row} updated': '%s %%{row} Zeilen aktualisiert',
|
||||||
'%Y-%m-%d': '%Y-%m-%d',
|
'%Y-%m-%d': '%d.%m.%Y',
|
||||||
'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
|
'%Y-%m-%d %H:%M:%S': '%d.%m.%Y %H:%M:%S',
|
||||||
'(requires internet access)': '(requires internet access)',
|
'(requires internet access)': '(Internet Zugang wir ben?tigt)',
|
||||||
|
'(requires internet access, experimental)': '(ben?tigt Internet Zugang)',
|
||||||
'(something like "it-it")': '(so etwas wie "it-it")',
|
'(something like "it-it")': '(so etwas wie "it-it")',
|
||||||
'@markmin\x01Searching: **%s** %%{file}': 'Searching: **%s** files',
|
'@markmin\x01Searching: **%s** %%{file}': '@markmin\x01Suche: **%s** Dateien',
|
||||||
'A new version of web2py is available': 'Eine neue Version von web2py ist verfügbar',
|
'A new version of web2py is available': 'Eine neue Version von web2py ist verf?gbar',
|
||||||
'A new version of web2py is available: %s': 'Eine neue Version von web2py ist verfügbar: %s',
|
'A new version of web2py is available: %s': 'Eine neue Version von web2py ist verf?gbar: %s',
|
||||||
'Abort': 'Abbrechen',
|
'Abort': 'Abbrechen',
|
||||||
'About': 'Über',
|
'About': '?ber',
|
||||||
'About application': 'Über die Anwendung',
|
'About application': '?ber die Anwendung',
|
||||||
'Additional code for your application': 'Additional code for your application',
|
'Additional code for your application': 'zus?tzlicher Code f?r Ihre Anwendung',
|
||||||
'additional code for your application': 'zusätzlicher Code für Ihre Anwendung',
|
|
||||||
'admin disabled because no admin password': 'admin ist deaktiviert, weil kein Admin-Passwort gesetzt ist',
|
'admin disabled because no admin password': 'admin ist deaktiviert, weil kein Admin-Passwort gesetzt ist',
|
||||||
'admin disabled because not supported on google apps engine': 'admin ist deaktiviert, es existiert dafür keine Unterstützung auf der google apps engine',
|
'admin disabled because not supported on google apps engine': 'admin ist deaktiviert, es existiert daf?r keine Unterst?tzung auf der google apps engine',
|
||||||
'admin disabled because unable to access password file': 'admin ist deaktiviert, weil kein Zugriff auf die Passwortdatei besteht',
|
'admin disabled because unable to access password file': 'admin ist deaktiviert, weil kein Zugriff auf die Passwortdatei besteht',
|
||||||
'Admin is disabled because insecure channel': 'Appadmin ist deaktiviert, wegen der Benutzung eines unsicheren Kanals',
|
'Admin is disabled because insecure channel': 'Appadmin ist deaktiviert, wegen der Benutzung eines unsicheren Kanals',
|
||||||
'Admin is disabled because unsecure channel': 'Appadmin ist deaktiviert, wegen der Benutzung eines unsicheren Kanals',
|
'Admin is disabled because unsecure channel': 'Appadmin ist deaktiviert, wegen der Benutzung eines unsicheren Kanals',
|
||||||
'Admin language': 'Admin language',
|
'Admin language': 'Admin-Sprache',
|
||||||
'administrative interface': 'administrative interface',
|
'administrative interface': 'Administrative Schnittstelle',
|
||||||
'Administrator Password:': 'Administrator Passwort:',
|
'Administrator Password:': 'Administrator Passwort:',
|
||||||
|
'An error occured, please %s the page': 'Ein Fehler ist aufgetereten, bitte %s die Seite',
|
||||||
'and rename it (required):': 'und benenne sie um (erforderlich):',
|
'and rename it (required):': 'und benenne sie um (erforderlich):',
|
||||||
'and rename it:': ' und benenne sie um:',
|
'and rename it:': ' und benenne sie um:',
|
||||||
'appadmin': 'appadmin',
|
'appadmin': 'appadmin',
|
||||||
'appadmin is disabled because insecure channel': 'Appadmin ist deaktiviert, wegen der Benutzung eines unsicheren Kanals',
|
'appadmin is disabled because insecure channel': 'Appadmin ist deaktiviert, wegen der Benutzung eines unsicheren Kanals',
|
||||||
|
'Application': 'Anwendung',
|
||||||
'application "%s" uninstalled': 'Anwendung "%s" deinstalliert',
|
'application "%s" uninstalled': 'Anwendung "%s" deinstalliert',
|
||||||
'application compiled': 'Anwendung kompiliert',
|
'application compiled': 'Anwendung kompiliert',
|
||||||
'application is compiled and cannot be designed': 'Die Anwendung ist kompiliert kann deswegen nicht mehr geändert werden',
|
'application is compiled and cannot be designed': 'Die Anwendung ist kompiliert kann deswegen nicht mehr ge?ndert werden',
|
||||||
'Application name:': 'Application name:',
|
'Application name:': 'Name der Applikation:',
|
||||||
'Are you sure you want to delete file "%s"?': 'Sind Sie sich sicher, dass Sie diese Datei löschen wollen "%s"?',
|
'Are you sure you want to delete file "%s"?': 'Sind Sie sich sicher, dass Sie diese Datei l?schen wollen "%s"?',
|
||||||
'Are you sure you want to delete this object?': 'Are you sure you want to delete this object?',
|
'Are you sure you want to delete this object?': 'Are you sure you want to delete this object?',
|
||||||
'Are you sure you want to uninstall application "%s"': 'Sind Sie sich sicher, dass Sie diese Anwendung deinstallieren wollen "%s"',
|
'Are you sure you want to uninstall application "%s"': 'Sind Sie sich sicher, dass Sie diese Anwendung deinstallieren wollen "%s"',
|
||||||
'Are you sure you want to uninstall application "%s"?': 'Sind Sie sich sicher, dass Sie diese Anwendung deinstallieren wollen "%s"?',
|
'Are you sure you want to uninstall application "%s"?': 'Sind Sie sich sicher, dass Sie diese Anwendung deinstallieren wollen "%s"?',
|
||||||
'Are you sure you want to upgrade web2py now?': 'Sind Sie sich sicher, dass Sie web2py jetzt upgraden möchten?',
|
'Are you sure you want to upgrade web2py now?': 'Sind Sie sich sicher, dass Sie web2py jetzt upgraden m?chten?',
|
||||||
'arguments': 'arguments',
|
'arguments': 'arguments',
|
||||||
'ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.': 'ACHTUNG: Die Einwahl benötigt eine sichere (HTTPS) Verbindung. Es sei denn sie läuft Lokal(localhost).',
|
'ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.': 'ACHTUNG: Die Einwahl ben?tigt eine sichere (HTTPS) Verbindung. Es sei denn sie l?uft Lokal(localhost).',
|
||||||
'ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.': 'ACHTUNG: Testen ist nicht threadsicher. Führen sie also nicht mehrere Tests gleichzeitig aus.',
|
'ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.': 'ACHTUNG: Testen ist nicht threadsicher. F?hren sie also nicht mehrere Tests gleichzeitig aus.',
|
||||||
'ATTENTION: This is an experimental feature and it needs more testing.': 'ACHTUNG: Dies ist eine experimentelle Funktion und benötigt noch weitere Tests.',
|
'ATTENTION: This is an experimental feature and it needs more testing.': 'ACHTUNG: Dies ist eine experimentelle Funktion und ben?tigt noch weitere Tests.',
|
||||||
'ATTENTION: you cannot edit the running application!': 'ACHTUNG: Eine laufende Anwendung kann nicht editiert werden!',
|
'ATTENTION: you cannot edit the running application!': 'ACHTUNG: Eine laufende Anwendung kann nicht editiert werden!',
|
||||||
'Authentication': 'Authentifizierung',
|
'Authentication': 'Authentifizierung',
|
||||||
'Available databases and tables': 'Verfügbare Datenbanken und Tabellen',
|
'Available databases and tables': 'Verf?gbare Datenbanken und Tabellen',
|
||||||
'back': 'zurück',
|
'back': 'zur?ck',
|
||||||
'beautify': 'beautify',
|
'beautify': 'versch?nern',
|
||||||
'cache': 'Cache',
|
'cache': 'Pufferspeicher',
|
||||||
'cache, errors and sessions cleaned': 'Zwischenspeicher (cache), Fehler und Sitzungen (sessions) gelöscht',
|
'cache, errors and sessions cleaned': 'Zwischenspeicher (cache), Fehler und Sitzungen (sessions) gel?scht',
|
||||||
'call': 'call',
|
'call': 'Aufruf',
|
||||||
'can be a git repo': 'can be a git repo',
|
'can be a git repo': 'kann ein git Repository sein',
|
||||||
'Cannot be empty': 'Darf nicht leer sein',
|
'Cannot be empty': 'Darf nicht leer sein',
|
||||||
'Cannot compile: there are errors in your app. Debug it, correct errors and try again.': 'Nicht Kompilierbar:Es sind Fehler in der Anwendung. Beseitigen Sie die Fehler und versuchen Sie es erneut.',
|
'Cannot compile: there are errors in your app. Debug it, correct errors and try again.': 'Nicht Kompilierbar:Es sind Fehler in der Anwendung. Beseitigen Sie die Fehler und versuchen Sie es erneut.',
|
||||||
'cannot create file': 'Kann Datei nicht erstellen',
|
'cannot create file': 'Kann Datei nicht erstellen',
|
||||||
'cannot upload file "%(filename)s"': 'Kann Datei nicht Hochladen "%(filename)s"',
|
'cannot upload file "%(filename)s"': 'Kann Datei nicht Hochladen "%(filename)s"',
|
||||||
'Change admin password': 'Administrator-Passwort ändern',
|
'Change admin password': 'Administrator-Passwort ?ndern',
|
||||||
'Change Password': 'Passwort ändern',
|
'Change Password': 'Passwort ?ndern',
|
||||||
'change password': 'Passwort ändern',
|
'change password': 'Passwort ?ndern',
|
||||||
'check all': 'alles auswählen',
|
'check all': 'alles ausw?hlen',
|
||||||
'Check for upgrades': 'check for upgrades',
|
'Check for upgrades': 'check for upgrades',
|
||||||
'Check to delete': 'Markiere zum löschen',
|
'Check to delete': 'Markiere zum l?schen',
|
||||||
'Checking for upgrades...': 'Auf Updates überprüfen...',
|
'Checking for upgrades...': 'Auf Updates ?berpr?fen...',
|
||||||
'Clean': 'löschen',
|
'Clean': 'leeren',
|
||||||
'click here for online examples': 'hier klicken für online Beispiele',
|
'click here for online examples': 'hier klicken f?r online Beispiele',
|
||||||
'click here for the administrative interface': 'hier klicken für die Administrationsoberfläche ',
|
'click here for the administrative interface': 'hier klicken f?r die Administrationsoberfl?che ',
|
||||||
|
'Click row to expand traceback': 'Klicke auf die Zeile f?r Fehlerverfolgung',
|
||||||
'click to check for upgrades': 'hier klicken um nach Upgrades zu suchen',
|
'click to check for upgrades': 'hier klicken um nach Upgrades zu suchen',
|
||||||
'Client IP': 'Client IP',
|
'Client IP': 'Client IP',
|
||||||
'code': 'code',
|
'code': 'code',
|
||||||
'collapse/expand all': 'collapse/expand all',
|
'collapse/expand all': 'alles zu- bzw. aufklappen',
|
||||||
'Compile': 'kompilieren',
|
'Compile': 'kompilieren',
|
||||||
'compiled application removed': 'kompilierte Anwendung gelöscht',
|
'compiled application removed': 'kompilierte Anwendung gel?scht',
|
||||||
'Controller': 'Controller',
|
'Controller': 'Controller',
|
||||||
'Controllers': 'Controller',
|
'Controllers': 'Controller',
|
||||||
'controllers': 'Controllers',
|
'controllers': 'Controllers',
|
||||||
'Copyright': 'Urheberrecht',
|
'Copyright': 'Urheberrecht',
|
||||||
|
'Count': 'Anzahl',
|
||||||
'Create': 'erstellen',
|
'Create': 'erstellen',
|
||||||
'create file with filename:': 'erzeuge Datei mit Dateinamen:',
|
'create file with filename:': 'erzeuge Datei mit Dateinamen:',
|
||||||
'create new application:': 'erzeuge neue Anwendung:',
|
'create new application:': 'erzeuge neue Anwendung:',
|
||||||
'Create new simple application': 'Erzeuge neue Anwendung',
|
'Create new simple application': 'Erzeuge neue Anwendung',
|
||||||
'created by': 'created by',
|
'created by': 'erstellt von',
|
||||||
'crontab': 'crontab',
|
'crontab': 'crontab',
|
||||||
'Current request': 'Aktuelle Anfrage (request)',
|
'Current request': 'Aktuelle Anfrage (request)',
|
||||||
'Current response': 'Aktuelle Antwort (response)',
|
'Current response': 'Aktuelle Antwort (response)',
|
||||||
'Current session': 'Aktuelle Sitzung (session)',
|
'Current session': 'Aktuelle Sitzung (session)',
|
||||||
'currently running': 'currently running',
|
'currently running': 'aktuell in Betrieb',
|
||||||
'currently saved or': 'des derzeit gespeicherten oder',
|
'currently saved or': 'des derzeit gespeicherten oder',
|
||||||
'customize me!': 'pass mich an!',
|
'customize me!': 'pass mich an!',
|
||||||
'data uploaded': 'Daten hochgeladen',
|
'data uploaded': 'Daten hochgeladen',
|
||||||
'Database': 'Datenbank',
|
'Database': 'Datenbank',
|
||||||
'database': 'Datenbank',
|
'database': 'Datenbank',
|
||||||
'database %s select': 'Datenbank %s ausgewählt',
|
'database %s select': 'Datenbank %s ausgew?hlt',
|
||||||
'database administration': 'Datenbankadministration',
|
'database administration': 'Datenbankadministration',
|
||||||
'Date and Time': 'Datum und Uhrzeit',
|
'Date and Time': 'Datum und Uhrzeit',
|
||||||
'db': 'db',
|
'db': 'db',
|
||||||
'DB Model': 'DB Modell',
|
'DB Model': 'DB Modell',
|
||||||
'Debug': 'Debug',
|
'Debug': 'Debug',
|
||||||
'defines tables': 'definiere Tabellen',
|
'defines tables': 'definiere Tabellen',
|
||||||
'Delete': 'Löschen',
|
'Delete': 'L?schen',
|
||||||
'delete': 'löschen',
|
'delete': 'l?schen',
|
||||||
'delete all checked': 'lösche alle markierten',
|
'delete all checked': 'l?sche alle markierten',
|
||||||
'delete plugin': 'Plugin löschen',
|
'delete plugin': 'Plugin l?schen',
|
||||||
'Delete:': 'Löschen:',
|
'Delete:': 'L?schen:',
|
||||||
'Deploy': 'deploy',
|
'Deploy': 'Installieren',
|
||||||
'Deploy on Google App Engine': 'Auf Google App Engine installieren',
|
'Deploy on Google App Engine': 'Auf Google App Engine installieren',
|
||||||
'Deploy to OpenShift': 'Deploy to OpenShift',
|
'Deploy to OpenShift': 'Auf OpenShift installieren',
|
||||||
'Description': 'Beschreibung',
|
'Description': 'Beschreibung',
|
||||||
'design': 'design',
|
'design': 'design',
|
||||||
'DESIGN': 'design',
|
'DESIGN': 'design',
|
||||||
'Design for': 'Design für',
|
'Design for': 'Design f?r',
|
||||||
|
'Detailed traceback description': 'Detailed traceback description',
|
||||||
'direction: ltr': 'direction: ltr',
|
'direction: ltr': 'direction: ltr',
|
||||||
'Disable': 'Disable',
|
'Disable': 'Deaktivieren',
|
||||||
'documentation': 'Dokumentation',
|
'documentation': 'Dokumentation',
|
||||||
'done!': 'fertig!',
|
'done!': 'fertig!',
|
||||||
'download layouts': 'download layouts',
|
'Download .w2p': 'Download .w2p',
|
||||||
|
'download layouts': 'Layouts herunterladen',
|
||||||
'download plugins': 'download plugins',
|
'download plugins': 'download plugins',
|
||||||
'E-mail': 'E-mail',
|
'E-mail': 'E-mail',
|
||||||
'EDIT': 'BEARBEITEN',
|
'EDIT': 'BEARBEITEN',
|
||||||
@@ -129,56 +136,64 @@
|
|||||||
'Editing file "%s"': 'Bearbeite Datei "%s"',
|
'Editing file "%s"': 'Bearbeite Datei "%s"',
|
||||||
'Editing Language file': 'Sprachdatei bearbeiten',
|
'Editing Language file': 'Sprachdatei bearbeiten',
|
||||||
'Enterprise Web Framework': 'Enterprise Web Framework',
|
'Enterprise Web Framework': 'Enterprise Web Framework',
|
||||||
'Error logs for "%(app)s"': 'Fehlerprotokoll für "%(app)s"',
|
'Error': 'Fehler',
|
||||||
|
'Error logs for "%(app)s"': 'Fehlerprotokoll f?r "%(app)s"',
|
||||||
|
'Error snapshot': 'Error snapshot',
|
||||||
|
'Error ticket': 'Error ticket',
|
||||||
'Errors': 'Fehler',
|
'Errors': 'Fehler',
|
||||||
'escape': 'escape',
|
'escape': 'escape',
|
||||||
'Exception instance attributes': 'Atribute der Ausnahmeinstanz',
|
'Exception instance attributes': 'Atribute der Ausnahmeinstanz',
|
||||||
'Expand Abbreviation': 'Kürzel erweitern',
|
'Expand Abbreviation': 'K?rzel erweitern',
|
||||||
'export as csv file': 'Exportieren als CSV-Datei',
|
'export as csv file': 'Exportieren als CSV-Datei',
|
||||||
'exposes': 'stellt zur Verfügung',
|
'exposes': 'stellt zur Verf?gung',
|
||||||
'extends': 'erweitert',
|
'extends': 'erweitert',
|
||||||
'failed to reload module': 'neu laden des Moduls fehlgeschlagen',
|
'failed to reload module': 'neu laden des Moduls fehlgeschlagen',
|
||||||
|
'File': 'Datei',
|
||||||
'file "%(filename)s" created': 'Datei "%(filename)s" erstellt',
|
'file "%(filename)s" created': 'Datei "%(filename)s" erstellt',
|
||||||
'file "%(filename)s" deleted': 'Datei "%(filename)s" gelöscht',
|
'file "%(filename)s" deleted': 'Datei "%(filename)s" gel?scht',
|
||||||
'file "%(filename)s" uploaded': 'Datei "%(filename)s" hochgeladen',
|
'file "%(filename)s" uploaded': 'Datei "%(filename)s" hochgeladen',
|
||||||
'file "%(filename)s" was not deleted': 'Datei "%(filename)s" wurde nicht gelöscht',
|
'file "%(filename)s" was not deleted': 'Datei "%(filename)s" wurde nicht gel?scht',
|
||||||
'file "%s" of %s restored': 'Datei "%s" von %s wiederhergestellt',
|
'file "%s" of %s restored': 'Datei "%s" von %s wiederhergestellt',
|
||||||
'file changed on disk': 'Datei auf Festplatte geändert',
|
'file changed on disk': 'Datei auf Festplatte ge?ndert',
|
||||||
'file does not exist': 'Datei existiert nicht',
|
'file does not exist': 'Datei existiert nicht',
|
||||||
'file saved on %(time)s': 'Datei gespeichert am %(time)s',
|
'file saved on %(time)s': 'Datei gespeichert am %(time)s',
|
||||||
'file saved on %s': 'Datei gespeichert auf %s',
|
'file saved on %s': 'Datei gespeichert auf %s',
|
||||||
'filter': 'filter',
|
'filter': 'filter',
|
||||||
'First name': 'Vorname',
|
'First name': 'Vorname',
|
||||||
|
'Frames': 'Frames',
|
||||||
'Functions with no doctests will result in [passed] tests.': 'Funktionen ohne doctests erzeugen [passed] in Tests',
|
'Functions with no doctests will result in [passed] tests.': 'Funktionen ohne doctests erzeugen [passed] in Tests',
|
||||||
'Get from URL:': 'Get from URL:',
|
'Get from URL:': 'Get from URL:',
|
||||||
'Git Pull': 'Git Pull',
|
'Git Pull': 'Git Pull',
|
||||||
'Git Push': 'Git Push',
|
'Git Push': 'Git Push',
|
||||||
'Go to Matching Pair': 'gehe zum übereinstimmenden Paar',
|
'Go to Matching Pair': 'gehe zum ?bereinstimmenden Paar',
|
||||||
|
'Goto': 'Goto',
|
||||||
'Group ID': 'Gruppen ID',
|
'Group ID': 'Gruppen ID',
|
||||||
'Hello World': 'Hallo Welt',
|
'Hello World': 'Hallo Welt',
|
||||||
'Help': 'Hilfe',
|
'Help': 'Hilfe',
|
||||||
|
'Home': 'Home',
|
||||||
'htmledit': 'htmledit',
|
'htmledit': 'htmledit',
|
||||||
'If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.\nA green title indicates that all tests (if defined) passed. In this case test results are not shown.': 'Falls der obere Test eine Fehler-Ticketnummer enthält deutet das auf einen Fehler in der Ausführung des Controllers hin, noch bevor der Doctest ausgeführt werden konnte. Gewöhnlich führen fehlerhafte Einrückungen oder fehlerhafter Code ausserhalb der Funktion zu solchen Fehlern. Ein grüner Titel deutet darauf hin, dass alle Test(wenn sie vorhanden sind) erfolgreich durchlaufen wurden. In diesem Fall werden die Testresultate nicht angezeigt.',
|
'If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.\nA green title indicates that all tests (if defined) passed. In this case test results are not shown.': 'Falls der obere Test eine Fehler-Ticketnummer enth?lt deutet das auf einen Fehler in der Ausf?hrung des Controllers hin, noch bevor der Doctest ausgef?hrt werden konnte. Gew?hnlich f?hren fehlerhafte Einr?ckungen oder fehlerhafter Code ausserhalb der Funktion zu solchen Fehlern. Ein gr?ner Titel deutet darauf hin, dass alle Test(wenn sie vorhanden sind) erfolgreich durchlaufen wurden. In diesem Fall werden die Testresultate nicht angezeigt.',
|
||||||
'If you answer "yes", be patient, it may take a while to download': '',
|
'If you answer "yes", be patient, it may take a while to download': '',
|
||||||
'If you answer yes, be patient, it may take a while to download': 'If you answer yes, be patient, it may take a while to download',
|
'If you answer yes, be patient, it may take a while to download': 'If you answer yes, be patient, it may take a while to download',
|
||||||
'Import/Export': 'Importieren/Exportieren',
|
'Import/Export': 'Importieren/Exportieren',
|
||||||
'includes': 'Einfügen',
|
'includes': 'Einf?gen',
|
||||||
'Index': 'Index',
|
'Index': 'Index',
|
||||||
'index': 'index',
|
'index': 'index',
|
||||||
'insert new': 'neu einfügen',
|
'insert new': 'neu einf?gen',
|
||||||
'insert new %s': 'neu einfügen %s',
|
'insert new %s': 'neu einf?gen %s',
|
||||||
|
'inspect attributes': 'inspect attributes',
|
||||||
'Install': 'installieren',
|
'Install': 'installieren',
|
||||||
'Installed applications': 'Installierte Anwendungen',
|
'Installed applications': 'Installierte Anwendungen',
|
||||||
'internal error': 'interner Fehler',
|
'internal error': 'interner Fehler',
|
||||||
'Internal State': 'interner Status',
|
'Internal State': 'interner Status',
|
||||||
'Invalid action': 'Ungültige Aktion',
|
'Invalid action': 'Ung?ltige Aktion',
|
||||||
'Invalid email': 'Ungültige Email',
|
'Invalid email': 'Ung?ltige Email',
|
||||||
'invalid password': 'Ungültiges Passwort',
|
'invalid password': 'Ung?ltiges Passwort',
|
||||||
'Invalid Query': 'Ungültige Abfrage',
|
'Invalid Query': 'Ung?ltige Abfrage',
|
||||||
'invalid request': 'ungültige Anfrage',
|
'invalid request': 'ung?ltige Anfrage',
|
||||||
'invalid ticket': 'ungültiges Ticket',
|
'invalid ticket': 'ung?ltiges Ticket',
|
||||||
'Key bindings': 'Tastenbelegungen',
|
'Key bindings': 'Tastenbelegungen',
|
||||||
'Key bindings for ZenConding Plugin': 'Tastenbelegungen für das ZenConding Plugin',
|
'Key bindings for ZenConding Plugin': 'Tastenbelegungen f?r das ZenConding Plugin',
|
||||||
'language file "%(filename)s" created/updated': 'Sprachdatei "%(filename)s" erstellt/aktualisiert',
|
'language file "%(filename)s" created/updated': 'Sprachdatei "%(filename)s" erstellt/aktualisiert',
|
||||||
'Language files (static strings) updated': 'Sprachdatei (statisch Strings) aktualisiert',
|
'Language files (static strings) updated': 'Sprachdatei (statisch Strings) aktualisiert',
|
||||||
'languages': 'Sprachen',
|
'languages': 'Sprachen',
|
||||||
@@ -187,8 +202,9 @@
|
|||||||
'Last name': 'Nachname',
|
'Last name': 'Nachname',
|
||||||
'Last saved on:': 'Zuletzt gespeichert am:',
|
'Last saved on:': 'Zuletzt gespeichert am:',
|
||||||
'Layout': 'Layout',
|
'Layout': 'Layout',
|
||||||
'License for': 'Lizenz für',
|
'License for': 'Lizenz f?r',
|
||||||
'loading...': 'lade...',
|
'loading...': 'lade...',
|
||||||
|
'locals': 'locals',
|
||||||
'located in the file': 'located in Datei',
|
'located in the file': 'located in Datei',
|
||||||
'Login': 'Anmelden',
|
'Login': 'Anmelden',
|
||||||
'login': 'anmelden',
|
'login': 'anmelden',
|
||||||
@@ -196,33 +212,37 @@
|
|||||||
'Logout': 'abmelden',
|
'Logout': 'abmelden',
|
||||||
'Lost Password': 'Passwort vergessen',
|
'Lost Password': 'Passwort vergessen',
|
||||||
'lost password?': 'Passwort vergessen?',
|
'lost password?': 'Passwort vergessen?',
|
||||||
'Main Menu': 'Menú principal',
|
'Main Menu': 'Men? principal',
|
||||||
|
'Manage': 'Verwalten',
|
||||||
'Match Pair': 'Paare finden',
|
'Match Pair': 'Paare finden',
|
||||||
'Menu Model': 'Menü Modell',
|
'Menu Model': 'Men? Modell',
|
||||||
'merge': 'verbinden',
|
'merge': 'verbinden',
|
||||||
'Merge Lines': 'Zeilen zusammenfügen',
|
'Merge Lines': 'Zeilen zusammenf?gen',
|
||||||
'Models': 'Modelle',
|
'Models': 'Modelle',
|
||||||
'models': 'Modelle',
|
'models': 'Modelle',
|
||||||
'Modules': 'Module',
|
'Modules': 'Module',
|
||||||
'modules': 'Module',
|
'modules': 'Module',
|
||||||
'Name': 'Name',
|
'Name': 'Name',
|
||||||
'new application "%s" created': 'neue Anwendung "%s" erzeugt',
|
'new application "%s" created': 'neue Anwendung "%s" erzeugt',
|
||||||
'New application wizard': 'New application wizard',
|
'New application wizard': 'Neue Anwendung per Assistent',
|
||||||
'New Record': 'Neuer Datensatz',
|
'New Record': 'Neuer Datensatz',
|
||||||
'new record inserted': 'neuer Datensatz eingefügt',
|
'new record inserted': 'neuer Datensatz eingef?gt',
|
||||||
'New simple application': 'New simple application',
|
'New simple application': 'Neue einfache Anwendung',
|
||||||
'next 100 rows': 'nächsten 100 Zeilen',
|
'next 100 rows': 'n?chsten 100 Zeilen',
|
||||||
'Next Edit Point': 'nächster Bearbeitungsschritt',
|
'Next Edit Point': 'n?chster Bearbeitungsschritt',
|
||||||
'NO': 'NEIN',
|
'NO': 'NEIN',
|
||||||
'No databases in this application': 'Keine Datenbank in dieser Anwendung',
|
'No databases in this application': 'Keine Datenbank in dieser Anwendung',
|
||||||
|
'No ticket_storage.txt found under /private folder': 'No ticket_storage.txt found under /private folder',
|
||||||
|
'Or Get from URL:': 'oder hole es von folgender URL:',
|
||||||
'or import from csv file': 'oder importieren von cvs Datei',
|
'or import from csv file': 'oder importieren von cvs Datei',
|
||||||
'or provide app url:': 'oder geben Sie eine Anwendungs-URL an:',
|
'or provide app url:': 'oder geben Sie eine Anwendungs-URL an:',
|
||||||
'or provide application url:': 'oder geben Sie eine Anwendungs-URL an:',
|
'or provide application url:': 'oder geben Sie eine Anwendungs-URL an:',
|
||||||
'Origin': 'Herkunft',
|
'Origin': 'Herkunft',
|
||||||
'Original/Translation': 'Original/Übersetzung',
|
'Original/Translation': 'Original/?bersetzung',
|
||||||
'Overwrite installed app': 'installierte Anwendungen überschreiben',
|
'Overwrite installed app': 'installierte Anwendungen ?berschreiben',
|
||||||
'Pack all': 'verpacke alles',
|
'Pack all': 'verpacke alles',
|
||||||
'Pack compiled': 'Verpacke kompiliert',
|
'Pack compiled': 'Verpacke kompiliert',
|
||||||
|
'Pack custom': 'Verpacke individuell',
|
||||||
'pack plugin': 'Plugin verpacken',
|
'pack plugin': 'Plugin verpacken',
|
||||||
'Password': 'Passwort',
|
'Password': 'Passwort',
|
||||||
'Peeking at file': 'Dateiansicht',
|
'Peeking at file': 'Dateiansicht',
|
||||||
@@ -230,9 +250,10 @@
|
|||||||
'Plugin "%s" in application': 'Plugin "%s" in Anwendung',
|
'Plugin "%s" in application': 'Plugin "%s" in Anwendung',
|
||||||
'plugins': 'plugins',
|
'plugins': 'plugins',
|
||||||
'Plugins': 'Plugins',
|
'Plugins': 'Plugins',
|
||||||
'Powered by': 'Unterstützt von',
|
'Powered by': 'Unterst?tzt von',
|
||||||
'previous 100 rows': 'vorherige 100 zeilen',
|
'previous 100 rows': 'vorherige 100 zeilen',
|
||||||
'Previous Edit Point': 'vorheriger Bearbeitungsschritt',
|
'Previous Edit Point': 'vorheriger Bearbeitungsschritt',
|
||||||
|
'Project Progress': 'Projekt Fortschritt',
|
||||||
'Query:': 'Abfrage:',
|
'Query:': 'Abfrage:',
|
||||||
'record': 'Datensatz',
|
'record': 'Datensatz',
|
||||||
'record does not exist': 'Datensatz existiert nicht',
|
'record does not exist': 'Datensatz existiert nicht',
|
||||||
@@ -240,33 +261,38 @@
|
|||||||
'Record ID': 'Datensatz ID',
|
'Record ID': 'Datensatz ID',
|
||||||
'register': 'Registrierung',
|
'register': 'Registrierung',
|
||||||
'Register': 'registrieren',
|
'Register': 'registrieren',
|
||||||
'Registration key': 'Registrierungsschlüssel',
|
'Registration key': 'Registrierungsschl?ssel',
|
||||||
'Reload routes': 'Reload routes',
|
'reload': 'Neu laden',
|
||||||
'Remove compiled': 'kompilat gelöscht',
|
'Reload routes': 'Routen neu laden',
|
||||||
'Reset Password key': 'Passwortschlüssel zurücksetzen',
|
'Remove compiled': 'Bytecode l?schen',
|
||||||
|
'request': 'request',
|
||||||
|
'Reset Password key': 'Passwortschl?ssel zur?cksetzen',
|
||||||
'Resolve Conflict file': 'bereinige Konflikt-Datei',
|
'Resolve Conflict file': 'bereinige Konflikt-Datei',
|
||||||
|
'response': 'Antwort',
|
||||||
'restore': 'wiederherstellen',
|
'restore': 'wiederherstellen',
|
||||||
'revert': 'zurückkehren',
|
'revert': 'zur?ckkehren',
|
||||||
'Role': 'Rolle',
|
'Role': 'Rolle',
|
||||||
'Rows in table': 'Zeilen in Tabelle',
|
'Rows in table': 'Zeilen in Tabelle',
|
||||||
'Rows selected': 'Zeilen ausgewählt',
|
'Rows selected': 'Zeilen ausgew?hlt',
|
||||||
'Running on %s': 'Running on %s',
|
'Running on %s': 'L?uft auf %s',
|
||||||
'save': 'sichern',
|
'save': 'sichern',
|
||||||
'Save via Ajax': 'via Ajax sichern',
|
'Save via Ajax': 'via Ajax sichern',
|
||||||
'Saved file hash:': 'Gespeicherter Datei-Hash:',
|
'Saved file hash:': 'Gespeicherter Datei-Hash:',
|
||||||
'selected': 'ausgewählt(e)',
|
'Select Files to Package': 'Dateien zum Paketieren w?hlen',
|
||||||
'session expired': 'Sitzung Abgelaufen',
|
'selected': 'ausgew?hlt(e)',
|
||||||
|
'session': 'Sitzung',
|
||||||
|
'session expired': 'Sitzung abgelaufen',
|
||||||
'shell': 'shell',
|
'shell': 'shell',
|
||||||
'Site': 'Seite',
|
'Site': 'Seite',
|
||||||
'some files could not be removed': 'einige Dateien konnten nicht gelöscht werden',
|
'some files could not be removed': 'einige Dateien konnten nicht gel?scht werden',
|
||||||
'Start wizard': 'start wizard',
|
'Start wizard': 'Assistent starten',
|
||||||
'state': 'Status',
|
'state': 'Status',
|
||||||
'static': 'statische Dateien',
|
'static': 'statische Dateien',
|
||||||
'Static files': 'statische Dateien',
|
'Static files': 'statische Dateien',
|
||||||
'Stylesheet': 'Stylesheet',
|
'Stylesheet': 'Stylesheet',
|
||||||
'Submit': 'Submit',
|
'Submit': 'Submit',
|
||||||
'submit': 'Absenden',
|
'submit': 'Absenden',
|
||||||
'Sure you want to delete this object?': 'Wollen Sie das Objekt wirklich löschen?',
|
'Sure you want to delete this object?': 'Wollen Sie das Objekt wirklich l?schen?',
|
||||||
'table': 'Tabelle',
|
'table': 'Tabelle',
|
||||||
'Table name': 'Tabellen Name',
|
'Table name': 'Tabellen Name',
|
||||||
'test': 'Test',
|
'test': 'Test',
|
||||||
@@ -276,42 +302,45 @@
|
|||||||
'test_try': 'test_try',
|
'test_try': 'test_try',
|
||||||
'Testing application': 'Teste die Anwendung',
|
'Testing application': 'Teste die Anwendung',
|
||||||
'Testing controller': 'teste Controller',
|
'Testing controller': 'teste Controller',
|
||||||
'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'Die "query" ist eine Bedingung wie "db.table1.field1 == \'Wert\'". Etwas wie "db.table1.field1 db.table2.field2 ==" führt zu einem SQL JOIN.',
|
'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'Die "query" ist eine Bedingung wie "db.table1.field1 == \'Wert\'". Etwas wie "db.table1.field1 db.table2.field2 ==" f?hrt zu einem SQL JOIN.',
|
||||||
'the application logic, each URL path is mapped in one exposed function in the controller': 'Die Logik der Anwendung, jeder URL-Pfad wird auf eine Funktion abgebildet die der Controller zur Verfügung stellt',
|
'the application logic, each URL path is mapped in one exposed function in the controller': 'Die Logik der Anwendung, jeder URL-Pfad wird auf eine Funktion abgebildet die der Controller zur Verf?gung stellt',
|
||||||
'The application logic, each URL path is mapped in one exposed function in the controller': 'The application logic, each URL path is mapped in one exposed function in the controller',
|
'The application logic, each URL path is mapped in one exposed function in the controller': 'The application logic, each URL path is mapped in one exposed function in the controller',
|
||||||
'the data representation, define database tables and sets': 'Die Datenrepräsentation definiert Mengen von Tabellen und Datenbanken ',
|
'the data representation, define database tables and sets': 'Die Datenrepr?sentation definiert Mengen von Tabellen und Datenbanken ',
|
||||||
'The data representation, define database tables and sets': 'The data representation, define database tables and sets',
|
'The data representation, define database tables and sets': 'The data representation, define database tables and sets',
|
||||||
'The output of the file is a dictionary that was rendered by the view': 'The output of the file is a dictionary that was rendered by the view',
|
'The output of the file is a dictionary that was rendered by the view': 'The output of the file is a dictionary that was rendered by the view',
|
||||||
'The presentations layer, views are also known as templates': 'The presentations layer, views are also known as templates',
|
'The presentations layer, views are also known as templates': 'The presentations layer, views are also known as templates',
|
||||||
'the presentations layer, views are also known as templates': 'Die Präsentationsschicht, Views sind auch bekannt als Vorlagen/Templates',
|
'the presentations layer, views are also known as templates': 'Die Pr?sentationsschicht, Views sind auch bekannt als Vorlagen/Templates',
|
||||||
'There are no controllers': 'Keine Controller vorhanden',
|
'There are no controllers': 'Keine Controller vorhanden',
|
||||||
'There are no models': 'Keine Modelle vorhanden',
|
'There are no models': 'Keine Modelle vorhanden',
|
||||||
'There are no modules': 'Keine Module vorhanden',
|
'There are no modules': 'Keine Module vorhanden',
|
||||||
'There are no plugins': 'There are no plugins',
|
'There are no plugins': 'There are no plugins',
|
||||||
'There are no static files': 'Keine statischen Dateien vorhanden',
|
'There are no static files': 'Keine statischen Dateien vorhanden',
|
||||||
'There are no translators, only default language is supported': 'Keine Übersetzungen vorhanden, nur die voreingestellte Sprache wird unterstützt',
|
'There are no translators, only default language is supported': 'Keine ?bersetzungen vorhanden, nur die voreingestellte Sprache wird unterst?tzt',
|
||||||
'There are no views': 'Keine Views vorhanden',
|
'There are no views': 'Keine Views vorhanden',
|
||||||
'These files are served without processing, your images go here': 'These files are served without processing, your images go here',
|
'These files are served without processing, your images go here': 'These files are served without processing, your images go here',
|
||||||
'these files are served without processing, your images go here': 'Diese Dateien werden ohne Verarbeitung ausgeliefert. Beispielsweise Bilder kommen hier hin.',
|
'these files are served without processing, your images go here': 'Diese Dateien werden ohne Verarbeitung ausgeliefert. Beispielsweise Bilder kommen hier hin.',
|
||||||
'This is a copy of the scaffolding application': 'Dies ist eine Kopie einer Grundgerüst-Anwendung',
|
'This is a copy of the scaffolding application': 'Dies ist eine Kopie einer Grundger?st-Anwendung',
|
||||||
'This is the %(filename)s template': 'Dies ist das Template %(filename)s',
|
'This is the %(filename)s template': 'Dies ist das Template %(filename)s',
|
||||||
'Ticket': 'Ticket',
|
'Ticket': 'Ticket',
|
||||||
'Timestamp': 'Timestamp',
|
'Ticket ID': 'Ticket ID',
|
||||||
|
'Timestamp': 'Zeitstempel',
|
||||||
'TM': 'TM',
|
'TM': 'TM',
|
||||||
'to previous version.': 'zu einer früheren Version.',
|
'to previous version.': 'zu einer fr?heren Version.',
|
||||||
'To create a plugin, name a file/folder plugin_[name]': 'Um ein Plugin zu erstellen benennen Sie eine(n) Datei/Ordner plugin_[Name]',
|
'To create a plugin, name a file/folder plugin_[name]': 'Um ein Plugin zu erstellen benennen Sie eine(n) Datei/Ordner plugin_[Name]',
|
||||||
'translation strings for the application': 'Übersetzungs-Strings für die Anwendung',
|
'Traceback': 'Traceback',
|
||||||
'Translation strings for the application': 'Translation strings for the application',
|
'translation strings for the application': '?bersetzungs-Strings f?r die Anwendung',
|
||||||
|
'Translation strings for the application': '?bersetzungs-Strings f?r die Anwendung',
|
||||||
'try': 'versuche',
|
'try': 'versuche',
|
||||||
'try something like': 'versuche so etwas wie',
|
'try something like': 'versuche so etwas wie',
|
||||||
'Unable to check for upgrades': 'überprüfen von Upgrades nicht möglich',
|
'Try the mobile interface': 'Try the mobile interface',
|
||||||
'unable to create application "%s"': 'erzeugen von Anwendung "%s" nicht möglich',
|
'Unable to check for upgrades': '?berpr?fen von Upgrades nicht m?glich',
|
||||||
'unable to delete file "%(filename)s"': 'löschen von Datein "%(filename)s" nicht möglich',
|
'unable to create application "%s"': 'erzeugen von Anwendung "%s" nicht m?glich',
|
||||||
'Unable to download': 'herunterladen nicht möglich',
|
'unable to delete file "%(filename)s"': 'l?schen von Datein "%(filename)s" nicht m?glich',
|
||||||
'Unable to download app': 'herunterladen der Anwendung nicht möglich',
|
'Unable to download': 'herunterladen nicht m?glich',
|
||||||
'unable to parse csv file': 'analysieren der cvs Datei nicht möglich',
|
'Unable to download app': 'herunterladen der Anwendung nicht m?glich',
|
||||||
'unable to uninstall "%s"': 'deinstallieren von "%s" nicht möglich',
|
'unable to parse csv file': 'analysieren der cvs Datei nicht m?glich',
|
||||||
'uncheck all': 'alles demarkieren',
|
'unable to uninstall "%s"': 'deinstallieren von "%s" nicht m?glich',
|
||||||
|
'uncheck all': 'Selektionen entfernen',
|
||||||
'Uninstall': 'deinstallieren',
|
'Uninstall': 'deinstallieren',
|
||||||
'update': 'aktualisieren',
|
'update': 'aktualisieren',
|
||||||
'update all languages': 'aktualisiere alle Sprachen',
|
'update all languages': 'aktualisiere alle Sprachen',
|
||||||
@@ -319,33 +348,35 @@
|
|||||||
'upgrade web2py now': 'jetzt web2py upgraden',
|
'upgrade web2py now': 'jetzt web2py upgraden',
|
||||||
'upload': 'upload',
|
'upload': 'upload',
|
||||||
'Upload & install packed application': 'Verpackte Anwendung hochladen und installieren',
|
'Upload & install packed application': 'Verpackte Anwendung hochladen und installieren',
|
||||||
'Upload a package:': 'Upload a package:',
|
'Upload a package:': 'Ein Packet hochladen:',
|
||||||
'Upload and install packed application': 'Upload and install packed application',
|
'Upload and install packed application': 'Verpackte Anwendung hochladen und installieren',
|
||||||
'upload application:': 'lade Anwendung hoch:',
|
'upload application:': 'lade Anwendung hoch:',
|
||||||
'Upload existing application': 'lade existierende Anwendung hoch',
|
'Upload existing application': 'lade existierende Anwendung hoch',
|
||||||
'upload file:': 'lade Datei hoch:',
|
'upload file:': 'lade Datei hoch:',
|
||||||
'upload plugin file:': 'Plugin-Datei hochladen:',
|
'upload plugin file:': 'Plugin-Datei hochladen:',
|
||||||
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Benutze (...)&(...) für AND, (...)|(...) für OR, und ~(...) für NOT, um komplexe Abfragen zu erstellen.',
|
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Benutze (...)&(...) f?r AND, (...)|(...) f?r OR, und ~(...) f?r NOT, um komplexe Abfragen zu erstellen.',
|
||||||
'Use an url:': 'Use an url:',
|
'Use an url:': 'Verwende URL:',
|
||||||
'user': 'user',
|
'user': 'Nutzer',
|
||||||
'User ID': 'Benutzer ID',
|
'User ID': 'Benutzer ID',
|
||||||
'variables': 'variables',
|
'variables': 'Variablen',
|
||||||
'Version': 'Version',
|
'Version': 'Version',
|
||||||
'Version %s.%s.%s (%s) %s': 'Version %s.%s.%s (%s) %s',
|
'Version %s.%s.%s (%s) %s': 'Version %s.%s.%s (%s) %s',
|
||||||
'versioning': 'Versionierung',
|
'versioning': 'Versionierung',
|
||||||
'View': 'View',
|
'Versioning': 'Versionierung',
|
||||||
'view': 'View',
|
'View': 'Ansicht',
|
||||||
'Views': 'Views',
|
'view': 'Ansicht',
|
||||||
'views': 'Views',
|
'Views': 'Ansichten',
|
||||||
|
'views': 'Ansichten',
|
||||||
|
'Web Framework': 'Web Framework',
|
||||||
'web2py is up to date': 'web2py ist auf dem neuesten Stand',
|
'web2py is up to date': 'web2py ist auf dem neuesten Stand',
|
||||||
'web2py Recent Tweets': 'neuste Tweets von web2py',
|
'web2py Recent Tweets': 'neuste Tweets von web2py',
|
||||||
'Welcome %s': 'Willkommen %s',
|
'Welcome %s': 'Willkommen %s',
|
||||||
'Welcome to web2py': 'Willkommen zu web2py',
|
'Welcome to web2py': 'Willkommen zu web2py',
|
||||||
'Which called the function': 'Which called the function',
|
'Which called the function': 'welche die Funktion aufrief',
|
||||||
'Wrap with Abbreviation': 'mit Kürzel einhüllen',
|
'Wrap with Abbreviation': 'mit K?rzel einh?llen',
|
||||||
'xml': 'xml',
|
'xml': 'xml',
|
||||||
'YES': 'JA',
|
'YES': 'JA',
|
||||||
'You are successfully running web2py': 'web2by wird erfolgreich ausgeführt',
|
'You are successfully running web2py': 'web2by wird erfolgreich ausgef?hrt',
|
||||||
'You can modify this application and adapt it to your needs': 'Sie können diese Anwendung verändern und Ihren Bedürfnissen anpassen',
|
'You can modify this application and adapt it to your needs': 'Sie k?nnen diese Anwendung ver?ndern und Ihren Bed?rfnissen anpassen',
|
||||||
'You visited the url': 'Sie besuchten die URL',
|
'You visited the url': 'Sie besuchten die URL',
|
||||||
}
|
}
|
||||||
|
|||||||
+214
-137
@@ -3,154 +3,28 @@
|
|||||||
'!langcode!': 'es',
|
'!langcode!': 'es',
|
||||||
'!langname!': 'Español',
|
'!langname!': 'Español',
|
||||||
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"actualice" es una expresión opcional como "campo1=\'nuevo_valor\'". No se puede actualizar o eliminar resultados de un JOIN',
|
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"actualice" es una expresión opcional como "campo1=\'nuevo_valor\'". No se puede actualizar o eliminar resultados de un JOIN',
|
||||||
'%Y-%m-%d': '%Y-%m-%d',
|
|
||||||
'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
|
|
||||||
'%s %%{row} deleted': '%s filas eliminadas',
|
'%s %%{row} deleted': '%s filas eliminadas',
|
||||||
'%s %%{row} updated': '%s filas actualizadas',
|
'%s %%{row} updated': '%s filas actualizadas',
|
||||||
|
'%Y-%m-%d': '%Y-%m-%d',
|
||||||
|
'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
|
||||||
'(something like "it-it")': '(algo como "it-it")',
|
'(something like "it-it")': '(algo como "it-it")',
|
||||||
|
'@markmin\x01(file **gluon/contrib/plural_rules/%s.py** is not found)': '(file **gluon/contrib/plural_rules/%s.py** is not found)',
|
||||||
'@markmin\x01Searching: **%s** %%{file}': 'Searching: **%s** files',
|
'@markmin\x01Searching: **%s** %%{file}': 'Searching: **%s** files',
|
||||||
'A new version of web2py is available': 'Hay una nueva versión de web2py disponible',
|
'A new version of web2py is available': 'Hay una nueva versión de web2py disponible',
|
||||||
'A new version of web2py is available: %s': 'Hay una nueva versión de web2py disponible: %s',
|
'A new version of web2py is available: %s': 'Hay una nueva versión de web2py disponible: %s',
|
||||||
'ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.': 'ATENCION: Inicio de sesión requiere una conexión segura (HTTPS) o localhost.',
|
|
||||||
'ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.': 'ATENCION: NO EJECUTE VARIAS PRUEBAS SIMULTANEAMENTE, NO SON THREAD SAFE.',
|
|
||||||
'ATTENTION: you cannot edit the running application!': 'ATENCION: no puede modificar la aplicación que se ejecuta!',
|
|
||||||
'About': 'acerca de',
|
'About': 'acerca de',
|
||||||
'About application': 'Acerca de la aplicación',
|
'About application': 'Acerca de la aplicación',
|
||||||
'Admin is disabled because insecure channel': 'Admin deshabilitado, el canal no es seguro',
|
|
||||||
'Admin is disabled because unsecure channel': 'Admin deshabilitado, el canal no es seguro',
|
|
||||||
'Administrator Password:': 'Contraseña del Administrador:',
|
|
||||||
'Are you sure you want to delete file "%s"?': '¿Está seguro que desea eliminar el archivo "%s"?',
|
|
||||||
'Are you sure you want to delete plugin "%s"?': '¿Está seguro que quiere eliminar el plugin "%s"?',
|
|
||||||
'Are you sure you want to uninstall application "%s"': '¿Está seguro que desea desinstalar la aplicación "%s"',
|
|
||||||
'Are you sure you want to uninstall application "%s"?': '¿Está seguro que desea desinstalar la aplicación "%s"?',
|
|
||||||
'Are you sure you want to upgrade web2py now?': '¿Está seguro que desea actualizar web2py ahora?',
|
|
||||||
'Available databases and tables': 'Bases de datos y tablas disponibles',
|
|
||||||
'Cannot be empty': 'No puede estar vacío',
|
|
||||||
'Cannot compile: there are errors in your app. Debug it, correct errors and try again.': 'No se puede compilar: hay errores en su aplicación. Depure, corrija errores y vuelva a intentarlo.',
|
|
||||||
'Cannot compile: there are errors in your app:': 'No se puede compilar: hay errores en su aplicación:',
|
|
||||||
'Change Password': 'Cambie Contraseña',
|
|
||||||
'Change admin password': 'cambie contraseña admin',
|
|
||||||
'Check to delete': 'Marque para eliminar',
|
|
||||||
'Checking for upgrades...': 'Buscando actulizaciones...',
|
|
||||||
'Clean': 'limpiar',
|
|
||||||
'Click row to expand traceback': 'Click row to expand traceback',
|
|
||||||
'Client IP': 'IP del Cliente',
|
|
||||||
'Compile': 'compilar',
|
|
||||||
'Controllers': 'Controladores',
|
|
||||||
'Count': 'Count',
|
|
||||||
'Create': 'crear',
|
|
||||||
'Create new application using the Wizard': 'Create new application using the Wizard',
|
|
||||||
'Create new simple application': 'Cree una nueva aplicación',
|
|
||||||
'Current request': 'Solicitud en curso',
|
|
||||||
'Current response': 'Respuesta en curso',
|
|
||||||
'Current session': 'Sesión en curso',
|
|
||||||
'DESIGN': 'DISEÑO',
|
|
||||||
'Date and Time': 'Fecha y Hora',
|
|
||||||
'Delete': 'Elimine',
|
|
||||||
'Delete:': 'Elimine:',
|
|
||||||
'Deploy on Google App Engine': 'Instale en Google App Engine',
|
|
||||||
'Description': 'Descripción',
|
|
||||||
'Design for': 'Diseño para',
|
|
||||||
'E-mail': 'Correo electrónico',
|
|
||||||
'EDIT': 'EDITAR',
|
|
||||||
'Edit': 'editar',
|
|
||||||
'Edit Profile': 'Editar Perfil',
|
|
||||||
'Edit application': 'Editar aplicación',
|
|
||||||
'Edit current record': 'Edite el registro actual',
|
|
||||||
'Editing Language file': 'Editando archivo de lenguaje',
|
|
||||||
'Editing file': 'Editando archivo',
|
|
||||||
'Editing file "%s"': 'Editando archivo "%s"',
|
|
||||||
'Enterprise Web Framework': 'Armazón Empresarial para Internet',
|
|
||||||
'Error': 'Error',
|
|
||||||
'Error logs for "%(app)s"': 'Bitácora de errores en "%(app)s"',
|
|
||||||
'Errors': 'errores',
|
|
||||||
'Exception instance attributes': 'Atributos de la instancia de Excepción',
|
|
||||||
'File': 'File',
|
|
||||||
'First name': 'Nombre',
|
|
||||||
'Functions with no doctests will result in [passed] tests.': 'Funciones sin doctests equivalen a pruebas [aceptadas].',
|
|
||||||
'Group ID': 'ID de Grupo',
|
|
||||||
'Hello World': 'Hola Mundo',
|
|
||||||
'Help': 'ayuda',
|
|
||||||
'If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.\nA green title indicates that all tests (if defined) passed. In this case test results are not shown.': 'Si el reporte anterior contiene un número de tiquete este indica un falla en la ejecución del controlador, antes de cualquier intento de ejecutat doctests. Esto generalmente se debe a un error en la indentación o un error por fuera del código de la función.\r\nUn titulo verde indica que todas las pruebas pasaron (si existen). En dicho caso los resultados no se muestran.',
|
|
||||||
'Import/Export': 'Importar/Exportar',
|
|
||||||
'Install': 'instalar',
|
|
||||||
'Installed applications': 'Aplicaciones instaladas',
|
|
||||||
'Internal State': 'Estado Interno',
|
|
||||||
'Invalid Query': 'Consulta inválida',
|
|
||||||
'Invalid action': 'Acción inválida',
|
|
||||||
'Invalid email': 'Correo inválido',
|
|
||||||
'Language files (static strings) updated': 'Archivos de lenguaje (cadenas estáticas) actualizados',
|
|
||||||
'Languages': 'Lenguajes',
|
|
||||||
'Last name': 'Apellido',
|
|
||||||
'Last saved on:': 'Guardado en:',
|
|
||||||
'License for': 'Licencia para',
|
|
||||||
'Login': 'Inicio de sesión',
|
|
||||||
'Login to the Administrative Interface': 'Inicio de sesión para la Interfaz Administrativa',
|
|
||||||
'Logout': 'fin de sesión',
|
|
||||||
'Lost Password': 'Contraseña perdida',
|
|
||||||
'Models': 'Modelos',
|
|
||||||
'Modules': 'Módulos',
|
|
||||||
'NO': 'NO',
|
|
||||||
'Name': 'Nombre',
|
|
||||||
'New Record': 'Registro nuevo',
|
|
||||||
'No databases in this application': 'No hay bases de datos en esta aplicación',
|
|
||||||
'Origin': 'Origen',
|
|
||||||
'Original/Translation': 'Original/Traducción',
|
|
||||||
'Overwrite installed app': 'sobreescriba aplicación instalada',
|
|
||||||
'PAM authenticated user, cannot change password here': 'usuario autenticado por PAM, no puede cambiar la contraseña aquí',
|
|
||||||
'Pack all': 'empaquetar todo',
|
|
||||||
'Pack compiled': 'empaquete compiladas',
|
|
||||||
'Password': 'Contraseña',
|
|
||||||
'Peeking at file': 'Visualizando archivo',
|
|
||||||
'Plugin "%s" in application': 'Plugin "%s" en aplicación',
|
|
||||||
'Plugins': 'Plugins',
|
|
||||||
'Powered by': 'Este sitio usa',
|
|
||||||
'Query:': 'Consulta:',
|
|
||||||
'Record ID': 'ID de Registro',
|
|
||||||
'Register': 'Registrese',
|
|
||||||
'Registration key': 'Contraseña de Registro',
|
|
||||||
'Remove compiled': 'eliminar compiladas',
|
|
||||||
'Resolve Conflict file': 'archivo Resolución de Conflicto',
|
|
||||||
'Role': 'Rol',
|
|
||||||
'Rows in table': 'Filas en la tabla',
|
|
||||||
'Rows selected': 'Filas seleccionadas',
|
|
||||||
'Saved file hash:': 'Hash del archivo guardado:',
|
|
||||||
'Site': 'sitio',
|
|
||||||
'Static files': 'Archivos estáticos',
|
|
||||||
'Sure you want to delete this object?': '¿Está seguro que desea eliminar este objeto?',
|
|
||||||
'TM': 'MR',
|
|
||||||
'Table name': 'Nombre de la tabla',
|
|
||||||
'Testing application': 'Probando aplicación',
|
|
||||||
'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'La "consulta" es una condición como "db.tabla1.campo1==\'valor\'". Algo como "db.tabla1.campo1==db.tabla2.campo2" resulta en un JOIN SQL.',
|
|
||||||
'There are no controllers': 'No hay controladores',
|
|
||||||
'There are no models': 'No hay modelos',
|
|
||||||
'There are no modules': 'No hay módulos',
|
|
||||||
'There are no static files': 'No hay archivos estáticos',
|
|
||||||
'There are no translators, only default language is supported': 'No hay traductores, sólo el lenguaje por defecto es soportado',
|
|
||||||
'There are no views': 'No hay vistas',
|
|
||||||
'This is the %(filename)s template': 'Esta es la plantilla %(filename)s',
|
|
||||||
'Ticket': 'Tiquete',
|
|
||||||
'Timestamp': 'Timestamp',
|
|
||||||
'To create a plugin, name a file/folder plugin_[name]': 'Para crear un plugin, nombre un archivo/carpeta plugin_[nombre]',
|
|
||||||
'Unable to check for upgrades': 'No es posible verificar la existencia de actualizaciones',
|
|
||||||
'Unable to download': 'No es posible la descarga',
|
|
||||||
'Unable to download app': 'No es posible descargar la aplicación',
|
|
||||||
'Unable to download app because:': 'No es posible descargar la aplicación porque:',
|
|
||||||
'Unable to download because': 'No es posible descargar porque',
|
|
||||||
'Uninstall': 'desinstalar',
|
|
||||||
'Update:': 'Actualice:',
|
|
||||||
'Upload & install packed application': 'Suba e instale aplicación empaquetada',
|
|
||||||
'Upload existing application': 'Suba esta aplicación',
|
|
||||||
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Use (...)&(...) para AND, (...)|(...) para OR, y ~(...) para NOT, para crear consultas más complejas.',
|
|
||||||
'User ID': 'ID de Usuario',
|
|
||||||
'Version': 'Versión',
|
|
||||||
'Views': 'Vistas',
|
|
||||||
'Welcome to web2py': 'Bienvenido a web2py',
|
|
||||||
'YES': 'SI',
|
|
||||||
'additional code for your application': 'código adicional para su aplicación',
|
'additional code for your application': 'código adicional para su aplicación',
|
||||||
|
'Additional code for your application': 'Additional code for your application',
|
||||||
'admin disabled because no admin password': ' por falta de contraseña',
|
'admin disabled because no admin password': ' por falta de contraseña',
|
||||||
'admin disabled because not supported on google app engine': 'admin deshabilitado, no es soportado en GAE',
|
'admin disabled because not supported on google app engine': 'admin deshabilitado, no es soportado en GAE',
|
||||||
'admin disabled because unable to access password file': 'admin deshabilitado, imposible acceder al archivo con la contraseña',
|
'admin disabled because unable to access password file': 'admin deshabilitado, imposible acceder al archivo con la contraseña',
|
||||||
|
'Admin is disabled because insecure channel': 'Admin deshabilitado, el canal no es seguro',
|
||||||
|
'Admin is disabled because unsecure channel': 'Admin deshabilitado, el canal no es seguro',
|
||||||
|
'Admin language': 'Admin language',
|
||||||
|
'administrative interface': 'administrative interface',
|
||||||
|
'Administrator Password:': 'Contraseña del Administrador:',
|
||||||
|
'An error occured, please %s the page': 'An error occured, please %s the page',
|
||||||
'and rename it (required):': 'y renombrela (requerido):',
|
'and rename it (required):': 'y renombrela (requerido):',
|
||||||
'and rename it:': ' y renombrelo:',
|
'and rename it:': ' y renombrelo:',
|
||||||
'appadmin': 'appadmin',
|
'appadmin': 'appadmin',
|
||||||
@@ -158,47 +32,115 @@
|
|||||||
'application "%s" uninstalled': 'aplicación "%s" desinstalada',
|
'application "%s" uninstalled': 'aplicación "%s" desinstalada',
|
||||||
'application compiled': 'aplicación compilada',
|
'application compiled': 'aplicación compilada',
|
||||||
'application is compiled and cannot be designed': 'la aplicación está compilada y no puede ser modificada',
|
'application is compiled and cannot be designed': 'la aplicación está compilada y no puede ser modificada',
|
||||||
|
'are not used': 'are not used',
|
||||||
|
'are not used yet': 'are not used yet',
|
||||||
|
'Are you sure you want to delete file "%s"?': '¿Está seguro que desea eliminar el archivo "%s"?',
|
||||||
|
'Are you sure you want to delete plugin "%s"?': '¿Está seguro que quiere eliminar el plugin "%s"?',
|
||||||
|
'Are you sure you want to delete this object?': 'Are you sure you want to delete this object?',
|
||||||
|
'Are you sure you want to uninstall application "%s"': '¿Está seguro que desea desinstalar la aplicación "%s"',
|
||||||
|
'Are you sure you want to uninstall application "%s"?': '¿Está seguro que desea desinstalar la aplicación "%s"?',
|
||||||
|
'Are you sure you want to upgrade web2py now?': '¿Está seguro que desea actualizar web2py ahora?',
|
||||||
'arguments': 'argumentos',
|
'arguments': 'argumentos',
|
||||||
|
'at char %s': 'at char %s',
|
||||||
|
'at line %s': 'at line %s',
|
||||||
|
'ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.': 'ATENCION: Inicio de sesión requiere una conexión segura (HTTPS) o localhost.',
|
||||||
|
'ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.': 'ATENCION: NO EJECUTE VARIAS PRUEBAS SIMULTANEAMENTE, NO SON THREAD SAFE.',
|
||||||
|
'ATTENTION: you cannot edit the running application!': 'ATENCION: no puede modificar la aplicación que se ejecuta!',
|
||||||
|
'Autocomplete': 'Autocomplete',
|
||||||
|
'Available databases and tables': 'Bases de datos y tablas disponibles',
|
||||||
'back': 'atrás',
|
'back': 'atrás',
|
||||||
|
'breakpoint': 'breakpoint',
|
||||||
|
'breakpoints': 'breakpoints',
|
||||||
'browse': 'buscar',
|
'browse': 'buscar',
|
||||||
'cache': 'cache',
|
'cache': 'cache',
|
||||||
'cache, errors and sessions cleaned': 'cache, errores y sesiones eliminados',
|
'cache, errors and sessions cleaned': 'cache, errores y sesiones eliminados',
|
||||||
|
'Cannot be empty': 'No puede estar vacío',
|
||||||
|
'Cannot compile: there are errors in your app. Debug it, correct errors and try again.': 'No se puede compilar: hay errores en su aplicación. Depure, corrija errores y vuelva a intentarlo.',
|
||||||
|
'Cannot compile: there are errors in your app:': 'No se puede compilar: hay errores en su aplicación:',
|
||||||
'cannot create file': 'no es posible crear archivo',
|
'cannot create file': 'no es posible crear archivo',
|
||||||
'cannot upload file "%(filename)s"': 'no es posible subir archivo "%(filename)s"',
|
'cannot upload file "%(filename)s"': 'no es posible subir archivo "%(filename)s"',
|
||||||
|
'Change admin password': 'cambie contraseña admin',
|
||||||
|
'Change Password': 'Cambie Contraseña',
|
||||||
'check all': 'marcar todos',
|
'check all': 'marcar todos',
|
||||||
|
'Check to delete': 'Marque para eliminar',
|
||||||
|
'Checking for upgrades...': 'Buscando actulizaciones...',
|
||||||
|
'Clean': 'limpiar',
|
||||||
'click here for online examples': 'haga clic aquí para ver ejemplos en línea',
|
'click here for online examples': 'haga clic aquí para ver ejemplos en línea',
|
||||||
'click here for the administrative interface': 'haga clic aquí para usar la interfaz administrativa',
|
'click here for the administrative interface': 'haga clic aquí para usar la interfaz administrativa',
|
||||||
|
'Click row to expand traceback': 'Click row to expand traceback',
|
||||||
'click to check for upgrades': 'haga clic para buscar actualizaciones',
|
'click to check for upgrades': 'haga clic para buscar actualizaciones',
|
||||||
'click to open': 'click to open',
|
'click to open': 'click to open',
|
||||||
|
'Client IP': 'IP del Cliente',
|
||||||
'code': 'código',
|
'code': 'código',
|
||||||
|
'Code listing': 'Code listing',
|
||||||
|
'collapse/expand all': 'collapse/expand all',
|
||||||
'commit (mercurial)': 'commit (mercurial)',
|
'commit (mercurial)': 'commit (mercurial)',
|
||||||
|
'Compile': 'compilar',
|
||||||
'compiled application removed': 'aplicación compilada removida',
|
'compiled application removed': 'aplicación compilada removida',
|
||||||
|
'continue': 'continue',
|
||||||
|
'Controllers': 'Controladores',
|
||||||
'controllers': 'controladores',
|
'controllers': 'controladores',
|
||||||
|
'Count': 'Count',
|
||||||
|
'Create': 'crear',
|
||||||
'create file with filename:': 'cree archivo con nombre:',
|
'create file with filename:': 'cree archivo con nombre:',
|
||||||
|
'Create new application using the Wizard': 'Create new application using the Wizard',
|
||||||
'create new application:': 'nombre de la nueva aplicación:',
|
'create new application:': 'nombre de la nueva aplicación:',
|
||||||
|
'Create new simple application': 'Cree una nueva aplicación',
|
||||||
'created by': 'creado por',
|
'created by': 'creado por',
|
||||||
'crontab': 'crontab',
|
'crontab': 'crontab',
|
||||||
|
'Current request': 'Solicitud en curso',
|
||||||
|
'Current response': 'Respuesta en curso',
|
||||||
|
'Current session': 'Sesión en curso',
|
||||||
'currently saved or': 'actualmente guardado o',
|
'currently saved or': 'actualmente guardado o',
|
||||||
'customize me!': 'Adaptame!',
|
'customize me!': 'Adaptame!',
|
||||||
'data uploaded': 'datos subidos',
|
'data uploaded': 'datos subidos',
|
||||||
'database': 'base de datos',
|
'database': 'base de datos',
|
||||||
'database %s select': 'selección en base de datos %s',
|
'database %s select': 'selección en base de datos %s',
|
||||||
'database administration': 'administración base de datos',
|
'database administration': 'administración base de datos',
|
||||||
|
'Date and Time': 'Fecha y Hora',
|
||||||
'db': 'db',
|
'db': 'db',
|
||||||
|
'Debug': 'Debug',
|
||||||
'defines tables': 'define tablas',
|
'defines tables': 'define tablas',
|
||||||
|
'Delete': 'Elimine',
|
||||||
'delete': 'eliminar',
|
'delete': 'eliminar',
|
||||||
'delete all checked': 'eliminar marcados',
|
'delete all checked': 'eliminar marcados',
|
||||||
'delete plugin': 'eliminar plugin',
|
'delete plugin': 'eliminar plugin',
|
||||||
|
'Delete this file (you will be asked to confirm deletion)': 'Delete this file (you will be asked to confirm deletion)',
|
||||||
|
'Delete:': 'Elimine:',
|
||||||
|
'Deploy on Google App Engine': 'Instale en Google App Engine',
|
||||||
|
'Description': 'Descripción',
|
||||||
'design': 'modificar',
|
'design': 'modificar',
|
||||||
|
'DESIGN': 'DISEÑO',
|
||||||
|
'Design for': 'Diseño para',
|
||||||
'direction: ltr': 'direction: ltr',
|
'direction: ltr': 'direction: ltr',
|
||||||
|
'docs': 'docs',
|
||||||
'done!': 'listo!',
|
'done!': 'listo!',
|
||||||
|
'download layouts': 'download layouts',
|
||||||
|
'download plugins': 'download plugins',
|
||||||
|
'E-mail': 'Correo electrónico',
|
||||||
|
'EDIT': 'EDITAR',
|
||||||
|
'Edit': 'editar',
|
||||||
|
'Edit application': 'Editar aplicación',
|
||||||
'edit controller': 'editar controlador',
|
'edit controller': 'editar controlador',
|
||||||
|
'Edit current record': 'Edite el registro actual',
|
||||||
|
'Edit Profile': 'Editar Perfil',
|
||||||
'edit views:': 'editar vistas:',
|
'edit views:': 'editar vistas:',
|
||||||
|
'Editing file': 'Editando archivo',
|
||||||
|
'Editing file "%s"': 'Editando archivo "%s"',
|
||||||
|
'Editing Language file': 'Editando archivo de lenguaje',
|
||||||
|
'Enterprise Web Framework': 'Armazón Empresarial para Internet',
|
||||||
|
'Error': 'Error',
|
||||||
|
'Error logs for "%(app)s"': 'Bitácora de errores en "%(app)s"',
|
||||||
|
'Errors': 'errores',
|
||||||
|
'Exception instance attributes': 'Atributos de la instancia de Excepción',
|
||||||
'export as csv file': 'exportar como archivo CSV',
|
'export as csv file': 'exportar como archivo CSV',
|
||||||
'exposes': 'expone',
|
'exposes': 'expone',
|
||||||
|
'exposes:': 'exposes:',
|
||||||
'extends': 'extiende',
|
'extends': 'extiende',
|
||||||
|
'failed to compile file because:': 'failed to compile file because:',
|
||||||
'failed to reload module': 'recarga del módulo ha fallado',
|
'failed to reload module': 'recarga del módulo ha fallado',
|
||||||
'failed to reload module because:': 'no es posible recargar el módulo por:',
|
'failed to reload module because:': 'no es posible recargar el módulo por:',
|
||||||
|
'File': 'File',
|
||||||
'file "%(filename)s" created': 'archivo "%(filename)s" creado',
|
'file "%(filename)s" created': 'archivo "%(filename)s" creado',
|
||||||
'file "%(filename)s" deleted': 'archivo "%(filename)s" eliminado',
|
'file "%(filename)s" deleted': 'archivo "%(filename)s" eliminado',
|
||||||
'file "%(filename)s" uploaded': 'archivo "%(filename)s" subido',
|
'file "%(filename)s" uploaded': 'archivo "%(filename)s" subido',
|
||||||
@@ -208,76 +150,211 @@
|
|||||||
'file does not exist': 'archivo no existe',
|
'file does not exist': 'archivo no existe',
|
||||||
'file saved on %(time)s': 'archivo guardado %(time)s',
|
'file saved on %(time)s': 'archivo guardado %(time)s',
|
||||||
'file saved on %s': 'archivo guardado %s',
|
'file saved on %s': 'archivo guardado %s',
|
||||||
|
'filter': 'filter',
|
||||||
|
'Find Next': 'Find Next',
|
||||||
|
'Find Previous': 'Find Previous',
|
||||||
|
'First name': 'Nombre',
|
||||||
|
'Functions with no doctests will result in [passed] tests.': 'Funciones sin doctests equivalen a pruebas [aceptadas].',
|
||||||
|
'Globals##debug': 'Globals',
|
||||||
|
'graph model': 'graph model',
|
||||||
|
'Group ID': 'ID de Grupo',
|
||||||
|
'Hello World': 'Hola Mundo',
|
||||||
|
'Help': 'ayuda',
|
||||||
'htmledit': 'htmledit',
|
'htmledit': 'htmledit',
|
||||||
|
'If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.\nA green title indicates that all tests (if defined) passed. In this case test results are not shown.': 'Si el reporte anterior contiene un número de tiquete este indica un falla en la ejecución del controlador, antes de cualquier intento de ejecutat doctests. Esto generalmente se debe a un error en la indentación o un error por fuera del código de la función.\r\nUn titulo verde indica que todas las pruebas pasaron (si existen). En dicho caso los resultados no se muestran.',
|
||||||
|
'Import/Export': 'Importar/Exportar',
|
||||||
'includes': 'incluye',
|
'includes': 'incluye',
|
||||||
'insert new': 'inserte nuevo',
|
'insert new': 'inserte nuevo',
|
||||||
'insert new %s': 'inserte nuevo %s',
|
'insert new %s': 'inserte nuevo %s',
|
||||||
|
'Install': 'instalar',
|
||||||
|
'Installed applications': 'Aplicaciones instaladas',
|
||||||
|
'Interaction at %s line %s': 'Interaction at %s line %s',
|
||||||
|
'Interactive console': 'Interactive console',
|
||||||
'internal error': 'error interno',
|
'internal error': 'error interno',
|
||||||
|
'Internal State': 'Estado Interno',
|
||||||
|
'Invalid action': 'Acción inválida',
|
||||||
|
'Invalid email': 'Correo inválido',
|
||||||
'invalid password': 'contraseña inválida',
|
'invalid password': 'contraseña inválida',
|
||||||
|
'Invalid Query': 'Consulta inválida',
|
||||||
'invalid request': 'solicitud inválida',
|
'invalid request': 'solicitud inválida',
|
||||||
'invalid ticket': 'tiquete inválido',
|
'invalid ticket': 'tiquete inválido',
|
||||||
|
'Key bindings': 'Key bindings',
|
||||||
'language file "%(filename)s" created/updated': 'archivo de lenguaje "%(filename)s" creado/actualizado',
|
'language file "%(filename)s" created/updated': 'archivo de lenguaje "%(filename)s" creado/actualizado',
|
||||||
|
'Language files (static strings) updated': 'Archivos de lenguaje (cadenas estáticas) actualizados',
|
||||||
'languages': 'lenguajes',
|
'languages': 'lenguajes',
|
||||||
|
'Languages': 'Lenguajes',
|
||||||
'languages updated': 'lenguajes actualizados',
|
'languages updated': 'lenguajes actualizados',
|
||||||
|
'Last name': 'Apellido',
|
||||||
|
'Last saved on:': 'Guardado en:',
|
||||||
|
'License for': 'Licencia para',
|
||||||
'loading...': 'cargando...',
|
'loading...': 'cargando...',
|
||||||
|
'Locals##debug': 'Locals',
|
||||||
|
'Login': 'Inicio de sesión',
|
||||||
'login': 'inicio de sesión',
|
'login': 'inicio de sesión',
|
||||||
|
'Login to the Administrative Interface': 'Inicio de sesión para la Interfaz Administrativa',
|
||||||
|
'Logout': 'fin de sesión',
|
||||||
|
'Lost Password': 'Contraseña perdida',
|
||||||
'manage': 'manage',
|
'manage': 'manage',
|
||||||
'merge': 'combinar',
|
'merge': 'combinar',
|
||||||
|
'Models': 'Modelos',
|
||||||
'models': 'modelos',
|
'models': 'modelos',
|
||||||
|
'Modules': 'Módulos',
|
||||||
'modules': 'módulos',
|
'modules': 'módulos',
|
||||||
|
'Name': 'Nombre',
|
||||||
'new application "%s" created': 'nueva aplicación "%s" creada',
|
'new application "%s" created': 'nueva aplicación "%s" creada',
|
||||||
'new plugin installed': 'nuevo plugin instalado',
|
'new plugin installed': 'nuevo plugin instalado',
|
||||||
|
'New Record': 'Registro nuevo',
|
||||||
'new record inserted': 'nuevo registro insertado',
|
'new record inserted': 'nuevo registro insertado',
|
||||||
|
'next': 'next',
|
||||||
'next 100 rows': '100 filas siguientes',
|
'next 100 rows': '100 filas siguientes',
|
||||||
|
'NO': 'NO',
|
||||||
|
'No databases in this application': 'No hay bases de datos en esta aplicación',
|
||||||
|
'No Interaction yet': 'No Interaction yet',
|
||||||
'no match': 'no encontrado',
|
'no match': 'no encontrado',
|
||||||
|
'or alternatively': 'or alternatively',
|
||||||
'or import from csv file': 'o importar desde archivo CSV',
|
'or import from csv file': 'o importar desde archivo CSV',
|
||||||
'or provide app url:': 'o provea URL de la aplicación:',
|
'or provide app url:': 'o provea URL de la aplicación:',
|
||||||
'or provide application url:': 'o provea URL de la aplicación:',
|
'or provide application url:': 'o provea URL de la aplicación:',
|
||||||
|
'Origin': 'Origen',
|
||||||
|
'Original/Translation': 'Original/Traducción',
|
||||||
|
'Overwrite installed app': 'sobreescriba aplicación instalada',
|
||||||
|
'Pack all': 'empaquetar todo',
|
||||||
|
'Pack compiled': 'empaquete compiladas',
|
||||||
'pack plugin': 'empaquetar plugin',
|
'pack plugin': 'empaquetar plugin',
|
||||||
|
'PAM authenticated user, cannot change password here': 'usuario autenticado por PAM, no puede cambiar la contraseña aquí',
|
||||||
|
'Password': 'Contraseña',
|
||||||
'password changed': 'contraseña cambiada',
|
'password changed': 'contraseña cambiada',
|
||||||
|
'Peeking at file': 'Visualizando archivo',
|
||||||
|
'Please': 'Please',
|
||||||
'plugin "%(plugin)s" deleted': 'plugin "%(plugin)s" eliminado',
|
'plugin "%(plugin)s" deleted': 'plugin "%(plugin)s" eliminado',
|
||||||
|
'Plugin "%s" in application': 'Plugin "%s" en aplicación',
|
||||||
|
'plugins': 'plugins',
|
||||||
|
'Plugins': 'Plugins',
|
||||||
|
'Plural-Forms:': 'Plural-Forms:',
|
||||||
|
'Powered by': 'Este sitio usa',
|
||||||
'previous 100 rows': '100 filas anteriores',
|
'previous 100 rows': '100 filas anteriores',
|
||||||
|
'Private files': 'Private files',
|
||||||
|
'private files': 'private files',
|
||||||
|
'Query:': 'Consulta:',
|
||||||
'record': 'registro',
|
'record': 'registro',
|
||||||
'record does not exist': 'el registro no existe',
|
'record does not exist': 'el registro no existe',
|
||||||
'record id': 'id de registro',
|
'record id': 'id de registro',
|
||||||
|
'Record ID': 'ID de Registro',
|
||||||
|
'refresh': 'refresh',
|
||||||
|
'Register': 'Registrese',
|
||||||
|
'Registration key': 'Contraseña de Registro',
|
||||||
|
'reload': 'reload',
|
||||||
|
'Remove compiled': 'eliminar compiladas',
|
||||||
|
'Removed Breakpoint on %s at line %s': 'Removed Breakpoint on %s at line %s',
|
||||||
|
'Replace': 'Replace',
|
||||||
|
'Replace All': 'Replace All',
|
||||||
|
'Resolve Conflict file': 'archivo Resolución de Conflicto',
|
||||||
'restore': 'restaurar',
|
'restore': 'restaurar',
|
||||||
|
'return': 'return',
|
||||||
'revert': 'revertir',
|
'revert': 'revertir',
|
||||||
|
'Role': 'Rol',
|
||||||
|
'Rows in table': 'Filas en la tabla',
|
||||||
|
'Rows selected': 'Filas seleccionadas',
|
||||||
|
'rules are not defined': 'rules are not defined',
|
||||||
|
"Run tests in this file (to run all files, you may also use the button labelled 'test')": "Run tests in this file (to run all files, you may also use the button labelled 'test')",
|
||||||
|
'Save': 'Save',
|
||||||
'save': 'guardar',
|
'save': 'guardar',
|
||||||
|
'Save file:': 'Save file:',
|
||||||
|
'Save via Ajax': 'Save via Ajax',
|
||||||
|
'Saved file hash:': 'Hash del archivo guardado:',
|
||||||
'selected': 'seleccionado(s)',
|
'selected': 'seleccionado(s)',
|
||||||
'session expired': 'sesión expirada',
|
'session expired': 'sesión expirada',
|
||||||
|
'Set Breakpoint on %s at line %s: %s': 'Set Breakpoint on %s at line %s: %s',
|
||||||
'shell': 'shell',
|
'shell': 'shell',
|
||||||
|
'Site': 'sitio',
|
||||||
'some files could not be removed': 'algunos archivos no pudieron ser removidos',
|
'some files could not be removed': 'algunos archivos no pudieron ser removidos',
|
||||||
|
'Start searching': 'Start searching',
|
||||||
'state': 'estado',
|
'state': 'estado',
|
||||||
'static': 'estáticos',
|
'static': 'estáticos',
|
||||||
|
'Static': 'Static',
|
||||||
|
'Static files': 'Archivos estáticos',
|
||||||
|
'step': 'step',
|
||||||
|
'stop': 'stop',
|
||||||
'submit': 'enviar',
|
'submit': 'enviar',
|
||||||
|
'successful': 'successful',
|
||||||
|
'Sure you want to delete this object?': '¿Está seguro que desea eliminar este objeto?',
|
||||||
'table': 'tabla',
|
'table': 'tabla',
|
||||||
|
'Table name': 'Nombre de la tabla',
|
||||||
'test': 'probar',
|
'test': 'probar',
|
||||||
|
'Testing application': 'Probando aplicación',
|
||||||
|
'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'La "consulta" es una condición como "db.tabla1.campo1==\'valor\'". Algo como "db.tabla1.campo1==db.tabla2.campo2" resulta en un JOIN SQL.',
|
||||||
'the application logic, each URL path is mapped in one exposed function in the controller': 'la lógica de la aplicación, cada ruta URL se mapea en una función expuesta en el controlador',
|
'the application logic, each URL path is mapped in one exposed function in the controller': 'la lógica de la aplicación, cada ruta URL se mapea en una función expuesta en el controlador',
|
||||||
|
'The application logic, each URL path is mapped in one exposed function in the controller': 'The application logic, each URL path is mapped in one exposed function in the controller',
|
||||||
'the data representation, define database tables and sets': 'la representación de datos, define tablas y conjuntos de base de datos',
|
'the data representation, define database tables and sets': 'la representación de datos, define tablas y conjuntos de base de datos',
|
||||||
|
'The data representation, define database tables and sets': 'The data representation, define database tables and sets',
|
||||||
|
'The presentations layer, views are also known as templates': 'The presentations layer, views are also known as templates',
|
||||||
'the presentations layer, views are also known as templates': 'la capa de presentación, las vistas también son llamadas plantillas',
|
'the presentations layer, views are also known as templates': 'la capa de presentación, las vistas también son llamadas plantillas',
|
||||||
|
'There are no controllers': 'No hay controladores',
|
||||||
|
'There are no models': 'No hay modelos',
|
||||||
|
'There are no modules': 'No hay módulos',
|
||||||
|
'There are no plugins': 'There are no plugins',
|
||||||
|
'There are no private files': 'There are no private files',
|
||||||
|
'There are no static files': 'No hay archivos estáticos',
|
||||||
|
'There are no translators, only default language is supported': 'No hay traductores, sólo el lenguaje por defecto es soportado',
|
||||||
|
'There are no views': 'No hay vistas',
|
||||||
|
'These files are not served, they are only available from within your app': 'These files are not served, they are only available from within your app',
|
||||||
|
'These files are served without processing, your images go here': 'These files are served without processing, your images go here',
|
||||||
'these files are served without processing, your images go here': 'estos archivos son servidos sin procesar, sus imágenes van aquí',
|
'these files are served without processing, your images go here': 'estos archivos son servidos sin procesar, sus imágenes van aquí',
|
||||||
|
'This is the %(filename)s template': 'Esta es la plantilla %(filename)s',
|
||||||
|
'this page to see if a breakpoint was hit and debug interaction is required.': 'this page to see if a breakpoint was hit and debug interaction is required.',
|
||||||
|
'Ticket': 'Tiquete',
|
||||||
|
'Timestamp': 'Timestamp',
|
||||||
|
'TM': 'MR',
|
||||||
'to previous version.': 'a la versión previa.',
|
'to previous version.': 'a la versión previa.',
|
||||||
|
'To create a plugin, name a file/folder plugin_[name]': 'Para crear un plugin, nombre un archivo/carpeta plugin_[nombre]',
|
||||||
|
'To emulate a breakpoint programatically, write:': 'To emulate a breakpoint programatically, write:',
|
||||||
|
'to use the debugger!': 'to use the debugger!',
|
||||||
|
'toggle breakpoint': 'toggle breakpoint',
|
||||||
|
'Toggle Fullscreen': 'Toggle Fullscreen',
|
||||||
'translation strings for the application': 'cadenas de caracteres de traducción para la aplicación',
|
'translation strings for the application': 'cadenas de caracteres de traducción para la aplicación',
|
||||||
|
'Translation strings for the application': 'Translation strings for the application',
|
||||||
'try': 'intente',
|
'try': 'intente',
|
||||||
'try something like': 'intente algo como',
|
'try something like': 'intente algo como',
|
||||||
|
'Type some Python code in here and hit Return (Enter) to execute it.': 'Type some Python code in here and hit Return (Enter) to execute it.',
|
||||||
|
'Unable to check for upgrades': 'No es posible verificar la existencia de actualizaciones',
|
||||||
'unable to create application "%s"': 'no es posible crear la aplicación "%s"',
|
'unable to create application "%s"': 'no es posible crear la aplicación "%s"',
|
||||||
'unable to delete file "%(filename)s"': 'no es posible eliminar el archivo "%(filename)s"',
|
'unable to delete file "%(filename)s"': 'no es posible eliminar el archivo "%(filename)s"',
|
||||||
'unable to delete file plugin "%(plugin)s"': 'no es posible eliminar plugin "%(plugin)s"',
|
'unable to delete file plugin "%(plugin)s"': 'no es posible eliminar plugin "%(plugin)s"',
|
||||||
|
'Unable to download': 'No es posible la descarga',
|
||||||
|
'Unable to download app': 'No es posible descargar la aplicación',
|
||||||
|
'Unable to download app because:': 'No es posible descargar la aplicación porque:',
|
||||||
|
'Unable to download because': 'No es posible descargar porque',
|
||||||
'unable to parse csv file': 'no es posible analizar el archivo CSV',
|
'unable to parse csv file': 'no es posible analizar el archivo CSV',
|
||||||
'unable to uninstall "%s"': 'no es posible instalar "%s"',
|
'unable to uninstall "%s"': 'no es posible instalar "%s"',
|
||||||
'unable to upgrade because "%s"': 'no es posible actualizar porque "%s"',
|
'unable to upgrade because "%s"': 'no es posible actualizar porque "%s"',
|
||||||
'uncheck all': 'desmarcar todos',
|
'uncheck all': 'desmarcar todos',
|
||||||
|
'Uninstall': 'desinstalar',
|
||||||
'update': 'actualizar',
|
'update': 'actualizar',
|
||||||
'update all languages': 'actualizar todos los lenguajes',
|
'update all languages': 'actualizar todos los lenguajes',
|
||||||
|
'Update:': 'Actualice:',
|
||||||
'upgrade web2py now': 'actualize web2py ahora',
|
'upgrade web2py now': 'actualize web2py ahora',
|
||||||
|
'Upload': 'Upload',
|
||||||
|
'Upload & install packed application': 'Suba e instale aplicación empaquetada',
|
||||||
'upload application:': 'subir aplicación:',
|
'upload application:': 'subir aplicación:',
|
||||||
|
'Upload existing application': 'Suba esta aplicación',
|
||||||
'upload file:': 'suba archivo:',
|
'upload file:': 'suba archivo:',
|
||||||
'upload plugin file:': 'suba archivo de plugin:',
|
'upload plugin file:': 'suba archivo de plugin:',
|
||||||
|
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Use (...)&(...) para AND, (...)|(...) para OR, y ~(...) para NOT, para crear consultas más complejas.',
|
||||||
|
'User ID': 'ID de Usuario',
|
||||||
'variables': 'variables',
|
'variables': 'variables',
|
||||||
|
'Version': 'Versión',
|
||||||
'versioning': 'versiones',
|
'versioning': 'versiones',
|
||||||
|
'Versioning': 'Versioning',
|
||||||
'view': 'vista',
|
'view': 'vista',
|
||||||
|
'Views': 'Vistas',
|
||||||
'views': 'vistas',
|
'views': 'vistas',
|
||||||
'web2py Recent Tweets': 'Tweets Recientes de web2py',
|
|
||||||
'web2py is up to date': 'web2py está actualizado',
|
'web2py is up to date': 'web2py está actualizado',
|
||||||
|
'web2py online debugger': 'web2py online debugger',
|
||||||
|
'web2py Recent Tweets': 'Tweets Recientes de web2py',
|
||||||
'web2py upgraded; please restart it': 'web2py actualizado; favor reiniciar',
|
'web2py upgraded; please restart it': 'web2py actualizado; favor reiniciar',
|
||||||
|
'Welcome to web2py': 'Bienvenido a web2py',
|
||||||
|
'YES': 'SI',
|
||||||
|
'You need to set up and reach a': 'You need to set up and reach a',
|
||||||
|
'Your application will be blocked until you click an action button (next, step, continue, etc.)': 'Your application will be blocked until you click an action button (next, step, continue, etc.)',
|
||||||
|
'Your can inspect variables using the console below': 'Your can inspect variables using the console below',
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,11 +5,11 @@
|
|||||||
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"update" est une expression en option tels que "field1 = \'newvalue\'". Vous ne pouvez pas mettre à jour ou supprimer les résultats d\'une jointure "a JOIN"',
|
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"update" est une expression en option tels que "field1 = \'newvalue\'". Vous ne pouvez pas mettre à jour ou supprimer les résultats d\'une jointure "a JOIN"',
|
||||||
'%Y-%m-%d': '%d-%m-%Y',
|
'%Y-%m-%d': '%d-%m-%Y',
|
||||||
'%Y-%m-%d %H:%M:%S': '%d-%m-%Y %H:%M:%S',
|
'%Y-%m-%d %H:%M:%S': '%d-%m-%Y %H:%M:%S',
|
||||||
'%s %%{row} deleted': 'lignes %s supprimé',
|
'%s %%{row} deleted': 'lignes %s supprimées',
|
||||||
'%s %%{row} updated': 'lignes %s mis à jour',
|
'%s %%{row} updated': 'lignes %s mises à jour',
|
||||||
'(requires internet access)': '(requires internet access)',
|
'(requires internet access)': '(nécessite un accès Internet)',
|
||||||
'(something like "it-it")': '(quelque chose comme "it-it") ',
|
'(something like "it-it")': '(quelque chose comme "it-it") ',
|
||||||
'@markmin\x01Searching: **%s** %%{file}': 'Searching: **%s** files',
|
'@markmin\x01Searching: **%s** %%{file}': 'Cherche: **%s** fichiers',
|
||||||
'A new version of web2py is available: %s': 'Une nouvelle version de web2py est disponible: %s ',
|
'A new version of web2py is available: %s': 'Une nouvelle version de web2py est disponible: %s ',
|
||||||
'A new version of web2py is available: Version 1.68.2 (2009-10-21 09:59:29)\n': 'Une nouvelle version de web2py est disponible: Version 1.68.2 (2009-10-21 09:59:29)\r\n',
|
'A new version of web2py is available: Version 1.68.2 (2009-10-21 09:59:29)\n': 'Une nouvelle version de web2py est disponible: Version 1.68.2 (2009-10-21 09:59:29)\r\n',
|
||||||
'ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.': 'ATTENTION: nécessite une connexion sécurisée (HTTPS) ou être en localhost. ',
|
'ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.': 'ATTENTION: nécessite une connexion sécurisée (HTTPS) ou être en localhost. ',
|
||||||
@@ -17,59 +17,59 @@
|
|||||||
'ATTENTION: you cannot edit the running application!': "ATTENTION: vous ne pouvez pas modifier l'application qui tourne!",
|
'ATTENTION: you cannot edit the running application!': "ATTENTION: vous ne pouvez pas modifier l'application qui tourne!",
|
||||||
'About': 'à propos',
|
'About': 'à propos',
|
||||||
'About application': "A propos de l'application",
|
'About application': "A propos de l'application",
|
||||||
'Additional code for your application': 'Additional code for your application',
|
'Additional code for your application': 'Code additionnel pour votre application',
|
||||||
'Admin is disabled because insecure channel': 'Admin est désactivé parce que canal non sécurisé',
|
'Admin is disabled because insecure channel': 'Admin est désactivé parce que canal non sécurisé',
|
||||||
'Admin language': 'Admin language',
|
'Admin language': "Language de l'admin",
|
||||||
'Administrator Password:': 'Mot de passe Administrateur:',
|
'Administrator Password:': 'Mot de passe Administrateur:',
|
||||||
'Application name:': 'Application name:',
|
'Application name:': "Nom de l'application:",
|
||||||
'Are you sure you want to delete file "%s"?': 'Etes-vous sûr de vouloir supprimer le fichier «%s»?',
|
'Are you sure you want to delete file "%s"?': 'Êtes-vous sûr de vouloir supprimer le fichier «%s»?',
|
||||||
'Are you sure you want to delete plugin "%s"?': 'Etes-vous sûr de vouloir effacer le plugin "%s"?',
|
'Are you sure you want to delete plugin "%s"?': 'Êtes-vous sûr de vouloir supprimer le plugin "%s"?',
|
||||||
'Are you sure you want to delete this object?': 'Are you sure you want to delete this object?',
|
'Are you sure you want to delete this object?': 'Êtes-vous sûr de vouloir supprimer cet objet?',
|
||||||
'Are you sure you want to uninstall application "%s"?': "Êtes-vous sûr de vouloir désinstaller l'application «%s»?",
|
'Are you sure you want to uninstall application "%s"?': "Êtes-vous sûr de vouloir désinstaller l'application «%s»?",
|
||||||
'Are you sure you want to upgrade web2py now?': 'Are you sure you want to upgrade web2py now?',
|
'Are you sure you want to upgrade web2py now?': 'Êtes-vous sûr de vouloir mettre à jour web2py maintenant?',
|
||||||
'Available databases and tables': 'Bases de données et tables disponible',
|
'Available databases and tables': 'Bases de données et tables disponible',
|
||||||
'Cannot be empty': 'Ne peut pas être vide',
|
'Cannot be empty': 'Ne peut pas être vide',
|
||||||
'Cannot compile: there are errors in your app. Debug it, correct errors and try again.': 'Ne peut pas compiler: il y a des erreurs dans votre application. corriger les erreurs et essayez à nouveau.',
|
'Cannot compile: there are errors in your app. Debug it, correct errors and try again.': 'Ne peut pas compiler: il y a des erreurs dans votre application. corriger les erreurs et essayez à nouveau.',
|
||||||
'Cannot compile: there are errors in your app:': 'Cannot compile: there are errors in your app:',
|
'Cannot compile: there are errors in your app:': 'Ne peut pas compiler: il y a des erreurs dans votre application:',
|
||||||
'Change admin password': 'change admin password',
|
'Change admin password': 'Changer le mot de passe admin',
|
||||||
'Check for upgrades': 'check for upgrades',
|
'Check for upgrades': 'Vérifier les mises à jour',
|
||||||
'Check to delete': 'Cocher pour supprimer',
|
'Check to delete': 'Cocher pour supprimer',
|
||||||
'Checking for upgrades...': 'Vérification des mises à jour ... ',
|
'Checking for upgrades...': 'Vérification des mises à jour ... ',
|
||||||
'Clean': 'nettoyer',
|
'Clean': 'nettoyer',
|
||||||
'Compile': 'compiler',
|
'Compile': 'compiler',
|
||||||
'Controllers': 'Contrôleurs',
|
'Controllers': 'Contrôleurs',
|
||||||
'Create': 'create',
|
'Create': 'Créer',
|
||||||
'Create new simple application': 'Créer une nouvelle application',
|
'Create new simple application': 'Créer une nouvelle application',
|
||||||
'Current request': 'Requête actuel',
|
'Current request': 'Requête actuelle',
|
||||||
'Current response': 'Réponse actuelle',
|
'Current response': 'Réponse actuelle',
|
||||||
'Current session': 'Session en cours',
|
'Current session': 'Session en cours',
|
||||||
'Date and Time': 'Date et heure',
|
'Date and Time': 'Date et heure',
|
||||||
'Delete': 'Supprimer',
|
'Delete': 'Supprimer',
|
||||||
'Delete this file (you will be asked to confirm deletion)': 'Delete this file (you will be asked to confirm deletion)',
|
'Delete this file (you will be asked to confirm deletion)': 'Supprimer ce fichier (on vous demandera de confirmer la suppression)',
|
||||||
'Delete:': 'Supprimer:',
|
'Delete:': 'Supprimer:',
|
||||||
'Deploy': 'deploy',
|
'Deploy': 'Déployer',
|
||||||
'Deploy on Google App Engine': 'Déployer sur Google App Engine',
|
'Deploy on Google App Engine': 'Déployer sur Google App Engine',
|
||||||
'EDIT': 'MODIFIER',
|
'EDIT': 'MODIFIER',
|
||||||
'Edit': 'modifier',
|
'Edit': 'modifier',
|
||||||
'Edit application': "Modifier l'application",
|
'Edit application': "Modifier l'application",
|
||||||
'Edit current record': 'Modifier cet entrée',
|
'Edit current record': 'Modifier cette entrée',
|
||||||
'Editing Language file': 'Modifier le fichier de langue',
|
'Editing Language file': 'Modifier le fichier de langue',
|
||||||
'Editing file': 'Modifier le fichier',
|
'Editing file': 'Modifier le fichier',
|
||||||
'Editing file "%s"': 'Modifier le fichier "% s" ',
|
'Editing file "%s"': 'Modifier le fichier "% s" ',
|
||||||
'Enterprise Web Framework': 'Enterprise Web Framework',
|
'Enterprise Web Framework': 'Enterprise Web Framework',
|
||||||
'Error logs for "%(app)s"': 'Journal d\'erreurs pour "%(app)s"',
|
'Error logs for "%(app)s"': 'Journal d\'erreurs pour "%(app)s"',
|
||||||
'Errors': 'erreurs',
|
'Errors': 'erreurs',
|
||||||
'Exception instance attributes': 'Exception instance attributes',
|
'Exception instance attributes': "Attributs d'instance Exception",
|
||||||
'Functions with no doctests will result in [passed] tests.': 'Des fonctions sans doctests entraînera tests [passed] .',
|
'Functions with no doctests will result in [passed] tests.': 'Des fonctions sans doctests entraîneront des tests [passed] .',
|
||||||
'Help': 'aide',
|
'Help': 'aide',
|
||||||
'If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.\nA green title indicates that all tests (if defined) passed. In this case test results are not shown.': "Si le rapport ci-dessus contient un numéro de ticket, cela indique une défaillance dans l'exécution du contrôleur, avant toute tentative d'exécuter les doctests. Cela est généralement dû à une erreur d'indentation ou une erreur à l'extérieur du code de la fonction.\r\nUn titre verte indique que tous les tests (si définie) passed. Dans ce cas, les résultats des essais ne sont pas affichées.",
|
'If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.\nA green title indicates that all tests (if defined) passed. In this case test results are not shown.': "Si le rapport ci-dessus contient un numéro de ticket, cela indique une défaillance dans l'exécution du contrôleur, avant toute tentative d'exécuter les doctests. Cela est généralement dû à une erreur d'indentation ou une erreur à l'extérieur du code de la fonction.\r\nUn titre vert indique que tous les tests (si définis) sont passés. Dans ce cas, les résultats des essais ne sont pas affichées.",
|
||||||
'Import/Export': 'Importer/Exporter',
|
'Import/Export': 'Importer/Exporter',
|
||||||
'Install': 'install',
|
'Install': 'Installer',
|
||||||
'Installed applications': 'Les applications installées',
|
'Installed applications': 'Applications installées',
|
||||||
'Internal State': 'État Interne',
|
'Internal State': 'État Interne',
|
||||||
'Invalid Query': 'Requête non valide',
|
'Invalid Query': 'Requête non valide',
|
||||||
'Invalid action': 'Action non valide',
|
'Invalid action': 'Action non valide',
|
||||||
'Language files (static strings) updated': 'Fichiers de langue (static strings) Mise à jour ',
|
'Language files (static strings) updated': 'Fichiers de langue (chaînes statiques) mis à jour ',
|
||||||
'Languages': 'Langues',
|
'Languages': 'Langues',
|
||||||
'Last saved on:': 'Dernière sauvegarde le:',
|
'Last saved on:': 'Dernière sauvegarde le:',
|
||||||
'License for': 'Licence pour',
|
'License for': 'Licence pour',
|
||||||
@@ -79,13 +79,13 @@
|
|||||||
'Models': 'Modèles',
|
'Models': 'Modèles',
|
||||||
'Modules': 'Modules',
|
'Modules': 'Modules',
|
||||||
'NO': 'NON',
|
'NO': 'NON',
|
||||||
'New Record': 'Nouvel Entrée',
|
'New Record': 'Nouvelle Entrée',
|
||||||
'New application wizard': 'New application wizard',
|
'New application wizard': 'Assistant nouvelle application',
|
||||||
'New simple application': 'New simple application',
|
'New simple application': 'Nouvelle application simple',
|
||||||
'No databases in this application': 'Aucune base de données dans cette application',
|
'No databases in this application': 'Aucune base de données dans cette application',
|
||||||
'Original/Translation': 'Original / Traduction',
|
'Original/Translation': 'Original / Traduction',
|
||||||
'Overwrite installed app': 'overwrite installed app',
|
'Overwrite installed app': "Écraser l'application installée",
|
||||||
'PAM authenticated user, cannot change password here': 'PAM authenticated user, cannot change password here',
|
'PAM authenticated user, cannot change password here': 'Utilisateur authentifié par PAM, vous ne pouvez pas changer le mot de passe ici',
|
||||||
'Pack all': 'tout empaqueter',
|
'Pack all': 'tout empaqueter',
|
||||||
'Pack compiled': 'paquet compilé',
|
'Pack compiled': 'paquet compilé',
|
||||||
'Peeking at file': 'Jeter un oeil au fichier',
|
'Peeking at file': 'Jeter un oeil au fichier',
|
||||||
@@ -97,101 +97,101 @@
|
|||||||
'Resolve Conflict file': 'Résoudre les conflits de fichiers',
|
'Resolve Conflict file': 'Résoudre les conflits de fichiers',
|
||||||
'Rows in table': 'Lignes de la table',
|
'Rows in table': 'Lignes de la table',
|
||||||
'Rows selected': 'Lignes sélectionnées',
|
'Rows selected': 'Lignes sélectionnées',
|
||||||
"Run tests in this file (to run all files, you may also use the button labelled 'test')": "Run tests in this file (to run all files, you may also use the button labelled 'test')",
|
"Run tests in this file (to run all files, you may also use the button labelled 'test')": "Lancer les tests dans ce fichier (pour lancer tous les fichiers, vous pouvez également utiliser le bouton nommé 'test')",
|
||||||
'Save': 'Save',
|
'Save': 'Enregistrer',
|
||||||
'Saved file hash:': 'Hash du Fichier enregistré:',
|
'Saved file hash:': 'Hash du Fichier enregistré:',
|
||||||
'Site': 'site',
|
'Site': 'Site',
|
||||||
'Start wizard': 'start wizard',
|
'Start wizard': "Démarrer l'assistant",
|
||||||
'Static files': 'Fichiers statiques',
|
'Static files': 'Fichiers statiques',
|
||||||
'Sure you want to delete this object?': 'Vous êtes sûr de vouloir supprimer cet objet? ',
|
'Sure you want to delete this object?': 'Vous êtes sûr de vouloir supprimer cet objet? ',
|
||||||
'TM': 'MD',
|
'TM': 'MD',
|
||||||
'Testing application': "Test de l'application",
|
'Testing application': "Test de l'application",
|
||||||
'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'La "requête" est une condition comme "db.table1.field1==\'value\'". Quelque chose comme "db.table1.field1==db.table2.field2" aboutit à un JOIN SQL.',
|
'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'La "requête" est une condition comme "db.table1.field1==\'value\'". Quelque chose comme "db.table1.field1==db.table2.field2" aboutit à un JOIN SQL.',
|
||||||
'The application logic, each URL path is mapped in one exposed function in the controller': 'The application logic, each URL path is mapped in one exposed function in the controller',
|
'The application logic, each URL path is mapped in one exposed function in the controller': "La logique de l'application, chaque chemin d'URL est mappé avec une fonction exposée dans le contrôleur",
|
||||||
'The data representation, define database tables and sets': 'The data representation, define database tables and sets',
|
'The data representation, define database tables and sets': 'La représentation des données, définir les tables et ensembles de la base de données',
|
||||||
'The presentations layer, views are also known as templates': 'The presentations layer, views are also known as templates',
|
'The presentations layer, views are also known as templates': "Les couches de présentation, les vues sont également appelées modples",
|
||||||
'There are no controllers': "Il n'existe pas de contrôleurs",
|
'There are no controllers': "Il n'y a pas de contrôleurs",
|
||||||
'There are no models': "Il n'existe pas de modèles",
|
'There are no models': "Il n'y a pas de modèles",
|
||||||
'There are no modules': "Il n'existe pas de modules",
|
'There are no modules': "Il n'y a pas de modules",
|
||||||
'There are no plugins': 'There are no plugins',
|
'There are no plugins': "Il n'y a pas de plugins",
|
||||||
'There are no static files': "Il n'existe pas de fichiers statiques",
|
'There are no static files': "Il n'y a pas de fichiers statiques",
|
||||||
'There are no translators, only default language is supported': "Il n'y a pas de traducteurs, est prise en charge uniquement la langue par défaut",
|
'There are no translators, only default language is supported': "Il n'y a pas de traducteurs, seule la langue par défaut est prise en charge",
|
||||||
'There are no views': "Il n'existe pas de vues",
|
'There are no views': "Il n'y a pas de vues",
|
||||||
'These files are served without processing, your images go here': 'These files are served without processing, your images go here',
|
'These files are served without processing, your images go here': 'Ces fichiers sont renvoyés sans traitement, vos images viennent ici',
|
||||||
'This is the %(filename)s template': 'Ceci est le modèle %(filename)s ',
|
'This is the %(filename)s template': 'Ceci est le modèle %(filename)s ',
|
||||||
'Ticket': 'Ticket',
|
'Ticket': 'Ticket',
|
||||||
'To create a plugin, name a file/folder plugin_[name]': 'Pour créer un plugin, créer un fichier /dossier plugin_[nom]',
|
'To create a plugin, name a file/folder plugin_[name]': 'Pour créer un plugin, créer un fichier /dossier plugin_[nom]',
|
||||||
'Translation strings for the application': 'Translation strings for the application',
|
'Translation strings for the application': "Chaînes de traduction pour l'application",
|
||||||
'Unable to check for upgrades': 'Impossible de vérifier les mises à niveau',
|
'Unable to check for upgrades': 'Impossible de vérifier les mises à jour',
|
||||||
'Unable to download': 'Impossible de télécharger',
|
'Unable to download': 'Impossible de télécharger',
|
||||||
'Unable to download app': 'Impossible de télécharger app',
|
'Unable to download app': "Impossible de télécharger l'app",
|
||||||
'Unable to download app because:': 'Unable to download app because:',
|
'Unable to download app because:': "Impossible de télécharger l'app car:",
|
||||||
'Unable to download because': 'Unable to download because',
|
'Unable to download because': 'Impossible de télécharger car',
|
||||||
'Uninstall': 'désinstaller',
|
'Uninstall': 'désinstaller',
|
||||||
'Update:': 'Mise à jour:',
|
'Update:': 'Mise à jour:',
|
||||||
'Upload & install packed application': 'Upload & install packed application',
|
'Upload & install packed application': "Charger & installer l'application empaquetée",
|
||||||
'Upload a package:': 'Upload a package:',
|
'Upload a package:': 'Charger un paquet:',
|
||||||
'Upload existing application': 'charger une application existante',
|
'Upload existing application': 'Charger une application existante',
|
||||||
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Utilisez (...)&(...) pour AND, (...)|(...) pour OR, et ~(...) pour NOT et construire des requêtes plus complexes. ',
|
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Utilisez (...)&(...) pour AND, (...)|(...) pour OR, et ~(...) pour NOT afin de construire des requêtes plus complexes. ',
|
||||||
'Use an url:': 'Use an url:',
|
'Use an url:': 'Utiliser une url:',
|
||||||
'Version': 'Version',
|
'Version': 'Version',
|
||||||
'Views': 'Vues',
|
'Views': 'Vues',
|
||||||
'Web Framework': 'Web Framework',
|
'Web Framework': 'Framework Web',
|
||||||
'YES': 'OUI',
|
'YES': 'OUI',
|
||||||
'additional code for your application': 'code supplémentaire pour votre application',
|
'additional code for your application': 'code supplémentaire pour votre application',
|
||||||
'admin disabled because no admin password': 'admin désactivé car aucun mot de passe admin',
|
'admin disabled because no admin password': 'admin désactivée car aucun mot de passe admin',
|
||||||
'admin disabled because not supported on google app engine': 'admin désactivé car non pris en charge sur Google Apps engine',
|
'admin disabled because not supported on google app engine': 'admin désactivée car non prise en charge sur Google Apps engine',
|
||||||
'admin disabled because unable to access password file': "admin désactivé car incapable d'accéder au fichier mot de passe",
|
'admin disabled because unable to access password file': "admin désactivée car incapable d'accéder au fichier mot de passe",
|
||||||
'administrative interface': 'administrative interface',
|
'administrative interface': "interface d'administration",
|
||||||
'and rename it (required):': 'et renommez-la (obligatoire):',
|
'and rename it (required):': 'et renommez-la (obligatoire):',
|
||||||
'and rename it:': 'et renommez-le:',
|
'and rename it:': 'et renommez-le:',
|
||||||
'appadmin': 'appadmin',
|
'appadmin': 'appadmin',
|
||||||
'appadmin is disabled because insecure channel': 'appadmin est désactivé parce que canal non sécurisé',
|
'appadmin is disabled because insecure channel': 'appadmin est désactivé parce que canal non sécurisé',
|
||||||
'application "%s" uninstalled': 'application "%s" désinstallé',
|
'application "%s" uninstalled': 'application "%s" désinstallée',
|
||||||
'application %(appname)s installed with md5sum: %(digest)s': 'application %(appname)s installed with md5sum: %(digest)s',
|
'application %(appname)s installed with md5sum: %(digest)s': 'application %(appname)s installée avec md5sum: %(digest)s',
|
||||||
'application compiled': 'application compilée',
|
'application compiled': 'application compilée',
|
||||||
'application is compiled and cannot be designed': "l'application est compilée et ne peut être désigné",
|
'application is compiled and cannot be designed': "l'application est compilée et ne peut être modifiée",
|
||||||
'arguments': 'arguments',
|
'arguments': 'arguments',
|
||||||
'back': 'retour',
|
'back': 'retour',
|
||||||
'cache': 'cache',
|
'cache': 'cache',
|
||||||
'cache, errors and sessions cleaned': 'cache, erreurs et sessions nettoyé',
|
'cache, errors and sessions cleaned': 'cache, erreurs et sessions nettoyés',
|
||||||
'cannot create file': 'ne peu pas créer de fichier',
|
'cannot create file': 'ne peut pas créer de fichier',
|
||||||
'cannot upload file "%(filename)s"': 'ne peu pas charger le fichier "%(filename)s"',
|
'cannot upload file "%(filename)s"': 'ne peut pas charger le fichier "%(filename)s"',
|
||||||
'check all': 'tous vérifier ',
|
'check all': 'tout vérifier ',
|
||||||
'click to check for upgrades': 'Cliquez pour vérifier les mises à niveau',
|
'click to check for upgrades': 'Cliquez pour vérifier les mises jour',
|
||||||
'code': 'code',
|
'code': 'code',
|
||||||
'collapse/expand all': 'collapse/expand all',
|
'collapse/expand all': 'tout réduire/agrandir',
|
||||||
'compiled application removed': 'application compilée enlevé',
|
'compiled application removed': 'application compilée enlevée',
|
||||||
'controllers': 'contrôleurs',
|
'controllers': 'contrôleurs',
|
||||||
'create file with filename:': 'créer un fichier avec nom de fichier:',
|
'create file with filename:': 'créer un fichier avec nom de fichier:',
|
||||||
'create new application:': 'créer une nouvelle application:',
|
'create new application:': 'créer une nouvelle application:',
|
||||||
'created by': 'créé par',
|
'created by': 'créé par',
|
||||||
'crontab': 'crontab',
|
'crontab': 'crontab',
|
||||||
'currently running': 'currently running',
|
'currently running': 'tourne actuellement',
|
||||||
'currently saved or': 'actuellement enregistrés ou',
|
'currently saved or': 'actuellement enregistré ou',
|
||||||
'data uploaded': 'données chargées',
|
'data uploaded': 'données chargées',
|
||||||
'database': 'base de données',
|
'database': 'base de données',
|
||||||
'database %s select': 'base de données %s sélectionner',
|
'database %s select': 'base de données %s sélectionner',
|
||||||
'database administration': 'administration base de données',
|
'database administration': 'administration base de données',
|
||||||
'db': 'db',
|
'db': 'bdd',
|
||||||
'defines tables': 'définit les tables',
|
'defines tables': 'définit les tables',
|
||||||
'delete': 'supprimer',
|
'delete': 'supprimer',
|
||||||
'delete all checked': 'supprimer tout ce qui est cocher',
|
'delete all checked': 'supprimer tout ce qui est coché',
|
||||||
'delete plugin': ' supprimer plugin',
|
'delete plugin': ' supprimer le plugin',
|
||||||
'design': 'conception',
|
'design': 'conception',
|
||||||
'direction: ltr': 'direction: ltr',
|
'direction: ltr': 'direction: ltr',
|
||||||
'docs': 'docs',
|
'docs': 'docs',
|
||||||
'done!': 'fait!',
|
'done!': 'fait!',
|
||||||
'download layouts': 'download layouts',
|
'download layouts': 'télécharger layouts',
|
||||||
'download plugins': 'download plugins',
|
'download plugins': 'télécharger plugins',
|
||||||
'edit controller': 'modifier contrôleur',
|
'edit controller': 'modifier contrôleur',
|
||||||
'edit views:': 'edit views:',
|
'edit views:': 'modifier vues:',
|
||||||
'export as csv file': 'exportation au format CSV',
|
'export as csv file': 'export au format CSV',
|
||||||
'exposes': 'expose',
|
'exposes': 'expose',
|
||||||
'exposes:': 'exposes:',
|
'exposes:': 'expose:',
|
||||||
'extends': 'étend',
|
'extends': 'étend',
|
||||||
'failed to reload module': 'impossible de recharger le module',
|
'failed to reload module': 'impossible de recharger le module',
|
||||||
'failed to reload module because:': 'failed to reload module because:',
|
'failed to reload module because:': 'impossible de recharger le module car:',
|
||||||
'file "%(filename)s" created': 'fichier "%(filename)s" créé',
|
'file "%(filename)s" created': 'fichier "%(filename)s" créé',
|
||||||
'file "%(filename)s" deleted': 'fichier "%(filename)s" supprimé',
|
'file "%(filename)s" deleted': 'fichier "%(filename)s" supprimé',
|
||||||
'file "%(filename)s" uploaded': 'fichier "%(filename)s" chargé',
|
'file "%(filename)s" uploaded': 'fichier "%(filename)s" chargé',
|
||||||
@@ -200,7 +200,7 @@
|
|||||||
'file does not exist': "fichier n'existe pas",
|
'file does not exist': "fichier n'existe pas",
|
||||||
'file saved on %(time)s': 'fichier enregistré le %(time)s',
|
'file saved on %(time)s': 'fichier enregistré le %(time)s',
|
||||||
'file saved on %s': 'fichier enregistré le %s',
|
'file saved on %s': 'fichier enregistré le %s',
|
||||||
'filter': 'filter',
|
'filter': 'filtre',
|
||||||
'htmledit': 'edition html',
|
'htmledit': 'edition html',
|
||||||
'includes': 'inclus',
|
'includes': 'inclus',
|
||||||
'index': 'index',
|
'index': 'index',
|
||||||
@@ -219,14 +219,14 @@
|
|||||||
'modules': 'modules',
|
'modules': 'modules',
|
||||||
'new application "%s" created': 'nouvelle application "%s" créée',
|
'new application "%s" created': 'nouvelle application "%s" créée',
|
||||||
'new plugin installed': 'nouveau plugin installé',
|
'new plugin installed': 'nouveau plugin installé',
|
||||||
'new record inserted': 'nouvelle entrée inséré',
|
'new record inserted': 'nouvelle entrée insérée',
|
||||||
'next 100 rows': '100 lignes suivantes',
|
'next 100 rows': '100 lignes suivantes',
|
||||||
'no match': 'no match',
|
'no match': 'aucune correspondance',
|
||||||
'or import from csv file': 'ou importer depuis un fichier CSV ',
|
'or import from csv file': 'ou importer depuis un fichier CSV ',
|
||||||
'or provide app url:': 'or provide app url:',
|
'or provide app url:': "ou fournir l'URL de l'app:",
|
||||||
'or provide application url:': "ou fournir l'URL de l'application:",
|
'or provide application url:': "ou fournir l'URL de l'application:",
|
||||||
'pack plugin': 'paquet plugin',
|
'pack plugin': 'paquet plugin',
|
||||||
'password changed': 'password changed',
|
'password changed': 'mot de passe modifié',
|
||||||
'plugin "%(plugin)s" deleted': 'plugin "%(plugin)s" supprimé',
|
'plugin "%(plugin)s" deleted': 'plugin "%(plugin)s" supprimé',
|
||||||
'plugins': 'plugins',
|
'plugins': 'plugins',
|
||||||
'previous 100 rows': '100 lignes précédentes',
|
'previous 100 rows': '100 lignes précédentes',
|
||||||
@@ -245,9 +245,9 @@
|
|||||||
'submit': 'envoyer',
|
'submit': 'envoyer',
|
||||||
'table': 'table',
|
'table': 'table',
|
||||||
'test': 'tester',
|
'test': 'tester',
|
||||||
'the application logic, each URL path is mapped in one exposed function in the controller': "la logique de l'application, chaque route URL est mappé dans une fonction exposée dans le contrôleur",
|
'the application logic, each URL path is mapped in one exposed function in the controller': "la logique de l'application, chaque chemin d'URL est mappé dans une fonction exposée dans le contrôleur",
|
||||||
'the data representation, define database tables and sets': 'la représentation des données, défini les tables de bases de données et sets',
|
'the data representation, define database tables and sets': 'La représentation des données, définir les tables et ensembles de la base de données',
|
||||||
'the presentations layer, views are also known as templates': 'la couche des présentations, les vues sont également connus en tant que modèles',
|
'the presentations layer, views are also known as templates': 'la couche de présentation, les vues sont également appelées modèles',
|
||||||
'these files are served without processing, your images go here': 'ces fichiers sont servis sans transformation, vos images vont ici',
|
'these files are served without processing, your images go here': 'ces fichiers sont servis sans transformation, vos images vont ici',
|
||||||
'to previous version.': 'à la version précédente.',
|
'to previous version.': 'à la version précédente.',
|
||||||
'translation strings for the application': "chaînes de traduction de l'application",
|
'translation strings for the application': "chaînes de traduction de l'application",
|
||||||
@@ -258,22 +258,22 @@
|
|||||||
'unable to delete file plugin "%(plugin)s"': 'impossible de supprimer le plugin "%(plugin)s"',
|
'unable to delete file plugin "%(plugin)s"': 'impossible de supprimer le plugin "%(plugin)s"',
|
||||||
'unable to parse csv file': "impossible d'analyser les fichiers CSV",
|
'unable to parse csv file': "impossible d'analyser les fichiers CSV",
|
||||||
'unable to uninstall "%s"': 'impossible de désinstaller "%s"',
|
'unable to uninstall "%s"': 'impossible de désinstaller "%s"',
|
||||||
'unable to upgrade because "%s"': 'unable to upgrade because "%s"',
|
'unable to upgrade because "%s"': 'impossible de mettre à jour car "%s"',
|
||||||
'uncheck all': 'tout décocher',
|
'uncheck all': 'tout décocher',
|
||||||
'update': 'mettre à jour',
|
'update': 'mettre à jour',
|
||||||
'update all languages': 'mettre à jour toutes les langues',
|
'update all languages': 'mettre à jour toutes les langues',
|
||||||
'upgrade now': 'upgrade now',
|
'upgrade now': 'mettre à jour maintenant',
|
||||||
'upgrade web2py now': 'upgrade web2py now',
|
'upgrade web2py now': 'mettre à jour web2py maintenant',
|
||||||
'upload': 'upload',
|
'upload': 'charger',
|
||||||
'upload application:': "charger l'application:",
|
'upload application:': "charger l'application:",
|
||||||
'upload file:': 'charger le fichier:',
|
'upload file:': 'charger le fichier:',
|
||||||
'upload plugin file:': 'charger fichier plugin:',
|
'upload plugin file:': 'charger fichier plugin:',
|
||||||
'user': 'user',
|
'user': 'utilisateur',
|
||||||
'variables': 'variables',
|
'variables': 'variables',
|
||||||
'versioning': 'versioning',
|
'versioning': 'versioning',
|
||||||
'view': 'vue',
|
'view': 'vue',
|
||||||
'views': 'vues',
|
'views': 'vues',
|
||||||
'web2py Recent Tweets': 'web2py Tweets récentes',
|
'web2py Recent Tweets': 'Tweets récents sur web2py ',
|
||||||
'web2py is up to date': 'web2py est à jour',
|
'web2py is up to date': 'web2py est à jour',
|
||||||
'web2py upgraded; please restart it': 'web2py upgraded; please restart it',
|
'web2py upgraded; please restart it': 'web2py mis à jour; veuillez le redémarrer',
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
'Admin language': 'Admin language',
|
'Admin language': 'Admin language',
|
||||||
'administrative interface': 'administrative interface',
|
'administrative interface': 'administrative interface',
|
||||||
'Administrator Password:': 'Password Amministratore:',
|
'Administrator Password:': 'Password Amministratore:',
|
||||||
|
'An error occured, please %s the page': 'An error occured, please %s the page',
|
||||||
'and rename it (required):': 'e rinominala (obbligatorio):',
|
'and rename it (required):': 'e rinominala (obbligatorio):',
|
||||||
'and rename it:': 'e rinominala:',
|
'and rename it:': 'e rinominala:',
|
||||||
'appadmin': 'appadmin ',
|
'appadmin': 'appadmin ',
|
||||||
@@ -144,8 +145,10 @@
|
|||||||
'Get from URL:': 'Get from URL:',
|
'Get from URL:': 'Get from URL:',
|
||||||
'Git Pull': 'Git Pull',
|
'Git Pull': 'Git Pull',
|
||||||
'Git Push': 'Git Push',
|
'Git Push': 'Git Push',
|
||||||
|
'graph model': 'graph model',
|
||||||
'Hello World': 'Salve Mondo',
|
'Hello World': 'Salve Mondo',
|
||||||
'Help': 'aiuto',
|
'Help': 'aiuto',
|
||||||
|
'Hide/Show Translated strings': 'Hide/Show Translated strings',
|
||||||
'htmledit': 'modifica come html',
|
'htmledit': 'modifica come html',
|
||||||
'If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.\nA green title indicates that all tests (if defined) passed. In this case test results are not shown.': 'If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.\nA green title indicates that all tests (if defined) passed. In this case test results are not shown.',
|
'If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.\nA green title indicates that all tests (if defined) passed. In this case test results are not shown.': 'If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.\nA green title indicates that all tests (if defined) passed. In this case test results are not shown.',
|
||||||
'Import/Export': 'Importa/Esporta',
|
'Import/Export': 'Importa/Esporta',
|
||||||
@@ -195,6 +198,8 @@
|
|||||||
'NO': 'NO',
|
'NO': 'NO',
|
||||||
'No databases in this application': 'Nessun database presente in questa applicazione',
|
'No databases in this application': 'Nessun database presente in questa applicazione',
|
||||||
'no match': 'nessuna corrispondenza',
|
'no match': 'nessuna corrispondenza',
|
||||||
|
'or alternatively': 'or alternatively',
|
||||||
|
'Or Get from URL:': 'Or Get from URL:',
|
||||||
'or import from csv file': 'oppure importa da file CSV',
|
'or import from csv file': 'oppure importa da file CSV',
|
||||||
'or provide app url:': "oppure fornisci url dell'applicazione:",
|
'or provide app url:': "oppure fornisci url dell'applicazione:",
|
||||||
'Original/Translation': 'Originale/Traduzione',
|
'Original/Translation': 'Originale/Traduzione',
|
||||||
@@ -219,6 +224,7 @@
|
|||||||
'record does not exist': 'il record non esiste',
|
'record does not exist': 'il record non esiste',
|
||||||
'record id': 'ID del record',
|
'record id': 'ID del record',
|
||||||
'register': 'registrazione',
|
'register': 'registrazione',
|
||||||
|
'reload': 'reload',
|
||||||
'Remove compiled': 'rimozione codice compilato',
|
'Remove compiled': 'rimozione codice compilato',
|
||||||
'request': 'request',
|
'request': 'request',
|
||||||
'Resolve Conflict file': 'File di risoluzione conflitto',
|
'Resolve Conflict file': 'File di risoluzione conflitto',
|
||||||
@@ -242,6 +248,7 @@
|
|||||||
'Start wizard': 'start wizard',
|
'Start wizard': 'start wizard',
|
||||||
'state': 'stato',
|
'state': 'stato',
|
||||||
'static': 'statico',
|
'static': 'statico',
|
||||||
|
'Static': 'Static',
|
||||||
'Static files': 'Files statici',
|
'Static files': 'Files statici',
|
||||||
'Stylesheet': 'Foglio di stile (stylesheet)',
|
'Stylesheet': 'Foglio di stile (stylesheet)',
|
||||||
'submit': 'invia',
|
'submit': 'invia',
|
||||||
@@ -261,6 +268,7 @@
|
|||||||
'There are no models': 'Non ci sono modelli',
|
'There are no models': 'Non ci sono modelli',
|
||||||
'There are no modules': 'Non ci sono moduli',
|
'There are no modules': 'Non ci sono moduli',
|
||||||
'There are no plugins': 'There are no plugins',
|
'There are no plugins': 'There are no plugins',
|
||||||
|
'There are no private files': 'There are no private files',
|
||||||
'There are no static files': 'Non ci sono file statici',
|
'There are no static files': 'Non ci sono file statici',
|
||||||
'There are no translators, only default language is supported': 'Non ci sono traduzioni, viene solo supportato il linguaggio di base',
|
'There are no translators, only default language is supported': 'Non ci sono traduzioni, viene solo supportato il linguaggio di base',
|
||||||
'There are no views': 'Non ci sono viste ("view")',
|
'There are no views': 'Non ci sono viste ("view")',
|
||||||
@@ -280,6 +288,7 @@
|
|||||||
'Translation strings for the application': 'Translation strings for the application',
|
'Translation strings for the application': 'Translation strings for the application',
|
||||||
'try': 'prova',
|
'try': 'prova',
|
||||||
'try something like': 'prova qualcosa come',
|
'try something like': 'prova qualcosa come',
|
||||||
|
'Try the mobile interface': 'Try the mobile interface',
|
||||||
'try view': 'try view',
|
'try view': 'try view',
|
||||||
'Unable to check for upgrades': 'Impossibile controllare presenza di aggiornamenti',
|
'Unable to check for upgrades': 'Impossibile controllare presenza di aggiornamenti',
|
||||||
'unable to create application "%s"': 'impossibile creare applicazione "%s"',
|
'unable to create application "%s"': 'impossibile creare applicazione "%s"',
|
||||||
@@ -298,6 +307,7 @@
|
|||||||
'Update:': 'Aggiorna:',
|
'Update:': 'Aggiorna:',
|
||||||
'upgrade web2py now': 'upgrade web2py now',
|
'upgrade web2py now': 'upgrade web2py now',
|
||||||
'upload': 'upload',
|
'upload': 'upload',
|
||||||
|
'Upload': 'Upload',
|
||||||
'Upload & install packed application': 'Carica ed installa pacchetto con applicazione',
|
'Upload & install packed application': 'Carica ed installa pacchetto con applicazione',
|
||||||
'Upload a package:': 'Upload a package:',
|
'Upload a package:': 'Upload a package:',
|
||||||
'Upload and install packed application': 'Upload and install packed application',
|
'Upload and install packed application': 'Upload and install packed application',
|
||||||
@@ -308,6 +318,7 @@
|
|||||||
'Use an url:': 'Use an url:',
|
'Use an url:': 'Use an url:',
|
||||||
'variables': 'variables',
|
'variables': 'variables',
|
||||||
'Version': 'Versione',
|
'Version': 'Versione',
|
||||||
|
'Version %s.%s.%s %s (%s)': 'Version %s.%s.%s %s (%s)',
|
||||||
'Version %s.%s.%s (%s) %s': 'Version %s.%s.%s (%s) %s',
|
'Version %s.%s.%s (%s) %s': 'Version %s.%s.%s (%s) %s',
|
||||||
'versioning': 'sistema di versioni',
|
'versioning': 'sistema di versioni',
|
||||||
'Versioning': 'Versioning',
|
'Versioning': 'Versioning',
|
||||||
|
|||||||
@@ -92,7 +92,7 @@
|
|||||||
'Database': 'База данных',
|
'Database': 'База данных',
|
||||||
'database': 'база данных',
|
'database': 'база данных',
|
||||||
'database %s select': 'Выбор базы данных %s ',
|
'database %s select': 'Выбор базы данных %s ',
|
||||||
'database administration': 'администраторирование базы данных',
|
'database administration': 'администрирование базы данных',
|
||||||
'Date and Time': 'Дата и время',
|
'Date and Time': 'Дата и время',
|
||||||
'db': 'бд',
|
'db': 'бд',
|
||||||
'DB Model': 'Модель БД',
|
'DB Model': 'Модель БД',
|
||||||
@@ -134,7 +134,7 @@
|
|||||||
'Editing Language file': 'Правка языкового файла',
|
'Editing Language file': 'Правка языкового файла',
|
||||||
'Editing Plural Forms File': 'Editing Plural Forms File',
|
'Editing Plural Forms File': 'Editing Plural Forms File',
|
||||||
'Enterprise Web Framework': 'Enterprise Web Framework',
|
'Enterprise Web Framework': 'Enterprise Web Framework',
|
||||||
'Error logs for "%(app)s"': 'Журнал ошибок для "%(app)"',
|
'Error logs for "%(app)s"': 'Журнал ошибок для "%(app)s"',
|
||||||
'Error snapshot': 'Error snapshot',
|
'Error snapshot': 'Error snapshot',
|
||||||
'Error ticket': 'Error ticket',
|
'Error ticket': 'Error ticket',
|
||||||
'Errors': 'Ошибка',
|
'Errors': 'Ошибка',
|
||||||
|
|||||||
@@ -0,0 +1,212 @@
|
|||||||
|
# coding: utf8
|
||||||
|
{
|
||||||
|
'!langcode!': 'sr-cr',
|
||||||
|
'!langname!': 'Српски (Ћирилица)',
|
||||||
|
'%Y-%m-%d': '%d-%m-%Y',
|
||||||
|
'%Y-%m-%d %H:%M:%S': '%d-%m-%Y %H:%M:%S',
|
||||||
|
'(requires internet access)': '(захтијева приступ интернету)',
|
||||||
|
'(something like "it-it")': '(нешто као "it-it")',
|
||||||
|
'@markmin\x01(file **gluon/contrib/plural_rules/%s.py** is not found)': '(датотека **gluon/contrib/plural_rules/%s.py** није пронађена)',
|
||||||
|
'About': 'Информације',
|
||||||
|
'About application': 'О апликацији',
|
||||||
|
'Additional code for your application': 'Додатни код за апликацију',
|
||||||
|
'admin disabled because unable to access password file': 'администрација онемогућена јер не могу приступити датотеци са лозинком',
|
||||||
|
'Admin language': 'Језик администратора',
|
||||||
|
'administrative interface': 'административни интерфејс',
|
||||||
|
'Administrator Password:': 'Лозинка администратора:',
|
||||||
|
'and rename it:': 'и преименуј у:',
|
||||||
|
'Application name:': 'Назив апликације:',
|
||||||
|
'are not used': 'није кориштено',
|
||||||
|
'are not used yet': 'није још кориштено',
|
||||||
|
'Are you sure you want to delete this object?': 'Да ли сте сигурни да желите обрисати?',
|
||||||
|
'arguments': 'arguments',
|
||||||
|
'at char %s': 'код слова %s',
|
||||||
|
'at line %s': 'на линији %s',
|
||||||
|
'ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.': 'ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.',
|
||||||
|
'back': 'назад',
|
||||||
|
'Basics': 'Основе',
|
||||||
|
'Begin': 'Почетак',
|
||||||
|
'cache, errors and sessions cleaned': 'кеш, грешке и сесије су обрисани',
|
||||||
|
'can be a git repo': 'може бити git repo',
|
||||||
|
'cannot upload file "%(filename)s"': 'не мофу отпремити датотеку "%(filename)s"',
|
||||||
|
'Change admin password': 'Промијени лзинку администратора',
|
||||||
|
'check all': 'check all',
|
||||||
|
'Check for upgrades': 'Провјери могућност надоградње',
|
||||||
|
'Checking for upgrades...': 'Провјеравам могућност надоградње...',
|
||||||
|
'Clean': 'Прочисти',
|
||||||
|
'Click row to expand traceback': 'Click row to expand traceback',
|
||||||
|
'code': 'код',
|
||||||
|
'collapse/expand all': 'сакрити/приказати све',
|
||||||
|
'Compile': 'Компајлирај',
|
||||||
|
'Controllers': 'Контролери',
|
||||||
|
'controllers': 'контролери',
|
||||||
|
'Count': 'Count',
|
||||||
|
'Create': 'Креирај',
|
||||||
|
'create file with filename:': 'Креирај датотеку под називом:',
|
||||||
|
'Create rules': 'Креирај правила',
|
||||||
|
'created by': 'израдио',
|
||||||
|
'crontab': 'crontab',
|
||||||
|
'currently running': 'тренутно покренут',
|
||||||
|
'currently saved or': 'тренутно сачувано или',
|
||||||
|
'database administration': 'администрација базе података',
|
||||||
|
'Debug': 'Debug',
|
||||||
|
'defines tables': 'дефинише табеле',
|
||||||
|
'delete': 'обриши',
|
||||||
|
'Delete': 'Обриши',
|
||||||
|
'delete all checked': 'delete all checked',
|
||||||
|
'Delete this file (you will be asked to confirm deletion)': 'Обриши ову даатотеку (бићете упитани за потврду брисања)',
|
||||||
|
'Deploy': 'Постави',
|
||||||
|
'Deploy on Google App Engine': 'Постави на Google App Engine',
|
||||||
|
'Deploy to OpenShift': 'Постави на OpenShift',
|
||||||
|
'Detailed traceback description': 'Detailed traceback description',
|
||||||
|
'direction: ltr': 'direction: ltr',
|
||||||
|
'Disable': 'Искључи',
|
||||||
|
'docs': 'документација',
|
||||||
|
'download layouts': 'преузми layouts',
|
||||||
|
'download plugins': 'преузми plugins',
|
||||||
|
'Edit': 'Уређивање',
|
||||||
|
'edit all': 'уреди све',
|
||||||
|
'Edit application': 'Уреди апликацију',
|
||||||
|
'edit controller': 'уреди контролер',
|
||||||
|
'edit views:': 'уреди views:',
|
||||||
|
'Editing file "%s"': 'Уређивање датотеке "%s"',
|
||||||
|
'Editing Language file': 'Уређивање језичке датотеке',
|
||||||
|
'Error': 'Грешка',
|
||||||
|
'Error logs for "%(app)s"': 'Преглед грешака за "%(app)s"',
|
||||||
|
'Error snapshot': 'Error snapshot',
|
||||||
|
'Error ticket': 'Error ticket',
|
||||||
|
'Errors': 'Грешке',
|
||||||
|
'Exception instance attributes': 'Exception instance attributes',
|
||||||
|
'Expand Abbreviation': 'Expand Abbreviation',
|
||||||
|
'exposes': 'exposes',
|
||||||
|
'exposes:': 'exposes:',
|
||||||
|
'extends': 'проширује',
|
||||||
|
'failed to compile file because:': 'нисам могао да компајлирам због:',
|
||||||
|
'File': 'Датотека',
|
||||||
|
'file does not exist': 'датотека не постоји',
|
||||||
|
'file saved on %s': 'датотека сачувана на %s',
|
||||||
|
'filter': 'филтер',
|
||||||
|
'Find Next': 'Пронађи сљедећи',
|
||||||
|
'Find Previous': 'Пронађи претходни',
|
||||||
|
'Frames': 'Frames',
|
||||||
|
'Functions with no doctests will result in [passed] tests.': 'Functions with no doctests will result in [passed] tests.',
|
||||||
|
'Generate': 'Generate',
|
||||||
|
'Get from URL:': 'Преузми са странице:',
|
||||||
|
'Git Pull': 'Git Pull',
|
||||||
|
'Git Push': 'Git Push',
|
||||||
|
'Go to Matching Pair': 'Go to Matching Pair',
|
||||||
|
'go!': 'крени!',
|
||||||
|
'Help': 'Помоћ',
|
||||||
|
'Hide/Show Translated strings': 'Сакрити/Приказати преведене ријечи',
|
||||||
|
'If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.\nA green title indicates that all tests (if defined) passed. In this case test results are not shown.': 'If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.\nA green title indicates that all tests (if defined) passed. In this case test results are not shown.',
|
||||||
|
'includes': 'укључује',
|
||||||
|
'inspect attributes': 'inspect attributes',
|
||||||
|
'Install': 'Инсталирај',
|
||||||
|
'Installed applications': 'Инсталиране апликације',
|
||||||
|
'invalid password.': 'погрешна лозинка.',
|
||||||
|
'Key bindings': 'Пречице',
|
||||||
|
'Key bindings for ZenCoding Plugin': 'Пречице за ZenCoding Plugin',
|
||||||
|
'Language files (static strings) updated': 'Језичке датотеке су ажуриране',
|
||||||
|
'languages': 'језици',
|
||||||
|
'Languages': 'Језици',
|
||||||
|
'Last saved on:': 'Посљедња измјена:',
|
||||||
|
'License for': 'Лиценца за',
|
||||||
|
'loading...': 'преузимам...',
|
||||||
|
'locals': 'locals',
|
||||||
|
'Login': 'Пријава',
|
||||||
|
'Login to the Administrative Interface': 'Пријава за административни интерфејс',
|
||||||
|
'Logout': 'Излаз',
|
||||||
|
'Match Pair': 'Match Pair',
|
||||||
|
'Merge Lines': 'Споји линије',
|
||||||
|
'models': 'models',
|
||||||
|
'Models': 'Models',
|
||||||
|
'Modules': 'Modules',
|
||||||
|
'modules': 'modules',
|
||||||
|
'New Application Wizard': 'Чаробњак за нове апликације',
|
||||||
|
'New application wizard': 'Чаробњак за нове апликације',
|
||||||
|
'New simple application': 'Нова једноставна апликација',
|
||||||
|
'Next Edit Point': 'Next Edit Point',
|
||||||
|
'No ticket_storage.txt found under /private folder': 'No ticket_storage.txt found under /private folder',
|
||||||
|
'online designer': 'онлајн дизајнер',
|
||||||
|
'Original/Translation': 'Оргинал/Превод',
|
||||||
|
'Overwrite installed app': 'Пребриши постојећу апликацију',
|
||||||
|
'Pack all': 'Запакуј све',
|
||||||
|
'Peeking at file': 'Peeking at file',
|
||||||
|
'Plugins': 'Plugins',
|
||||||
|
'plugins': 'plugins',
|
||||||
|
'Plural-Forms:': 'Plural-Forms:',
|
||||||
|
'Powered by': 'Омогућио',
|
||||||
|
'Previous Edit Point': 'Previous Edit Point',
|
||||||
|
'Private files': 'Private files',
|
||||||
|
'private files': 'private files',
|
||||||
|
'Project Progress': 'Напредак пројекта',
|
||||||
|
'Reload routes': 'Обнови преусмјерења',
|
||||||
|
'Removed Breakpoint on %s at line %s': 'Removed Breakpoint on %s at line %s',
|
||||||
|
'Replace': 'Замијени',
|
||||||
|
'Replace All': 'Замијени све',
|
||||||
|
'request': 'request',
|
||||||
|
'response': 'response',
|
||||||
|
'restart': 'restart',
|
||||||
|
'restore': 'restore',
|
||||||
|
'revert': 'revert',
|
||||||
|
'rules are not defined': 'правила нису дефинисана',
|
||||||
|
'rules:': 'правила:',
|
||||||
|
"Run tests in this file (to run all files, you may also use the button labelled 'test')": "Run tests in this file (to run all files, you may also use the button labelled 'test')",
|
||||||
|
'Running on %s': 'Покренути на %s',
|
||||||
|
'Save': 'Сачувај',
|
||||||
|
'Save via Ajax': 'сачувај via Ajax',
|
||||||
|
'Saved file hash:': 'Сачувано као хаш:',
|
||||||
|
'session': 'сесија',
|
||||||
|
'session expired': 'сесија истекла',
|
||||||
|
'Set Breakpoint on %s at line %s: %s': 'Set Breakpoint on %s at line %s: %s',
|
||||||
|
'shell': 'shell',
|
||||||
|
'Site': 'Сајт',
|
||||||
|
'skip to generate': 'skip to generate',
|
||||||
|
'Start a new app': 'Покрени нову апликацију',
|
||||||
|
'Start searching': 'Покрени претрагу',
|
||||||
|
'Start wizard': 'Покрени чаробњака',
|
||||||
|
'static': 'static',
|
||||||
|
'Static files': 'Static files',
|
||||||
|
'Step': 'Корак',
|
||||||
|
'Submit': 'Прихвати',
|
||||||
|
'successful': 'успјешан',
|
||||||
|
'test': 'тест',
|
||||||
|
'Testing application': 'Тестирање апликације',
|
||||||
|
'The application logic, each URL path is mapped in one exposed function in the controller': 'The application logic, each URL path is mapped in one exposed function in the controller',
|
||||||
|
'The data representation, define database tables and sets': 'The data representation, define database tables and sets',
|
||||||
|
'The presentations layer, views are also known as templates': 'The presentations layer, views are also known as templates',
|
||||||
|
'There are no models': 'There are no models',
|
||||||
|
'There are no plugins': 'There are no plugins',
|
||||||
|
'There are no private files': 'There are no private files',
|
||||||
|
'These files are not served, they are only available from within your app': 'These files are not served, they are only available from within your app',
|
||||||
|
'These files are served without processing, your images go here': 'These files are served without processing, your images go here',
|
||||||
|
'Ticket ID': 'Ticket ID',
|
||||||
|
'Ticket Missing': 'Ticket nedostaje',
|
||||||
|
'to previous version.': 'на претходну верзију.',
|
||||||
|
'To create a plugin, name a file/folder plugin_[name]': 'To create a plugin, name a file/folder plugin_[name]',
|
||||||
|
'toggle breakpoint': 'toggle breakpoint',
|
||||||
|
'Toggle Fullscreen': 'Toggle Fullscreen',
|
||||||
|
'Traceback': 'Traceback',
|
||||||
|
'Translation strings for the application': 'Ријечи у апликацији које треба превести',
|
||||||
|
'Try the mobile interface': 'Пробај мобилни интерфејс',
|
||||||
|
'try view': 'try view',
|
||||||
|
'uncheck all': 'uncheck all',
|
||||||
|
'Uninstall': 'Деинсталирај',
|
||||||
|
'update': 'ажурирај',
|
||||||
|
'update all languages': 'ажурирај све језике',
|
||||||
|
'upload': 'Отпреми',
|
||||||
|
'Upload a package:': 'Преузми пакет:',
|
||||||
|
'Upload and install packed application': 'Преузми и инсталирај запаковану апликацију',
|
||||||
|
'upload file:': 'преузми датотеку:',
|
||||||
|
'upload plugin file:': 'преузми плагин датотеку:',
|
||||||
|
'variables': 'variables',
|
||||||
|
'Version': 'Верзија',
|
||||||
|
'Version %s.%s.%s (%s) %s': 'Верзија %s.%s.%s (%s) %s',
|
||||||
|
'Versioning': 'Versioning',
|
||||||
|
'views': 'views',
|
||||||
|
'Views': 'Views',
|
||||||
|
'Web Framework': 'Web Framework',
|
||||||
|
'web2py is up to date': 'web2py је ажуран',
|
||||||
|
'web2py Recent Tweets': 'web2py Recent Tweets',
|
||||||
|
'Wrap with Abbreviation': 'Wrap with Abbreviation',
|
||||||
|
}
|
||||||
@@ -0,0 +1,212 @@
|
|||||||
|
# coding: utf8
|
||||||
|
{
|
||||||
|
'!langcode!': 'sr-lt',
|
||||||
|
'!langname!': 'Srpski (Latinica)',
|
||||||
|
'%Y-%m-%d': '%d-%m-%Y',
|
||||||
|
'%Y-%m-%d %H:%M:%S': '%d-%m-%Y %H:%M:%S',
|
||||||
|
'(requires internet access)': '(zahtijeva pristup internetu)',
|
||||||
|
'(something like "it-it")': '(nešto kao "it-it")',
|
||||||
|
'@markmin\x01(file **gluon/contrib/plural_rules/%s.py** is not found)': '(datoteka **gluon/contrib/plural_rules/%s.py** nije pronađena)',
|
||||||
|
'About': 'Informacije',
|
||||||
|
'About application': 'O aplikaciji',
|
||||||
|
'Additional code for your application': 'Dodatni kod za aplikaciju',
|
||||||
|
'admin disabled because unable to access password file': 'administracija onemogućena jer ne mogu pristupiti datoteci sa lozinkom',
|
||||||
|
'Admin language': 'Jezik administratora',
|
||||||
|
'administrative interface': 'administrativni interfejs',
|
||||||
|
'Administrator Password:': 'Lozinka administratora:',
|
||||||
|
'and rename it:': 'i preimenuj u:',
|
||||||
|
'Application name:': 'Naziv aplikacije:',
|
||||||
|
'are not used': 'nije korišteno',
|
||||||
|
'are not used yet': 'nije još korišteno',
|
||||||
|
'Are you sure you want to delete this object?': 'Da li ste sigurni da želite obrisati?',
|
||||||
|
'arguments': 'arguments',
|
||||||
|
'at char %s': 'kod slova %s',
|
||||||
|
'at line %s': 'na liniji %s',
|
||||||
|
'ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.': 'ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.',
|
||||||
|
'back': 'nazad',
|
||||||
|
'Basics': 'Osnove',
|
||||||
|
'Begin': 'Početak',
|
||||||
|
'cache, errors and sessions cleaned': 'keš, greške i sesije su obrisani',
|
||||||
|
'can be a git repo': 'može biti git repo',
|
||||||
|
'cannot upload file "%(filename)s"': 'ne mogu otpremiti datoteku "%(filename)s"',
|
||||||
|
'Change admin password': 'Promijeni lozinku administratora',
|
||||||
|
'check all': 'check all',
|
||||||
|
'Check for upgrades': 'Provjeri mogućnost nadogradnje',
|
||||||
|
'Checking for upgrades...': 'Provjeravam mogućnost nadogradnje...',
|
||||||
|
'Clean': 'Pročisti',
|
||||||
|
'Click row to expand traceback': 'Click row to expand traceback',
|
||||||
|
'code': 'kod',
|
||||||
|
'collapse/expand all': 'sakriti/prikazati sve',
|
||||||
|
'Compile': 'Kompajliraj',
|
||||||
|
'Controllers': 'Kontroleri',
|
||||||
|
'controllers': 'kontroleri',
|
||||||
|
'Count': 'Count',
|
||||||
|
'Create': 'Kreiraj',
|
||||||
|
'create file with filename:': 'Kreiraj datoteku pod nazivom:',
|
||||||
|
'Create rules': 'Kreiraj pravila',
|
||||||
|
'created by': 'izradio',
|
||||||
|
'crontab': 'crontab',
|
||||||
|
'currently running': 'trenutno pokrenut',
|
||||||
|
'currently saved or': 'trenutno sačuvano ili',
|
||||||
|
'database administration': 'administracija baze podataka',
|
||||||
|
'Debug': 'Debug',
|
||||||
|
'defines tables': 'definiše tabele',
|
||||||
|
'delete': 'obriši',
|
||||||
|
'Delete': 'Obriši',
|
||||||
|
'delete all checked': 'delete all checked',
|
||||||
|
'Delete this file (you will be asked to confirm deletion)': 'Obriši ovu datoteku (bićete upitani za potvrdu brisanja)',
|
||||||
|
'Deploy': 'Postavi',
|
||||||
|
'Deploy on Google App Engine': 'Postavi na Google App Engine',
|
||||||
|
'Deploy to OpenShift': 'Postavi na OpenShift',
|
||||||
|
'Detailed traceback description': 'Detailed traceback description',
|
||||||
|
'direction: ltr': 'direction: ltr',
|
||||||
|
'Disable': 'Isključi',
|
||||||
|
'docs': 'dokumentacija',
|
||||||
|
'download layouts': 'preuzmi layouts',
|
||||||
|
'download plugins': 'preuzmi plugins',
|
||||||
|
'Edit': 'Uređivanje',
|
||||||
|
'edit all': 'uredi sve',
|
||||||
|
'Edit application': 'Uredi aplikaciju',
|
||||||
|
'edit controller': 'uredi controller',
|
||||||
|
'edit views:': 'uredi views:',
|
||||||
|
'Editing file "%s"': 'Uređivanje datoteke "%s"',
|
||||||
|
'Editing Language file': 'Uređivanje jezičke datoteke',
|
||||||
|
'Error': 'Greška',
|
||||||
|
'Error logs for "%(app)s"': 'Pregled grešaka za "%(app)s"',
|
||||||
|
'Error snapshot': 'Error snapshot',
|
||||||
|
'Error ticket': 'Error ticket',
|
||||||
|
'Errors': 'Greške',
|
||||||
|
'Exception instance attributes': 'Exception instance attributes',
|
||||||
|
'Expand Abbreviation': 'Expand Abbreviation',
|
||||||
|
'exposes': 'exposes',
|
||||||
|
'exposes:': 'exposes:',
|
||||||
|
'extends': 'proširuje',
|
||||||
|
'failed to compile file because:': 'nisam mogao da kompajliram zbog:',
|
||||||
|
'File': 'Datoteka',
|
||||||
|
'file does not exist': 'datoteka ne postoji',
|
||||||
|
'file saved on %s': 'datoteka sačuvana na %s',
|
||||||
|
'filter': 'filter',
|
||||||
|
'Find Next': 'Pronađi sljedeći',
|
||||||
|
'Find Previous': 'Pronađi prethodni',
|
||||||
|
'Frames': 'Frames',
|
||||||
|
'Functions with no doctests will result in [passed] tests.': 'Functions with no doctests will result in [passed] tests.',
|
||||||
|
'Generate': 'Generate',
|
||||||
|
'Get from URL:': 'Preuzmi sa stranice:',
|
||||||
|
'Git Pull': 'Git Pull',
|
||||||
|
'Git Push': 'Git Push',
|
||||||
|
'Go to Matching Pair': 'Go to Matching Pair',
|
||||||
|
'go!': 'kreni!',
|
||||||
|
'Help': 'Pomoć',
|
||||||
|
'Hide/Show Translated strings': 'Sakriti/Prikazati prevedene riječi',
|
||||||
|
'If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.\nA green title indicates that all tests (if defined) passed. In this case test results are not shown.': 'If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.\nA green title indicates that all tests (if defined) passed. In this case test results are not shown.',
|
||||||
|
'includes': 'uključuje',
|
||||||
|
'inspect attributes': 'inspect attributes',
|
||||||
|
'Install': 'Instaliraj',
|
||||||
|
'Installed applications': 'Instalirane aplikacije',
|
||||||
|
'invalid password.': 'pogrešna lozinka.',
|
||||||
|
'Key bindings': 'Prečice',
|
||||||
|
'Key bindings for ZenCoding Plugin': 'Prečice za for ZenCoding Plugin',
|
||||||
|
'Language files (static strings) updated': 'Jezičke datoteke su ažurirane',
|
||||||
|
'languages': 'jezici',
|
||||||
|
'Languages': 'Jezici',
|
||||||
|
'Last saved on:': 'Posljednja izmjena:',
|
||||||
|
'License for': 'Licenca za',
|
||||||
|
'loading...': 'preuzimam...',
|
||||||
|
'locals': 'locals',
|
||||||
|
'Login': 'Prijava',
|
||||||
|
'Login to the Administrative Interface': 'Prijava za administrativni interfejs',
|
||||||
|
'Logout': 'Izlaz',
|
||||||
|
'Match Pair': 'Match Pair',
|
||||||
|
'Merge Lines': 'Spoji linije',
|
||||||
|
'models': 'models',
|
||||||
|
'Models': 'Models',
|
||||||
|
'Modules': 'Modules',
|
||||||
|
'modules': 'modules',
|
||||||
|
'New Application Wizard': 'Čarobnjak za nove aplikacije',
|
||||||
|
'New application wizard': 'Čarobnjak za nove aplikacije',
|
||||||
|
'New simple application': 'Nova jednostavna aplikacija',
|
||||||
|
'Next Edit Point': 'Next Edit Point',
|
||||||
|
'No ticket_storage.txt found under /private folder': 'No ticket_storage.txt found under /private folder',
|
||||||
|
'online designer': 'onlajn dizajner',
|
||||||
|
'Original/Translation': 'Original/Prevod',
|
||||||
|
'Overwrite installed app': 'Prebriši postojeću aplikaciju',
|
||||||
|
'Pack all': 'Zapakuj sve',
|
||||||
|
'Peeking at file': 'Peeking at file',
|
||||||
|
'Plugins': 'Plugins',
|
||||||
|
'plugins': 'plugins',
|
||||||
|
'Plural-Forms:': 'Plural-Forms:',
|
||||||
|
'Powered by': 'Omogućio',
|
||||||
|
'Previous Edit Point': 'Previous Edit Point',
|
||||||
|
'Private files': 'Private files',
|
||||||
|
'private files': 'private files',
|
||||||
|
'Project Progress': 'Napredak projekta',
|
||||||
|
'Reload routes': 'Obnovi preusmjerenja',
|
||||||
|
'Removed Breakpoint on %s at line %s': 'Removed Breakpoint on %s at line %s',
|
||||||
|
'Replace': 'Zamijeni',
|
||||||
|
'Replace All': 'Zamijeni sve',
|
||||||
|
'request': 'request',
|
||||||
|
'response': 'response',
|
||||||
|
'restart': 'restart',
|
||||||
|
'restore': 'restore',
|
||||||
|
'revert': 'revert',
|
||||||
|
'rules are not defined': 'pravila nisu definisana',
|
||||||
|
'rules:': 'pravila:',
|
||||||
|
"Run tests in this file (to run all files, you may also use the button labelled 'test')": "Run tests in this file (to run all files, you may also use the button labelled 'test')",
|
||||||
|
'Running on %s': 'Pokrenuto na %s',
|
||||||
|
'Save': 'Sačuvaj',
|
||||||
|
'Save via Ajax': 'Sačuvaj via Ajax',
|
||||||
|
'Saved file hash:': 'Sačuvano kao haš:',
|
||||||
|
'session': 'sesija',
|
||||||
|
'session expired': 'sesija istekla',
|
||||||
|
'Set Breakpoint on %s at line %s: %s': 'Set Breakpoint on %s at line %s: %s',
|
||||||
|
'shell': 'shell',
|
||||||
|
'Site': 'Sajt',
|
||||||
|
'skip to generate': 'skip to generate',
|
||||||
|
'Start a new app': 'Pokreni novu aplikaciju',
|
||||||
|
'Start searching': 'Pokreni pretragu',
|
||||||
|
'Start wizard': 'Pokreni čarobnjaka',
|
||||||
|
'static': 'static',
|
||||||
|
'Static files': 'Static files',
|
||||||
|
'Step': 'Korak',
|
||||||
|
'Submit': 'Prihvati',
|
||||||
|
'successful': 'uspješan',
|
||||||
|
'test': 'test',
|
||||||
|
'Testing application': 'Testing application',
|
||||||
|
'The application logic, each URL path is mapped in one exposed function in the controller': 'The application logic, each URL path is mapped in one exposed function in the controller',
|
||||||
|
'The data representation, define database tables and sets': 'The data representation, define database tables and sets',
|
||||||
|
'The presentations layer, views are also known as templates': 'The presentations layer, views are also known as templates',
|
||||||
|
'There are no models': 'There are no models',
|
||||||
|
'There are no plugins': 'There are no plugins',
|
||||||
|
'There are no private files': 'There are no private files',
|
||||||
|
'These files are not served, they are only available from within your app': 'These files are not served, they are only available from within your app',
|
||||||
|
'These files are served without processing, your images go here': 'These files are served without processing, your images go here',
|
||||||
|
'Ticket ID': 'Ticket ID',
|
||||||
|
'Ticket Missing': 'Ticket nedostaje',
|
||||||
|
'to previous version.': 'na prethodnu verziju.',
|
||||||
|
'To create a plugin, name a file/folder plugin_[name]': 'To create a plugin, name a file/folder plugin_[name]',
|
||||||
|
'toggle breakpoint': 'toggle breakpoint',
|
||||||
|
'Toggle Fullscreen': 'Toggle Fullscreen',
|
||||||
|
'Traceback': 'Traceback',
|
||||||
|
'Translation strings for the application': 'Riječi u aplikaciji koje treba prevesti',
|
||||||
|
'Try the mobile interface': 'Probaj mobilni interfejs',
|
||||||
|
'try view': 'try view',
|
||||||
|
'uncheck all': 'uncheck all',
|
||||||
|
'Uninstall': 'Deinstaliraj',
|
||||||
|
'update': 'ažuriraj',
|
||||||
|
'update all languages': 'ažuriraj sve jezike',
|
||||||
|
'upload': 'Otpremi',
|
||||||
|
'Upload a package:': 'Preuzmi paket:',
|
||||||
|
'Upload and install packed application': 'Preuzmi i instaliraj zapakovanu aplikaciju',
|
||||||
|
'upload file:': 'preuzmi datoteku:',
|
||||||
|
'upload plugin file:': 'preuzmi plugin datoteku:',
|
||||||
|
'variables': 'variables',
|
||||||
|
'Version': 'Verzija',
|
||||||
|
'Version %s.%s.%s (%s) %s': 'Verzija %s.%s.%s (%s) %s',
|
||||||
|
'Versioning': 'Versioning',
|
||||||
|
'views': 'views',
|
||||||
|
'Views': 'Views',
|
||||||
|
'Web Framework': 'Web Framework',
|
||||||
|
'web2py is up to date': 'web2py je ažuran',
|
||||||
|
'web2py Recent Tweets': 'web2py Recent Tweets',
|
||||||
|
'Wrap with Abbreviation': 'Wrap with Abbreviation',
|
||||||
|
}
|
||||||
@@ -34,10 +34,12 @@
|
|||||||
'App does not exist or your are not authorized': 'Додаток не існує, або ви не авторизовані',
|
'App does not exist or your are not authorized': 'Додаток не існує, або ви не авторизовані',
|
||||||
'appadmin': 'Aдм.панель',
|
'appadmin': 'Aдм.панель',
|
||||||
'appadmin is disabled because insecure channel': "адмін.панель відключено через використання ненадійного каналу зв'язку",
|
'appadmin is disabled because insecure channel': "адмін.панель відключено через використання ненадійного каналу зв'язку",
|
||||||
|
'Application': 'Додаток (Application)',
|
||||||
'application "%s" uninstalled': 'додаток "%s" вилучено',
|
'application "%s" uninstalled': 'додаток "%s" вилучено',
|
||||||
'application %(appname)s installed with md5sum: %(digest)s': 'додаток %(appname)s встановлено з md5sum: %(digest)s',
|
'application %(appname)s installed with md5sum: %(digest)s': 'додаток %(appname)s встановлено з md5sum: %(digest)s',
|
||||||
'Application cannot be generated in demo mode': 'В демо-режимі генерувати додатки не можна',
|
'Application cannot be generated in demo mode': 'В демо-режимі генерувати додатки не можна',
|
||||||
'application compiled': 'додаток скомпільовано',
|
'application compiled': 'додаток скомпільовано',
|
||||||
|
'Application exists already': 'Додаток вже існує',
|
||||||
'application is compiled and cannot be designed': 'додаток скомпільований. налаштування змінювати не можна',
|
'application is compiled and cannot be designed': 'додаток скомпільований. налаштування змінювати не можна',
|
||||||
'Application name:': 'Назва додатку:',
|
'Application name:': 'Назва додатку:',
|
||||||
'are not used': 'не використовуються',
|
'are not used': 'не використовуються',
|
||||||
@@ -160,6 +162,7 @@
|
|||||||
'Error snapshot': 'Розгорнутий знімок стану (Error snapshot)',
|
'Error snapshot': 'Розгорнутий знімок стану (Error snapshot)',
|
||||||
'Error ticket': 'Позначка (ticket) про помилку',
|
'Error ticket': 'Позначка (ticket) про помилку',
|
||||||
'Errors': 'Помилки',
|
'Errors': 'Помилки',
|
||||||
|
'Errors in form, please check it out.': 'Помилка у формі, будь-ласка перевірте її.',
|
||||||
'Exception %(extype)s: %(exvalue)s': 'Виключення %(extype)s: %(exvalue)s',
|
'Exception %(extype)s: %(exvalue)s': 'Виключення %(extype)s: %(exvalue)s',
|
||||||
'Exception %s': 'Виключення %s',
|
'Exception %s': 'Виключення %s',
|
||||||
'Exception instance attributes': 'Атрибути примірника класу Exception (виключення)',
|
'Exception instance attributes': 'Атрибути примірника класу Exception (виключення)',
|
||||||
@@ -388,6 +391,7 @@
|
|||||||
'There are no models': 'Моделей, наразі, нема',
|
'There are no models': 'Моделей, наразі, нема',
|
||||||
'There are no modules': 'Модулів поки що нема',
|
'There are no modules': 'Модулів поки що нема',
|
||||||
'There are no plugins': 'Жодної втулки, наразі, не встановлено',
|
'There are no plugins': 'Жодної втулки, наразі, не встановлено',
|
||||||
|
'There are no private files': 'Приватних файлів поки що нема',
|
||||||
'There are no static files': 'Статичних файлів, наразі, нема',
|
'There are no static files': 'Статичних файлів, наразі, нема',
|
||||||
'There are no translators': 'Перекладів нема',
|
'There are no translators': 'Перекладів нема',
|
||||||
'There are no translators, only default language is supported': 'Перекладів нема, підтримується тільки мова оригіналу',
|
'There are no translators, only default language is supported': 'Перекладів нема, підтримується тільки мова оригіналу',
|
||||||
@@ -418,6 +422,7 @@
|
|||||||
'Traceback': 'Стек викликів (Traceback)',
|
'Traceback': 'Стек викликів (Traceback)',
|
||||||
'Translation strings for the application': 'Пари рядків <оригінал>:<переклад> для вибраної мови',
|
'Translation strings for the application': 'Пари рядків <оригінал>:<переклад> для вибраної мови',
|
||||||
'try something like': 'спробуйте щось схоже на',
|
'try something like': 'спробуйте щось схоже на',
|
||||||
|
'Try the mobile interface': 'Спробуйте мобільний інтерфейс',
|
||||||
'try view': 'дивитись результат',
|
'try view': 'дивитись результат',
|
||||||
'Type PDB debugger command in here and hit Return (Enter) to execute it.': 'наберіть тут будь-які команди ладнача PDB і натисніть клавішу [Return] ([Enter]), щоб запустити їх на виконання.',
|
'Type PDB debugger command in here and hit Return (Enter) to execute it.': 'наберіть тут будь-які команди ладнача PDB і натисніть клавішу [Return] ([Enter]), щоб запустити їх на виконання.',
|
||||||
'Type python statement in here and hit Return (Enter) to execute it.': 'Наберіть тут будь-які вирази Python і натисніть клавішу [Return] ([Enter]), щоб запустити їх на виконання.',
|
'Type python statement in here and hit Return (Enter) to execute it.': 'Наберіть тут будь-які вирази Python і натисніть клавішу [Return] ([Enter]), щоб запустити їх на виконання.',
|
||||||
@@ -463,7 +468,7 @@
|
|||||||
'Views': 'Відображення (Views)',
|
'Views': 'Відображення (Views)',
|
||||||
'views': 'відображення',
|
'views': 'відображення',
|
||||||
'WARNING:': 'ПОПЕРЕДЖЕННЯ:',
|
'WARNING:': 'ПОПЕРЕДЖЕННЯ:',
|
||||||
'Web Framework': 'Web Framework',
|
'Web Framework': 'Веб-каркас (Web Framework)',
|
||||||
'web2py apps to deploy': 'Готові до розгортання додатки web2py',
|
'web2py apps to deploy': 'Готові до розгортання додатки web2py',
|
||||||
'web2py Debugger': 'Ладнач web2py',
|
'web2py Debugger': 'Ладнач web2py',
|
||||||
'web2py downgrade': 'повернення на попередню версію web2py',
|
'web2py downgrade': 'повернення на попередню версію web2py',
|
||||||
|
|||||||
@@ -78,5 +78,3 @@ PLUGINS_APP = 'http://web2py.com/plugins'
|
|||||||
# set the language
|
# set the language
|
||||||
if 'adminLanguage' in request.cookies and not (request.cookies['adminLanguage'] is None):
|
if 'adminLanguage' in request.cookies and not (request.cookies['adminLanguage'] is None):
|
||||||
T.force(request.cookies['adminLanguage'].value)
|
T.force(request.cookies['adminLanguage'].value)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -28,5 +28,3 @@ from gluon.languages import findT, update_all_languages
|
|||||||
from gluon.myregex import *
|
from gluon.myregex import *
|
||||||
from gluon.restricted import *
|
from gluon.restricted import *
|
||||||
from gluon.compileapp import compile_application, remove_compiled_application
|
from gluon.compileapp import compile_application, remove_compiled_application
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
import base64, os, time
|
import base64
|
||||||
|
import os
|
||||||
|
import time
|
||||||
from gluon import portalocker
|
from gluon import portalocker
|
||||||
from gluon.admin import apath
|
from gluon.admin import apath
|
||||||
from gluon.fileutils import read_file
|
from gluon.fileutils import read_file
|
||||||
@@ -24,7 +26,8 @@ elif not request.is_local and not DEMO_MODE:
|
|||||||
try:
|
try:
|
||||||
_config = {}
|
_config = {}
|
||||||
port = int(request.env.server_port or 0)
|
port = int(request.env.server_port or 0)
|
||||||
restricted(read_file(apath('../parameters_%i.py' % port, request)), _config)
|
restricted(
|
||||||
|
read_file(apath('../parameters_%i.py' % port, request)), _config)
|
||||||
|
|
||||||
if not 'password' in _config or not _config['password']:
|
if not 'password' in _config or not _config['password']:
|
||||||
raise HTTP(200, T('admin disabled because no admin password'))
|
raise HTTP(200, T('admin disabled because no admin password'))
|
||||||
@@ -38,7 +41,8 @@ except IOError:
|
|||||||
raise HTTP(200,
|
raise HTTP(200,
|
||||||
T('admin disabled because not supported on google app engine'))
|
T('admin disabled because not supported on google app engine'))
|
||||||
else:
|
else:
|
||||||
raise HTTP(200, T('admin disabled because unable to access password file'))
|
raise HTTP(
|
||||||
|
200, T('admin disabled because unable to access password file'))
|
||||||
|
|
||||||
|
|
||||||
def verify_password(password):
|
def verify_password(password):
|
||||||
@@ -63,6 +67,7 @@ deny_file = os.path.join(request.folder, 'private', 'hosts.deny')
|
|||||||
allowed_number_of_attempts = 5
|
allowed_number_of_attempts = 5
|
||||||
expiration_failed_logins = 3600
|
expiration_failed_logins = 3600
|
||||||
|
|
||||||
|
|
||||||
def read_hosts_deny():
|
def read_hosts_deny():
|
||||||
import datetime
|
import datetime
|
||||||
hosts = {}
|
hosts = {}
|
||||||
@@ -83,6 +88,7 @@ def read_hosts_deny():
|
|||||||
f.close()
|
f.close()
|
||||||
return hosts
|
return hosts
|
||||||
|
|
||||||
|
|
||||||
def write_hosts_deny(denied_hosts):
|
def write_hosts_deny(denied_hosts):
|
||||||
f = open(deny_file, 'w')
|
f = open(deny_file, 'w')
|
||||||
portalocker.lock(f, portalocker.LOCK_EX)
|
portalocker.lock(f, portalocker.LOCK_EX)
|
||||||
@@ -93,6 +99,7 @@ def write_hosts_deny(denied_hosts):
|
|||||||
portalocker.unlock(f)
|
portalocker.unlock(f)
|
||||||
f.close()
|
f.close()
|
||||||
|
|
||||||
|
|
||||||
def login_record(success=True):
|
def login_record(success=True):
|
||||||
denied_hosts = read_hosts_deny()
|
denied_hosts = read_hosts_deny()
|
||||||
val = (0, 0)
|
val = (0, 0)
|
||||||
@@ -168,4 +175,3 @@ elif session.authorized and \
|
|||||||
if request.controller == 'appadmin' and DEMO_MODE:
|
if request.controller == 'appadmin' and DEMO_MODE:
|
||||||
session.flash = 'Appadmin disabled in demo mode'
|
session.flash = 'Appadmin disabled in demo mode'
|
||||||
redirect(URL('default', 'sites'))
|
redirect(URL('default', 'sites'))
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
|
||||||
def A_button(*a, **b):
|
def A_button(*a, **b):
|
||||||
b['_data-role'] = 'button'
|
b['_data-role'] = 'button'
|
||||||
b['_data-inline'] = 'true'
|
b['_data-inline'] = 'true'
|
||||||
@@ -11,7 +12,7 @@ def button(href, label):
|
|||||||
if is_mobile:
|
if is_mobile:
|
||||||
ret = A_button(SPAN(label), _href=href)
|
ret = A_button(SPAN(label), _href=href)
|
||||||
else:
|
else:
|
||||||
ret = A(SPAN(label),_class='button',_href=href)
|
ret = A(SPAN(label), _class='button btn', _href=href)
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
def button_enable(href, app):
|
def button_enable(href, app):
|
||||||
@@ -20,19 +21,20 @@ def button_enable(href, app):
|
|||||||
else:
|
else:
|
||||||
label = SPAN(T('Disable'), _style='color:green')
|
label = SPAN(T('Disable'), _style='color:green')
|
||||||
id = 'enable_' + app
|
id = 'enable_' + app
|
||||||
return A(label,_class='button',_id=id,callback=href,target=id)
|
return A(label, _class='button btn', _id=id, callback=href, target=id)
|
||||||
|
|
||||||
def sp_button(href, label):
|
def sp_button(href, label):
|
||||||
if request.user_agent().is_mobile:
|
if request.user_agent().is_mobile:
|
||||||
ret = A_button(SPAN(label), _href=href)
|
ret = A_button(SPAN(label), _href=href)
|
||||||
else:
|
else:
|
||||||
ret = A(SPAN(label),_class='button special',_href=href)
|
ret = A(SPAN(label), _class='button special btn btn-inverse', _href=href)
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
def helpicon():
|
def helpicon():
|
||||||
return IMG(_src=URL('static', 'images/help.png'), _alt='help')
|
return IMG(_src=URL('static', 'images/help.png'), _alt='help')
|
||||||
|
|
||||||
def searchbox(elementid):
|
def searchbox(elementid):
|
||||||
return TAG[''](LABEL(IMG(_id="search_start",_src=URL('static', 'images/search.png'), _alt=T('filter')), _class='icon', _for=elementid), ' ', INPUT(_id=elementid, _type='text', _size=12))
|
return SPAN(LABEL(IMG(_id="search_start", _src=URL('static', 'images/search.png'), _alt=T('filter')),
|
||||||
|
_class='icon', _for=elementid), ' ',
|
||||||
|
INPUT(_id=elementid, _type='text', _size=12, _class="input-medium"),
|
||||||
|
_class="searchbox")
|
||||||
@@ -4,9 +4,12 @@
|
|||||||
if MULTI_USER_MODE:
|
if MULTI_USER_MODE:
|
||||||
db = DAL('sqlite://storage.sqlite') # if not, use SQLite or other DB
|
db = DAL('sqlite://storage.sqlite') # if not, use SQLite or other DB
|
||||||
from gluon.tools import *
|
from gluon.tools import *
|
||||||
auth = Auth(globals(),db) # authentication/authorization
|
auth = Auth(
|
||||||
crud = Crud(globals(),db) # for CRUD helpers using auth
|
globals(), db) # authentication/authorization
|
||||||
service = Service(globals()) # for json, xml, jsonrpc, xmlrpc, amfrpc
|
crud = Crud(
|
||||||
|
globals(), db) # for CRUD helpers using auth
|
||||||
|
service = Service(
|
||||||
|
globals()) # for json, xml, jsonrpc, xmlrpc, amfrpc
|
||||||
plugins = PluginManager()
|
plugins = PluginManager()
|
||||||
|
|
||||||
mail = auth.settings.mailer
|
mail = auth.settings.mailer
|
||||||
@@ -29,6 +32,7 @@ if not session.authorized and MULTI_USER_MODE:
|
|||||||
elif not request.function == 'user':
|
elif not request.function == 'user':
|
||||||
redirect(URL('default', 'user/login'))
|
redirect(URL('default', 'user/login'))
|
||||||
|
|
||||||
|
|
||||||
def is_manager():
|
def is_manager():
|
||||||
if not MULTI_USER_MODE:
|
if not MULTI_USER_MODE:
|
||||||
return True
|
return True
|
||||||
@@ -36,5 +40,3 @@ def is_manager():
|
|||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -21,6 +21,12 @@ if request.vars.app or request.args:
|
|||||||
_c == 'mercurial' and _f == 'commit',
|
_c == 'mercurial' and _f == 'commit',
|
||||||
URL(_a, 'mercurial', 'commit', args=_t)))
|
URL(_a, 'mercurial', 'commit', args=_t)))
|
||||||
|
|
||||||
|
if os.path.exists('applications/examples'):
|
||||||
|
response.menu.append(
|
||||||
|
(T('Help'), False, URL('examples', 'default', 'documentation')))
|
||||||
|
else:
|
||||||
|
response.menu.append((T('Help'), False, 'http://web2py.com/examples/default/documentation'))
|
||||||
|
|
||||||
if not session.authorized:
|
if not session.authorized:
|
||||||
response.menu = [(T('Login'), True, URL('site'))]
|
response.menu = [(T('Login'), True, URL('site'))]
|
||||||
else:
|
else:
|
||||||
@@ -29,9 +35,3 @@ else:
|
|||||||
response.menu.append((T('Debug'), False,
|
response.menu.append((T('Debug'), False,
|
||||||
URL(_a, 'debug', 'interact')))
|
URL(_a, 'debug', 'interact')))
|
||||||
|
|
||||||
if os.path.exists('applications/examples'):
|
|
||||||
response.menu.append((T('Help'), False, URL('examples','default','index')))
|
|
||||||
else:
|
|
||||||
response.menu.append((T('Help'), False, 'http://web2py.com/examples'))
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
response.files.append(URL('static','plugin_multiselect/jquery.multi-select.js'))
|
response.files.append(
|
||||||
|
URL('static', 'plugin_multiselect/jquery.multi-select.js'))
|
||||||
response.files.append(URL('static', 'plugin_multiselect/multi-select.css'))
|
response.files.append(URL('static', 'plugin_multiselect/multi-select.css'))
|
||||||
response.files.append(URL('static', 'plugin_multiselect/start.js'))
|
response.files.append(URL('static', 'plugin_multiselect/start.js'))
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,2 +1 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,579 @@
|
|||||||
|
/*=============================================================
|
||||||
|
GENERAL
|
||||||
|
==============================================================*/
|
||||||
|
html,body{height:auto;background:transparent;}
|
||||||
|
/*=============================================================
|
||||||
|
CONTROLS
|
||||||
|
==============================================================*/
|
||||||
|
label,
|
||||||
|
input,
|
||||||
|
button,
|
||||||
|
select,
|
||||||
|
textarea,
|
||||||
|
button.btn
|
||||||
|
{
|
||||||
|
font-size:13px;
|
||||||
|
font-weight:normal;
|
||||||
|
line-height:18px;
|
||||||
|
}
|
||||||
|
textarea,
|
||||||
|
select
|
||||||
|
{
|
||||||
|
margin-bottom:9px;
|
||||||
|
}
|
||||||
|
select,
|
||||||
|
/*textarea,*/
|
||||||
|
input[type="text"],
|
||||||
|
input[type="password"],
|
||||||
|
input[type="datetime"],
|
||||||
|
input[type="datetime-local"],
|
||||||
|
input[type="date"],
|
||||||
|
input[type="month"],
|
||||||
|
input[type="time"],
|
||||||
|
input[type="week"],
|
||||||
|
input[type="number"],
|
||||||
|
input[type="email"],
|
||||||
|
input[type="url"],
|
||||||
|
input[type="search"],
|
||||||
|
input[type="tel"],
|
||||||
|
input[type="color"],
|
||||||
|
.uneditable-input,
|
||||||
|
a.btn-lnk
|
||||||
|
{
|
||||||
|
height:18px;
|
||||||
|
padding:4px;
|
||||||
|
font-size:13px;
|
||||||
|
line-height:18px;
|
||||||
|
}
|
||||||
|
.design h3,
|
||||||
|
.plugin h3
|
||||||
|
{
|
||||||
|
background-position:0 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
select,
|
||||||
|
input[type="file"]
|
||||||
|
{
|
||||||
|
height:28px;
|
||||||
|
line-height:28px;
|
||||||
|
}
|
||||||
|
input[type="submit"],
|
||||||
|
input[type="button"]
|
||||||
|
{
|
||||||
|
font-size:13px;
|
||||||
|
height:28px;
|
||||||
|
line-height:18px;
|
||||||
|
padding:4px 10px;
|
||||||
|
}
|
||||||
|
input[type="radio"],
|
||||||
|
input[type="checkbox"]
|
||||||
|
{
|
||||||
|
margin-top:2px;
|
||||||
|
}
|
||||||
|
.button.btn
|
||||||
|
{
|
||||||
|
line-height:1.25em;
|
||||||
|
font-size:inherit;
|
||||||
|
border:none;
|
||||||
|
text-shadow:none;
|
||||||
|
margin-bottom:0px;
|
||||||
|
-webkit-border-radius:0px;
|
||||||
|
-moz-border-radius:0px;
|
||||||
|
border-radius:0px;
|
||||||
|
-webkit-box-shadow:none;
|
||||||
|
-moz-box-shadow:none;
|
||||||
|
box-shadow:none);
|
||||||
|
}
|
||||||
|
.button.btn:hover
|
||||||
|
{
|
||||||
|
background-color:transparent;
|
||||||
|
-webkit-transition: background-position 0s linear;
|
||||||
|
-moz-transition: background-position 0s linear;
|
||||||
|
-o-transition: background-position 0s linear;
|
||||||
|
transition: background-position 0s linear;
|
||||||
|
}
|
||||||
|
form label
|
||||||
|
{
|
||||||
|
font-weight:bold;
|
||||||
|
}
|
||||||
|
.help
|
||||||
|
{
|
||||||
|
border-color:transparent;
|
||||||
|
}
|
||||||
|
/* tree menu */
|
||||||
|
.folder
|
||||||
|
{
|
||||||
|
border:none;
|
||||||
|
}
|
||||||
|
.folder>i
|
||||||
|
{
|
||||||
|
display:none;
|
||||||
|
}
|
||||||
|
.celled
|
||||||
|
{
|
||||||
|
padding-top: 2px;
|
||||||
|
}
|
||||||
|
.celled-one
|
||||||
|
{
|
||||||
|
padding-top: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.test h3
|
||||||
|
{
|
||||||
|
border:0;
|
||||||
|
padding-left:18px;
|
||||||
|
}
|
||||||
|
/*=============================================================
|
||||||
|
FLASH MESSAGEBOX
|
||||||
|
==============================================================*/
|
||||||
|
.flash
|
||||||
|
{
|
||||||
|
position:fixed;
|
||||||
|
width:50%;
|
||||||
|
top:49px;
|
||||||
|
left:25%;
|
||||||
|
right:25%;
|
||||||
|
cursor:default;
|
||||||
|
text-align:center;
|
||||||
|
padding:8px 35px 8px 14px;
|
||||||
|
z-index:5620;
|
||||||
|
}
|
||||||
|
.flash>.close
|
||||||
|
{
|
||||||
|
color:inherit;
|
||||||
|
opacity:0.7;
|
||||||
|
}
|
||||||
|
.flash>.close:hover
|
||||||
|
{
|
||||||
|
opacity:0.9;
|
||||||
|
}
|
||||||
|
/*=============================================================
|
||||||
|
NAVBAR
|
||||||
|
==============================================================*/
|
||||||
|
.navbar-fixed-top .navbar-inner,
|
||||||
|
.navbar-static-top .navbar-inner
|
||||||
|
{
|
||||||
|
/* in place of shadow image */
|
||||||
|
-webkit-box-shadow:0px 10px 20px rgba(195,195,195,1.0);
|
||||||
|
-moz-box-shadow: 0px 10px 20px rgba(195,195,195,1.0);
|
||||||
|
box-shadow: 0px 10px 20px rgba(195,195,195,1.0);
|
||||||
|
//zoom:1; /* IE6-9 */
|
||||||
|
filter:progid:DXImageTransform.Microsoft.DropShadow(OffX=0, OffY=10, Color=#000000); /* IE6-9 */
|
||||||
|
padding:0;
|
||||||
|
}
|
||||||
|
.navbar-inverse .navbar-inner
|
||||||
|
{
|
||||||
|
min-height:33px; /* required - override */
|
||||||
|
height:33px;
|
||||||
|
filter:progid:DXImageTransform.Microsoft.gradient(enabled=false); /* IE6-9 */
|
||||||
|
background:#292929 url(../images/header_bg.png) repeat-x;
|
||||||
|
border:none;
|
||||||
|
}
|
||||||
|
#header
|
||||||
|
{
|
||||||
|
background:transparent;
|
||||||
|
}
|
||||||
|
#header.navbar
|
||||||
|
{
|
||||||
|
overflow:visible;
|
||||||
|
}
|
||||||
|
.navbar-inverse .nav > li > a
|
||||||
|
{
|
||||||
|
padding:0;
|
||||||
|
line-height:1.25;
|
||||||
|
text-shadow:none;
|
||||||
|
}
|
||||||
|
.navbar .btn-navbar
|
||||||
|
{
|
||||||
|
padding:4px;
|
||||||
|
margin:5px 5px 0 5px;
|
||||||
|
}
|
||||||
|
#menu{margin-right:-7px;}
|
||||||
|
/*=============================================================
|
||||||
|
FOOTER
|
||||||
|
==============================================================*/
|
||||||
|
#footer
|
||||||
|
{
|
||||||
|
padding-bottom:0;
|
||||||
|
}
|
||||||
|
/*=============================================================
|
||||||
|
MAIN
|
||||||
|
==============================================================*/
|
||||||
|
#main
|
||||||
|
{
|
||||||
|
position:static;
|
||||||
|
padding-top:0;
|
||||||
|
padding-bottom:0;
|
||||||
|
}
|
||||||
|
/*=============================================================
|
||||||
|
SIDEBAR
|
||||||
|
==============================================================*/
|
||||||
|
.sidebar_inner
|
||||||
|
{
|
||||||
|
background:transparent;
|
||||||
|
padding:0;
|
||||||
|
min-width:auto;
|
||||||
|
}
|
||||||
|
.sidebar .box {
|
||||||
|
border-top:1px solid #EEE;
|
||||||
|
}
|
||||||
|
/*=============================================================
|
||||||
|
WIZARD
|
||||||
|
==============================================================*/
|
||||||
|
.step div.help li
|
||||||
|
{
|
||||||
|
line-height:inherit;
|
||||||
|
}
|
||||||
|
.ms-container .ms-selectable li.ms-elem-selectable,
|
||||||
|
.ms-container .ms-selection li.ms-elem-selected
|
||||||
|
{
|
||||||
|
font-size:13px;
|
||||||
|
}
|
||||||
|
.input-append a.btn
|
||||||
|
{
|
||||||
|
padding:4px;
|
||||||
|
height:18px;
|
||||||
|
font-size:13px;
|
||||||
|
line-height:18px;
|
||||||
|
}
|
||||||
|
/*=============================================================
|
||||||
|
ERRORS TABLE
|
||||||
|
==============================================================*/
|
||||||
|
.errors .table th
|
||||||
|
{
|
||||||
|
filter:progid:DXImageTransform.Microsoft.gradient(enabled=false); /* IE6-9 */
|
||||||
|
}
|
||||||
|
|
||||||
|
.tablebar span.help
|
||||||
|
{
|
||||||
|
font-weight:normal;
|
||||||
|
line-height:1.25em;
|
||||||
|
text-shadow:none;
|
||||||
|
width:auto;
|
||||||
|
}
|
||||||
|
/*=============================================================
|
||||||
|
TOOLTIP
|
||||||
|
==============================================================*/
|
||||||
|
.tooltip.in
|
||||||
|
{
|
||||||
|
opacity:1;
|
||||||
|
filter:alpha(opacity=100);
|
||||||
|
}
|
||||||
|
.tooltip-inner
|
||||||
|
{
|
||||||
|
opacity:1;
|
||||||
|
text-align:left;
|
||||||
|
background:#9fb364;
|
||||||
|
color:#eef1d9;
|
||||||
|
border:1px solid #eef1d9;
|
||||||
|
font-style:italic;
|
||||||
|
padding:0.3em;
|
||||||
|
-moz-border-radius:0.5em;
|
||||||
|
border-radius:0.5em;
|
||||||
|
font-size:13px;
|
||||||
|
text-transform:none;
|
||||||
|
}
|
||||||
|
.tooltip.right .tooltip-arrow,
|
||||||
|
.tooltip.left .tooltip-arrow
|
||||||
|
{
|
||||||
|
border-color:transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=============================================================
|
||||||
|
THE GRID
|
||||||
|
==============================================================*/
|
||||||
|
.w2p_grid_bottom_bar .w2p_export_menu
|
||||||
|
{
|
||||||
|
line-height:18px;
|
||||||
|
margin-left:0;
|
||||||
|
}
|
||||||
|
.w2p_export_menu .dropdown-toggle
|
||||||
|
{
|
||||||
|
cursor:pointer;
|
||||||
|
margin:0;
|
||||||
|
padding:0;
|
||||||
|
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(white), to(#E6E6E6));
|
||||||
|
background-image: -webkit-linear-gradient(top, white, #E6E6E6);
|
||||||
|
background-image: -o-linear-gradient(top, white, #E6E6E6);
|
||||||
|
background-image: linear-gradient(to bottom, white, #E6E6E6);
|
||||||
|
background-image: -moz-linear-gradient(top, white, #E6E6E6);
|
||||||
|
}
|
||||||
|
.w2p_export_menu ul
|
||||||
|
{
|
||||||
|
margin-top:2px;
|
||||||
|
display:none;
|
||||||
|
}
|
||||||
|
.w2p_export_menu li
|
||||||
|
{
|
||||||
|
display:list-item;
|
||||||
|
margin:0;
|
||||||
|
}
|
||||||
|
div.web2py_grid
|
||||||
|
{
|
||||||
|
font-size:13px;
|
||||||
|
line-height:18px;
|
||||||
|
}
|
||||||
|
.web2py_grid a.btn
|
||||||
|
{
|
||||||
|
font-size:13px;
|
||||||
|
line-height:18px;
|
||||||
|
padding:4px 10px;
|
||||||
|
margin-left:0;
|
||||||
|
margin-right:4px;
|
||||||
|
|
||||||
|
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
|
||||||
|
background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
|
||||||
|
background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
|
||||||
|
background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
|
||||||
|
background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
|
||||||
|
}
|
||||||
|
.web2py_grid .input-append .btn
|
||||||
|
{
|
||||||
|
padding:4px 10px;
|
||||||
|
margin-right:0;
|
||||||
|
font-family:inherit;
|
||||||
|
color:#333;
|
||||||
|
text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);
|
||||||
|
border:1px solid #c5c5c5;
|
||||||
|
}
|
||||||
|
.web2py_grid select:focus
|
||||||
|
{
|
||||||
|
border-color:rgba(232,149,60,0.8);
|
||||||
|
outline:0;
|
||||||
|
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(232, 149, 60, 0.6);
|
||||||
|
-moz-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(232,149,60,0.6);
|
||||||
|
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(232, 149, 60, 0.6);
|
||||||
|
}
|
||||||
|
.web2py_console input[type="button"],
|
||||||
|
.web2py_grid .row_buttons a.btn
|
||||||
|
{
|
||||||
|
color:#333;
|
||||||
|
line-height:18px;
|
||||||
|
padding:4px 10px;
|
||||||
|
text-shadow:rgba(255, 255, 255, 0.74902) 0px 1px 1px;
|
||||||
|
border-color:rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25);
|
||||||
|
-webkit-border-radius: 4px;
|
||||||
|
-moz-border-radius: 4px;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
.web2py_console input[type="button"]:hover,
|
||||||
|
.web2py_grid .row_buttons a.btn:hover
|
||||||
|
{
|
||||||
|
color:#333;
|
||||||
|
border-color:rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25);
|
||||||
|
background:#E6E6E6;
|
||||||
|
background-position: 0 -15px !important;
|
||||||
|
-webkit-transition: background-position .1s linear;
|
||||||
|
-moz-transition: background-position .1s linear;
|
||||||
|
-o-transition: background-position .1s linear;
|
||||||
|
transition: background-position .1s linear;
|
||||||
|
}
|
||||||
|
.web2py_table
|
||||||
|
{
|
||||||
|
border:none;
|
||||||
|
}
|
||||||
|
.web2py_table table
|
||||||
|
{
|
||||||
|
/*table-layout:fixed;*/
|
||||||
|
margin-bottom:4px;
|
||||||
|
}
|
||||||
|
.web2py_table table td
|
||||||
|
{
|
||||||
|
/*word-wrap:break-word;*/ /*uncomment when "table-layout:fixed" is applied */
|
||||||
|
}
|
||||||
|
|
||||||
|
.web2py_grid thead th
|
||||||
|
{
|
||||||
|
background-color:transparent;
|
||||||
|
padding:4px 5px;
|
||||||
|
line-height:18px;
|
||||||
|
vertical-align:bottom;
|
||||||
|
border-right:0;
|
||||||
|
border-bottom:0;
|
||||||
|
word-wrap:break-word;
|
||||||
|
}
|
||||||
|
.web2py_grid .btn-group > .dropdown-menu
|
||||||
|
{
|
||||||
|
font-size:13px;
|
||||||
|
}
|
||||||
|
.web2py_grid .dropdown-menu li > a:hover,
|
||||||
|
.web2py_grid .dropdown-menu li > a:focus
|
||||||
|
{
|
||||||
|
filter:progid:DXImageTransform.Microsoft.gradient(enabled=false); /* IE6-9 */
|
||||||
|
background-image:none;
|
||||||
|
background-color:#E8953C;
|
||||||
|
}
|
||||||
|
.pagination
|
||||||
|
{
|
||||||
|
margin:0;
|
||||||
|
height:30px;
|
||||||
|
}
|
||||||
|
.pagination ul > li > a
|
||||||
|
{
|
||||||
|
line-height:28px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#w2p_grid_addbtn:focus,
|
||||||
|
#w2p_search-form :focus,
|
||||||
|
.btn:focus
|
||||||
|
{
|
||||||
|
outline:none;
|
||||||
|
}
|
||||||
|
.web2py_console input[type="button"]:focus,
|
||||||
|
.web2py_grid .row_buttons a.btn:focus
|
||||||
|
{
|
||||||
|
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15) inset, 0 1px 2px rgba(0, 0, 0, 0.05);
|
||||||
|
}
|
||||||
|
div.web2py_counter.span6
|
||||||
|
{
|
||||||
|
min-height:20px;
|
||||||
|
}
|
||||||
|
.web2py_paginator
|
||||||
|
{
|
||||||
|
border:0;
|
||||||
|
margin:0;
|
||||||
|
padding:0;
|
||||||
|
background-color:transparent;
|
||||||
|
}
|
||||||
|
.web2py_paginator ul li a
|
||||||
|
{
|
||||||
|
margin-right:0;
|
||||||
|
padding:0 14px;
|
||||||
|
border:1px solid #DDD;
|
||||||
|
border-left-width:0;
|
||||||
|
color:#E8953C;
|
||||||
|
}
|
||||||
|
.web2py_paginator ul li a:hover
|
||||||
|
{
|
||||||
|
background: whiteSmoke;
|
||||||
|
border: 1px solid #DDD;
|
||||||
|
border-left-width:0;
|
||||||
|
color:#e2821b;
|
||||||
|
}
|
||||||
|
.web2py_paginator ul li:first-child a,
|
||||||
|
.web2py_paginator ul li:first-child a:hover
|
||||||
|
{
|
||||||
|
border-left-width:1px;
|
||||||
|
}
|
||||||
|
.web2py_paginator .current
|
||||||
|
{
|
||||||
|
font-weight:normal;
|
||||||
|
}
|
||||||
|
.web2py_paginator ul li.current a:hover
|
||||||
|
{
|
||||||
|
color:#999;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.editor-bar-column a[name="save"]
|
||||||
|
{
|
||||||
|
background-color: whiteSmoke;
|
||||||
|
background-image: -webkit-gradient(linear,0 0,0 100%,from(white),to(#E6E6E6));
|
||||||
|
background-image: -webkit-linear-gradient(top,white,#E6E6E6);
|
||||||
|
background-image: -o-linear-gradient(top,white,#E6E6E6);
|
||||||
|
background-image: linear-gradient(to bottom,white,#E6E6E6);
|
||||||
|
background-image: -moz-linear-gradient(top,white,#E6E6E6);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
padding:2px 6px;
|
||||||
|
font-size:11px;
|
||||||
|
line-height:17px;
|
||||||
|
margin:0;
|
||||||
|
}
|
||||||
|
.editor-bar-column a[name="save"]:hover
|
||||||
|
{
|
||||||
|
background-color: #E6E6E6;
|
||||||
|
background-position: 0 -15px;
|
||||||
|
-webkit-transition: background-position .1s linear;
|
||||||
|
-moz-transition: background-position .1s linear;
|
||||||
|
-o-transition: background-position .1s linear;
|
||||||
|
transition: background-position .1s linear;
|
||||||
|
}
|
||||||
|
.keybindings
|
||||||
|
{
|
||||||
|
padding:0 18px 10px;
|
||||||
|
}
|
||||||
|
.keybindings li
|
||||||
|
{
|
||||||
|
margin-bottom:0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----- translate page ---*/
|
||||||
|
|
||||||
|
.languageform input
|
||||||
|
{
|
||||||
|
margin-bottom:0;
|
||||||
|
}
|
||||||
|
.languageform div
|
||||||
|
{
|
||||||
|
margin-bottom:9px;
|
||||||
|
}
|
||||||
|
.languageform input.untranslated
|
||||||
|
{
|
||||||
|
background-color:#FC0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.step #wizard_nav .first-box
|
||||||
|
{
|
||||||
|
padding-top:0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=============================================================
|
||||||
|
MEDIA QUERIES
|
||||||
|
==============================================================*/
|
||||||
|
@media (max-width: 979px)
|
||||||
|
{
|
||||||
|
/*-----------------------------------
|
||||||
|
Navbar
|
||||||
|
-------------------------------------*/
|
||||||
|
#header .navbar-inner
|
||||||
|
{
|
||||||
|
padding:0;
|
||||||
|
}
|
||||||
|
/*collapsed menu*/
|
||||||
|
.navbar .nav-collapse .nav
|
||||||
|
{
|
||||||
|
background:#222;
|
||||||
|
padding:8px 2px 8px 8px;
|
||||||
|
-webkit-border-bottom-right-radius:8px;
|
||||||
|
-webkit-border-bottom-left-radius:8px;
|
||||||
|
-moz-border-radius-bottomright:8px;
|
||||||
|
-moz-border-radius-bottomleft:8px;
|
||||||
|
border-bottom-right-radius:8px;
|
||||||
|
border-bottom-left-radius:8px;
|
||||||
|
}
|
||||||
|
#menu
|
||||||
|
{
|
||||||
|
margin-right:0;
|
||||||
|
}
|
||||||
|
#menu li
|
||||||
|
{
|
||||||
|
float:none;
|
||||||
|
}
|
||||||
|
#menu a.button,
|
||||||
|
#menu a.button span
|
||||||
|
{
|
||||||
|
background-image:url(../images/menu_responsive.png);
|
||||||
|
}
|
||||||
|
#menu a.button
|
||||||
|
{
|
||||||
|
padding:0 1em 0 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@media(max-width:632px)
|
||||||
|
{
|
||||||
|
/*-----------------------------------
|
||||||
|
footer
|
||||||
|
-------------------------------------*/
|
||||||
|
#footer
|
||||||
|
{
|
||||||
|
height:auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
#footer select
|
||||||
|
{
|
||||||
|
margin-top:8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,351 @@
|
|||||||
|
|
||||||
|
/*=============================================================
|
||||||
|
GENERAL
|
||||||
|
==============================================================*/
|
||||||
|
body { /*remember to account for the hidden area underneath
|
||||||
|
fixed navbar by adding at least 40px padding to the <body>.
|
||||||
|
Be sure to add this after the core Bootstrap CSS
|
||||||
|
and before the optional responsive CSS.
|
||||||
|
An alternative solution is to set top-margin to div#main padding-top:60px; comment this for alternative solution*/ height:auto; /*uncomment this for alternative solution*/ }
|
||||||
|
|
||||||
|
/*=============================================================
|
||||||
|
BOOTSTRAP ICONS FOLDER FIX
|
||||||
|
==============================================================*/
|
||||||
|
[class^="icon-"], [class*=" icon-"] { /* right folder for bootstrap black images/icons*/ background-image:url("../images/glyphicons-halflings.png") }
|
||||||
|
|
||||||
|
.icon-white, .nav-tabs>.active >a>[class^="icon-"], .nav-tabs>.active>a>[class*=" icon-"], .nav-pills>.active>a>[class^="icon-"], .nav-pills>.active>a>[class*=" icon-"], .nav-list>.active>a>[class^="icon-"], .nav-list>.active>a>[class*=" icon-"], .navbar-inverse .nav>.active>a>[class^="icon-"], .navbar-inverse .nav>.active>a>[class*=" icon-"], .dropdown-menu>li>a:hover>[class^="icon-"], .dropdown-menu>li>a:hover>[class*=" icon-"], .dropdown-menu>.active>a>[class^="icon-"], .dropdown-menu>.active>a>[class*=" icon-"] { /* right folder for bootstrap white images/icons*/ background-image:url("../images/glyphicons-halflings-white.png"); }
|
||||||
|
|
||||||
|
/*=============================================================
|
||||||
|
INPUT BORDER HIGHLIGHT WHEN INPUT IS FOCUSED
|
||||||
|
==============================================================*/
|
||||||
|
textarea:focus, input[type="text"]:focus, input[type="password"]:focus, input[type="datetime"]:focus, input[type="datetime-local"]:focus, input[type="date"]:focus, input[type="month"]:focus, input[type="time"]:focus, input[type="week"]:focus, input[type="number"]:focus, input[type="email"]:focus, input[type="url"]:focus, input[type="search"]:focus, input[type="tel"]:focus, input[type="color"]:focus, input[type="file"]:focus, select:focus, .uneditable-input:focus { /* outline color*/ border-color:rgba(232, 149, 60, 0.8); outline:0; /*outline:thin dotted \9;*/ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(232, 149, 60, 0.6); -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(232, 149, 60, 0.6); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(232, 149, 60, 0.6); }
|
||||||
|
|
||||||
|
.web2py_grid .dropdown-menu li > a:hover, .web2py_grid .dropdown-menu li > a:focus { filter:progid:DXImageTransform.Microsoft.gradient(enabled=false); /* IE6-9*/ background-image:none; background-color:#E8953C; }
|
||||||
|
|
||||||
|
/*=============================================================
|
||||||
|
COLOR OF LINKS
|
||||||
|
==============================================================*/
|
||||||
|
a, a:hover { color:#E8953C; text-decoration:none; }
|
||||||
|
|
||||||
|
a:hover { color:#e2821b; }
|
||||||
|
|
||||||
|
/*=============================================================
|
||||||
|
CONTROLS and CONTAINERS
|
||||||
|
==============================================================*/
|
||||||
|
.row-buttons .btn { margin-bottom:7px; }
|
||||||
|
|
||||||
|
.sidebar .box { clear:right; margin-top:2em; border-top:1px solid #d1d1d1; padding:0 1em; }
|
||||||
|
|
||||||
|
.pwdchange>.button { margin-bottom:10px; }
|
||||||
|
|
||||||
|
input[type="file"] { margin-bottom:9px; }
|
||||||
|
|
||||||
|
.form-inline input[type="file"] { margin-bottom:0px; }
|
||||||
|
|
||||||
|
input + .help-block { margin-top:-5px; margin-bottom:4px; }
|
||||||
|
|
||||||
|
#confirm_form input.btn, .generatedbyw2p input { margin-right:4px; }
|
||||||
|
|
||||||
|
a[rel='tooltip'] span, div[rel='tooltip'] span { display:none; margin-left:-9999px; }
|
||||||
|
|
||||||
|
/*in-page browsing*/
|
||||||
|
[rel="pagebookmark"] { position:relative; }
|
||||||
|
|
||||||
|
[rel="pagebookmark"]>.component { cursor:pointer; }
|
||||||
|
|
||||||
|
[rel="pagebookmark"]>.hashstick { position:absolute; top:-54px; left:-9999px; visibility:visible; }
|
||||||
|
|
||||||
|
/* following 2 rules set the style of a small button for going to top of page*/
|
||||||
|
.tophashlink.btn { padding:2px 3px; visibility:hidden; }
|
||||||
|
|
||||||
|
.hashstick:target+.tophashlink.btn { visibility:visible; }
|
||||||
|
|
||||||
|
ul.act_edit { margin-top:4px; margin-left:20px; }
|
||||||
|
|
||||||
|
ul.act_edit .btn { margin-top:4px; margin-bottom:4px; }
|
||||||
|
|
||||||
|
ul.act_edit .file>a { white-space:pre; }
|
||||||
|
|
||||||
|
.right-full { text-align:right; }
|
||||||
|
|
||||||
|
.searchbox, .searchbox label, .searchbox input { display:inline-block; }
|
||||||
|
|
||||||
|
.buttons-row .btn { margin-bottom:9px; }
|
||||||
|
|
||||||
|
.li-controls { display:inline-block; width:180px; vertical-align:middle; }
|
||||||
|
|
||||||
|
.celled { display:inline-block; padding: 0 0 0 4px; vertical-align:top; margin-top:4px; width:700px; }
|
||||||
|
|
||||||
|
.folder { list-style-type:none; #border-left: 1px dotted #AAA; }
|
||||||
|
|
||||||
|
.folder li { list-style-type:none; }
|
||||||
|
|
||||||
|
.folder>i { display:inline-block; width:5px; height:5px; border:1px solid; background-color:#FAA732; margin-left:-4px; margin-top:-2px; border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); border-radius:1px; }
|
||||||
|
|
||||||
|
.folder>i+a { padding-left:0.5em; }
|
||||||
|
|
||||||
|
.folder ul { margin-top:0.5em; margin-bottom:0.5em; }
|
||||||
|
|
||||||
|
.controls-inline .btn { margin-right:5px; }
|
||||||
|
|
||||||
|
div.web2py_counter.span6 { min-height:24px; text-align:right; }
|
||||||
|
|
||||||
|
.pagination { margin:0; }
|
||||||
|
|
||||||
|
.table { margin-bottom:10px; }
|
||||||
|
|
||||||
|
.row_buttons .btn { margin-right:4px; }
|
||||||
|
|
||||||
|
.editor-bar-column { display:inline-block; vertical-align:top; margin-right:4px; }
|
||||||
|
|
||||||
|
.editor-bar-column .input-long { width:270px; }
|
||||||
|
|
||||||
|
.editor-bar-column .input-normal { width:206px; }
|
||||||
|
|
||||||
|
.keybindings li { margin-bottom:0.5em; }
|
||||||
|
|
||||||
|
.keybindings span { padding:0.3em; border:1px solid transparent; vertical-align:middle; }
|
||||||
|
|
||||||
|
.teletype-text { font-family:monospace; font-weight:bold; font-style:normal; border-color:#999; background:#333; color:#DDD; -moz-border-radius:0.3em; border-radius:0.3em; }
|
||||||
|
|
||||||
|
.edit_language .tab_row div { display:inline-block; vertical-align:top; margin-right:4px; }
|
||||||
|
|
||||||
|
.edit_language .fake-input { height:18px; padding:4px; font-size:13px; line-height:18px; overflow:hidden; white-space:nowrap; display:inline-block; margin-bottom:9px; }
|
||||||
|
|
||||||
|
.test h3 { padding-left:9px; margin:0; font-size:16px; line-height:1; border-left:9px solid transparent; }
|
||||||
|
|
||||||
|
.test h3.passed { border-color:#009900; }
|
||||||
|
|
||||||
|
.test h3.failed { border-color:#CC0000; }
|
||||||
|
|
||||||
|
.test h3.nodoctests { border-color:#CCCC99; }
|
||||||
|
|
||||||
|
.test .test_report { width:100%; overflow:auto; }
|
||||||
|
|
||||||
|
.test_report pre { white-space:pre; }
|
||||||
|
|
||||||
|
.test div[id^="output_"]>h2 { font-size:18px; line-height:1; color:grey; }
|
||||||
|
|
||||||
|
div.center { text-align:center; }
|
||||||
|
|
||||||
|
.delete h2 { word-wrap:break-word; }
|
||||||
|
|
||||||
|
/*=============================================================
|
||||||
|
SHELL
|
||||||
|
==============================================================*/
|
||||||
|
.shell .output-wrapper { width:100%; height:30em; border:1px solid #333; }
|
||||||
|
|
||||||
|
.shell .prompt-wrapper { float:left; width:100%; overflow:hidden; height:auto; border:1px solid #333; }
|
||||||
|
|
||||||
|
.shell .prompt-container { margin-left:2.5em; }
|
||||||
|
|
||||||
|
.shell #caret { width:2.5em; float:left; margin-left:-100%; }
|
||||||
|
|
||||||
|
.shell #shellwrapper { background:white; color:#E8953C; width:100%; margin:1em 0; border:0; }
|
||||||
|
|
||||||
|
.shell #output, .shell .prompt { color:#E8953C; background:white; resize:none; border:none; width:100%; height:100%; cursor:default; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; }
|
||||||
|
|
||||||
|
.shell #output:focus, .shell .prompt:focus { border-color:transparent; outline:0; -webkit-box-shadow: none; -moz-box-shadow: none; box-shadow: none; }
|
||||||
|
|
||||||
|
.shell #output pre { color: #E8953C; }
|
||||||
|
|
||||||
|
.shell #autoscroll { cursor:pointer; float:right; }
|
||||||
|
|
||||||
|
.shell .prompt, .shell #output, .shell #caret { font-size: 11pt; padding: 6px; padding-right: 0em; }
|
||||||
|
|
||||||
|
.shell #caret { padding-top:9px; }
|
||||||
|
|
||||||
|
.shell .prompt, .shell #output, .shell pre, .shell #caret { font-family: monospace; }
|
||||||
|
|
||||||
|
.shell a[rel="tooltip"] { margin-left:8px; }
|
||||||
|
|
||||||
|
/*=============================================================
|
||||||
|
PEEK
|
||||||
|
==============================================================*/
|
||||||
|
.peek .code-wrapper { width:100%; overflow:auto; white-space:pre; }
|
||||||
|
|
||||||
|
.peek table td pre { word-break:normal; white-space:pre; }
|
||||||
|
|
||||||
|
/*=============================================================
|
||||||
|
FOOTER
|
||||||
|
==============================================================*/
|
||||||
|
#footer { border-top:1px solid; text-align:center; padding:1em 0; }
|
||||||
|
|
||||||
|
#footer span, #footer select { display:inline-block; margin-bottom:0; vertical-align:middle; }
|
||||||
|
|
||||||
|
#footer select { width:auto; }
|
||||||
|
|
||||||
|
/*=============================================================
|
||||||
|
MAIN
|
||||||
|
==============================================================*/
|
||||||
|
#main { margin-top:60px; /*uncomment this for alternative solution to hidden area underneath fixed navbar issue*/ margin-bottom:60px; }
|
||||||
|
|
||||||
|
/*=============================================================
|
||||||
|
WIZARD
|
||||||
|
==============================================================*/
|
||||||
|
#wizard_nav .box { border-bottom:1px dotted; }
|
||||||
|
|
||||||
|
#wizard_nav li { margin-left:1em; margin-top:0.5em; }
|
||||||
|
|
||||||
|
.step textarea { width:auto; }
|
||||||
|
|
||||||
|
select[name='layout_theme'] { vertical-align:top; }
|
||||||
|
|
||||||
|
img#preview { margin-bottom:9px; }
|
||||||
|
|
||||||
|
/* multiselect customization*/
|
||||||
|
.ms-container { margin-bottom:5px; }
|
||||||
|
|
||||||
|
.ms-selectable, .step .ms-selection { text-align:center; }
|
||||||
|
|
||||||
|
.ms-list { text-align:left; background:white; }
|
||||||
|
|
||||||
|
.ms-container li.ms-elem-selectable:not(.disabled).ms-hover, .ms-container .ms-selection li:not(.disabled).ms-hover { background-color:#E8953C; }
|
||||||
|
|
||||||
|
.ms-container .ms-selectable { margin-right:25px; }
|
||||||
|
|
||||||
|
.ms-container .ms-selectable, .ms-container .ms-selection { background:transparent; }
|
||||||
|
|
||||||
|
.ms-container .ms-list.ms-focus { border-color:rgba(232, 149, 60, 0.8); -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(232, 149, 60, 0.6); -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(232, 149, 60, 0.6); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(232, 149, 60, 0.6); }
|
||||||
|
|
||||||
|
/* grow_input*/
|
||||||
|
ul[id$="_grow_input"] { margin-left:0; }
|
||||||
|
|
||||||
|
/* generate_form*/
|
||||||
|
#generate_form .control-group { margin-bottom:0; }
|
||||||
|
|
||||||
|
#generate_form .control-label { text-align:left; }
|
||||||
|
|
||||||
|
#generate_form .controls { padding-left:18px; margin-left:0; }
|
||||||
|
|
||||||
|
#generate_form .control-label.empty { width:142px; }
|
||||||
|
|
||||||
|
.step [rel="pagebookmark"]>.hashstick { display:none; }
|
||||||
|
|
||||||
|
/*generated page*/
|
||||||
|
.generated iframe { border:1px inset #e3e3e3; }
|
||||||
|
|
||||||
|
/*=============================================================
|
||||||
|
ERRORS TABLE / TICKET PAGE
|
||||||
|
==============================================================*/
|
||||||
|
.tablebar { margin:7px 0 7px 0; }
|
||||||
|
|
||||||
|
.tablebar input { margin-right:27px; }
|
||||||
|
|
||||||
|
.tablebar span { vertical-align:bottom; }
|
||||||
|
|
||||||
|
.table th { background: #e9e9e9; background: -moz-linear-gradient(top, #FAFAFA 0%, #E9E9E9 100%); background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #FAFAFA), color-stop(100%, #E9E9E9)); background: -webkit-linear-gradient(top, #FAFAFA 0%, #E9E9E9 100%); background: -o-linear-gradient(top, #FAFAFA 0%, #E9E9E9 100%); background: -ms-linear-gradient(top, #FAFAFA 0%, #E9E9E9 100%); background: linear-gradient(top, #FAFAFA 0%, #E9E9E9 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FAFAFA', endColorstr='#E9E9E9'); -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#FAFAFA', endColorstr='#E9E9E9')"; /*font-size:10px; color:#444; text-transform:uppercase;*/ }
|
||||||
|
|
||||||
|
td.cbcentered, th.cbcentered { text-align:center; }
|
||||||
|
|
||||||
|
td.cbcentered>input, th.cbcentered>input { margin-top:-1px; }
|
||||||
|
|
||||||
|
.traceback div { }
|
||||||
|
|
||||||
|
.ticket_code>table td:first-child { border-left:0; }
|
||||||
|
|
||||||
|
#trck_errors table td pre { word-break:normal; white-space:pre; }
|
||||||
|
|
||||||
|
.inspect pre, .errorsource pre { word-break:normal; white-space:pre; }
|
||||||
|
|
||||||
|
.ticket_code { background-color:lightyellow; }
|
||||||
|
|
||||||
|
.ticket_code table, .ticket_code td { border-width:0px; border-collapse:collapse; width:100%; }
|
||||||
|
|
||||||
|
.ticket_code tbody tr:hover td { background-color:transparent; }
|
||||||
|
|
||||||
|
/*=============================================================
|
||||||
|
FLOT GRAPHS
|
||||||
|
==============================================================*/
|
||||||
|
.about #placeholder { width:auto; max-width:600px; height:300px; position:relative; margin:0 auto; /* for centering*/ }
|
||||||
|
|
||||||
|
/*=============================================================
|
||||||
|
THE GRID
|
||||||
|
==============================================================*/
|
||||||
|
#w2p_query_panel { min-width:20px; min-height:20px; padding:10px; margin-top:1em; background-color:#f5f5f5; border: 1px solid #e3e3e3; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); }
|
||||||
|
|
||||||
|
#w2p_query_panel select, #w2p_query_panel input { margin-bottom:0; margin-right:4px; }
|
||||||
|
|
||||||
|
.web2py_grid .hidden { visibility:visible; }
|
||||||
|
|
||||||
|
.qry_pnl_btns { display:inline-block; }
|
||||||
|
|
||||||
|
#w2p_grid_addbtn, #w2p_search-form { margin-top:9px; margin-bottom:9px; }
|
||||||
|
|
||||||
|
#w2p_search-form { margin-bottom:0; }
|
||||||
|
|
||||||
|
#w2p_search-form form { margin-bottom:0; }
|
||||||
|
|
||||||
|
/*----- translate page ---*/
|
||||||
|
.languageform input { margin-bottom:0; }
|
||||||
|
|
||||||
|
.languageform input.untranslated { background-color:#FC0; }
|
||||||
|
|
||||||
|
/*=============================================================
|
||||||
|
MEDIA QUERIES
|
||||||
|
==============================================================*/
|
||||||
|
@media (max-width: 800px) { .step [rel="pagebookmark"]>.hashstick { /*top:-54px;*/ display:block; }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 767px) { [rel="pagebookmark"]>.hashstick { top:0; }
|
||||||
|
|
||||||
|
/*-----------------------------------
|
||||||
|
main
|
||||||
|
-------------------------------------*/
|
||||||
|
#main { margin-top:0; }
|
||||||
|
|
||||||
|
/*-----------------------------------
|
||||||
|
footer
|
||||||
|
-------------------------------------*/
|
||||||
|
#footer { margin-left: -20px; margin-right: -20px; padding-left: 20px; padding-right: 20px; }
|
||||||
|
|
||||||
|
/*-----------------------------------
|
||||||
|
errors page
|
||||||
|
-------------------------------------*/
|
||||||
|
#trck_errors { table-layout:fixed; }
|
||||||
|
|
||||||
|
#trck_errors .column1 { width:20px; }
|
||||||
|
|
||||||
|
#trck_errors .column2 { width:45px; }
|
||||||
|
|
||||||
|
#trck_errors .column3 { width:150px; }
|
||||||
|
|
||||||
|
#trck_errors .columnN { width:55px; }
|
||||||
|
|
||||||
|
#trck_errors .columnN1 { width:138px; }
|
||||||
|
|
||||||
|
.ticket_code, .inspect.resp1, .inspect.controls pre, .errorsource { width:100%; overflow:auto; }
|
||||||
|
|
||||||
|
.ticket_code>table { width:100%; }
|
||||||
|
|
||||||
|
.celled { width:320px; }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 480px) { .qry_pnl_btns { display:block; margin-top:4px; }
|
||||||
|
|
||||||
|
/*-----------------------------------
|
||||||
|
wizard
|
||||||
|
-------------------------------------*/
|
||||||
|
#generate_form .control-label { float:left; width:160px; padding-top:5px; }
|
||||||
|
|
||||||
|
.inspect>code { display:block; white-space:normal; }
|
||||||
|
|
||||||
|
.li-controls { }
|
||||||
|
|
||||||
|
.celled { width:165px; }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
h4.editableapp, h4.currentapp { padding: 5px 0 5px 54px; display: inline; }
|
||||||
|
|
||||||
|
h4.editableapp { background: #fff url(../images/folder.png) no-repeat; }
|
||||||
|
|
||||||
|
h4.currentapp { background: #fff url(../images/folder_locked.png) no-repeat; }
|
||||||
|
|
||||||
|
.flash { position:fixed; width:50%; top:49px; left:25%; right:25%; cursor:default; text-align:center; z-index:5620; }
|
||||||
|
|
||||||
|
table.twitter{ background-color: transparent; }
|
||||||
|
table.twitter tr td {vertical-align: top; padding: 5px; }
|
||||||
|
table.twitter tr { border-bottom: 1px solid #a0a0a0; }
|
||||||
@@ -1166,7 +1166,7 @@ ul#snapshot > li {
|
|||||||
font-size: 1em;
|
font-size: 1em;
|
||||||
color: #3C3C3D;
|
color: #3C3C3D;
|
||||||
text-shadow: 1px 1px 0 #FFFFFF;
|
text-shadow: 1px 1px 0 #FFFFFF;
|
||||||
background:#ECECEC;
|
//background:#ECECEC;
|
||||||
white-space: nowrap; overflow: visible;
|
white-space: nowrap; overflow: visible;
|
||||||
cursor: pointer; text-decoration: none;
|
cursor: pointer; text-decoration: none;
|
||||||
border: 1px solid #CACACA;
|
border: 1px solid #CACACA;
|
||||||
@@ -1244,8 +1244,64 @@ color: #222;
|
|||||||
border-radius:2px;
|
border-radius:2px;
|
||||||
}
|
}
|
||||||
.ie9 #query_panel {padding-bottom:2px;}
|
.ie9 #query_panel {padding-bottom:2px;}
|
||||||
|
|
||||||
.error, .error a {color:red}
|
.error, .error a {color:red}
|
||||||
.pluralsform thead td {font-weight:bold; font-size:1.2em; padding-bottom:5px}
|
.pluralsform thead td {font-weight:bold; font-size:1.2em; padding-bottom:5px}
|
||||||
.pluralsform td {padding-left:5px}
|
.pluralsform td {padding-left:5px}
|
||||||
.tm_ftag {color:blue}
|
.tm_ftag {color:blue}
|
||||||
|
|
||||||
|
/*-----------------------------------*/
|
||||||
|
/* due to bootstrap layout
|
||||||
|
/*-----------------------------------*/
|
||||||
|
.navbar .btn-navbar{display:none;}
|
||||||
|
label{display:block;}
|
||||||
|
input{margin-bottom:5px;}
|
||||||
|
.login input{width:210px;}
|
||||||
|
.change_password input{width:210px;}
|
||||||
|
div.flash .close{color:inherit;float:right;}
|
||||||
|
label.checkbox{margin-bottom:5px;}
|
||||||
|
.control-group{margin-bottom:5px;}
|
||||||
|
.step #menu li{margin-left:0;margin-top:0;}
|
||||||
|
.step #wizard_nav{padding-top:0.5em;}
|
||||||
|
.hashstick{visibility:hidden;}
|
||||||
|
#generate_form .control-label{float:left;width:160px;padding-top:5px;text-align:left;}
|
||||||
|
#generate_form .controls > .checkbox:first-child{padding-top:7px;}
|
||||||
|
/* from default/errors.html */
|
||||||
|
table.sortable{border-spacing:0px;}
|
||||||
|
table.sortable td, table.sortable th{padding:2px 5px 2px 5px;}
|
||||||
|
table.sortable thead{background-color:#eee;color:#666666;font-weight:bold;cursor:default;}
|
||||||
|
tr.error_ticket:hover{background-color:#eee;}
|
||||||
|
.controls a.button.unavailable{color:#ff0000;}
|
||||||
|
/* end from default/errors.html */
|
||||||
|
/* new errors table */
|
||||||
|
.tablebar{margin:7px 0 7px 0;}
|
||||||
|
.cbcentered{text-align:center;}
|
||||||
|
/* new tooltip */
|
||||||
|
a[rel='tooltip']:hover{background:transparent;text-decoration:none;}
|
||||||
|
a[rel='tooltip'] span{display:none;padding:5px;margin-left:10px;width:150px;}
|
||||||
|
a[rel='tooltip']:hover span{cursor:default;display:inline;position:absolute;}
|
||||||
|
a[rel='tooltip'] span{background:#9fb364;color:#eef1d9;border:1px solid #eef1d9;font-style:italic;width:20%;padding:0.3em;-moz-border-radius:0.5em;border-radius:0.5em;font-size:13px;text-transform:none;}
|
||||||
|
/* flot graph */
|
||||||
|
.about #placeholder{width:600px;height:300px;margin:0 auto;}
|
||||||
|
.tophashlink.btn{visibility:hidden;}
|
||||||
|
.help-block{display:block;}
|
||||||
|
.w2p_grid_bottom_bar .w2p_export_menu{float:left;line-height:39px;margin-left:10px;}
|
||||||
|
.w2p_export_menu .dropdown-toggle{cursor:default;color:#333;margin:0;padding:0;background-image:none;}
|
||||||
|
.w2p_export_menu ul{display:inline-block;margin:0;vertical-align:middle;}
|
||||||
|
.w2p_export_menu li{list-style:none;display:inline-block;margin-right:4px;margin-left:2px;}
|
||||||
|
.edit_language .tab_row div{display:inline-block;vertical-align:top;margin-right:4px;}
|
||||||
|
.edit_language .tab_row>div{border:1px solid #e3e3e3;margin-bottom:20px;background-color:#f5f5f5;}
|
||||||
|
/* shell*/
|
||||||
|
.shell .output-wrapper{width:75%;height:30em;border:1px solid #333;}
|
||||||
|
.shell .prompt-wrapper{float:left;width:100%;overflow:hidden;height:auto;border:1px solid #333;}
|
||||||
|
.shell .prompt-container{margin-left:2.5em;}
|
||||||
|
.shell #caret{width:2.5em;float:left;margin-left:-100%;}
|
||||||
|
.shell #shellwrapper{background:white;color:#E8953C;width:75%;margin:1em 0;border:0;}
|
||||||
|
.shell #output,.shell .prompt{color:#E8953C;background:white;resize:none;border:none;width:100%;height:100%;cursor:default;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}
|
||||||
|
.shell #output:focus,.shell .prompt:focus{border-color:transparent;outline:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
|
||||||
|
.shell #output pre{color:#E8953C;}
|
||||||
|
.shell #autoscroll{cursor:pointer;float:right;}
|
||||||
|
.shell .prompt,.shell #output,.shell #caret{font-size:11pt;padding:6px;padding-right:0em;}
|
||||||
|
.shell .prompt,.shell #output,.shell pre,.shell #caret{font-family:monospace;}
|
||||||
|
.shell a[rel="tooltip"]{margin-left:8px;}
|
||||||
|
.shell .clearfix{clear:both;}
|
||||||
|
.shell #caret{padding-top:9px;}
|
||||||
@@ -61,7 +61,7 @@ input[type=text],input[type=password],select{width:300px; margin-right:5px}
|
|||||||
border-top:1px #DEDEDE solid;
|
border-top:1px #DEDEDE solid;
|
||||||
}
|
}
|
||||||
.header {
|
.header {
|
||||||
// background:<fill here for header image>;
|
/* background:<fill here for header image>; */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -92,7 +92,7 @@ div.flash {
|
|||||||
position:fixed;
|
position:fixed;
|
||||||
padding:10px;
|
padding:10px;
|
||||||
top:48px;
|
top:48px;
|
||||||
right:50px;
|
right:250px;
|
||||||
min-width:280px;
|
min-width:280px;
|
||||||
opacity:0.95;
|
opacity:0.95;
|
||||||
margin:0px 0px 10px 10px;
|
margin:0px 0px 10px 10px;
|
||||||
@@ -115,6 +115,10 @@ div.flash {
|
|||||||
z-index:2000;
|
z-index:2000;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
div.flash #closeflash{color:inherit; float:right; margin-left:15px;}
|
||||||
|
.ie-lte7 div.flash #closeflash
|
||||||
|
{color:expression(this.parentNode.currentStyle['color']);float:none;position:absolute;right:4px;}
|
||||||
|
|
||||||
div.flash:hover { opacity:0.25; }
|
div.flash:hover { opacity:0.25; }
|
||||||
|
|
||||||
div.error_wrapper {display:block}
|
div.error_wrapper {display:block}
|
||||||
@@ -182,11 +186,12 @@ div.error {
|
|||||||
* will look better with the declarations below
|
* will look better with the declarations below
|
||||||
* if needed to remove base.css consider keeping these following lines in some css file.
|
* if needed to remove base.css consider keeping these following lines in some css file.
|
||||||
*/
|
*/
|
||||||
// .web2py_table {border:1px solid #ccc}
|
/* .web2py_table {border:1px solid #ccc} */
|
||||||
.web2py_paginator {}
|
.web2py_paginator {}
|
||||||
.web2py_grid {width:100%}
|
.web2py_grid {width:100%}
|
||||||
.web2py_grid table {width:100%}
|
.web2py_grid table {width:100%}
|
||||||
.web2py_grid tbody td {padding:2px 5px 2px 5px; vertical-align: middle;}
|
.web2py_grid tbody td {padding:2px 5px 2px 5px; vertical-align: middle;}
|
||||||
|
.web2py_grid .web2py_form td {vertical-align: top;}
|
||||||
|
|
||||||
.web2py_grid thead th,.web2py_grid tfoot td {
|
.web2py_grid thead th,.web2py_grid tfoot td {
|
||||||
background-color:#EAEAEA;
|
background-color:#EAEAEA;
|
||||||
|
|||||||
@@ -0,0 +1,232 @@
|
|||||||
|
/*=============================================================
|
||||||
|
CUSTOM RULES
|
||||||
|
==============================================================*/
|
||||||
|
|
||||||
|
body{height:auto;} /* to avoid vertical scroll bar */
|
||||||
|
div.flash.flash-center{left:25%;right:25%;}
|
||||||
|
div.flash.flash-top,div.flash.flash-top:hover{
|
||||||
|
position:relative;
|
||||||
|
display:block;
|
||||||
|
margin:0;
|
||||||
|
padding:1em;
|
||||||
|
top:0;
|
||||||
|
left:0;
|
||||||
|
width:100%;
|
||||||
|
text-align:center;
|
||||||
|
text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);
|
||||||
|
color:#865100;
|
||||||
|
background:#feea9a;
|
||||||
|
border:1px solid;
|
||||||
|
border-top:0px;
|
||||||
|
border-left:0px;
|
||||||
|
border-right:0px;
|
||||||
|
border-radius:0;
|
||||||
|
opacity:1;
|
||||||
|
}
|
||||||
|
#header{margin-top:60px;}
|
||||||
|
.mastheader h1 {
|
||||||
|
margin-bottom:9px;
|
||||||
|
font-size:81px;
|
||||||
|
font-weight:bold;
|
||||||
|
letter-spacing:-1px;
|
||||||
|
line-height:1;
|
||||||
|
font-size:54px;
|
||||||
|
}
|
||||||
|
.mastheader small {
|
||||||
|
font-size:20px;
|
||||||
|
font-weight:300;
|
||||||
|
}
|
||||||
|
/* auth navbar - primitive style */
|
||||||
|
.auth_navbar,.auth_navbar a{color:inherit;}
|
||||||
|
.ie-lte7 .auth_navbar,.auth_navbar a{color:expression(this.parentNode.currentStyle['color']); /* ie7 doesn't support inherit */}
|
||||||
|
.auth_navbar a{white-space:nowrap;} /* to avoid the nav split on more lines */
|
||||||
|
.auth_navbar a:hover{color:white;text-decoration:none;}
|
||||||
|
ul#navbar>.auth_navbar{
|
||||||
|
display:inline-block;
|
||||||
|
padding:5px;
|
||||||
|
}
|
||||||
|
/* form errors message box customization */
|
||||||
|
div.error_wrapper{margin-bottom:9px;}
|
||||||
|
div.error_wrapper .error{
|
||||||
|
border-radius: 4px;
|
||||||
|
-o-border-radius: 4px;
|
||||||
|
-moz-border-radius: 4px;
|
||||||
|
-webkit-border-radius: 4px;
|
||||||
|
}
|
||||||
|
/* below rules are only for formstyle = bootstrap
|
||||||
|
trying to make errors look like bootstrap ones */
|
||||||
|
div.controls .error_wrapper{
|
||||||
|
display:inline-block;
|
||||||
|
margin-bottom:0;
|
||||||
|
vertical-align:middle;
|
||||||
|
}
|
||||||
|
div.controls .error{
|
||||||
|
min-width:5px;
|
||||||
|
background:inherit;
|
||||||
|
color:#B94A48;
|
||||||
|
border:none;
|
||||||
|
padding:0;
|
||||||
|
margin:0;
|
||||||
|
/*display:inline;*/ /* uncommenting this, the animation effect is lost */
|
||||||
|
}
|
||||||
|
div.controls .help-inline{color:#3A87AD;}
|
||||||
|
div.controls .error_wrapper +.help-inline {margin-left:-99999px;}
|
||||||
|
div.controls select +.error_wrapper {margin-left:5px;}
|
||||||
|
.ie-lte7 div.error{color:#fff;}
|
||||||
|
|
||||||
|
/* beautify brand */
|
||||||
|
.navbar-inverse .brand{color:#c6cecc;}
|
||||||
|
.navbar-inverse .brand b{display:inline-block;margin-top:-1px;}
|
||||||
|
.navbar-inverse .brand b>span{font-size:22px;color:white}
|
||||||
|
.navbar-inverse .brand:hover b>span{color:white}
|
||||||
|
/* beautify web2py link in navbar */
|
||||||
|
span.highlighted{color:#d8d800;}
|
||||||
|
.open span.highlighted{color:#ffff00;}
|
||||||
|
|
||||||
|
/*=============================================================
|
||||||
|
OVERRIDING WEB2PY.CSS RULES
|
||||||
|
==============================================================*/
|
||||||
|
|
||||||
|
/* reset to default */
|
||||||
|
a{white-space:normal;}
|
||||||
|
li{margin-bottom:0;}
|
||||||
|
textarea,button{display:block;}
|
||||||
|
/*reset ul padding */
|
||||||
|
ul#navbar{padding:0;}
|
||||||
|
/* label aligned to related input */
|
||||||
|
td.w2p_fl,td.w2p_fc {padding:0;}
|
||||||
|
#web2py_user_form td{vertical-align:middle;}
|
||||||
|
|
||||||
|
/*=============================================================
|
||||||
|
OVERRIDING BOOTSTRAP.CSS RULES
|
||||||
|
==============================================================*/
|
||||||
|
|
||||||
|
/* because web2py handles this via js */
|
||||||
|
textarea { width:90%}
|
||||||
|
.hidden{visibility:visible;}
|
||||||
|
/* right folder for bootstrap black images/icons */
|
||||||
|
[class^="icon-"],[class*=" icon-"]{
|
||||||
|
background-image:url("../images/glyphicons-halflings.png")
|
||||||
|
}
|
||||||
|
/* right folder for bootstrap white images/icons */
|
||||||
|
.icon-white,
|
||||||
|
.nav-tabs > .active > a > [class^="icon-"],
|
||||||
|
.nav-tabs > .active > a > [class*=" icon-"],
|
||||||
|
.nav-pills > .active > a > [class^="icon-"],
|
||||||
|
.nav-pills > .active > a > [class*=" icon-"],
|
||||||
|
.nav-list > .active > a > [class^="icon-"],
|
||||||
|
.nav-list > .active > a > [class*=" icon-"],
|
||||||
|
.navbar-inverse .nav > .active > a > [class^="icon-"],
|
||||||
|
.navbar-inverse .nav > .active > a > [class*=" icon-"],
|
||||||
|
.dropdown-menu > li > a:hover > [class^="icon-"],
|
||||||
|
.dropdown-menu > li > a:hover > [class*=" icon-"],
|
||||||
|
.dropdown-menu > .active > a > [class^="icon-"],
|
||||||
|
.dropdown-menu > .active > a > [class*=" icon-"] {
|
||||||
|
background-image:url("../images/glyphicons-halflings-white.png");
|
||||||
|
}
|
||||||
|
/* bootstrap has a label as input's wrapper while web2py has a div */
|
||||||
|
div>input[type="radio"],div>input[type="checkbox"]{margin:0;}
|
||||||
|
/* bootstrap has button instead of input */
|
||||||
|
input[type="button"], input[type="submit"]{margin-right:8px;}
|
||||||
|
|
||||||
|
/*=============================================================
|
||||||
|
RULES FOR SOLVING CONFLICTS BETWEEN WEB2PY.CSS AND BOOTSTRAP.CSS
|
||||||
|
==============================================================*/
|
||||||
|
|
||||||
|
/*when formstyle=table3cols*/
|
||||||
|
tr#auth_user_remember__row>td.w2p_fw>div{padding-bottom:8px;}
|
||||||
|
td.w2p_fw div>label{vertical-align:middle;}
|
||||||
|
td.w2p_fc {padding-bottom:5px;}
|
||||||
|
/*when formstyle=divs*/
|
||||||
|
div#auth_user_remember__row{margin-top:4px;}
|
||||||
|
div#auth_user_remember__row>.w2p_fl{display:none;}
|
||||||
|
div#auth_user_remember__row>.w2p_fw{min-height:39px;}
|
||||||
|
div.w2p_fw,div.w2p_fc{
|
||||||
|
display:inline-block;
|
||||||
|
vertical-align:middle;
|
||||||
|
margin-bottom:0;
|
||||||
|
}
|
||||||
|
div.w2p_fc{
|
||||||
|
padding-left:5px;
|
||||||
|
margin-top:-8px;
|
||||||
|
}
|
||||||
|
/*when formstyle=ul*/
|
||||||
|
form>ul{
|
||||||
|
list-style:none;
|
||||||
|
margin:0;
|
||||||
|
}
|
||||||
|
li#auth_user_remember__row{margin-top:4px;}
|
||||||
|
li#auth_user_remember__row>.w2p_fl{display:none;}
|
||||||
|
li#auth_user_remember__row>.w2p_fw{min-height:39px;}
|
||||||
|
/*when formstyle=bootstrap*/
|
||||||
|
#auth_user_remember__row label.checkbox{display:block;}
|
||||||
|
span.inline-help{display:inline-block;}
|
||||||
|
input[type="text"].input-xlarge,input[type="password"].input-xlarge{width:270px;}
|
||||||
|
/*when recaptcha is used*/
|
||||||
|
#recaptcha{min-height:30px;display:inline-block;margin-bottom:0;line-height:30px;vertical-align:middle;}
|
||||||
|
td>#recaptcha{margin-bottom:6px;}
|
||||||
|
div>#recaptcha{margin-bottom:9px;}
|
||||||
|
div.control-group.error{
|
||||||
|
width:auto;
|
||||||
|
background:transparent;
|
||||||
|
border:0;
|
||||||
|
color:inherit;
|
||||||
|
padding:0;
|
||||||
|
background-repeat:repeat;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=============================================================
|
||||||
|
OTHER RULES
|
||||||
|
==============================================================*/
|
||||||
|
|
||||||
|
/* Massimo Di Pierro fixed alignment in forms with list:string */
|
||||||
|
form table tr{margin-bottom:9px;}
|
||||||
|
td.w2p_fw ul{margin-left:0px;}
|
||||||
|
|
||||||
|
/* web2py_console in grid and smartgrid */
|
||||||
|
.hidden{visibility:visible;}
|
||||||
|
.web2py_console input{
|
||||||
|
display: inline-block;
|
||||||
|
margin-bottom: 0;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
.web2py_console input[type="submit"],
|
||||||
|
.web2py_console input[type="button"],
|
||||||
|
.web2py_console button{
|
||||||
|
padding-top:4px;
|
||||||
|
padding-bottom:4px;
|
||||||
|
margin:3px 0 0 2px;
|
||||||
|
}
|
||||||
|
.web2py_console a,
|
||||||
|
.web2py_console select,
|
||||||
|
.web2py_console input
|
||||||
|
{
|
||||||
|
margin:3px 0 0 2px;
|
||||||
|
}
|
||||||
|
.web2py_grid form table{width:auto;}
|
||||||
|
/* auth_user_remember checkbox extrapadding in IE fix */
|
||||||
|
.ie-lte9 input#auth_user_remember.checkbox {padding-left:0;}
|
||||||
|
|
||||||
|
/*=============================================================
|
||||||
|
MEDIA QUERIES
|
||||||
|
==============================================================*/
|
||||||
|
|
||||||
|
@media only screen and (max-width:979px){
|
||||||
|
body{padding-top:0px;}
|
||||||
|
#navbar{top:5px;}
|
||||||
|
div.flash{right:5px;}
|
||||||
|
.dropdown-menu ul{visibility:visible;}
|
||||||
|
}
|
||||||
|
@media only screen and (max-width:479px){
|
||||||
|
body{
|
||||||
|
padding-left:10px;
|
||||||
|
padding-right:10px;
|
||||||
|
}
|
||||||
|
.navbar-fixed-top,.navbar-fixed-bottom {
|
||||||
|
margin-left:-10px;
|
||||||
|
margin-right:-10px;
|
||||||
|
}
|
||||||
|
input[type="text"],input[type="password"],select{
|
||||||
|
width:95%;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,122 @@
|
|||||||
|
/*=============================================================
|
||||||
|
BOOTSTRAP DROPDOWN MENU
|
||||||
|
==============================================================*/
|
||||||
|
|
||||||
|
.dropdown-menu ul{
|
||||||
|
left:100%;
|
||||||
|
position:absolute;
|
||||||
|
top:0;
|
||||||
|
visibility:hidden;
|
||||||
|
margin-top:-1px;
|
||||||
|
}
|
||||||
|
.dropdown-menu li:hover ul{visibility:visible;}
|
||||||
|
.navbar .dropdown-menu ul:before{
|
||||||
|
border-bottom:7px solid transparent;
|
||||||
|
border-left:none;
|
||||||
|
border-right:7px solid rgba(0, 0, 0, 0.2);
|
||||||
|
border-top:7px solid transparent;
|
||||||
|
left:-7px;
|
||||||
|
top:5px;
|
||||||
|
}
|
||||||
|
.nav > li.dropdown > a:after {
|
||||||
|
border-left: 4px solid transparent;
|
||||||
|
border-right: 4px solid transparent;
|
||||||
|
border-top: 4px solid #000000;
|
||||||
|
content: "";
|
||||||
|
display: inline-block;
|
||||||
|
height: 0;
|
||||||
|
opacity: 0.7;
|
||||||
|
vertical-align: top;
|
||||||
|
width: 0;
|
||||||
|
|
||||||
|
margin-left: 2px;
|
||||||
|
margin-top: 8px;
|
||||||
|
|
||||||
|
border-bottom-color: #FFFFFF;
|
||||||
|
border-top-color: #FFFFFF;
|
||||||
|
}
|
||||||
|
.dropdown-menu span{display:inline-block;}
|
||||||
|
ul.dropdown-menu li.dropdown > a:after {
|
||||||
|
border-left: 4px solid #000;
|
||||||
|
border-right: 4px solid transparent;
|
||||||
|
border-bottom: 4px solid transparent;
|
||||||
|
border-top: 4px solid transparent;
|
||||||
|
content: "";
|
||||||
|
display: inline-block;
|
||||||
|
height: 0;
|
||||||
|
opacity: 0.7;
|
||||||
|
vertical-align: top;
|
||||||
|
width: 0;
|
||||||
|
|
||||||
|
margin-left: 8px;
|
||||||
|
margin-top: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul.nav li.dropdown:hover ul.dropdown-menu {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.open >.dropdown-menu ul{display:block;} /* fix menu issue when BS2.0.4 is applied */
|
||||||
|
|
||||||
|
/*=============================================================
|
||||||
|
BOOTSTRAP SUBMIT BUTTON
|
||||||
|
==============================================================*/
|
||||||
|
|
||||||
|
input[type='submit']:not(.btn) {
|
||||||
|
display: inline-block;
|
||||||
|
padding: 4px 14px;
|
||||||
|
margin-bottom: 0;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 20px;
|
||||||
|
color: #333;
|
||||||
|
text-align: center;
|
||||||
|
text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
|
||||||
|
vertical-align: middle;
|
||||||
|
cursor: pointer;
|
||||||
|
background-color: whiteSmoke;
|
||||||
|
background-image: -webkit-gradient(linear,0 0,0 100%,from(white),to(#E6E6E6));
|
||||||
|
background-image: -webkit-linear-gradient(top,white,#E6E6E6);
|
||||||
|
background-image: -o-linear-gradient(top,white,#E6E6E6);
|
||||||
|
background-image: linear-gradient(to bottom,white,#E6E6E6);
|
||||||
|
background-image: -moz-linear-gradient(top,white,#E6E6E6);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
border: 1px solid #BBB;
|
||||||
|
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
|
||||||
|
border-bottom-color: #A2A2A2;
|
||||||
|
-webkit-border-radius: 4px;
|
||||||
|
-moz-border-radius: 4px;
|
||||||
|
border-radius: 4px;
|
||||||
|
filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);
|
||||||
|
filter: progid:dximagetransform.microsoft.gradient(enabled=false);
|
||||||
|
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);
|
||||||
|
-moz-box-shadow: inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);
|
||||||
|
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type='submit']:not(.btn):hover {
|
||||||
|
color: #333;
|
||||||
|
text-decoration: none;
|
||||||
|
background-color: #E6E6E6;
|
||||||
|
background-position: 0 -15px;
|
||||||
|
-webkit-transition: background-position .1s linear;
|
||||||
|
-moz-transition: background-position .1s linear;
|
||||||
|
-o-transition: background-position .1s linear;
|
||||||
|
transition: background-position .1s linear;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type='submit']:not(.btn).active, input[type='submit']:not(.btn):active {
|
||||||
|
background-color: #E6E6E6;
|
||||||
|
background-color: #D9D9D9 9;
|
||||||
|
background-image: none;
|
||||||
|
outline: 0;
|
||||||
|
-webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);
|
||||||
|
-moz-box-shadow: inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);
|
||||||
|
box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=============================================================
|
||||||
|
OTHER
|
||||||
|
==============================================================*/
|
||||||
|
|
||||||
|
.ie-lte8 .navbar-fixed-top {position:static;}
|
||||||
|
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 4.6 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 8.6 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 12 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.5 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 4.9 KiB |
@@ -43,8 +43,9 @@ function doHighlight(highlight) {
|
|||||||
if (window.ace_editor) {
|
if (window.ace_editor) {
|
||||||
window.ace_editor.gotoLine(highlight.lineno);
|
window.ace_editor.gotoLine(highlight.lineno);
|
||||||
} else if (window.mirror) {
|
} else if (window.mirror) {
|
||||||
window.mirror.setSelection({line:highlight.lineno,ch:0},
|
// Put the cursor at the offending line:
|
||||||
{line:highlight.end,ch:0});
|
window.mirror.setCursor({line:highlight.lineno-1,
|
||||||
|
ch:highlight.offset+1});
|
||||||
} else if (window.eamy) {
|
} else if (window.eamy) {
|
||||||
// not implemented
|
// not implemented
|
||||||
} else if (window.textarea) {
|
} else if (window.textarea) {
|
||||||
@@ -105,7 +106,7 @@ function doClickSave() {
|
|||||||
doHighlight(json.highlight);
|
doHighlight(json.highlight);
|
||||||
} else {
|
} else {
|
||||||
jQuery("input[name='saved_on']").attr('style','background-color:#99FF99');
|
jQuery("input[name='saved_on']").attr('style','background-color:#99FF99');
|
||||||
jQuery(".flash").delay(1000).fadeOut('slow');
|
//jQuery(".flash").delay(1000).fadeOut('slow');
|
||||||
}
|
}
|
||||||
// console.info(jQuery("input[name='file_hash']").val());
|
// console.info(jQuery("input[name='file_hash']").val());
|
||||||
var output = '<b>exposes:</b> ';
|
var output = '<b>exposes:</b> ';
|
||||||
@@ -148,8 +149,12 @@ function getSelectionRange() {
|
|||||||
return sel;
|
return sel;
|
||||||
}
|
}
|
||||||
|
|
||||||
function doToggleBreakpoint(filename, url) {
|
function doToggleBreakpoint(filename, url, sel) {
|
||||||
var sel = getSelectionRange();
|
if (sel==null) {
|
||||||
|
// use cursor position to determine the breakpoint line
|
||||||
|
// (gutter already tell us the selected line)
|
||||||
|
sel = getSelectionRange();
|
||||||
|
}
|
||||||
var dataForPost = prepareMultiPartPOST(new Array(
|
var dataForPost = prepareMultiPartPOST(new Array(
|
||||||
prepareDataForSave('filename', filename),
|
prepareDataForSave('filename', filename),
|
||||||
prepareDataForSave('sel_start', sel["start"]),
|
prepareDataForSave('sel_start', sel["start"]),
|
||||||
@@ -170,15 +175,26 @@ function doToggleBreakpoint(filename, url) {
|
|||||||
success: function(json,text,xhr){
|
success: function(json,text,xhr){
|
||||||
// show flash message (if any)
|
// show flash message (if any)
|
||||||
var flash=xhr.getResponseHeader('web2py-component-flash');
|
var flash=xhr.getResponseHeader('web2py-component-flash');
|
||||||
if (flash) jQuery('.flash').html(decodeURIComponent(flash)).slideDown();
|
if (flash) {
|
||||||
|
jQuery('.flash').html(decodeURIComponent(flash))
|
||||||
|
.append('<a href="#" class="close">×</a>')
|
||||||
|
.slideDown();
|
||||||
|
}
|
||||||
else jQuery('.flash').hide();
|
else jQuery('.flash').hide();
|
||||||
try {
|
try {
|
||||||
if (json.error) {
|
if (json.error) {
|
||||||
window.location.href=json.redirect;
|
window.location.href=json.redirect;
|
||||||
} else {
|
} else {
|
||||||
|
if (json.ok==true && window.mirror) {
|
||||||
// mark the breakpoint if ok=True
|
// mark the breakpoint if ok=True
|
||||||
|
editor.setMarker(json.lineno-1,
|
||||||
|
"<span style='color: red'>●</span> %N%")
|
||||||
|
} else if (json.ok==false && window.mirror) {
|
||||||
// remove mark if ok=False
|
// remove mark if ok=False
|
||||||
|
editor.setMarker(json.lineno-1, "%N%")
|
||||||
|
} else {
|
||||||
// do nothing if ok = null
|
// do nothing if ok = null
|
||||||
|
}
|
||||||
// alert(json.ok + json.lineno);
|
// alert(json.ok + json.lineno);
|
||||||
}
|
}
|
||||||
} catch(e) { on_error(); }
|
} catch(e) { on_error(); }
|
||||||
@@ -188,6 +204,43 @@ function doToggleBreakpoint(filename, url) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// on load, update all breakpoints markers:
|
||||||
|
function doListBreakpoints(filename, url) {
|
||||||
|
var dataForPost = prepareMultiPartPOST(new Array(
|
||||||
|
prepareDataForSave('filename', filename)
|
||||||
|
));
|
||||||
|
jQuery.ajax({
|
||||||
|
type: "POST",
|
||||||
|
contentType: 'multipart/form-data;boundary="'+dataForPost[1]+'"',
|
||||||
|
url: url,
|
||||||
|
dataType: "json",
|
||||||
|
data: dataForPost[0],
|
||||||
|
timeout: 5000,
|
||||||
|
beforeSend: function(xhr) {
|
||||||
|
xhr.setRequestHeader('web2py-component-location',
|
||||||
|
document.location);
|
||||||
|
xhr.setRequestHeader('web2py-component-element',
|
||||||
|
'doListBreakpoints');},
|
||||||
|
success: function(json,text,xhr){
|
||||||
|
try {
|
||||||
|
if (json.error) {
|
||||||
|
window.location.href=json.redirect;
|
||||||
|
} else {
|
||||||
|
if (window.mirror) {
|
||||||
|
for (i in json.breakpoints) {
|
||||||
|
lineno = json.breakpoints[i];
|
||||||
|
// mark the breakpoint if ok=True
|
||||||
|
editor.setMarker(lineno-1,
|
||||||
|
"<span style='color: red'>●</span> %N%");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch(e) { on_error(); }
|
||||||
|
},
|
||||||
|
error: function(json) { on_error(); }
|
||||||
|
});
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
function keepalive(url) {
|
function keepalive(url) {
|
||||||
jQuery.ajax({
|
jQuery.ajax({
|
||||||
@@ -197,4 +250,3 @@ function keepalive(url) {
|
|||||||
success: function(){},
|
success: function(){},
|
||||||
error: function(x) { on_error(); } });
|
error: function(x) { on_error(); } });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
Flot plugin for automatically redrawing plots when the placeholder
|
||||||
|
size changes, e.g. on window resizes.
|
||||||
|
|
||||||
|
It works by listening for changes on the placeholder div (through the
|
||||||
|
jQuery resize event plugin) - if the size changes, it will redraw the
|
||||||
|
plot.
|
||||||
|
|
||||||
|
There are no options. If you need to disable the plugin for some
|
||||||
|
plots, you can just fix the size of their placeholders.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/* Inline dependency:
|
||||||
|
* jQuery resize event - v1.1 - 3/14/2010
|
||||||
|
* http://benalman.com/projects/jquery-resize-plugin/
|
||||||
|
*
|
||||||
|
* Copyright (c) 2010 "Cowboy" Ben Alman
|
||||||
|
* Dual licensed under the MIT and GPL licenses.
|
||||||
|
* http://benalman.com/about/license/
|
||||||
|
*/
|
||||||
|
(function($,h,c){var a=$([]),e=$.resize=$.extend($.resize,{}),i,k="setTimeout",j="resize",d=j+"-special-event",b="delay",f="throttleWindow";e[b]=250;e[f]=true;$.event.special[j]={setup:function(){if(!e[f]&&this[k]){return false}var l=$(this);a=a.add(l);$.data(this,d,{w:l.width(),h:l.height()});if(a.length===1){g()}},teardown:function(){if(!e[f]&&this[k]){return false}var l=$(this);a=a.not(l);l.removeData(d);if(!a.length){clearTimeout(i)}},add:function(l){if(!e[f]&&this[k]){return false}var n;function m(s,o,p){var q=$(this),r=$.data(this,d);r.w=o!==c?o:q.width();r.h=p!==c?p:q.height();n.apply(this,arguments)}if($.isFunction(l)){n=l;return m}else{n=l.handler;l.handler=m}}};function g(){i=h[k](function(){a.each(function(){var n=$(this),m=n.width(),l=n.height(),o=$.data(this,d);if(m!==o.w||l!==o.h){n.trigger(j,[o.w=m,o.h=l])}});g()},e[b])}})(jQuery,this);
|
||||||
|
|
||||||
|
|
||||||
|
(function ($) {
|
||||||
|
var options = { }; // no options
|
||||||
|
|
||||||
|
function init(plot) {
|
||||||
|
function onResize() {
|
||||||
|
var placeholder = plot.getPlaceholder();
|
||||||
|
|
||||||
|
// somebody might have hidden us and we can't plot
|
||||||
|
// when we don't have the dimensions
|
||||||
|
if (placeholder.width() == 0 || placeholder.height() == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
plot.resize();
|
||||||
|
plot.setupGrid();
|
||||||
|
plot.draw();
|
||||||
|
}
|
||||||
|
|
||||||
|
function bindEvents(plot, eventHolder) {
|
||||||
|
plot.getPlaceholder().resize(onResize);
|
||||||
|
}
|
||||||
|
|
||||||
|
function shutdown(plot, eventHolder) {
|
||||||
|
plot.getPlaceholder().unbind("resize", onResize);
|
||||||
|
}
|
||||||
|
|
||||||
|
plot.hooks.bindEvents.push(bindEvents);
|
||||||
|
plot.hooks.shutdown.push(shutdown);
|
||||||
|
}
|
||||||
|
|
||||||
|
$.plot.plugins.push({
|
||||||
|
init: init,
|
||||||
|
options: options,
|
||||||
|
name: 'resize',
|
||||||
|
version: '1.0'
|
||||||
|
});
|
||||||
|
})(jQuery);
|
||||||
+2
-2
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,44 @@
|
|||||||
|
/**
|
||||||
|
|
||||||
|
Created and copyrighted by Massimo Di Pierro <massimo.dipierro@gmail.com>
|
||||||
|
(MIT license)
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
<script src="share.js"></script>
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
jQuery(function(){
|
||||||
|
var script_source = jQuery('script[src*="share.js"]').attr('src');
|
||||||
|
var params = function(name,default_value) {
|
||||||
|
var match = RegExp('[?&]' + name + '=([^&]*)').exec(script_source);
|
||||||
|
return match && decodeURIComponent(match[1].replace(/\+/g, ' '))||default_value;
|
||||||
|
}
|
||||||
|
var path = params('static','social');
|
||||||
|
var url = encodeURIComponent(window.location.href);
|
||||||
|
var host = window.location.hostname;
|
||||||
|
var title = escape(jQuery('title').text());
|
||||||
|
var twit = 'http://twitter.com/home?status='+title+'%20'+url;
|
||||||
|
var facebook = 'http://www.facebook.com/sharer.php?u='+url;
|
||||||
|
var gplus = 'https://plus.google.com/share?url='+url;
|
||||||
|
var tbar = '<div id="socialdrawer"><span>Share<br/></span><div id="sicons"><a href="'+twit+'" id="twit" title="Share on twitter"><img src="'+path+'/twitter.png" alt="Share on Twitter" width="32" height="32" /></a><a href="'+facebook+'" id="facebook" title="Share on Facebook"><img src="'+path+'/facebook.png" alt="Share on facebook" width="32" height="32" /></a><a href="'+gplus+'" id="gplus" title="Share on Google Plus"><img src="'+path+'/gplus-32.png" alt="Share on Google Plus" width="32" height="32" /></a></div></div>';
|
||||||
|
// Add the share tool bar.
|
||||||
|
jQuery('body').append(tbar);
|
||||||
|
var st = jQuery('#socialdrawer');
|
||||||
|
st.css({'opacity':'.7','z-index':'3000','background':'#FFF','border':'solid 1px #666','border-width':' 1px 0 0 1px','height':'20px','width':'40px','position':'fixed','bottom':'0','right':'0','padding':'2px 5px','overflow':'hidden','-webkit-border-top-left-radius':' 12px','-moz-border-radius-topleft':' 12px','border-top-left-radius':' 12px','-moz-box-shadow':' -3px -3px 3px rgba(0,0,0,0.5)','-webkit-box-shadow':' -3px -3px 3px rgba(0,0,0,0.5)','box-shadow':' -3px -3px 3px rgba(0,0,0,0.5)'});
|
||||||
|
jQuery('#socialdrawer a').css({'float':'left','width':'32px','margin':'3px 2px 2px 2px','padding':'0','cursor':'pointer'});
|
||||||
|
jQuery('#socialdrawer span').css({'float':'left','margin':'2px 3px','text-shadow':' 1px 1px 1px #FFF','color':'#444','font-size':'12px','line-height':'1em'});
|
||||||
|
jQuery('#socialdrawer img').hide();
|
||||||
|
// hover
|
||||||
|
st.click(function(){
|
||||||
|
jQuery(this).animate({height:'40px', width:'160px', opacity: 0.95}, 300);
|
||||||
|
jQuery('#socialdrawer img').show();
|
||||||
|
});
|
||||||
|
//leave
|
||||||
|
st.mouseleave(function(){
|
||||||
|
st.animate({height:'20px', width: '40px', opacity: .7}, 300);
|
||||||
|
jQuery('#socialdrawer img').hide();
|
||||||
|
return false;
|
||||||
|
} );
|
||||||
|
});
|
||||||
@@ -44,18 +44,38 @@ function web2py_event_handlers() {
|
|||||||
doc.on('keyup', 'input.double, input.decimal', function(){this.value=this.value.reverse().replace(/[^0-9\-\.,]|[\-](?=.)|[\.,](?=[0-9]*[\.,])/g,'').reverse();});
|
doc.on('keyup', 'input.double, input.decimal', function(){this.value=this.value.reverse().replace(/[^0-9\-\.,]|[\-](?=.)|[\.,](?=[0-9]*[\.,])/g,'').reverse();});
|
||||||
var confirm_message = (typeof w2p_ajax_confirm_message != 'undefined') ? w2p_ajax_confirm_message : "Are you sure you want to delete this object?";
|
var confirm_message = (typeof w2p_ajax_confirm_message != 'undefined') ? w2p_ajax_confirm_message : "Are you sure you want to delete this object?";
|
||||||
doc.on('click', "input[type='checkbox'].delete", function(){if(this.checked) if(!confirm(confirm_message)) this.checked=false;});
|
doc.on('click', "input[type='checkbox'].delete", function(){if(this.checked) if(!confirm(confirm_message)) this.checked=false;});
|
||||||
|
|
||||||
doc.ajaxSuccess(function(e, xhr) {
|
doc.ajaxSuccess(function(e, xhr) {
|
||||||
var redirect=xhr.getResponseHeader('web2py-redirect-location');
|
var redirect=xhr.getResponseHeader('web2py-redirect-location');
|
||||||
if (redirect != null) {
|
var command=xhr.getResponseHeader('web2py-component-command');
|
||||||
|
var flash=xhr.getResponseHeader('web2py-component-flash');
|
||||||
|
if (redirect !== null) {
|
||||||
window.location = redirect;
|
window.location = redirect;
|
||||||
};
|
};
|
||||||
|
if(command !== null){
|
||||||
|
eval(decodeURIComponent(command));
|
||||||
|
}
|
||||||
|
if(flash) {
|
||||||
|
jQuery('.flash')
|
||||||
|
.html(decodeURIComponent(flash))
|
||||||
|
.append('<span id="closeflash">×</span>')
|
||||||
|
.slideDown();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
doc.ajaxError(function(e, xhr, settings, exception) {
|
||||||
|
doc.off('click', '.flash')
|
||||||
|
switch(xhr.status){
|
||||||
|
case 500:
|
||||||
|
$('.flash').html(ajax_error_500).slideDown();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
jQuery(function() {
|
jQuery(function() {
|
||||||
var flash = jQuery('.flash');
|
var flash = jQuery('.flash');
|
||||||
flash.hide();
|
flash.hide();
|
||||||
if(flash.html()) flash.append('<span style="float:right;">×</span>').slideDown();
|
if(flash.html()) flash.append('<span id="closeflash">×</span>').slideDown();
|
||||||
web2py_ajax_init(document);
|
web2py_ajax_init(document);
|
||||||
web2py_event_handlers();
|
web2py_event_handlers();
|
||||||
});
|
});
|
||||||
@@ -91,8 +111,6 @@ function web2py_ajax_page(method, action, data, target) {
|
|||||||
'complete':function(xhr,text){
|
'complete':function(xhr,text){
|
||||||
var html=xhr.responseText;
|
var html=xhr.responseText;
|
||||||
var content=xhr.getResponseHeader('web2py-component-content');
|
var content=xhr.getResponseHeader('web2py-component-content');
|
||||||
var command=xhr.getResponseHeader('web2py-component-command');
|
|
||||||
var flash=xhr.getResponseHeader('web2py-component-flash');
|
|
||||||
var t = jQuery('#'+target);
|
var t = jQuery('#'+target);
|
||||||
if(content=='prepend') t.prepend(html);
|
if(content=='prepend') t.prepend(html);
|
||||||
else if(content=='append') t.append(html);
|
else if(content=='append') t.append(html);
|
||||||
@@ -100,17 +118,14 @@ function web2py_ajax_page(method, action, data, target) {
|
|||||||
web2py_trap_form(action,target);
|
web2py_trap_form(action,target);
|
||||||
web2py_trap_link(target);
|
web2py_trap_link(target);
|
||||||
web2py_ajax_init('#'+target);
|
web2py_ajax_init('#'+target);
|
||||||
if(command)
|
|
||||||
eval(decodeURIComponent(command));
|
|
||||||
if(flash)
|
|
||||||
jQuery('.flash').html(decodeURIComponent(flash)).slideDown();
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function web2py_component(action, target, timeout, times){
|
function web2py_component(action, target, timeout, times){
|
||||||
jQuery(function(){
|
jQuery(function(){
|
||||||
var element = jQuery("#" + target).get(0);
|
var jelement = jQuery("#" + target);
|
||||||
|
var element = jelement.get(0);
|
||||||
var statement = "jQuery('#" + target + "').get(0).reload();";
|
var statement = "jQuery('#" + target + "').get(0).reload();";
|
||||||
element.reload = function (){
|
element.reload = function (){
|
||||||
// Continue if times is Infinity or
|
// Continue if times is Infinity or
|
||||||
@@ -119,6 +134,7 @@ function web2py_component(action, target, timeout, times){
|
|||||||
web2py_ajax_page('get', action, null, target);} }; // reload
|
web2py_ajax_page('get', action, null, target);} }; // reload
|
||||||
// Method to check timing limit
|
// Method to check timing limit
|
||||||
element.reload_check = function (){
|
element.reload_check = function (){
|
||||||
|
if (jelement.hasClass('w2p_component_stop')) {clearInterval(this.timing);return false;}
|
||||||
if (this.reload_counter == Infinity){return true;}
|
if (this.reload_counter == Infinity){return true;}
|
||||||
else {
|
else {
|
||||||
if (!isNaN(this.reload_counter)){
|
if (!isNaN(this.reload_counter)){
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
// this code improves bootstrap menus and adds dropdown support
|
||||||
|
jQuery(function(){
|
||||||
|
jQuery('.nav>li>a').each(function(){
|
||||||
|
if(jQuery(this).parent().find('ul').length)
|
||||||
|
jQuery(this).attr({'class':'dropdown-toggle','data-toggle':'dropdown'}).append('<b class="caret"></b>');
|
||||||
|
});
|
||||||
|
jQuery('.nav li li').each(function(){
|
||||||
|
if(jQuery(this).find('ul').length)
|
||||||
|
jQuery(this).addClass('dropdown-submenu');
|
||||||
|
});
|
||||||
|
function adjust_height_of_collapsed_nav() {
|
||||||
|
var cn = jQuery('div.collapse');
|
||||||
|
if (cn.get(0)) {
|
||||||
|
var cnh = cn.get(0).style.height;
|
||||||
|
if (cnh>'0px'){
|
||||||
|
cn.css('height','auto');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function hoverMenu(){
|
||||||
|
jQuery('ul.nav a.dropdown-toggle').parent().hover(function(){
|
||||||
|
adjust_height_of_collapsed_nav();
|
||||||
|
mi = jQuery(this).addClass('open');
|
||||||
|
mi.children('.dropdown-menu').stop(true, true).delay(200).fadeIn(400);
|
||||||
|
}, function(){
|
||||||
|
mi = jQuery(this);
|
||||||
|
mi.children('.dropdown-menu').stop(true, true).delay(200).fadeOut(function(){mi.removeClass('open')});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
hoverMenu(); // first page load
|
||||||
|
jQuery(window).resize(hoverMenu); // on resize event
|
||||||
|
jQuery('ul.nav li.dropdown a').click(function(){window.location=jQuery(this).attr('href');});
|
||||||
|
// make all buttons bootstrap buttons
|
||||||
|
jQuery('button, form input[type="submit"], form input[type="button"]').addClass('btn');
|
||||||
|
});
|
||||||
@@ -222,3 +222,28 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="clear"></div>
|
<div class="clear"></div>
|
||||||
{{pass}}
|
{{pass}}
|
||||||
|
|
||||||
|
{{if request.function=='graph_model':}}
|
||||||
|
<h2>{{=T("Graph Model")}}</h2>
|
||||||
|
{{if not pgv:}}
|
||||||
|
{{=T('pygraphviz library not found')}}
|
||||||
|
{{elif not databases:}}
|
||||||
|
{{=T("No databases in this application")}}
|
||||||
|
{{else:}}
|
||||||
|
<div class="btn-group">
|
||||||
|
<a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
|
||||||
|
<i class="icon-download"></i> {{=T('Save model as...')}}
|
||||||
|
<span class="caret"></span>
|
||||||
|
</a>
|
||||||
|
<ul class="dropdown-menu">
|
||||||
|
<li><a href="{{=URL('appadmin', 'bg_graph_model', args=['png'])}}">png</a></li>
|
||||||
|
<li><a href="{{=URL('appadmin', 'bg_graph_model', args=['svg'])}}">svg</a></li>
|
||||||
|
<li><a href="{{=URL('appadmin', 'bg_graph_model', args=['pdf'])}}">pdf</a></li>
|
||||||
|
<li><a href="{{=URL('appadmin', 'bg_graph_model', args=['ps'])}}">ps</a></li>
|
||||||
|
<li><a href="{{=URL('appadmin', 'bg_graph_model', args=['dot'])}}">dot</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
{{=IMG(_src=URL('appadmin', 'bg_graph_model'))}}
|
||||||
|
{{pass}}
|
||||||
|
{{pass}}
|
||||||
|
|||||||
@@ -0,0 +1,137 @@
|
|||||||
|
{{extend 'layout.html'}}
|
||||||
|
{{block sectionclass}}debug{{end}}
|
||||||
|
{{
|
||||||
|
frm_trs = form.elements('tr')
|
||||||
|
tbl_rows = []
|
||||||
|
for frm_tr in frm_trs:
|
||||||
|
if frm_tr['_id'] != 'submit_record__row':
|
||||||
|
fld_label = frm_tr.element('td.w2p_fl')
|
||||||
|
fld_widget = frm_tr.element('td.w2p_fw')[0]
|
||||||
|
fld_comment = frm_tr.element('td.w2p_fc')[0]
|
||||||
|
lbls = fld_label.elements('label')
|
||||||
|
lbl = ''
|
||||||
|
if len(lbls) > 0:
|
||||||
|
lbl = fld_label.elements('label')[0]
|
||||||
|
lbl['_class'] = 'control-label'
|
||||||
|
pass
|
||||||
|
if fld_widget['_type'] == 'checkbox':
|
||||||
|
fld_widget = LABEL(fld_widget, _class='checkbox')
|
||||||
|
else:
|
||||||
|
fld_widget = CAT(fld_widget, SPAN('', _class='help-inline'))
|
||||||
|
pass
|
||||||
|
if isinstance(fld_widget, SPAN):
|
||||||
|
fld_widget['_role'] = 'asinput'
|
||||||
|
pass
|
||||||
|
tbl_row = DIV(lbl, DIV(fld_widget,
|
||||||
|
TAG['SMALL'](fld_comment,
|
||||||
|
_class='help-block'),
|
||||||
|
_class='controls'), _class='control-group')
|
||||||
|
tbl_rows.append(tbl_row)
|
||||||
|
else:
|
||||||
|
smt_btn = frm_tr.element('td.w2p_fw')
|
||||||
|
btn = smt_btn.elements('input')[0]
|
||||||
|
btn['_class'] = 'btn btn-primary'
|
||||||
|
tbl_rows.append(DIV(btn, _class='controls'))
|
||||||
|
pass
|
||||||
|
pass
|
||||||
|
form.element('table', replace=CAT(*tbl_rows))
|
||||||
|
form['_class'] = 'form-horizontal well well-small'
|
||||||
|
import re
|
||||||
|
if form.errors:
|
||||||
|
for key, value in form.errors.iteritems():
|
||||||
|
inpt = form.element(_name=key)
|
||||||
|
inpt_wrapper = inpt.parent
|
||||||
|
if inpt_wrapper['_class'] == None or \
|
||||||
|
not "controls" in inpt_wrapper['_class']:
|
||||||
|
inpt_wrapper = inpt_wrapper.parent
|
||||||
|
pass
|
||||||
|
inpt_wrapper.parent['_class'] += ' error'
|
||||||
|
inpt_wrapper.element(_class=re.compile('help-inline'),
|
||||||
|
replace=lambda me:SPAN(value, _class=me['_class']))
|
||||||
|
pass
|
||||||
|
form.errors.clear()
|
||||||
|
pass
|
||||||
|
}}
|
||||||
|
<!-- begin "debug" block -->
|
||||||
|
<div class="row-fluid">
|
||||||
|
<div class="applist f60 span7" style="padding-bottom:20px;">
|
||||||
|
<div class="applist_inner">
|
||||||
|
<h2>{{=T("Breakpoints")}}</h2>
|
||||||
|
<div class="errorform">
|
||||||
|
<form name="myform" method="post">
|
||||||
|
<div class="tablebar">
|
||||||
|
<input value="{{=T('delete all checked')}}" type="submit" class="btn"/>
|
||||||
|
</div>
|
||||||
|
<div class="row-fluid">
|
||||||
|
<div class="span12 errors">
|
||||||
|
<table id="trck_breakpoints" class="sortable table table-hover table-condensed">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="column1 cbcentered"><input type="checkbox" name="delete_all}" /></th>
|
||||||
|
<th class="column2">{{=T("Filename")}}</th>
|
||||||
|
<th class="column3">{{=T("Line Nr")}}</th>
|
||||||
|
<th>{{=T("Temporary")}}</th>
|
||||||
|
<th>{{=T("Condition")}}</th>
|
||||||
|
<th class="columnN">{{=T("Hits")}}</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{{for bp in breakpoints:}}
|
||||||
|
<tr class="breakpoint">
|
||||||
|
<td class="cbcentered"><input type="checkbox" name="delete_{{=bp['number']}}" /></td>
|
||||||
|
<td>{{=bp['filename']}}</td>
|
||||||
|
<td>{{=A(bp['lineno'],_href="#",_onclick="collapse('%s');" % bp['number'])}}</td>
|
||||||
|
<td>{{=bp['temporary']}}</td>
|
||||||
|
<td>{{=bp['condition']}}</td>
|
||||||
|
<td>{{=bp['hits']}}</td>
|
||||||
|
</tr>
|
||||||
|
<tr id="{{=bp['number']}}" class="sourcecode traceback">
|
||||||
|
<td colspan="6">
|
||||||
|
<div class="ticket_code">
|
||||||
|
{{=CODE(open(bp['path']).read(), language='python',
|
||||||
|
link=None, highlight_line=bp['lineno'], context_lines=10)}}
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{{pass}}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form><!-- /errorform -->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div><!-- /applist -->
|
||||||
|
<div class="sidebar fl60 span5">
|
||||||
|
<div class="sidebar_inner controls" style="margin:0;">
|
||||||
|
<div class="box">
|
||||||
|
<h3>{{=T("Add breakpoint")}}</h3>
|
||||||
|
{{=form}}
|
||||||
|
<div class="row-fluid">
|
||||||
|
<div class="help span12 alert alert-block alert-info">
|
||||||
|
<ul class="unstyled">
|
||||||
|
<li>{{=T("You can also set and remove breakpoint in the edit window, using the Toggle Breakpoint button")}}</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
jQuery(document).ready(function() {
|
||||||
|
jQuery('.sourcecode').hide();
|
||||||
|
jQuery("#trck_breakpoints thead tr th:first input[type=checkbox]").click(function() {
|
||||||
|
var checkedStatus = this.checked;
|
||||||
|
jQuery("#trck_breakpoints tbody tr td:first-child input[type=checkbox]").each(function() {
|
||||||
|
this.checked = checkedStatus;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
jQuery("#trck_breakpoints tbody tr td:first-child input[type=checkbox]").change(function() {
|
||||||
|
var allchecked = jQuery("#trck_breakpoints tbody tr td:first-child input[type=checkbox]:checked").length == jQuery("#trck_breakpoints tbody tr td:first-child input[type=checkbox]").length;
|
||||||
|
jQuery("#trck_breakpoints thead tr th:first input[type=checkbox]").prop('checked', allchecked);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<!-- end "debug" block -->
|
||||||
@@ -0,0 +1,191 @@
|
|||||||
|
{{extend 'layout.html'}}
|
||||||
|
{{block sectionclass}}debug{{end}}
|
||||||
|
<!-- begin "debug" block -->
|
||||||
|
<div class="row-fluid">
|
||||||
|
<div class="applist f60 span7" style="padding-bottom:20px;">
|
||||||
|
<div class="applist_inner">
|
||||||
|
<h2>{{=T("web2py online debugger")}}</h2>
|
||||||
|
{{if filename:}}
|
||||||
|
<h3 style="word-wrap:break-word;">{{=T("Interaction at %s line %s") % (filename, lineno)}}</h3>
|
||||||
|
{{if exception:}}
|
||||||
|
<h3 class="exception">{{=T("Exception %s", exception['title'])}}</h3>
|
||||||
|
{{pass}}
|
||||||
|
<h5>{{=T("Code listing")}}</h5>
|
||||||
|
{{if lines:}}<div class="inspect" style="width:100%;overflow:auto;background-color:whiteSmoke;margin-bottom:20px;">
|
||||||
|
<pre>{{=CODE('\n'.join([x[1] for x in sorted(lines.items(),key=lambda x: x[0])]),
|
||||||
|
language='python', link=None, counter=min(lines.keys()),
|
||||||
|
highlight_line=lineno, context_lines=10)}}</pre></div>
|
||||||
|
{{pass}}
|
||||||
|
<div class="row-fluid">
|
||||||
|
<div class="help span7 alert alert-block alert-info">
|
||||||
|
<ul class="unstyled">
|
||||||
|
<li>{{=T("Your application will be blocked until you click an action button (next, step, continue, etc.)")}}</li>
|
||||||
|
<li>{{=T("Your can inspect variables using the console below")}}</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<h3>{{=T("Interactive console")}}</h3>
|
||||||
|
<div class="shell"><div id="wrapper">
|
||||||
|
<div class="row-fluid">
|
||||||
|
<div class="output-wrapper span11">
|
||||||
|
<textarea id="output" readonly="readonly">{{=data}}</textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row-fluid">
|
||||||
|
<form id="form" action="{{=URL(r=request, f='callback', args=app)}}" method="get" class="span11">
|
||||||
|
<div id="shellwrapper">
|
||||||
|
<div class="prompt-wrapper">
|
||||||
|
<div class="prompt-container">
|
||||||
|
<textarea class="prompt" name="statement" id="statement"></textarea>
|
||||||
|
</div>
|
||||||
|
<a href="#" rel="tooltip" data-placement="right" data-original-title="{{=T('Type some Python code in here and hit Return (Enter) to execute it.')}}">
|
||||||
|
{{=helpicon()}}
|
||||||
|
<span>Type some Python code in here and hit Return (Enter) to execute it.</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div id="caret"><span>>>></span></div>
|
||||||
|
<div id="autoscroll">autoscroll</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div></div>
|
||||||
|
{{elif request.env.get('wsgi_multiprocess') or not request.env.get('wsgi_multithread'):}}
|
||||||
|
<h3 class="not_paused">{{=T("Unsupported webserver working mode: %s", request.env.get('server_software', ''))}}</h3>
|
||||||
|
<div class="help span7 alert alert-block alert-info">
|
||||||
|
<ul class="unstyled">
|
||||||
|
<li><b>{{=T("WARNING:")}} </b>{{=T("This debugger may not work properly if you don't have a threaded webserver or you're using multiple daemon processes.")}}</li>
|
||||||
|
<li>{{=T("In development, use the default Rocket webserver that is currently supported by this debugger.")}}</li>
|
||||||
|
<li>{{=T("On production, you'll have to configure your webserver to use one process and multiple threads to use this debugger.")}}</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
{{#=BEAUTIFY(request.env)}}
|
||||||
|
{{else:}}
|
||||||
|
<h3 class="not_paused">{{=T("No Interaction yet")}}</h3>
|
||||||
|
<div class="help span7 alert alert-block alert-info">
|
||||||
|
<ul class="unstyled">
|
||||||
|
<li>{{=T("You need to set up and reach a")}} {{=A(T("breakpoint"), _href=URL('breakpoints'))}} {{=T('to use the debugger!')}}</li>
|
||||||
|
<li>{{=T('To emulate a breakpoint programatically, write:')}}
|
||||||
|
{{=CODE("from gluon.debug import dbg\n"
|
||||||
|
"dbg.set_trace() # stop here!\n",
|
||||||
|
counter=None)}}</li>
|
||||||
|
<li>{{=T('Please')}} {{=A(T("refresh"), _href=URL('interact'))}} {{=T('this page to see if a breakpoint was hit and debug interaction is required.')}}</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
{{pass}}
|
||||||
|
</div>
|
||||||
|
</div> <!-- /applist -->
|
||||||
|
<div class="sidebar fl60 span5">
|
||||||
|
<div class="sidebar_inner controls" style="margin:0;">
|
||||||
|
<span class="pwdchange pull-right">
|
||||||
|
{{if filename:}}
|
||||||
|
{{=sp_button(URL('step'), T("step"))}}
|
||||||
|
{{=sp_button(URL('next'), T("next"))}}
|
||||||
|
{{=sp_button(URL('ret'), T("return"))}}
|
||||||
|
{{=sp_button(URL('cont'), T("continue"))}}
|
||||||
|
{{=sp_button(URL('stop'), T("stop"))}}
|
||||||
|
{{pass}}
|
||||||
|
{{=button(URL('breakpoints'), T("breakpoints"))}}
|
||||||
|
</span>
|
||||||
|
|
||||||
|
{{if exception:}}
|
||||||
|
<div class="box">
|
||||||
|
<h3>{{=T('Exception %(extype)s: %(exvalue)s', dict(extype=exception['extype'], exvalue=exception['exvalue']))}}</h3>
|
||||||
|
<div class="formfield">
|
||||||
|
{{=CODE((exception['request']), counter=None)}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{pass}}
|
||||||
|
|
||||||
|
<div class="box">
|
||||||
|
<h3>{{=T('Locals##debug')}}</h3>
|
||||||
|
<div class="formfield">
|
||||||
|
{{=BEAUTIFY(f_locals)}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="box">
|
||||||
|
<h3>{{=T('Globals##debug')}}</h3>
|
||||||
|
<div class="formfield">
|
||||||
|
{{=BEAUTIFY(f_globals)}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="{{=URL('static', 'js/autoscroll.js')}}"></script>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
var bShellScrolling=0
|
||||||
|
jQuery(document).ready(function(){
|
||||||
|
// jQuery('#statement').focus(); // not usefull most times...
|
||||||
|
|
||||||
|
jQuery('#statement').keyup(function(event){
|
||||||
|
var t=jQuery(this),
|
||||||
|
s=t.val(),
|
||||||
|
o=jQuery('#output'),
|
||||||
|
RETURN = 38;
|
||||||
|
if(s=='\n') t.val('');
|
||||||
|
if(s.length>1 && s.substr(s.length-1,1)=='\n' && s.substr(s.length-2,1)!=':' &&
|
||||||
|
(s.indexOf(':\n ')<0 || s.substr(s.length-2,1)=='\n')) {
|
||||||
|
t.val('');
|
||||||
|
jQuery.post("{{=URL(r=request,f='execute',args=app)}}",
|
||||||
|
{statement:s},function(data){o.html(o.html()+data).attr('scrollTop',o.attr('scrollHeight'));});
|
||||||
|
} else { };
|
||||||
|
if(event.keyCode==RETURN){
|
||||||
|
var i=s.length
|
||||||
|
if(i==0){
|
||||||
|
var s=o.find('table:last pre:first').text();
|
||||||
|
bShellScrolling=o.find('table').length;
|
||||||
|
}else if(bShellScrolling){
|
||||||
|
var i=bShellScrolling
|
||||||
|
if(i<1){
|
||||||
|
return
|
||||||
|
}else{
|
||||||
|
i--
|
||||||
|
var s=o.find('table:nth-child('+(i)+') pre:first').text();
|
||||||
|
bShellScrolling=i
|
||||||
|
}
|
||||||
|
}else if(s.indexOf('\n')<0){
|
||||||
|
var oo=o.find('tr:first-child pre:contains("'+s+'")')
|
||||||
|
if(oo.length==0){
|
||||||
|
return
|
||||||
|
}else if(oo.length==1){
|
||||||
|
s=oo.text();
|
||||||
|
}else{
|
||||||
|
sVar=oo.text();
|
||||||
|
o.html(o.html()+'<dd>'+s+' ?</dd><dt>'+sVar+'</dt>').attr('scrollTop',o.attr('scrollHeight'))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
//multistring expr
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// if(s.slice(s.length-1)=='\n'){
|
||||||
|
s=s.slice(0,s.length-1)
|
||||||
|
// }
|
||||||
|
t.val(s);
|
||||||
|
}
|
||||||
|
if(bShellScrolling && event.keyCode==40){
|
||||||
|
var i=bShellScrolling
|
||||||
|
i++
|
||||||
|
var s=o.find('table:nth-child('+i+') tr:first-child pre').text();
|
||||||
|
if(s){
|
||||||
|
s=s.slice(0,s.length-1)
|
||||||
|
t.val(s);
|
||||||
|
bShellScrolling=i
|
||||||
|
}else{
|
||||||
|
bShellScrolling=0
|
||||||
|
t.val('')
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if(bShellScrolling && (event.keyCode==37 || event.keyCode==39)){
|
||||||
|
bShellScrolling=0;
|
||||||
|
};
|
||||||
|
if(event.keyCode==27){
|
||||||
|
bShellScrolling=0;
|
||||||
|
t.val('');
|
||||||
|
};
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</div>
|
||||||
|
<!-- end "debug" block -->
|
||||||
@@ -1,24 +1,26 @@
|
|||||||
{{extend 'layout.html'}}
|
{{extend 'layout.html'}}
|
||||||
|
|
||||||
{{block sectionclass}}about{{end}}
|
{{block sectionclass}}about{{end}}
|
||||||
|
<!-- begin "about" block -->
|
||||||
<h2>{{=T("About application")}} "{{=app}}"</h2>
|
<h2>{{=T("About application")}} "{{=app}}"</h2>
|
||||||
<h3>{{=T("About")}} {{=app}}</h3>
|
<h3>{{=T("About")}} {{=app}}</h3>
|
||||||
<p class="controls">{{=button(URL('edit/%s/ABOUT' % (app)), T('Edit'))}}</p>
|
<p class="controls">{{=button(URL('edit/%s/ABOUT' % (app)), T('Edit'))}}</p>
|
||||||
<div class="about_text legalese">{{=about}}</div>
|
<div class="about_text legalese well well-small">{{=about}}</div>
|
||||||
<h3>{{=T('License for')}} {{=app}}</h3>
|
<h3>{{=T('License for')}} {{=app}}</h3>
|
||||||
<p class="controls">{{=button(URL('edit/%s/LICENSE' % (app)), T('Edit'))}}</p>
|
<p class="controls">{{=button(URL('edit/%s/LICENSE' % (app)), T('Edit'))}}</p>
|
||||||
<div class="license_text legalese">{{=license}}</div>
|
<div class="license_text legalese well well-small">{{=license}}</div>
|
||||||
</ul>
|
|
||||||
|
|
||||||
<script language="javascript" type="text/javascript" src="{{=URL('static','js/jquery.flot.js')}}"></script>
|
|
||||||
|
|
||||||
<h3>{{=T('Project Progress')}}</h3>
|
<h3>{{=T('Project Progress')}}</h3>
|
||||||
<p>
|
<script language="javascript" type="text/javascript" src="{{=URL('static','js/jquery.flot.js')}}"></script>
|
||||||
<center>
|
<script language="javascript" type="text/javascript" src="{{=URL('static','js/jquery.flot.resize.js')}}"></script>
|
||||||
<div id="placeholder" style="width:600px;height:300px;"></div>
|
<div class="row-fluid">
|
||||||
</center>
|
<div class="span2"> </div>
|
||||||
|
<div class="span8 center">
|
||||||
|
<div id="placeholder"></div>
|
||||||
|
</div>
|
||||||
|
<div class="span2"> </div>
|
||||||
|
</div>
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
jQuery(function () { jQuery.plot(jQuery("#placeholder"), [ {{=progress}} ]); });
|
jQuery(document).ready(function() {
|
||||||
|
jQuery.plot(jQuery("#placeholder"), [ {{=progress}} ]);
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
</p>
|
<!-- end "about" block -->
|
||||||
@@ -1,5 +1,20 @@
|
|||||||
{{extend 'layout.html'}}
|
{{extend 'layout.html'}}
|
||||||
|
{{
|
||||||
<h1>{{=T('Bulk Student Registration')}}</h1>
|
# add bootstrap class to form
|
||||||
|
form['_class']='span4 well well-small'
|
||||||
{{=form}}
|
# change form.custom.begin
|
||||||
|
form.custom.begin=XML("<%s %s>" % (form.tag,form._xml()[0]))
|
||||||
|
# new form buttons
|
||||||
|
smt = form.element('input',_type='submit')
|
||||||
|
smt['_class']='btn'
|
||||||
|
form.element('input[type=submit]',replace=lambda button: DIV(button,_class="controls-inline"))
|
||||||
|
}}
|
||||||
|
<h2>{{=T('Bulk Student Registration').capitalize()}}</h2>
|
||||||
|
<div id="web2py_user_form">
|
||||||
|
{{=form.custom.begin}}
|
||||||
|
{{for e in form.components[0]:}}
|
||||||
|
{{= e[0][0]}}
|
||||||
|
{{= e[1][0]}}
|
||||||
|
{{pass}}
|
||||||
|
{{=form.custom.end}}
|
||||||
|
</div>
|
||||||
@@ -1,10 +1,22 @@
|
|||||||
{{extend 'layout.html'}}
|
{{extend 'layout.html'}}
|
||||||
|
|
||||||
{{block sectionclass}}change_password{{end}}
|
{{block sectionclass}}change_password{{end}}
|
||||||
|
<!-- begin "change_password" block -->
|
||||||
<h2>Change Admin Password</h2>
|
<h2>web2py™ {{=T('Web Framework')}}</h2>
|
||||||
|
<h3>{{=T('Change Admin Password')}}</h3>
|
||||||
<div class="pwform">
|
<div class="pwform">
|
||||||
{{=form}}
|
{{=form.custom.begin}}
|
||||||
|
{{ for fieldname in form.table.fields: }}
|
||||||
|
{{if fieldname is not 'id':}}
|
||||||
|
<label>{{=form.custom.label[fieldname]}}</label>
|
||||||
|
{{=form.custom.widget[fieldname]}}
|
||||||
|
{{pass}}
|
||||||
|
{{pass}}
|
||||||
|
<div class="controls"><button type="submit" class="btn">{{=T('Submit')}}</button></div>
|
||||||
|
{{=form.custom.end}}
|
||||||
</div>
|
</div>
|
||||||
|
<script type="text/javascript">
|
||||||
|
jQuery(document).ready(function() {
|
||||||
|
jQuery(":input:visible:enabled:first").focus();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<!-- end "change_password" block -->
|
||||||
@@ -1,9 +1,16 @@
|
|||||||
{{extend 'layout.html'}}
|
{{extend 'layout.html'}}
|
||||||
|
{{
|
||||||
|
dlg = dialog
|
||||||
|
smt_button = dlg.element(_type="submit")
|
||||||
|
smt_button['_class'] = 'btn'
|
||||||
|
smt_button['_style'] = 'margin-right:4px;'
|
||||||
|
ccl_button = dlg.element(_type="button")
|
||||||
|
ccl_button['_class'] = 'btn'
|
||||||
|
}}
|
||||||
{{block sectionclass}}delete{{end}}
|
{{block sectionclass}}delete{{end}}
|
||||||
|
<!-- begin "delete" block -->
|
||||||
<h2>{{=T('Are you sure you want to delete file "%s"?', filename)}}</h2>
|
<h2>{{=T('Are you sure you want to delete file "%s"?', filename)}}</h2>
|
||||||
<div class="center">
|
<div class="center">
|
||||||
{{=dialog}}
|
{{=dialog}}
|
||||||
</div>
|
</div>
|
||||||
|
<!-- end "delete" block -->
|
||||||
@@ -1,9 +1,16 @@
|
|||||||
{{extend 'layout.html'}}
|
{{extend 'layout.html'}}
|
||||||
|
{{
|
||||||
|
dlg = dialog
|
||||||
|
smt_button = dlg.element(_type="submit")
|
||||||
|
smt_button['_class'] = 'btn'
|
||||||
|
smt_button['_style'] = 'margin-right:4px;'
|
||||||
|
ccl_button = dlg.element(_type="button")
|
||||||
|
ccl_button['_class'] = 'btn'
|
||||||
|
}}
|
||||||
{{block sectionclass}}delete_plugin{{end}}
|
{{block sectionclass}}delete_plugin{{end}}
|
||||||
|
<!-- begin "delete_plugin" block -->
|
||||||
<h2>{{=T('Are you sure you want to delete plugin "%s"?', plugin)}}</h2>
|
<h2>{{=T('Are you sure you want to delete plugin "%s"?', plugin)}}</h2>
|
||||||
<div class="center">
|
<div class="center">
|
||||||
{{=dialog}}
|
{{=dialog}}
|
||||||
</div>
|
</div>
|
||||||
|
<!-- end "delete_plugin" block -->
|
||||||
@@ -7,52 +7,75 @@ def peekfile(path,file,vars={},title=None):
|
|||||||
return A(file.replace('\\\\','/'),_title=title,_href=URL('peek', args=args, vars=vars))
|
return A(file.replace('\\\\','/'),_title=title,_href=URL('peek', args=args, vars=vars))
|
||||||
def editfile(path,file,vars={}):
|
def editfile(path,file,vars={}):
|
||||||
args=(path,file) if 'app' in vars else (app,path,file)
|
args=(path,file) if 'app' in vars else (app,path,file)
|
||||||
return A(SPAN(T('Edit')),_class='button editbutton',_href=URL('edit', args=args, vars=vars))
|
return A(SPAN(T('Edit')),_class='button editbutton btn btn-mini',_href=URL('edit', args=args, vars=vars))
|
||||||
def testfile(path,file):
|
def testfile(path,file):
|
||||||
return A(TAG[''](IMG(_src=URL('static', 'images/test_icon.png'), _alt=T('test')), SPAN(T("Run tests in this file (to run all files, you may also use the button labelled 'test')"))), _class='icon test tooltip',_href=URL('test', args=(app, file)))
|
return A(TAG[''](IMG(_src=URL('static', 'images/test_icon.png'), _alt=T('test')),
|
||||||
|
SPAN(T("Run tests in this file (to run all files, you may also use the button labelled 'test')"))),
|
||||||
|
_class='icon test',
|
||||||
|
_href=URL('test', args=(app, file)),
|
||||||
|
_rel="tooltip",
|
||||||
|
**{'_data-placement':'right',
|
||||||
|
'_data-original-title':T("Run tests in this file (to run all files, you may also use the button labelled 'test')")})
|
||||||
def editlanguagefile(path,file,vars={}):
|
def editlanguagefile(path,file,vars={}):
|
||||||
return A(SPAN(T('Edit')),_class='button editbutton',_href=URL('edit_language', args=(app, path, file), vars=vars))
|
return A(SPAN(T('Edit')),_class='button editbutton btn btn-mini',_href=URL('edit_language', args=(app, path, file), vars=vars))
|
||||||
def editpluralsfile(path,file,vars={}):
|
def editpluralsfile(path,file,vars={}):
|
||||||
return A(SPAN(T('Edit')),_class='button editbutton',_href=URL('edit_plurals', args=(app, path, file), vars=vars))
|
return A(SPAN(T('Edit')),_class='button editbutton btn btn-mini',_href=URL('edit_plurals', args=(app, path, file), vars=vars))
|
||||||
def file_upload_form(location, anchor=None):
|
def file_upload_form(location, anchor=None):
|
||||||
form=FORM(T("upload file:")," ",
|
form=FORM(
|
||||||
INPUT(_type="file",_name="file")," ",T("and rename it:")," ",
|
LABEL(T("upload file:")),
|
||||||
INPUT(_type="text",_name="filename",requires=IS_NOT_EMPTY),
|
INPUT(_type="file",_name="file"),
|
||||||
|
LABEL(T("and rename it:")),
|
||||||
|
INPUT(_type="text",_name="filename",requires=IS_NOT_EMPTY,_class=""),
|
||||||
|
DIV(TAG['BUTTON'](T("Upload"),_type="submit",_class="btn"),_class="controls"),
|
||||||
INPUT(_type="hidden",_name="location",_value=location),
|
INPUT(_type="hidden",_name="location",_value=location),
|
||||||
INPUT(_type="hidden",_name="token",_value=session.token),
|
INPUT(_type="hidden",_name="token",_value=session.token),
|
||||||
INPUT(_type="hidden",_name="sender",_value=URL('design',args=app, anchor=anchor)),
|
INPUT(_type="hidden",_name="sender",_value=URL('design',args=app, anchor=anchor)),
|
||||||
INPUT(_type="submit",_value=T("upload")),_action=URL('upload_file'))
|
_action=URL('upload_file'),
|
||||||
|
_class="generatedbyw2p well well-small")
|
||||||
return form
|
return form
|
||||||
def file_create_form(location, anchor=None):
|
def file_create_form(location, anchor=None, helptext=""):
|
||||||
form=FORM(T("create file with filename:")," ",
|
form=FORM(
|
||||||
INPUT(_type="text",_name="filename",requires=IS_NOT_EMPTY),
|
LABEL(T("create file with filename:")),
|
||||||
|
INPUT(_type="text",_name="filename",requires=IS_NOT_EMPTY,_class=''),
|
||||||
|
TAG['SMALL'](helptext,_class="help-block"),
|
||||||
|
DIV(TAG['BUTTON'](T("Create"),_type="submit",_class="btn"),_class="controls"),
|
||||||
INPUT(_type="hidden",_name="location",_value=location),
|
INPUT(_type="hidden",_name="location",_value=location),
|
||||||
INPUT(_type="hidden",_name="sender",_value=URL('design',args=app)),
|
INPUT(_type="hidden",_name="sender",_value=URL('design',args=app)),
|
||||||
INPUT(_type="hidden",_name="token",_value=session.token),
|
INPUT(_type="hidden",_name="token",_value=session.token),
|
||||||
INPUT(_type="hidden",_name="id",_value=anchor),
|
INPUT(_type="hidden",_name="id",_value=anchor),
|
||||||
INPUT(_type="submit",_value=T("Create")),_action=URL('create_file'))
|
_action=URL('create_file'),
|
||||||
|
_class="generatedbyw2p well well-small")
|
||||||
return form
|
return form
|
||||||
def upload_plugin_form(app, anchor=None):
|
def upload_plugin_form(app, anchor=None):
|
||||||
form=FORM(T("upload plugin file:")," ",
|
form=FORM(
|
||||||
|
LABEL(T("upload plugin file:")),
|
||||||
INPUT(_type="file",_name="pluginfile"),
|
INPUT(_type="file",_name="pluginfile"),
|
||||||
INPUT(_type="hidden",_name="id",_value=anchor),
|
INPUT(_type="hidden",_name="id",_value=anchor),
|
||||||
INPUT(_type="hidden",_name="token",_value=session.token),
|
INPUT(_type="hidden",_name="token",_value=session.token),
|
||||||
INPUT(_type="submit",_value=T("upload")))
|
DIV(TAG['BUTTON'](T("Upload"),_type="submit",_class="btn"),_class="controls"),
|
||||||
|
_class="generatedbyw2p well well-small")
|
||||||
return form
|
return form
|
||||||
def deletefile(arglist, vars={}):
|
def deletefile(arglist, vars={}):
|
||||||
vars.update({'sender':request.function+'/'+app})
|
vars.update({'sender':request.function+'/'+app})
|
||||||
return A(TAG[''](IMG(_src=URL('static', 'images/delete_icon.png')), SPAN(T('Delete this file (you will be asked to confirm deletion)'))), _class='icon delete tooltip', _href=URL('delete',args=arglist,vars=vars))
|
return A(TAG[''](IMG(_src=URL('static', 'images/delete_icon.png')),
|
||||||
|
SPAN(T('Delete this file (you will be asked to confirm deletion)'))),
|
||||||
|
_href=URL('delete',args=arglist,vars=vars),
|
||||||
|
_class='icon delete',
|
||||||
|
_rel="tooltip",
|
||||||
|
**{'_data-placement':'right',
|
||||||
|
'_data-original-title':T('Delete this file (you will be asked to confirm deletion)')})
|
||||||
}}
|
}}
|
||||||
|
|
||||||
{{block sectionclass}}design{{end}}
|
{{block sectionclass}}design{{end}}
|
||||||
|
<!-- begin "design" block -->
|
||||||
|
|
||||||
<h2>{{=T("Edit application")}} "{{=A(app,_href=URL(app,'default','index'),_target="_blank")}}"</h2>
|
<h2>{{=T("Edit application")}} "{{=A(app,_href=URL(app,'default','index'),_target="_blank")}}"</h2>
|
||||||
|
|
||||||
<!-- COLLAPSE/JUMP-TO BUTTONS -->
|
<!-- COLLAPSE/JUMP-TO BUTTONS -->
|
||||||
<div class="right-full controls">
|
<div class="right-full controls">
|
||||||
<p>
|
<p class="buttons-row">
|
||||||
{{=searchbox('search')}}
|
{{=searchbox('search')}}
|
||||||
<a class="button special" href="#" onclick="jQuery('h3').click();return false"><span>{{=T("collapse/expand all")}}</span></a>
|
<a class="button special btn btn-inverse" href="#" onclick="jQuery('h3>span').click();return false"><span>{{=T("collapse/expand all")}}</span></a>
|
||||||
<span class="buttongroup">
|
<span class="buttongroup">
|
||||||
{{=button('#models', T("models"))}}
|
{{=button('#models', T("models"))}}
|
||||||
{{=button('#controllers', T("controllers"))}}
|
{{=button('#controllers', T("controllers"))}}
|
||||||
@@ -67,10 +90,12 @@ def deletefile(arglist, vars={}):
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- MODELS -->
|
<!-- MODELS -->
|
||||||
|
<h3 id="_models" rel="pagebookmark">
|
||||||
<h3 id="models" onclick="collapse('models_inner');" class="component">
|
<span class="component" onclick="collapse('models_inner');">{{=T("Models")}}</span>
|
||||||
{{=T("Models")}}
|
<a href="#models" rel="tooltip" data-placement="right" data-original-title="{{=T('The data representation, define database tables and sets')}}">
|
||||||
<span class="tooltip">{{=helpicon()}} <span>{{=T("The data representation, define database tables and sets")}}</span></span>
|
{{=helpicon()}}
|
||||||
|
<span>{{=T("The data representation, define database tables and sets")}}</span>
|
||||||
|
</a><span id="models" class="hashstick"> </span><a href="#" class="tophashlink btn btn-mini btn-warning"><span>top</span></a>
|
||||||
</h3>
|
</h3>
|
||||||
<div id="models_inner" class="component_contents">
|
<div id="models_inner" class="component_contents">
|
||||||
{{if not models:}}<p><strong>{{=T("There are no models")}}</strong></p>{{else:}}
|
{{if not models:}}<p><strong>{{=T("There are no models")}}</strong></p>{{else:}}
|
||||||
@@ -79,13 +104,12 @@ def deletefile(arglist, vars={}):
|
|||||||
{{if os.access(os.path.join(request.folder,'..',app,'databases','sql.log'),os.R_OK):}}
|
{{if os.access(os.path.join(request.folder,'..',app,'databases','sql.log'),os.R_OK):}}
|
||||||
{{=button(URL('peek/%s/databases/sql.log'%app), 'sql.log')}}
|
{{=button(URL('peek/%s/databases/sql.log'%app), 'sql.log')}}
|
||||||
{{pass}}
|
{{pass}}
|
||||||
|
{{=button(URL(a=app, c='appadmin',f='graph_model'), T('graph model'))}}
|
||||||
</div>
|
</div>
|
||||||
{{pass}}
|
<ul class="unstyled act_edit">
|
||||||
|
|
||||||
<ul>
|
|
||||||
{{for m in models:}}
|
{{for m in models:}}
|
||||||
{{id="models__"+m.replace('.','__')}}
|
{{id="models__"+m.replace('.','__')}}
|
||||||
<li id="{{=id}}">
|
<li id="{{='_'+id}}" rel="pagebookmark"><span id="{{=id}}" class="hashstick"> </span>
|
||||||
<span class="filetools controls">
|
<span class="filetools controls">
|
||||||
{{=editfile('models',m, dict(id=id))}}
|
{{=editfile('models',m, dict(id=id))}}
|
||||||
{{=deletefile([app, 'models', m], dict(id=id, id2='models'))}}
|
{{=deletefile([app, 'models', m], dict(id=id, id2='models'))}}
|
||||||
@@ -99,7 +123,13 @@ def deletefile(arglist, vars={}):
|
|||||||
</li>
|
</li>
|
||||||
{{pass}}
|
{{pass}}
|
||||||
</ul>
|
</ul>
|
||||||
<div class="controls formfield">{{=file_create_form('%s/models/' % app, 'models')}}</div>
|
{{pass}}
|
||||||
|
<div class="controls formfield">
|
||||||
|
<button onclick="jQuery('#form1').slideToggle()" class="btn btn-mini">Create</button>
|
||||||
|
<div id="form1" class="row-fluid" style="display:none">
|
||||||
|
<div class="span3">{{=file_create_form('%s/models/' % app, 'models')}}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- FIND CONTROLLER FUNCTIONS -->
|
<!-- FIND CONTROLLER FUNCTIONS -->
|
||||||
@@ -109,10 +139,12 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
|
|||||||
}}
|
}}
|
||||||
|
|
||||||
<!-- CONTROLLERS -->
|
<!-- CONTROLLERS -->
|
||||||
|
<h3 id="_controllers" rel="pagebookmark">
|
||||||
<h3 id="controllers" onclick="collapse('controllers_inner');" class="component">
|
<span class="component" onclick="collapse('controllers_inner');">{{=T("Controllers")}}</span>
|
||||||
{{=T("Controllers")}}
|
<a href="#controllers" rel="tooltip" data-placement="right" data-original-title="{{=T('The application logic, each URL path is mapped in one exposed function in the controller')}}">
|
||||||
<span class="tooltip">{{=helpicon()}} <span>{{=T("The application logic, each URL path is mapped in one exposed function in the controller")}}</span></span>
|
{{=helpicon()}}
|
||||||
|
<span>{{=T("The application logic, each URL path is mapped in one exposed function in the controller")}}</span>
|
||||||
|
</a><span id="controllers" class="hashstick"> </span><a href="#" class="tophashlink btn btn-mini btn-warning"><span>top</span></a>
|
||||||
</h3>
|
</h3>
|
||||||
<div id="controllers_inner" class="component_contents">
|
<div id="controllers_inner" class="component_contents">
|
||||||
{{if not controllers:}}<p><strong>{{=T("There are no controllers")}}</strong></p>{{else:}}
|
{{if not controllers:}}<p><strong>{{=T("There are no controllers")}}</strong></p>{{else:}}
|
||||||
@@ -121,11 +153,10 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
|
|||||||
{{=button(URL('test',args=app), T("test"))}}
|
{{=button(URL('test',args=app), T("test"))}}
|
||||||
{{=button(URL('edit',args=[app,'cron','crontab']), T("crontab"))}}
|
{{=button(URL('edit',args=[app,'cron','crontab']), T("crontab"))}}
|
||||||
</div>
|
</div>
|
||||||
{{pass}}
|
<ul class="unstyled act_edit">
|
||||||
<ul>
|
|
||||||
{{for c in controllers:}}
|
{{for c in controllers:}}
|
||||||
{{id="controllers__"+c.replace('.','__')}}
|
{{id="controllers__"+c.replace('.','__')}}
|
||||||
<li id="{{=id}}">
|
<li id="{{='_'+id}}" rel="pagebookmark"><span id="{{=id}}" class="hashstick"> </span>
|
||||||
<span class="filetools controls">
|
<span class="filetools controls">
|
||||||
{{=editfile('controllers',c, dict(id=id))}}
|
{{=editfile('controllers',c, dict(id=id))}}
|
||||||
{{=deletefile([app, 'controllers', c], dict(id=id, id2='controllers'))}}
|
{{=deletefile([app, 'controllers', c], dict(id=id, id2='controllers'))}}
|
||||||
@@ -134,30 +165,38 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
|
|||||||
<span class="file">
|
<span class="file">
|
||||||
{{=peekfile('controllers',c, dict(id=id))}}
|
{{=peekfile('controllers',c, dict(id=id))}}
|
||||||
</span>
|
</span>
|
||||||
<span class="extras">
|
<span class="extras celled">
|
||||||
{{if functions[c]:}}{{=T("exposes")}}{{pass}} {{=XML(', '.join([A(f,_href=URL(a=app,c=c[:-3],f=f)).xml() for f in functions[c]]))}}
|
{{if functions[c]:}}{{=T("exposes")}}{{pass}} {{=XML(', '.join([A(f,_href=URL(a=app,c=c[:-3],f=f)).xml() for f in functions[c]]))}}
|
||||||
</span>
|
</span>
|
||||||
</li>
|
</li>
|
||||||
{{pass}}
|
{{pass}}
|
||||||
</ul>
|
</ul>
|
||||||
<div class="controls formfield">{{=file_create_form('%s/controllers/' % app, 'controllers')}}</div>
|
{{pass}}
|
||||||
|
<div class="controls formfield">
|
||||||
|
<button onclick="jQuery('#form2').slideToggle()" class="btn btn-mini">Create</button>
|
||||||
|
<div id="form2" class="row-fluid" style="display:none">
|
||||||
|
<div class="span3">{{=file_create_form('%s/controllers/' % app, 'controllers')}}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- VIEWS -->
|
<!-- VIEWS -->
|
||||||
|
<h3 id="_views" rel="pagebookmark">
|
||||||
<h3 id="views" onclick="collapse('views_inner');" class="component">
|
<span class="component" onclick="collapse('views_inner');">{{=T("Views")}}</span>
|
||||||
{{=T("Views")}}
|
<a href="#views" rel="tooltip" data-placement="right" data-original-title="{{=T('The presentations layer, views are also known as templates')}}">
|
||||||
<span class="tooltip">{{=helpicon()}} <span>{{=T("The presentations layer, views are also known as templates")}}</span></span>
|
{{=helpicon()}}
|
||||||
|
<span>{{=T("The presentations layer, views are also known as templates")}}</span>
|
||||||
|
</a><span id="views" class="hashstick"> </span><a href="#" class="tophashlink btn btn-mini btn-warning"><span>top</span></a>
|
||||||
</h3>
|
</h3>
|
||||||
<div id="views_inner" class="component_contents">
|
<div id="views_inner" class="component_contents">
|
||||||
|
{{if not views:}}<p><strong>{{=T("There are no views")}}</strong></p>{{else:}}
|
||||||
<div class="controls comptools">
|
<div class="controls comptools">
|
||||||
{{=button(LAYOUTS_APP, T("download layouts"))}}
|
{{=button(LAYOUTS_APP, T("download layouts"))}}
|
||||||
</div>
|
</div>
|
||||||
{{if not views:}}<p><strong>{{=T("There are no views")}}</strong></p>{{pass}}
|
<ul class="unstyled act_edit">
|
||||||
<ul>
|
|
||||||
{{for c in views:}}
|
{{for c in views:}}
|
||||||
{{id="views__"+c.replace('/','__').replace('.','__')}}
|
{{id="views__"+c.replace('/','__').replace('.','__')}}
|
||||||
<li id="{{=id}}">
|
<li id="{{='_'+id}}" rel="pagebookmark"><span id="{{=id}}" class="hashstick"> </span>
|
||||||
<span class="filetools controls">
|
<span class="filetools controls">
|
||||||
{{=editfile('views',c, dict(id=id))}}
|
{{=editfile('views',c, dict(id=id))}}
|
||||||
{{=deletefile([app, 'views', c], dict(id=id, id2='views'))}}
|
{{=deletefile([app, 'views', c], dict(id=id, id2='views'))}}
|
||||||
@@ -165,85 +204,97 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
|
|||||||
<span class="file">
|
<span class="file">
|
||||||
{{=peekfile('views',c, dict(id=id))}}
|
{{=peekfile('views',c, dict(id=id))}}
|
||||||
</span>
|
</span>
|
||||||
<span class="extras">
|
<span class="extras celled celled-one">
|
||||||
{{if extend.has_key(c):}}{{=T("extends")}} <b>{{=extend[c]}}</b> {{pass}}
|
{{if extend.has_key(c):}}{{=T("extends")}} <b>{{=extend[c]}}</b> {{pass}}
|
||||||
{{if include[c]:}}{{=T("includes")}} {{pass}}{{=XML(', '.join([B(f).xml() for f in include[c]]))}}
|
{{if include[c]:}}{{=T("includes")}} {{pass}}{{=XML(', '.join([B(f).xml() for f in include[c]]))}}
|
||||||
</span>
|
</span>
|
||||||
</li>
|
</li>
|
||||||
{{pass}}
|
{{pass}}
|
||||||
</ul>
|
</ul>
|
||||||
<div class="controls formfield">{{=file_create_form('%s/views/' % app, 'views')}}</div>
|
{{pass}}
|
||||||
|
<div class="controls formfield">
|
||||||
|
<button onclick="jQuery('#form3').slideToggle()" class="btn btn-mini">Create</button>
|
||||||
|
<div id="form3" class="row-fluid" style="display:none">
|
||||||
|
<div class="span3">{{=file_create_form('%s/views/' % app, 'views')}}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- LANGUAGES -->
|
<!-- LANGUAGES -->
|
||||||
|
<h3 id="_languages" rel="pagebookmark">
|
||||||
<h3 id="languages" onclick="collapse('languages_inner');" class="component">
|
<span class="component" onclick="collapse('languages_inner');">{{=T("Languages")}}</span>
|
||||||
{{=T("Languages")}}
|
<a href="#languages" rel="tooltip" data-placement="right" data-original-title="{{=T('Translation strings for the application')}}">
|
||||||
<span class="tooltip">{{=helpicon()}} <span>{{=T("Translation strings for the application")}}</span></span>
|
{{=helpicon()}}
|
||||||
|
<span>{{=T("Translation strings for the application")}}</span>
|
||||||
|
</a><span id="languages" class="hashstick"> </span><a href="#" class="tophashlink btn btn-mini btn-warning"><span>top</span></a>
|
||||||
</h3>
|
</h3>
|
||||||
<div id="languages_inner" class="component_contents">
|
<div id="languages_inner" class="component_contents">
|
||||||
|
{{if not languages:}}<p><strong>{{=T("There are no translators, only default language is supported")}}</strong></p>{{else:}}
|
||||||
<div class="controls comptools">
|
<div class="controls comptools">
|
||||||
{{=button(URL('update_languages/'+app), T('update all languages'))}}
|
{{=button(URL('update_languages/'+app), T('update all languages'))}}
|
||||||
</div>
|
</div>
|
||||||
{{if not languages:}}<p><strong>{{=T("There are no translators, only default language is supported")}}</strong></p>{{pass}}
|
<ul class="unstyled act_edit">
|
||||||
<table>
|
|
||||||
{{for lang in sorted(languages):
|
{{for lang in sorted(languages):
|
||||||
file = lang+'.py'
|
file = lang+'.py'
|
||||||
id = "languages__"+file.replace('.','__')}}
|
id = "languages__"+file.replace('.','__')}}
|
||||||
<tr id="{{=id}}">
|
<li id="{{='_'+id}}" rel="pagebookmark" class="li-row"><span id="{{=id}}" class="hashstick"> </span>
|
||||||
<td>
|
<span class="li-controls">
|
||||||
<span class="filetools controls">
|
<span class="filetools controls">
|
||||||
{{=editlanguagefile('languages',file)}}
|
{{=editlanguagefile('languages',file)}}
|
||||||
{{=deletefile([app, 'languages', file], dict(id=id, id2='languages'))}}
|
{{=deletefile([app, 'languages', file], dict(id=id, id2='languages'))}}
|
||||||
</span>
|
</span>
|
||||||
<span class="file">
|
<span class="">
|
||||||
{{=peekfile('languages',file, dict(id=id))}}
|
{{=peekfile('languages',file, dict(id=id))}}
|
||||||
</span>
|
</span>
|
||||||
</td>
|
</span> <!-- /li-row -->
|
||||||
<td>
|
<span class="extras celled">
|
||||||
|
|
||||||
(
|
(
|
||||||
{{=T("Plural-Forms:")}}
|
{{=T("Plural-Forms:")}}
|
||||||
{{p=languages[lang][3:7]}}
|
{{p=languages[lang][3:7]}}
|
||||||
{{if p[2] == 'default':}}
|
{{if p[2] == 'default':}}
|
||||||
<span class='error'>{{=T("rules are not defined")}}</span> {{=T.M("(file **gluon/contrib/plural_rules/%s.py** is not found)",lang[:2])}}
|
<span class='error text-error'>{{=T("rules are not defined")}}</span> {{=T.M("(file **gluon/contrib/plural_rules/%s.py** is not found)",lang[:2])}}
|
||||||
{{else:}}
|
{{else:}}
|
||||||
{{if p[3] == 1:}}
|
{{if p[3] == 1:}}
|
||||||
{{=B(T("are not used"))}}
|
{{=B(T("are not used"))}}
|
||||||
{{else:}}
|
{{else:}}
|
||||||
{{pfile=p[0]}}
|
{{pfile=p[0]}}
|
||||||
{{if p[1]!=0:}}
|
{{if p[1]!=0:}}<span style="display:inline-block;margin-top:-10px;">
|
||||||
<span class="filetools controls">
|
<span class="filetools controls">
|
||||||
{{=editpluralsfile('languages',pfile,dict(nplurals=p[3]))}}
|
{{=editpluralsfile('languages',pfile,dict(nplurals=p[3]))}}
|
||||||
</span>
|
</span>
|
||||||
<span class="file">
|
<span class="file">
|
||||||
{{=peekfile('languages',pfile,dict(id=id))}}
|
{{=peekfile('languages',pfile,dict(id=id))}}
|
||||||
</span>
|
</span></span>
|
||||||
{{else:}}
|
{{else:}}
|
||||||
<b>{{=T("are not used yet")}}</b>
|
<b>{{=T("are not used yet")}}</b>
|
||||||
{{pass}}
|
{{pass}}
|
||||||
{{pass}}
|
{{pass}}
|
||||||
{{pass}}
|
{{pass}}
|
||||||
)
|
)
|
||||||
</td>
|
</span>
|
||||||
</tr>
|
</li>
|
||||||
{{pass}}
|
{{pass}}
|
||||||
</table>
|
</ul>
|
||||||
{{pass}}
|
{{pass}}
|
||||||
<div class="controls formfield">{{=file_create_form('%s/languages/' % app, 'languages')}}{{=T('(something like "it-it")')}}</div>
|
<div class="controls formfield">
|
||||||
|
<button onclick="jQuery('#form4').slideToggle()" class="btn btn-mini">Create</button>
|
||||||
|
<div id="form4" class="row-fluid" style="display:none">
|
||||||
|
<div class="span3">{{=file_create_form('%s/languages/' % app, 'languages', T('(something like "it-it")'))}}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- STATIC -->
|
<!-- STATIC -->
|
||||||
|
<h3 id="_static" rel="pagebookmark">
|
||||||
<h3 id="static" onclick="collapse('static_inner');" class="component">
|
<span class="component" onclick="collapse('static_inner');">{{=T("Static")}}</span>
|
||||||
{{=T("Static files")}}
|
<a href="#static" rel="tooltip" data-placement="right" data-original-title="{{=T('These files are served without processing, your images go here')}}">
|
||||||
<span class="tooltip">{{=helpicon()}} <span>{{=T("These files are served without processing, your images go here")}}</span></span>
|
{{=helpicon()}}
|
||||||
|
<span>{{=T("These files are served without processing, your images go here")}}</span>
|
||||||
|
</a><span id="static" class="hashstick"> </span><a href="#" class="tophashlink btn btn-mini btn-warning"><span>top</span></a>
|
||||||
</h3>
|
</h3>
|
||||||
<div id="static_inner" class="component_contents">
|
<div id="static_inner" class="component_contents">
|
||||||
<div class="controls comptools">
|
{{if not statics:}}<p><strong>{{=T("There are no static files")}}</strong></p>{{else:}}
|
||||||
</div>
|
<ul class="unstyled act_edit">
|
||||||
{{if not statics:}}<p><strong>{{=T("There are no static files")}}</strong></p>{{pass}}
|
|
||||||
<ul>
|
|
||||||
{{
|
{{
|
||||||
path=[]
|
path=[]
|
||||||
for file in statics+['']:
|
for file in statics+['']:
|
||||||
@@ -255,7 +306,7 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
|
|||||||
path.append(file_path[len(path)])
|
path.append(file_path[len(path)])
|
||||||
thispath='static__'+'__'.join(path)
|
thispath='static__'+'__'.join(path)
|
||||||
}}
|
}}
|
||||||
<li class="folder">
|
<li class="folder"><i> </i>
|
||||||
<a href="javascript:collapse('{{=thispath}}');" class="file">{{=path[-1]}}/</a>
|
<a href="javascript:collapse('{{=thispath}}');" class="file">{{=path[-1]}}/</a>
|
||||||
<ul id="{{=thispath}}" style="display: none;" class="sublist">{{
|
<ul id="{{=thispath}}" style="display: none;" class="sublist">{{
|
||||||
else:
|
else:
|
||||||
@@ -266,7 +317,8 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
|
|||||||
pass
|
pass
|
||||||
pass
|
pass
|
||||||
if filename:
|
if filename:
|
||||||
}}<li>
|
}}
|
||||||
|
<li>
|
||||||
<span class="filetools controls">
|
<span class="filetools controls">
|
||||||
{{=editfile('static',file, dict(id="static"))}} {{=deletefile([app,'static',file], dict(id="static",id2="static"))}}
|
{{=editfile('static',file, dict(id="static"))}} {{=deletefile([app,'static',file], dict(id="static",id2="static"))}}
|
||||||
</span>
|
</span>
|
||||||
@@ -277,26 +329,31 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
|
|||||||
pass
|
pass
|
||||||
pass
|
pass
|
||||||
}}
|
}}
|
||||||
{{pass}}
|
|
||||||
</ul>
|
</ul>
|
||||||
<div class="controls formfield">{{=file_create_form('%s/static/' % app, 'static')}}
|
{{pass}}
|
||||||
{{=file_upload_form('%s/static/' % app, 'static')}}</div>
|
<div class="controls formfield">
|
||||||
|
<button onclick="jQuery('#form5').slideToggle()" class="btn btn-mini">Create/Upload</button>
|
||||||
|
<div id="form5" class="row-fluid" style="display:none">
|
||||||
|
<div class="span3">{{=file_create_form('%s/static/' % app, 'static')}}<em>{{=T('or alternatively')}}</em></div>
|
||||||
|
<div class="span3">{{=file_upload_form('%s/static/' % app, 'static')}}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- MODULES -->
|
<!-- MODULES -->
|
||||||
|
<h3 id="_modules" rel="pagebookmark">
|
||||||
<h3 id="modules" onclick="collapse('modules_inner');" class="component">
|
<span class="component" onclick="collapse('modules_inner');">{{=T("Modules")}}</span>
|
||||||
{{=T("Modules")}}
|
<a href="#modules" rel="tooltip" data-placement="right" data-original-title="{{=T('Additional code for your application')}}">
|
||||||
<span class="tooltip">{{=helpicon()}} <span>{{=T("Additional code for your application")}}</span></span>
|
{{=helpicon()}}
|
||||||
|
<span>{{=T("Additional code for your application")}}</span>
|
||||||
|
</a><span id="modules" class="hashstick"> </span><a href="#" class="tophashlink btn btn-mini btn-warning"><span>top</span></a>
|
||||||
</h3>
|
</h3>
|
||||||
<div id="modules_inner" class="component_contents">
|
<div id="modules_inner" class="component_contents">
|
||||||
<div class="controls comptools">
|
{{if not modules:}}<p><strong>{{=T("There are no modules")}}</strong></p>{{else:}}
|
||||||
</div>
|
<ul class="unstyled act_edit">
|
||||||
{{if not modules:}}<p><strong>{{=T("There are no modules")}}</strong></p>{{pass}}
|
|
||||||
<ul>
|
|
||||||
{{for m in modules:}}
|
{{for m in modules:}}
|
||||||
{{id="modules__"+m.replace('/','__').replace('.','__')}}
|
{{id="modules__"+m.replace('/','__').replace('.','__')}}
|
||||||
<li id="{{=id}}">
|
<li id="{{='_'+id}}" rel="pagebookmark"><span id="{{=id}}" class="hashstick"> </span>
|
||||||
<span class="filetols controls">
|
<span class="filetols controls">
|
||||||
{{=editfile('modules',m,dict(id=id))}}
|
{{=editfile('modules',m,dict(id=id))}}
|
||||||
{{if m!='__init__.py':}}
|
{{if m!='__init__.py':}}
|
||||||
@@ -309,21 +366,27 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
|
|||||||
</li>
|
</li>
|
||||||
{{pass}}
|
{{pass}}
|
||||||
</ul>
|
</ul>
|
||||||
<div class="controls formfield">{{=file_create_form('%s/modules/' % app, 'modules')}}
|
{{pass}}
|
||||||
{{=file_upload_form('%s/modules/' % app, 'modules')}}</div>
|
<div class="controls formfield">
|
||||||
|
<button onclick="jQuery('#form6').slideToggle()" class="btn btn-mini">Create/Upload</button>
|
||||||
|
<div id="form6" class="row-fluid" style="display:none">
|
||||||
|
<div class="span3">{{=file_create_form('%s/modules/' % app, 'modules')}}<em>{{=T('or alternatively')}}</em></div>
|
||||||
|
<div class="span3">{{=file_upload_form('%s/modules/' % app, 'modules')}}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- PRIVATE -->
|
<!-- PRIVATE -->
|
||||||
|
<h3 id="_private" rel="pagebookmark">
|
||||||
<h3 id="private" onclick="collapse('private_inner');" class="component">
|
<span class="component" onclick="collapse('private_inner');">{{=T("Private files")}}</span>
|
||||||
{{=T("Private files")}}
|
<a href="#private" rel="tooltip" data-placement="right" data-original-title="{{=T('These files are not served, they are only available from within your app')}}">
|
||||||
<span class="tooltip">{{=helpicon()}} <span>{{=T("These files are not served, they are only available from within your app")}}</span></span>
|
{{=helpicon()}}
|
||||||
|
<span>{{=T("These files are not served, they are only available from within your app")}}</span>
|
||||||
|
</a><span id="private" class="hashstick"> </span><a href="#" class="tophashlink btn btn-mini btn-warning"><span>top</span></a>
|
||||||
</h3>
|
</h3>
|
||||||
<div id="private_inner" class="component_contents">
|
<div id="private_inner" class="component_contents">
|
||||||
<div class="controls comptools">
|
{{if not privates:}}<p><strong>{{=T("There are no private files")}}</strong></p>{{else:}}
|
||||||
</div>
|
<ul class="unstyled act_edit">
|
||||||
{{if not privates:}}<p><strong>{{=T("There are no private files")}}</strong></p>{{pass}}
|
|
||||||
<ul>
|
|
||||||
{{
|
{{
|
||||||
path=[]
|
path=[]
|
||||||
for file in privates+['']:
|
for file in privates+['']:
|
||||||
@@ -341,12 +404,14 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
|
|||||||
else:
|
else:
|
||||||
path = path[:-1]
|
path = path[:-1]
|
||||||
}}
|
}}
|
||||||
</ul></li>
|
</ul>
|
||||||
|
</li>
|
||||||
{{
|
{{
|
||||||
pass
|
pass
|
||||||
pass
|
pass
|
||||||
if filename:
|
if filename:
|
||||||
}}<li>
|
}}
|
||||||
|
<li>
|
||||||
<span class="filetools controls">
|
<span class="filetools controls">
|
||||||
{{=editfile('private',file, dict(id="private"))}} {{=deletefile([app,'private',file], dict(id="private",id2="private"))}}
|
{{=editfile('private',file, dict(id="private"))}} {{=deletefile([app,'private',file], dict(id="private",id2="private"))}}
|
||||||
</span>
|
</span>
|
||||||
@@ -359,25 +424,29 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
|
|||||||
}}
|
}}
|
||||||
{{pass}}
|
{{pass}}
|
||||||
</ul>
|
</ul>
|
||||||
<div class="controls formfield">{{=file_create_form('%s/private/' % app, 'private')}}
|
<div class="controls formfield">
|
||||||
{{=file_upload_form('%s/private/' % app, 'private')}}</div>
|
<button onclick="jQuery('#form7').slideToggle()" class="btn btn-mini">Create/Upload</button>
|
||||||
|
<div id="form7" class="row-fluid" style="display:none">
|
||||||
|
<div class="span3">{{=file_create_form('%s/private/' % app, 'private')}}<em>{{=T('or alternatively')}}</em></div>
|
||||||
|
<div class="span3">{{=file_upload_form('%s/private/' % app, 'private')}}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<!-- PLUGINS -->
|
<!-- PLUGINS -->
|
||||||
|
<h3 id="_plugins" rel="pagebookmark">
|
||||||
<h3 id="plugins" onclick="collapse('plugins_inner');" class="component">
|
<span class="component" onclick="collapse('plugins_inner');">{{=T("Plugins")}}</span>
|
||||||
{{=T("Plugins")}}
|
<a href="#plugins" rel="tooltip" data-placement="right" data-original-title="{{=T('To create a plugin, name a file/folder plugin_[name]')}}">
|
||||||
<span class="tooltip">{{=helpicon()}} <span>{{=T("To create a plugin, name a file/folder plugin_[name]")}}</span></span>
|
{{=helpicon()}}
|
||||||
|
<span>{{=T("To create a plugin, name a file/folder plugin_[name]")}}</span>
|
||||||
|
</a><span id="plugins" class="hashstick"> </span><a href="#" class="tophashlink btn btn-mini btn-warning"><span>top</span></a>
|
||||||
</h3>
|
</h3>
|
||||||
<div id="plugins_inner" class="component_contents">
|
<div id="plugins_inner" class="component_contents">
|
||||||
<div class="controls comptools">
|
<div class="controls comptools">
|
||||||
{{=button(PLUGINS_APP, T('download plugins'))}}
|
{{=button(PLUGINS_APP, T('download plugins'))}}
|
||||||
</div>
|
</div>
|
||||||
<div class="controls">
|
|
||||||
</div>
|
|
||||||
{{if plugins:}}
|
{{if plugins:}}
|
||||||
<ul>
|
<ul class="unstyled act_edit">
|
||||||
{{for plugin in plugins:}}
|
{{for plugin in plugins:}}
|
||||||
{{id="plugins__"+plugin.replace('/','__').replace('.','__')}}
|
{{id="plugins__"+plugin.replace('/','__').replace('.','__')}}
|
||||||
<li id="{{=id}}">
|
<li id="{{=id}}">
|
||||||
@@ -388,9 +457,14 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
|
|||||||
{{else:}}
|
{{else:}}
|
||||||
<p><strong>{{=T('There are no plugins')}}</strong></p>
|
<p><strong>{{=T('There are no plugins')}}</strong></p>
|
||||||
{{pass}}
|
{{pass}}
|
||||||
<div class="controls formfield">{{=upload_plugin_form(app, 'plugins')}}</div>
|
<div class="controls formfield">
|
||||||
|
<button onclick="jQuery('#form8').slideToggle()" class="btn btn-mini">Upload</button>
|
||||||
|
<div id="form8" class="row-fluid" style="display:none">
|
||||||
|
<div class="row-fluid">
|
||||||
|
<div class="span3">{{=upload_plugin_form(app, 'plugins')}}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
function filter_files() {
|
function filter_files() {
|
||||||
@@ -400,7 +474,7 @@ function filter_files() {
|
|||||||
files=data['files'];
|
files=data['files'];
|
||||||
message=data['message'];
|
message=data['message'];
|
||||||
for(var i=0; i<files.length; i++)
|
for(var i=0; i<files.length; i++)
|
||||||
jQuery('li#'+files[i].replace(/\//g,'__').replace('.','__')).slideDown();
|
jQuery('li#_'+files[i].replace(/\//g,'__').replace('.','__')).slideDown();
|
||||||
jQuery('.flash').html(message).slideDown();
|
jQuery('.flash').html(message).slideDown();
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
@@ -416,4 +490,4 @@ jQuery(document).ready(function(){
|
|||||||
jQuery('#search_start').click(function(e){ filter_files(); });
|
jQuery('#search_start').click(function(e){ filter_files(); });
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
<!-- end "design" block -->
|
||||||
|
|||||||
@@ -1,8 +1,18 @@
|
|||||||
{{extend 'layout.html'}}
|
{{extend 'layout.html'}}
|
||||||
|
<!-- begin "edit" block -->
|
||||||
{{
|
{{
|
||||||
def shortcut(combo, description):
|
def shortcut(combo, description):
|
||||||
return XML('<li><tt>%s</tt> %s</li>' % (combo, description))
|
return XML('<li><span class="teletype-text">%s</span><span>%s</span></li>' % (combo, description))
|
||||||
|
def listfiles(app, dir, regexp='.*\.py$'):
|
||||||
|
files = sorted(
|
||||||
|
listdir(apath('%(app)s/%(dir)s/' % {'app':app, 'dir':dir}, r=request), regexp))
|
||||||
|
files = [x.replace('\\', '/') for x in files if not x.endswith('.bak')]
|
||||||
|
return files
|
||||||
|
|
||||||
|
def editfile(path,file,vars={}):
|
||||||
|
args=(path,file) if 'app' in vars else (app,path,file)
|
||||||
|
return A(file, _class='', _href=URL('edit', args=args, vars=vars), _style='word-wrap: break-word;')
|
||||||
|
|
||||||
}}
|
}}
|
||||||
{{if TEXT_EDITOR == 'amy':}}
|
{{if TEXT_EDITOR == 'amy':}}
|
||||||
{{include 'default/amy_ajax.html'}}
|
{{include 'default/amy_ajax.html'}}
|
||||||
@@ -25,6 +35,13 @@
|
|||||||
<link rel="stylesheet" href="{{=cm}}/lib/util/dialog.css">
|
<link rel="stylesheet" href="{{=cm}}/lib/util/dialog.css">
|
||||||
<script src="{{=cm}}/emmet.min.js"></script>
|
<script src="{{=cm}}/emmet.min.js"></script>
|
||||||
<script language="Javascript" type="text/javascript" src="{{=URL('static','js/ajax_editor.js')}}"></script>
|
<script language="Javascript" type="text/javascript" src="{{=URL('static','js/ajax_editor.js')}}"></script>
|
||||||
|
<script language="Javascript" type="text/javascript">
|
||||||
|
jQuery(document).ready(function(){
|
||||||
|
doListBreakpoints({{=XML("'%s','%s://%s%s'" % (filename,
|
||||||
|
request.env['wsgi_url_scheme'], request.env['http_host'],
|
||||||
|
URL(c='debug', f='list_breakpoints')))}});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
{{elif TEXT_EDITOR == 'ace':}}
|
{{elif TEXT_EDITOR == 'ace':}}
|
||||||
<script src="{{=URL(r=request,c='static',f='ace/src/ace.js')}}" type="text/javascript" charset="utf-8"></script>
|
<script src="{{=URL(r=request,c='static',f='ace/src/ace.js')}}" type="text/javascript" charset="utf-8"></script>
|
||||||
<script src="{{=URL(r=request,c='static',f='ace/src/theme-%s.js' % TEXT_EDITOR_THEME)}}" type="text/javascript" charset="utf-8"></script>
|
<script src="{{=URL(r=request,c='static',f='ace/src/theme-%s.js' % TEXT_EDITOR_THEME)}}" type="text/javascript" charset="utf-8"></script>
|
||||||
@@ -88,7 +105,7 @@ jQuery(document).ready(function(){
|
|||||||
<h2>{{=T('Editing file "%s"',filename)}}</h2>
|
<h2>{{=T('Editing file "%s"',filename)}}</h2>
|
||||||
|
|
||||||
{{if functions:}}
|
{{if functions:}}
|
||||||
<p class="formfield">
|
<p class="formfield well well-small">
|
||||||
<span style="text-align:left;" id="exposed">
|
<span style="text-align:left;" id="exposed">
|
||||||
{{=B(T('exposes:'))}} {{=XML(', '.join([A(f,_href=URL(a=app,c=controller,f=f)).xml() for f in functions]))}}
|
{{=B(T('exposes:'))}} {{=XML(', '.join([A(f,_href=URL(a=app,c=controller,f=f)).xml() for f in functions]))}}
|
||||||
</span>
|
</span>
|
||||||
@@ -98,15 +115,15 @@ jQuery(document).ready(function(){
|
|||||||
{{pass}}
|
{{pass}}
|
||||||
</p>
|
</p>
|
||||||
{{pass}}
|
{{pass}}
|
||||||
|
<div class='row-fluid'>
|
||||||
<p class="right controls">
|
<p class="right controls pull-right">
|
||||||
{{if filetype=='python':}}
|
{{if filetype=='python':}}
|
||||||
{{=A(SPAN(T('toggle breakpoint')),
|
{{=A(SPAN(T('toggle breakpoint')),
|
||||||
_value="breakpoint", _name="breakpoint",
|
_value="breakpoint", _name="breakpoint",
|
||||||
_onclick="return doToggleBreakpoint('%s','%s://%s%s');" % (filename,
|
_onclick="return doToggleBreakpoint('%s','%s://%s%s',null);" % (filename,
|
||||||
request.env['wsgi_url_scheme'], request.env['http_host'],
|
request.env['wsgi_url_scheme'], request.env['http_host'],
|
||||||
URL(c='debug', f='toggle_breakpoint')),
|
URL(c='debug', f='toggle_breakpoint')),
|
||||||
_class="button special")}}
|
_class="button special btn btn-inverse")}}
|
||||||
{{pass}}
|
{{pass}}
|
||||||
{{=button(URL('design',args=request.vars.app if request.vars.app else request.args[0], anchor=request.vars.id), T('back'))}}
|
{{=button(URL('design',args=request.vars.app if request.vars.app else request.args[0], anchor=request.vars.id), T('back'))}}
|
||||||
{{if edit_controller:}}
|
{{if edit_controller:}}
|
||||||
@@ -116,25 +133,59 @@ jQuery(document).ready(function(){
|
|||||||
{{=button(view_link, T('try view'))}}
|
{{=button(view_link, T('try view'))}}
|
||||||
{{pass}}
|
{{pass}}
|
||||||
{{if request.args[1]=='models':}}
|
{{if request.args[1]=='models':}}
|
||||||
<a class="button" href="http://www.web2py.com/sqldesigner" target="_blank"><span>{{=T('online designer')}}</span></a>
|
<a class="button btn" href="http://www.web2py.com/sqldesigner" target="_blank"><span>{{=T('online designer')}}</span></a>
|
||||||
{{pass}}
|
{{pass}}
|
||||||
<a class="button" href="http://www.web2py.com/examples/static/epydoc/index.html" target="_blank"><span>{{=T('docs')}}</span></a>
|
<a class="button btn" href="http://www.web2py.com/examples/static/epydoc/index.html" target="_blank"><span>{{=T('docs')}}</span></a>
|
||||||
</p>
|
</p>
|
||||||
|
</div>
|
||||||
|
<div id="editor_area" class="row-fluid">
|
||||||
|
|
||||||
<div id="editor_area">
|
<ul class="nav nav-list span2 well" rel="pagebookmark">
|
||||||
<form action="{{=URL('edit',args=filename)}}" method="post" name="editform" id="editform">
|
{{dirs=[{'name':'models', 'reg':'.*\.py$'},
|
||||||
<a value="save" name="save" onclick="return doClickSave();" class="icon saveicon">
|
{'name':'controllers', 'reg':'.*\.py$'},
|
||||||
|
{'name':'views', 'reg':'[\w/\-]+(\.\w+)+$'},
|
||||||
|
{'name':'modules', 'reg':'.*\.py$'},
|
||||||
|
{'name':'private', 'reg': '[^\.#].*'}]}}
|
||||||
|
{{for dir in dirs:}}
|
||||||
|
<li class="nav-header component" onclick="collapse('{{="%s_files" % dir['name']}}');">{{=dir['name']}}</li>
|
||||||
|
<li id="{{="%s_files" % dir['name']}}">
|
||||||
|
<ul class="nav nav-list">
|
||||||
|
{{for f in listfiles(app, dir['name'], regexp=dir['reg'] ):}}
|
||||||
|
{{id="%s__" % dir['name'] + f.replace('.','__')}}
|
||||||
|
{{current_file = request.args(len(request.args) - 1)}}
|
||||||
|
<li class="{{='active' if current_file==f else ''}}">
|
||||||
|
{{=editfile(dir['name'], f, dict(id=id))}}
|
||||||
|
</li>
|
||||||
|
{{pass}}
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
{{pass}}
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<form action="{{=URL('edit',args=filename)}}" method="post" name="editform" id="editform" class="span10">
|
||||||
|
<div class="editor-bar-column">
|
||||||
|
<label>{{=T('Save file:')}}</label>
|
||||||
|
<a value="save" name="save" onclick="return doClickSave();" class="icon saveicon" style="background-image: -webkit-linear-gradient(top,white,#E6E6E6);">
|
||||||
{{=IMG(_src=URL('static', 'images/save_icon.png'), _alt=T('Save'))}}
|
{{=IMG(_src=URL('static', 'images/save_icon.png'), _alt=T('Save'))}}
|
||||||
</a>
|
</a>
|
||||||
{{=T('Saved file hash:')}}
|
</div>
|
||||||
<input type="input" name="file_hash" value="{{=file_hash}}" readonly="readonly"/>
|
<div class="editor-bar-column">
|
||||||
{{=T('Last saved on:')}} <input type="input" name="saved_on" value="{{=saved_on}}" readonly="readonly"/>
|
<div class="row-fluid">
|
||||||
<br><hr>
|
<div class="span7">
|
||||||
|
<label>{{=T('Saved file hash:')}}</label>
|
||||||
|
<input type="input" name="file_hash" value="{{=file_hash}}" class="input-long uneditable-input" readonly="readonly"/>
|
||||||
|
</div>
|
||||||
|
<div class="span5">
|
||||||
|
<label>{{=T('Last saved on:')}}</label>
|
||||||
|
<input type="input" name="saved_on" value="{{=saved_on}}" class="input-normal uneditable-input" readonly="readonly"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
{{if TEXT_EDITOR == 'amy':}}
|
{{if TEXT_EDITOR == 'amy':}}
|
||||||
<textarea style="width: auto; height:400px;direction:ltr;" rows="58" cols="100" -amy-enabled="true" id="body" name="data">{{=data}}</textarea>
|
<textarea style="width: auto; height:400px;direction:ltr;" rows="58" cols="100" -amy-enabled="true" id="body" name="data">{{=data}}</textarea>
|
||||||
<script>window.eamy = eamy;</script>
|
<script>window.eamy = eamy;</script>
|
||||||
{{elif TEXT_EDITOR == 'codemirror':}}
|
{{elif TEXT_EDITOR == 'codemirror':}}
|
||||||
<textarea style="width: auto; height:400px;direction:ltr;" id="body" name="data">{{=data}}</textarea>
|
<textarea style="width: auto; height:auto; direction:ltr;" id="body" name="data">{{=data}}</textarea>
|
||||||
<script>
|
<script>
|
||||||
function isFullScreen(instance) {
|
function isFullScreen(instance) {
|
||||||
return /\bCodeMirror-fullscreen\b/.test(instance.getWrapperElement().className);
|
return /\bCodeMirror-fullscreen\b/.test(instance.getWrapperElement().className);
|
||||||
@@ -191,12 +242,19 @@ jQuery(document).ready(function(){
|
|||||||
autofocus: true,
|
autofocus: true,
|
||||||
onCursorActivity: function() {
|
onCursorActivity: function() {
|
||||||
editor.setLineClass(hlLine, null, null);
|
editor.setLineClass(hlLine, null, null);
|
||||||
hlLine = editor.setLineClass(editor.getCursor().line, null, "activeline");}
|
hlLine = editor.setLineClass(editor.getCursor().line, null, "activeline");},
|
||||||
|
onGutterClick: function(cm, n) {
|
||||||
|
sel = {start: n, end: n, data: ''};
|
||||||
|
doToggleBreakpoint({{=XML("'%s','%s://%s%s',sel" % (filename,
|
||||||
|
request.env['wsgi_url_scheme'], request.env['http_host'],
|
||||||
|
URL(c='debug', f='toggle_breakpoint')))}});
|
||||||
|
}
|
||||||
};
|
};
|
||||||
var editor = CodeMirror.fromTextArea(
|
var editor = CodeMirror.fromTextArea(
|
||||||
document.getElementById("body"),cm_opts);
|
document.getElementById("body"),cm_opts);
|
||||||
var hlLine = editor.setLineClass(0, "activeline");
|
var hlLine = editor.setLineClass(0, "activeline");
|
||||||
window.mirror = editor;
|
window.mirror = editor;
|
||||||
|
jQuery(function(){jQuery('.CodeMirror-scroll').css("height","auto").css("overflow-x","auto");});
|
||||||
</script>
|
</script>
|
||||||
{{elif TEXT_EDITOR == 'ace':}}
|
{{elif TEXT_EDITOR == 'ace':}}
|
||||||
<div id="editor" style="height: 500px; width: auto; position: relative">{{=data}}</div>
|
<div id="editor" style="height: 500px; width: auto; position: relative">{{=data}}</div>
|
||||||
@@ -226,16 +284,21 @@ window.onload = function() {
|
|||||||
<textarea cols="80" rows="25" id="body" style="direction:ltr;" name="data">{{=data}}</textarea>
|
<textarea cols="80" rows="25" id="body" style="direction:ltr;" name="data">{{=data}}</textarea>
|
||||||
<script>window.textarea = area.textarea;</script>
|
<script>window.textarea = area.textarea;</script>
|
||||||
{{pass}}
|
{{pass}}
|
||||||
<button class="editbutton" onclick="window.location.reload(); return false">{{=T('restore')}}</button> {{=T('currently saved or')}} <button class="editbutton" type="submit" name="revert">{{=T('revert')}}</button>
|
<div class="editor-bar-bottom" style="margin-top:9px;">
|
||||||
|
<button class="editbutton btn" onclick="window.location.reload(); return false">{{=T('restore')}}</button>
|
||||||
|
{{=T('currently saved or')}}
|
||||||
|
<button class="editbutton btn" type="submit" name="revert">{{=T('revert')}}</button>
|
||||||
{{=T('to previous version.')}}
|
{{=T('to previous version.')}}
|
||||||
|
</div>
|
||||||
<br/>
|
<br/>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="help">
|
<div class="row-fluid">
|
||||||
|
<div class="help span4 alert alert-block alert-info">
|
||||||
{{if TEXT_EDITOR=='edit_area' and filetype=='html':}}
|
{{if TEXT_EDITOR=='edit_area' and filetype=='html':}}
|
||||||
<h3>{{=T('Key bindings for ZenCoding Plugin')}}</h3>
|
<h3>{{=T('Key bindings for ZenCoding Plugin')}}</h3>
|
||||||
<ul>
|
<ul class="keybindings unstyled">
|
||||||
{{=shortcut('Ctrl+S', T('Save via Ajax'))}}
|
{{=shortcut('Ctrl+S', T('Save via Ajax'))}}
|
||||||
{{=shortcut('Ctrl+,', T('Expand Abbreviation'))}}
|
{{=shortcut('Ctrl+,', T('Expand Abbreviation'))}}
|
||||||
{{=shortcut('Ctrl+M', T('Match Pair'))}}
|
{{=shortcut('Ctrl+M', T('Match Pair'))}}
|
||||||
@@ -247,7 +310,7 @@ window.onload = function() {
|
|||||||
</ul>
|
</ul>
|
||||||
{{elif TEXT_EDITOR == 'codemirror' and filetype=='html':}}
|
{{elif TEXT_EDITOR == 'codemirror' and filetype=='html':}}
|
||||||
<h3>{{=T('Key bindings for ZenCoding Plugin')}}</h3>
|
<h3>{{=T('Key bindings for ZenCoding Plugin')}}</h3>
|
||||||
<ul>
|
<ul class="keybindings unstyled">
|
||||||
{{=shortcut('Ctrl+S', T('Save via Ajax'))}}
|
{{=shortcut('Ctrl+S', T('Save via Ajax'))}}
|
||||||
{{=shortcut('Ctrl+F11', T('Toggle Fullscreen'))}}
|
{{=shortcut('Ctrl+F11', T('Toggle Fullscreen'))}}
|
||||||
{{=shortcut('Ctrl-F / Cmd-F', T('Start searching'))}}
|
{{=shortcut('Ctrl-F / Cmd-F', T('Start searching'))}}
|
||||||
@@ -259,7 +322,7 @@ window.onload = function() {
|
|||||||
</ul>
|
</ul>
|
||||||
{{elif TEXT_EDITOR == 'codemirror':}}
|
{{elif TEXT_EDITOR == 'codemirror':}}
|
||||||
<h3>{{=T("Key bindings")}}</h3>
|
<h3>{{=T("Key bindings")}}</h3>
|
||||||
<ul>
|
<ul class="keybindings unstyled">
|
||||||
{{=shortcut('Ctrl+S', T('Save via Ajax'))}}
|
{{=shortcut('Ctrl+S', T('Save via Ajax'))}}
|
||||||
{{=shortcut('Ctrl+F11', T('Toggle Fullscreen'))}}
|
{{=shortcut('Ctrl+F11', T('Toggle Fullscreen'))}}
|
||||||
{{=shortcut('Ctrl-F / Cmd-F', T('Start searching'))}}
|
{{=shortcut('Ctrl-F / Cmd-F', T('Start searching'))}}
|
||||||
@@ -270,8 +333,10 @@ window.onload = function() {
|
|||||||
</ul>
|
</ul>
|
||||||
{{else:}}
|
{{else:}}
|
||||||
<h3>{{=T("Key bindings")}}</h3>
|
<h3>{{=T("Key bindings")}}</h3>
|
||||||
<ul>
|
<ul class="keybindings unstyled">
|
||||||
{{=shortcut('Ctrl+S', T('Save via Ajax'))}}
|
{{=shortcut('Ctrl+S', T('Save via Ajax'))}}
|
||||||
</ul>
|
</ul>
|
||||||
{{pass}}
|
{{pass}}
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- end "edit" block -->
|
||||||
|
|||||||
@@ -7,18 +7,20 @@ function delkey(id) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
function hideShowTranslated(){
|
function hideShowTranslated(){
|
||||||
jQuery(".translated").closest("p").toggle();
|
jQuery(".translated").closest("div.row-fluid").toggle();
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{{block sectionclass}}edit_language{{end}}
|
{{block sectionclass}}edit_language{{end}}
|
||||||
|
<!-- begin "edit_language" block -->
|
||||||
<h2>{{=T('Editing Language file')}} "{{=filename}}"</h2>
|
<h2>{{=T('Editing Language file')}} "{{=filename}}"</h2>
|
||||||
<a class="button" href="#" onclick="hideShowTranslated(this);">
|
<div class="controls">
|
||||||
|
<a class="button btn" href="#" onclick="hideShowTranslated(this);">
|
||||||
<span>{{=T('Hide/Show Translated strings')}}</span>
|
<span>{{=T('Hide/Show Translated strings')}}</span>
|
||||||
</a>
|
</a>
|
||||||
|
</div>
|
||||||
<div class="languageform">
|
<div class="languageform">
|
||||||
{{=form}}
|
{{=form}}
|
||||||
</div>
|
</div>
|
||||||
|
<button class="btn" style="position:fixed; right:10px; bottom: 10px;" onclick="jQuery('form input[type=submit]').click()">Save Changes</button>
|
||||||
|
<!-- end "edit_language" block -->
|
||||||
|
|||||||
@@ -6,11 +6,10 @@ function delkey(id) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{{block sectionclass}}edit_language{{end}}
|
{{block sectionclass}}edit_language{{end}}
|
||||||
|
<!-- begin "edit_language(plurals)" block -->
|
||||||
<h2>{{=T("Editing Plural Forms File")}} "{{=filename}}"</h2>
|
<h2>{{=T("Editing Plural Forms File")}} "{{=filename}}"</h2>
|
||||||
<div class="pluralsform">
|
<div class="pluralsform">
|
||||||
{{=form}}
|
{{=form}}
|
||||||
</div>
|
</div>
|
||||||
|
<!-- end "edit_language(plurals)" block -->
|
||||||
@@ -1,98 +1,58 @@
|
|||||||
{{extend 'layout.html'}}
|
{{extend 'layout.html'}}
|
||||||
{{import os, stat, time}}
|
{{import os, stat, time}}
|
||||||
|
|
||||||
{{block sectionclass}}errors{{end}}
|
{{block sectionclass}}errors{{end}}
|
||||||
|
<!-- begin "errors" block -->
|
||||||
<style>
|
|
||||||
table.sortable {
|
|
||||||
border-spacing:0px;
|
|
||||||
}
|
|
||||||
table.sortable td, table.sortable th {
|
|
||||||
padding: 2px 5px 2px 5px;
|
|
||||||
}
|
|
||||||
table.sortable thead {
|
|
||||||
background-color:#eee;
|
|
||||||
color:#666666;
|
|
||||||
font-weight: bold;
|
|
||||||
cursor: default;
|
|
||||||
}
|
|
||||||
tr.error_ticket:hover {
|
|
||||||
background-color: #eee;
|
|
||||||
}
|
|
||||||
.controls a.button.unavailable {
|
|
||||||
color: #ff0000;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<script language="JavaScript">
|
|
||||||
function check(){
|
|
||||||
for (var i = 0; i < document.myform.elements.length; i++) {
|
|
||||||
var e = document.myform.elements[i];
|
|
||||||
if (e.type == 'checkbox') e.checked = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function uncheck(){
|
|
||||||
for (var i = 0; i < document.myform.elements.length; i++) {
|
|
||||||
var e = document.myform.elements[i];
|
|
||||||
if (e.type == 'checkbox') e.checked = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
jQuery(document).ready(function() { jQuery('.traceback').hide(); });
|
|
||||||
</script>
|
|
||||||
{{if db_ready['status'] == False:
|
{{if db_ready['status'] == False:
|
||||||
switchbutton = A(SPAN("switch to : db"), _href=db_ready['errlink'], _class="button unavailable", _title="%s" % (db_ready['errmessage']))
|
switchbutton = A(SPAN("switch to : db"), _href=db_ready['errlink'], _class="button unavailable btn btn-danger", _title="%s" % (db_ready['errmessage']))
|
||||||
else:
|
else:
|
||||||
switchbutton = A(SPAN("switch to : db"), _href=URL(args=[app, 'dbnew']), _class="button")
|
switchbutton = A(SPAN("switch to : db"), _href=URL(args=[app, 'dbnew']), _class="button btn")
|
||||||
pass}}
|
pass}}
|
||||||
|
|
||||||
<h2>{{=T('Error logs for "%(app)s"',dict(app=app))}}</h2>
|
<h2>{{=T('Error logs for "%(app)s"',dict(app=app))}}</h2>
|
||||||
|
|
||||||
<div class="errorform">
|
<div class="errorform">
|
||||||
<form name="myform" method="post">
|
<form name="myform" method="post">
|
||||||
<input name="CheckAll" value="{{=T('check all')}}"
|
|
||||||
onclick="check()" type="button">
|
|
||||||
<input name="CheckAll" value="{{=T('uncheck all')}}"
|
|
||||||
onclick="uncheck()" type="button">
|
|
||||||
<input value="{{=T('delete all checked')}}" type="submit"><br><br>
|
|
||||||
|
|
||||||
{{ if 'new' in method: }}
|
{{ if 'new' in method: }}
|
||||||
{{base_url = 'db' in method and 'ticketdb' or 'ticket' }}
|
{{base_url = 'db' in method and 'ticketdb' or 'ticket' }}
|
||||||
<h3>{{=T('Click row to expand traceback')}}</h3>
|
<p class="controls row-fluid">
|
||||||
<p class="controls">
|
<div class="controls controls-row">
|
||||||
{{if 'db' in method:}}
|
{{if 'db' in method:}}
|
||||||
source : db
|
<span class="uneditable-input">source : db</span>
|
||||||
<a class="button" href="{{=URL(args=[app, 'new'])}}"><span>switch to : filesystem</span></a>
|
<a class="button btn" href="{{=URL(args=[app, 'new'])}}"><span>switch to : filesystem</span></a>
|
||||||
<a class="button" href="{{=URL(args=[app, 'dbold'])}}"><span>lists by ticket</span></a>
|
<a class="button btn" href="{{=URL(args=[app, 'dbold'])}}"><span>lists by ticket</span></a>
|
||||||
{{else:}}
|
{{else:}}
|
||||||
source : filesystem
|
<span class="uneditable-input">source : filesystem</span>
|
||||||
{{=switchbutton}}
|
{{=switchbutton}}
|
||||||
<a class="button" href="{{=URL(args=[app, 'old'])}}"><span>lists by ticket</span></a>
|
<a class="button btn" href="{{=URL(args=[app, 'old'])}}"><span>lists by ticket</span></a>
|
||||||
{{pass}}
|
{{pass}}
|
||||||
|
</div>
|
||||||
</p>
|
</p>
|
||||||
<table id="trck_errors" class="sortable">
|
<div class="tablebar">
|
||||||
|
<input value="{{=T('delete all checked')}}" type="submit" class="btn"/>
|
||||||
|
<span class="help label label-info">{{=T('Click row to expand traceback')}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="row-fluid">
|
||||||
|
<div class="span6">
|
||||||
|
<table id="trck_errors" class="sortable table table-hover table-condensed">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>{{=T("Delete")}}</th>
|
<th class="column1 cbcentered"><input type="checkbox" name="delete_all}" /></th>
|
||||||
<th>{{=T("Count")}}</th>
|
<th class="column2">{{=T("Count")}}</th>
|
||||||
<th>{{=T("File")}}</th>
|
<th class="column3">{{=T("File")}}</th>
|
||||||
<th>{{=T("Error")}}</th>
|
<th>{{=T("Error")}}</th>
|
||||||
<th></th>
|
<th class="columnN"></th>
|
||||||
<th></th>
|
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{{for e in errors:}}
|
{{for e in errors:}}
|
||||||
<tr class="error_ticket">
|
<tr class="error_ticket">
|
||||||
<td><input type="checkbox" name="delete_{{=e['hash']}}" /></td>
|
<td class="cbcentered"><input type="checkbox" name="delete_{{=e['hash']}}" /></td>
|
||||||
<td>{{=e['count']}}</td>
|
<td>{{=e['count']}}</td>
|
||||||
<td>{{=e['causer']}}</td>
|
<td>{{=e['causer']}}</td>
|
||||||
<td>{{=A(e['last_line'],_href="#",_onclick="collapse('%s');"%e['hash'])}}</td>
|
<td>{{=A(e['last_line'],_href="#",_onclick="collapse('%s');return false;"%e['hash'])}}</td>
|
||||||
<td>+</td>
|
<td>+ {{=A(T('details'),_href=URL(base_url,args=[app,e['ticket']]))}}</td>
|
||||||
<td>{{=A(T('details'),_href=URL(base_url,args=[app,e['ticket']]))}}</td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr id="{{=e['hash']}}" class="traceback">
|
<tr id="{{=e['hash']}}" class="traceback">
|
||||||
<td colspan="6">
|
<td colspan="5">
|
||||||
<div>
|
<div class="ticket_code">
|
||||||
{{=CODE(e['pickel']['traceback'])}}
|
{{=CODE(e['pickel']['traceback'])}}
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
@@ -100,31 +60,40 @@ pass}}
|
|||||||
{{pass}}
|
{{pass}}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
{{ else: }}
|
{{ else: }}
|
||||||
<h3>{{=T('Click row to view a ticket')}}</h3>
|
<p class="controls row-fluid">
|
||||||
<p class="controls">
|
<div class="controls controls-row">
|
||||||
{{if 'db' in method:}}
|
{{if 'db' in method:}}
|
||||||
source : db
|
<span class="uneditable-input">source : db</span>
|
||||||
<a class="button" href="{{=URL(args=[app, 'old'])}}"><span>switch to : filesystem</span></a>
|
<a class="button btn" href="{{=URL(args=[app, 'old'])}}"><span>switch to : filesystem</span></a>
|
||||||
<a class="button" href="{{=URL(args=[app, 'dbnew'])}}"><span>lists by exception</span></a>
|
<a class="button btn" href="{{=URL(args=[app, 'dbnew'])}}"><span>lists by exception</span></a>
|
||||||
{{else:}}
|
{{else:}}
|
||||||
source : filesystem
|
<span class="uneditable-input">source : filesystem</span>
|
||||||
{{=switchbutton}}
|
{{=switchbutton}}
|
||||||
<a class="button" href="{{=URL(args=[app, 'new'])}}"><span>lists by exception</span></a>
|
<a class="button btn" href="{{=URL(args=[app, 'new'])}}"><span>lists by exception</span></a>
|
||||||
{{pass}}
|
{{pass}}
|
||||||
|
</div>
|
||||||
</p>
|
</p>
|
||||||
<table class="sortable">
|
<div class="tablebar">
|
||||||
|
<input value="{{=T('delete all checked')}}" type="submit" class="btn"/>
|
||||||
|
<span class="help label label-info">{{=T('Click row to expand traceback')}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="row-fluid">
|
||||||
|
<div class="span6">
|
||||||
|
<table id="trck_errors" class="sortable table table-hover table-condensed">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>{{=T("Delete")}}</th>
|
<th class="column1 cbcentered"><input type="checkbox" name="delete_all}" /></th>
|
||||||
<th>{{=T("Ticket")}}</th>
|
<th>{{=T("Ticket")}}</th>
|
||||||
<th>{{=T("Date and Time")}}</th>
|
<th class="columnN1">{{=T("Date and Time")}}</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{{for ticket in tickets:}}
|
{{for ticket in tickets:}}
|
||||||
<tr>
|
<tr>
|
||||||
<td><input type="checkbox" name="delete_{{=ticket}}"/></td>
|
<td class="cbcentered"><input type="checkbox" name="delete_{{=ticket}}"/></td>
|
||||||
{{if 'db' in method:}}
|
{{if 'db' in method:}}
|
||||||
<td><a href="{{=URL('ticketdb',args=[app,ticket])}}">{{=ticket}}</a></td>
|
<td><a href="{{=URL('ticketdb',args=[app,ticket])}}">{{=ticket}}</a></td>
|
||||||
<td>{{=time.strftime('%Y-%m-%d %H:%M:%S',times[ticket].timetuple())}}</td>
|
<td>{{=time.strftime('%Y-%m-%d %H:%M:%S',times[ticket].timetuple())}}</td>
|
||||||
@@ -136,7 +105,20 @@ pass}}
|
|||||||
{{pass}}
|
{{pass}}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
{{ pass }}
|
|
||||||
</form>
|
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
{{ pass }}
|
||||||
|
</form><!-- /errorform -->
|
||||||
|
</div>
|
||||||
|
<script type="text/javascript">
|
||||||
|
jQuery(document).ready(function() {
|
||||||
|
jQuery('.traceback').hide();
|
||||||
|
jQuery("#trck_errors thead tr th:first input[type=checkbox]").click(function() {
|
||||||
|
var checkedStatus = this.checked;
|
||||||
|
jQuery("#trck_errors tbody tr td:first-child input[type=checkbox]").each(function() {
|
||||||
|
this.checked = checkedStatus;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<!-- end "errors" block -->
|
||||||
@@ -1,5 +1,15 @@
|
|||||||
{{extend 'layout.html'}}
|
{{extend 'layout.html'}}
|
||||||
|
{{
|
||||||
|
dlg = dialog
|
||||||
|
smt_button = dlg.element(_type="submit")
|
||||||
|
smt_button['_class'] = 'btn'
|
||||||
|
smt_button['_style'] = 'margin-right:4px;'
|
||||||
|
ccl_button = dlg.element(_type="button")
|
||||||
|
ccl_button['_class'] = 'btn'
|
||||||
|
}}
|
||||||
|
<!-- begin "git_pull" block -->
|
||||||
<div class="center">
|
<div class="center">
|
||||||
<h2>{{=T('This will pull changes from the remote repo for application "%s"?', app)}}</h2>
|
<h2>{{=T('This will pull changes from the remote repo for application "%s"?', app)}}</h2>
|
||||||
{{=dialog}}
|
{{=dialog}}
|
||||||
|
</div>
|
||||||
|
<!-- end "git_pull" block -->
|
||||||
@@ -1,6 +1,15 @@
|
|||||||
{{extend 'layout.html'}}
|
{{extend 'layout.html'}}
|
||||||
|
{{
|
||||||
|
frm = form
|
||||||
|
smt_button = frm.element(_type="submit")
|
||||||
|
smt_button['_class'] = 'btn'
|
||||||
|
smt_button['_style'] = 'margin-right:4px;'
|
||||||
|
ccl_button = frm.element(_type="button")
|
||||||
|
ccl_button['_class'] = 'btn'
|
||||||
|
}}
|
||||||
|
<!-- begin "git_push" block -->
|
||||||
<h2>{{=T('This will push changes to the remote repo for application "%s".', app)}}</h2>
|
<h2>{{=T('This will push changes to the remote repo for application "%s".', app)}}</h2>
|
||||||
<center>
|
<center>
|
||||||
{{=form}}
|
{{=form}}
|
||||||
</center>
|
</center>
|
||||||
|
<!-- end "git_push" block -->
|
||||||
@@ -1,26 +1,23 @@
|
|||||||
{{extend 'layout.html'}}
|
{{extend 'layout.html'}}
|
||||||
|
{{block sectionclass}}login{{end}}
|
||||||
|
<!-- begin "index" block -->
|
||||||
|
<h2>web2py™ {{=T('Web Framework')}}</h2>
|
||||||
|
<h3>{{=T('Login to the Administrative Interface')}}</h3>
|
||||||
|
<div class="form row-fluid">
|
||||||
|
{{if request.is_https or request.is_local:}}
|
||||||
|
<form action="{{=URL(r=request)}}" method="post" class="span4 well">
|
||||||
|
<label for="password">{{=T('Administrator Password:')}}</label>
|
||||||
|
<input type="password" name="password" id="password"/>
|
||||||
|
<input type="hidden" name="send" value="{{=send}}"/>
|
||||||
|
<div class="controls"><button type="submit" name="login" class="btn">{{=T('Login')}}</button></div>
|
||||||
|
</form>
|
||||||
|
{{else:}}
|
||||||
|
<p class="help span7 alert alert-block alert-warning">{{=T('ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.')}}</p>
|
||||||
|
{{pass}}
|
||||||
|
</div>
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
jQuery(function() {
|
jQuery(document).ready(function(){
|
||||||
jQuery("#password").focus();
|
jQuery("#password").focus();
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
<!-- end "index" block -->
|
||||||
{{block sectionclass}}login{{end}}
|
|
||||||
|
|
||||||
<h2>web2py™ {{=T('Web Framework')}}</h2>
|
|
||||||
<h3>{{=T('Login to the Administrative Interface')}}</h3>
|
|
||||||
{{if request.is_https or request.is_local:}}
|
|
||||||
<div class="form">
|
|
||||||
<form action="{{=URL(r=request)}}" method="post">
|
|
||||||
<div><input type="hidden" name="send" value="{{=send}}"/></div>
|
|
||||||
<table>
|
|
||||||
<tr><td>{{=T('Administrator Password:')}}</td><td><input type="password" name="password" id="password"/></td></tr>
|
|
||||||
<tr><td></td><td><input type="submit" name="login" value="{{=T('Login')}}"/></td></tr>
|
|
||||||
</table>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
{{else:}}
|
|
||||||
<p class="help">{{=T('ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.')}}</p>
|
|
||||||
{{pass}}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,5 +1,163 @@
|
|||||||
{{extend 'layout.html'}}
|
{{extend 'layout.html'}}
|
||||||
|
{{
|
||||||
|
#grid['_class'] = 'web2py_grid'
|
||||||
|
if not request.args:
|
||||||
|
add_btn = grid.elements('div.web2py_console a.w2p_trap',replace=None)[0]
|
||||||
|
add_btn['_id'] = 'w2p_grid_addbtn'
|
||||||
|
add_btn['_class'] = 'w2p_trap btn'
|
||||||
|
qry_pnl_rows = grid.elements('div',_class="w2p_query_row hidden")
|
||||||
|
for qry_pnl_row in qry_pnl_rows:
|
||||||
|
qry_pnl_btn1 = qry_pnl_row.elements('input',_value="New",replace=None)[0]
|
||||||
|
qry_pnl_btn2 = qry_pnl_row.elements('input',_value="And",replace=None)[0]
|
||||||
|
qry_pnl_btn3 = qry_pnl_row.elements('input',_value="Or",replace=None)[0]
|
||||||
|
qry_pnl_btngrp = qry_pnl_row.elements('input',_value="Close",replace=lambda me:DIV(qry_pnl_btn1,qry_pnl_btn2,qry_pnl_btn3,me,_class="qry_pnl_btns"))
|
||||||
|
pass
|
||||||
|
qry_pnl = grid.elements('div#w2p_query_panel',replace=None)
|
||||||
|
csl_frm = grid.elements('div.web2py_console form')[0]
|
||||||
|
csl_frm['_class'] = 'form-inline'
|
||||||
|
csl_frm_search = grid.elements('#web2py_keywords',replace=lambda me:DIV(me,TAG['button'](T('Search'),_class='btn',_type='submit'),TAG['button'](T('Clear'),_class='btn',_type='button',_onclick='jQuery("#web2py_keywords").val("");'),_class="input-append"))
|
||||||
|
csl_frm_search_btn1 = grid.elements('input',_value="Search",replace=None)
|
||||||
|
csl_frm_search_btn2 = grid.elements('input',_value="Clear",replace=None)
|
||||||
|
new_console = grid.elements('div.web2py_console form',replace=lambda frm_csl:DIV(SPAN(add_btn,_class='span1'),SPAN(DIV(frm_csl,qry_pnl[0],_id='w2p_search-form'),_class='span5'),_class='row-fluid'))
|
||||||
|
w2p_grid_tbl = grid.element('table')
|
||||||
|
if w2p_grid_tbl:
|
||||||
|
w2p_grid_tbl['_class'] = 'table table-condensed table-hover table-bordered'
|
||||||
|
tbl_button_rows = grid.elements('td',_class="row_buttons")
|
||||||
|
for tbl_button_row in tbl_button_rows:
|
||||||
|
buttons = tbl_button_row.elements('a.w2p_trap')
|
||||||
|
for button in buttons:
|
||||||
|
button['_class'] = 'w2p_trap btn'
|
||||||
|
pass
|
||||||
|
pass
|
||||||
|
export_menu = grid.element('div.w2p_export_menu')
|
||||||
|
export_menu_links = export_menu.elements('a')
|
||||||
|
export_menu_items = []
|
||||||
|
for link in export_menu_links:
|
||||||
|
item = LI(link)
|
||||||
|
export_menu_items.append(item)
|
||||||
|
pass
|
||||||
|
new_export_menu = DIV(A(T('Exports:'),SPAN(_class='caret'),_href='#',_class='btn dropdown-toggle',**{'_data-toggle':"dropdown"}),UL(*export_menu_items,_class='dropdown-menu'),_class='w2p_export_menu btn-group pull-left')
|
||||||
|
grid_pagination = grid.element('div.web2py_paginator')
|
||||||
|
if grid_pagination:
|
||||||
|
export_menu = grid.element('div.w2p_export_menu',replace=None)
|
||||||
|
new_grid_pagination = grid.element('div.web2py_paginator',replace=lambda me:DIV(new_export_menu,me,_class='w2p_grid_bottom_bar'))
|
||||||
|
grid_pagination['_class'] = 'web2py_paginator pagination pagination-right'
|
||||||
|
grid_page_active = grid.element('li.current')
|
||||||
|
grid_page_active['_class'] = 'current active'
|
||||||
|
else:
|
||||||
|
new_grid_pagination = grid.element('div.w2p_export_menu',replace=DIV(new_export_menu))
|
||||||
|
pass
|
||||||
|
records_counter = grid.element('div.web2py_counter')
|
||||||
|
records_found = int(records_counter[0].partition('records')[0].strip())
|
||||||
|
paginate = 5 # TODO: get it from the controller
|
||||||
|
pages = records_found/paginate
|
||||||
|
tot_pages = pages if records_found%paginate == 0 else pages+1
|
||||||
|
current_page = int(request.vars.page) if request.vars.page else 1
|
||||||
|
end_record = paginate*current_page if current_page < tot_pages else records_found
|
||||||
|
begin_record = 1 if current_page == 1 else (paginate*(current_page-1))+1
|
||||||
|
rec = "records" if records_found>1 else "record"
|
||||||
|
record_shown_in_the_page = T("Showing %s to %s of %s %s found")%(begin_record,end_record,records_found,rec)
|
||||||
|
new_record_counter = grid.element('div.web2py_counter',replace=DIV(record_shown_in_the_page,_class="web2py_counter span6 pull-right"))
|
||||||
|
pass
|
||||||
|
elif request.args(0)=='new':
|
||||||
|
bck_btn = grid.element('div.web2py_grid span.leftarrow').parent
|
||||||
|
bck_btn['_id'] = 'w2p_grid_bckbtn'
|
||||||
|
bck_btn['_class'] = 'w2p_trap btn'
|
||||||
|
frm = grid.element('div.web2py_grid form')
|
||||||
|
frm['_class'] = 'web2py_form span4 well well-small'
|
||||||
|
|
||||||
<h1>{{=T('Manage Admin Users/Students')}}</h1>
|
checkbox_lbl = frm.element('label',_for='auth_user_is_manager')
|
||||||
|
checkbox_inp = frm.element(_name='is_manager',replace=CAT())
|
||||||
|
checkbox_lbl[0] = checkbox_inp
|
||||||
|
checkbox_lbl[1] = 'Is Manager'
|
||||||
|
checkbox_lbl['_class'] = "checkbox"
|
||||||
|
|
||||||
|
inp_smt = frm.element('input',_type='submit',replace=TAG['button'](T('Submit'),_type='submit',_class='btn'))
|
||||||
|
|
||||||
|
new_form_flds = []
|
||||||
|
frm_trs = frm.elements('tr')
|
||||||
|
for tr in frm_trs:
|
||||||
|
label = tr[0][0]
|
||||||
|
input = tr[1][0]
|
||||||
|
help = tr[2][0]
|
||||||
|
new_form_flds.append(label)
|
||||||
|
new_form_flds.append(input)
|
||||||
|
new_form_flds.append(help)
|
||||||
|
pass
|
||||||
|
new_frm_content = frm.element('table',replace=CAT(*new_form_flds))
|
||||||
|
new_frm = grid.element('div.web2py_grid form',replace=lambda me:DIV(me,_class='row-fluid'))
|
||||||
|
elif request.args(0)=='view':
|
||||||
|
bck_btn = grid.element('div.web2py_grid span.leftarrow').parent
|
||||||
|
bck_btn['_id'] = 'w2p_grid_bckbtn'
|
||||||
|
bck_btn['_class'] = 'w2p_trap btn'
|
||||||
|
pen_btn = grid.element('div.web2py_grid span.pen').parent
|
||||||
|
pen_btn['_id'] = 'w2p_grid_penbtn'
|
||||||
|
pen_btn['_class'] = 'w2p_trap btn'
|
||||||
|
frm = grid.element('div.web2py_grid form')
|
||||||
|
frm['_class'] = 'web2py_form span4 well well-small'
|
||||||
|
|
||||||
|
checkbox_lbl = frm.element('label',_for='auth_user_is_manager')
|
||||||
|
checkbox_inp = frm.element(_name='is_manager',replace=CAT())
|
||||||
|
checkbox_lbl[0] = checkbox_inp
|
||||||
|
checkbox_lbl[1] = 'Is Manager'
|
||||||
|
checkbox_lbl['_class'] = "checkbox"
|
||||||
|
|
||||||
|
new_form_flds = []
|
||||||
|
frm_trs = frm.elements('tr')
|
||||||
|
for tr in frm_trs:
|
||||||
|
label = tr[0][0]
|
||||||
|
input = tr[1][0]
|
||||||
|
help = tr[2][0]
|
||||||
|
new_form_flds.append(label)
|
||||||
|
if len(input) > 0 :
|
||||||
|
new_form_flds.append(SPAN(input,_class='uneditable-input'))
|
||||||
|
pass
|
||||||
|
new_form_flds.append(help)
|
||||||
|
pass
|
||||||
|
new_frm_content = frm.element('table',replace=CAT(*new_form_flds))
|
||||||
|
new_frm = grid.element('div.web2py_grid form',replace=lambda me:DIV(me,_class='row-fluid'))
|
||||||
|
elif request.args(0)=='edit':
|
||||||
|
bck_btn = grid.element('div.web2py_grid span.leftarrow').parent
|
||||||
|
bck_btn['_id'] = 'w2p_grid_bckbtn'
|
||||||
|
bck_btn['_class'] = 'w2p_trap btn'
|
||||||
|
viw_btn = grid.element('div.web2py_grid span.magnifier').parent
|
||||||
|
viw_btn['_id'] = 'w2p_grid_viwbtn'
|
||||||
|
viw_btn['_class'] = 'w2p_trap btn'
|
||||||
|
frm = grid.element('div.web2py_grid form')
|
||||||
|
frm['_class'] = 'web2py_form span4 well well-small'
|
||||||
|
|
||||||
|
checkbox_lbl = frm.element('label',_for='auth_user_is_manager')
|
||||||
|
checkbox_inp = frm.element(_name='is_manager',replace=CAT())
|
||||||
|
checkbox_lbl[0] = checkbox_inp
|
||||||
|
checkbox_lbl[1] = 'Is Manager'
|
||||||
|
checkbox_lbl['_class'] = "checkbox"
|
||||||
|
|
||||||
|
checkbox1_lbl = frm.element('label',_for='delete_record')
|
||||||
|
checkbox1_inp = frm.element(_id='delete_record',replace=CAT())
|
||||||
|
checkbox1_lbl[0] = checkbox1_inp
|
||||||
|
checkbox1_lbl[1] = T('Check to delete')
|
||||||
|
checkbox1_lbl['_class'] = "checkbox"
|
||||||
|
|
||||||
|
inp_smt = frm.element('input',_type='submit',replace=TAG['button'](T('Submit'),_type='submit',_class='btn'))
|
||||||
|
|
||||||
|
id_input = frm.element(_id='auth_user_id')
|
||||||
|
id_input['_class'] = 'uneditable-input'
|
||||||
|
|
||||||
|
new_form_flds = []
|
||||||
|
frm_trs = frm.elements('tr')
|
||||||
|
for tr in frm_trs:
|
||||||
|
label = tr[0][0]
|
||||||
|
input = tr[1][0]
|
||||||
|
help = tr[2][0]
|
||||||
|
new_form_flds.append(label)
|
||||||
|
print label
|
||||||
|
new_form_flds.append(input)
|
||||||
|
new_form_flds.append(help)
|
||||||
|
pass
|
||||||
|
new_frm_content = frm.element('table',replace=CAT(*new_form_flds))
|
||||||
|
new_frm = grid.element('div.web2py_grid form',replace=lambda me:DIV(me,_class='row-fluid'))
|
||||||
|
pass
|
||||||
|
}}
|
||||||
|
|
||||||
|
<h2>{{=T('Manage Admin Users/Students')}}</h2>
|
||||||
{{=grid}}
|
{{=grid}}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
{{extend 'layout.html'}}
|
||||||
|
{{import os}}
|
||||||
|
|
||||||
|
{{def tree(path):}}
|
||||||
|
<input type="checkbox" onclick="jQuery(this).parent().find(':checkbox').attr('checked',this.checked)" checked="checked"/>
|
||||||
|
<a href="#" onclick="jQuery(this).next().slideToggle();return false;">
|
||||||
|
{{=path[len(base):] or '/%s' % app}}
|
||||||
|
</a>
|
||||||
|
<ul class="collapsible">
|
||||||
|
{{for file in files[path]['files']:}}
|
||||||
|
<li style="list-style-type: none;">
|
||||||
|
{{p = os.path.relpath(os.path.join(path,file),base)}}
|
||||||
|
<input type="checkbox" value="{{=p}}" name="file" checked="checked"/>
|
||||||
|
{{=file}}
|
||||||
|
</li>
|
||||||
|
{{pass}}
|
||||||
|
{{for dir in files[path]['folders']:}}
|
||||||
|
<li style="list-style-type: none;">
|
||||||
|
{{tree(os.path.join(path,dir))}}
|
||||||
|
</li>
|
||||||
|
{{pass}}
|
||||||
|
</ul>
|
||||||
|
{{return}}
|
||||||
|
|
||||||
|
<form action="{{=URL(args=request.args)}}" method="POST">
|
||||||
|
<h2>{{=T('Select Files to Package')}}</h2>
|
||||||
|
<input type="submit" value="{{=T('Download .w2p')}}" class="btn"/>
|
||||||
|
<div style="margin-top:20px">
|
||||||
|
{{tree(base)}}
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
<script>jQuery(function(){jQuery('.collapsible').hide();});</script>
|
||||||
@@ -1,17 +1,16 @@
|
|||||||
{{extend 'layout.html'}}
|
{{extend 'layout.html'}}
|
||||||
|
|
||||||
{{block sectionclass}}peek{{end}}
|
{{block sectionclass}}peek{{end}}
|
||||||
|
<!-- begin "peek" block -->
|
||||||
<h2>{{=T("Peeking at file")}} "{{=filename}}"</h2>
|
<h2>{{=T("Peeking at file")}} "{{=filename}}"</h2>
|
||||||
|
|
||||||
<p class="controls">
|
<p class="controls">
|
||||||
{{=button(URL('design',args=request.vars.app if request.vars.app else request.args[0], anchor=request.vars.id), T('back'))}}
|
{{=button(URL('design',args=request.vars.app if request.vars.app else request.args[0], anchor=request.vars.id), T('back'))}}
|
||||||
{{=button(URL('edit',args=request.args, vars=request.vars), T('Edit'))}}
|
{{=button(URL('edit',args=request.args, vars=request.vars), T('Edit'))}}
|
||||||
</p>
|
</p>
|
||||||
|
<div class="code-wrapper">
|
||||||
{{
|
{{
|
||||||
if filename[-3:]=='.py': language='python'
|
if filename[-3:]=='.py': language='python'
|
||||||
else: language='html'
|
else: language='html'
|
||||||
}}
|
}}
|
||||||
{{=CODE(data,language=language,link='/examples/global/vars/')}}
|
{{=CODE(data,language=language,link='/examples/global/vars/')}}
|
||||||
|
</div>
|
||||||
|
<!-- end "peek" block -->
|
||||||
@@ -6,11 +6,17 @@ def all(items):
|
|||||||
def peekfile(path,file):
|
def peekfile(path,file):
|
||||||
return A(file.replace('\\\\','/'),_href=URL('peek', args=(app, path, file)))
|
return A(file.replace('\\\\','/'),_href=URL('peek', args=(app, path, file)))
|
||||||
def editfile(path,file):
|
def editfile(path,file):
|
||||||
return A(SPAN(T('Edit')),_class='button editbutton',_href=URL('edit', args=(app, path, file)))
|
return A(SPAN(T('Edit')),_class='button editbutton btn btn-mini',_href=URL('edit', args=(app, path, file)))
|
||||||
def testfile(path,file):
|
def testfile(path,file):
|
||||||
return A(TAG[''](IMG(_src=URL('static', 'images/test_icon.png'), _alt=T('test')), SPAN(T("Run tests in this file"))), _class='icon test tooltip',_href=URL('test', args=(app, file)))
|
return A(TAG[''](IMG(_src=URL('static', 'images/test_icon.png'), _alt=T('test')),
|
||||||
|
SPAN(T("Run tests in this file"))),
|
||||||
|
_class='icon test',
|
||||||
|
_href=URL('test', args=(app, file)),
|
||||||
|
_rel="tooltip",
|
||||||
|
**{'_data-placement':'right',
|
||||||
|
'_data-original-title':T("Run tests in this file")})
|
||||||
def editlanguagefile(path,file):
|
def editlanguagefile(path,file):
|
||||||
return A(SPAN(T('Edit')),_class='button editbutton',_href=URL('edit_language', args=(app, path, file)))
|
return A(SPAN(T('Edit')),_class='button editbutton btn-mini',_href=URL('edit_language', args=(app, path, file)))
|
||||||
def file_upload_form(location):
|
def file_upload_form(location):
|
||||||
form=FORM(T("upload file:")," ",
|
form=FORM(T("upload file:")," ",
|
||||||
INPUT(_type="file",_name="file")," ",T("and rename it:")," ",
|
INPUT(_type="file",_name="file")," ",T("and rename it:")," ",
|
||||||
@@ -29,42 +35,46 @@ def file_create_form(location):
|
|||||||
INPUT(_type="submit",_value=T("submit")),_action=URL('create_file'))
|
INPUT(_type="submit",_value=T("submit")),_action=URL('create_file'))
|
||||||
return form
|
return form
|
||||||
def deletefile(arglist):
|
def deletefile(arglist):
|
||||||
return A(TAG[''](IMG(_src=URL('static', 'images/delete_icon.png')), SPAN(T('Delete this file (you will be asked to confirm deletion)'))), _class='icon delete tooltip', _href=URL('delete',args=arglist,vars=dict(sender=request.function+'/'+app+'/'+request.args[1])))
|
return A(TAG[''](IMG(_src=URL('static', 'images/delete_icon.png')),
|
||||||
|
SPAN(T('Delete this file (you will be asked to confirm deletion)'))),
|
||||||
|
_href=URL('delete',args=arglist,vars=dict(sender=request.function+'/'+app+'/'+request.args[1])),
|
||||||
|
_class='icon delete',
|
||||||
|
_rel="tooltip",
|
||||||
|
**{'_data-placement':'right',
|
||||||
|
'_data-original-title':T('Delete this file (you will be asked to confirm deletion)')})
|
||||||
}}
|
}}
|
||||||
|
|
||||||
{{block sectionclass}}plugin{{end}}
|
{{block sectionclass}}plugin{{end}}
|
||||||
|
<!-- begin "plugin" block -->
|
||||||
|
<h2>{{=T('Plugin "%s" in application', request.args(1))}} "{{=app}}"</h2>
|
||||||
|
|
||||||
<h2>
|
<!-- COLLAPSE/JUMP-TO BUTTONS -->
|
||||||
{{=T('Plugin "%s" in application', request.args(1))}} "{{=app}}"
|
|
||||||
</h2>
|
|
||||||
<div class="right-full controls">
|
<div class="right-full controls">
|
||||||
<a class="button special" href="#" onclick="jQuery('h3').click();return false"><span>{{=T("collapse/expand all")}}</span></a>
|
<p class="buttons-row">
|
||||||
|
<a class="button special btn btn-inverse" href="#" onclick="jQuery('h3>span').click();return false"><span>{{=T("collapse/expand all")}}</span></a>
|
||||||
<span class="buttongroup">
|
<span class="buttongroup">
|
||||||
{{=button("#models", T("models"))}}
|
{{=button('#models', T("models"))}}
|
||||||
{{=button("#controllers", T("controllers"))}}
|
{{=button('#controllers', T("controllers"))}}
|
||||||
{{=button("#views", T("views"))}}
|
{{=button('#views', T("views"))}}
|
||||||
{{=button("#static", T("static"))}}
|
{{=button('#static', T("static"))}}
|
||||||
{{=button("#modules", T("modules"))}}
|
{{=button('#modules', T("modules"))}}
|
||||||
</span>
|
</span>
|
||||||
<span class="buttongroup">
|
<span class="buttongroup">
|
||||||
{{=sp_button(URL('design',args=request.args, anchor=request.vars.id), T("back"))}}
|
{{=sp_button(URL('design',args=request.args, anchor=request.vars.id), T("back"))}}
|
||||||
{{=sp_button(URL('delete_plugin',args=request.args, vars=request.vars), T("delete plugin"))}}
|
{{=sp_button(URL('delete_plugin',args=request.args, vars=request.vars), T("delete plugin"))}}
|
||||||
{{=sp_button(URL('pack_plugin',args=request.args), T("pack plugin"))}}
|
{{=sp_button(URL('pack_plugin',args=request.args), T("pack plugin"))}}
|
||||||
</span>
|
</span>
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- MODELS -->
|
<!-- MODELS -->
|
||||||
|
<h3 id="_models" rel="pagebookmark">
|
||||||
<h3 id="models" onclick="collapse('models_inner');" class="component">
|
<span class="component" onclick="collapse('models_inner');">{{=T("Models")}}</span>
|
||||||
{{=T("Models")}}
|
<span id="models" class="hashstick"> </span><a href="#" class="tophashlink btn btn-mini btn-warning"><span>top</span></a>
|
||||||
</h3>
|
</h3>
|
||||||
<div id="models_inner" class="component_contents">
|
<div id="models_inner" class="component_contents">
|
||||||
{{if not models:}}
|
{{if not models:}}<p><strong>{{=T("There are no models")}}</strong></p>{{else:}}
|
||||||
<p><strong>{{=T("There are no models")}}</strong></p>
|
<ul class="unstyled act-edit">
|
||||||
{{pass}}
|
|
||||||
<div class="controls comptools">
|
|
||||||
</div>
|
|
||||||
<ul>
|
|
||||||
{{for m in models:}}
|
{{for m in models:}}
|
||||||
<li>
|
<li>
|
||||||
<span class="filetools controls">
|
<span class="filetools controls">
|
||||||
@@ -80,6 +90,7 @@ def deletefile(arglist):
|
|||||||
</li>
|
</li>
|
||||||
{{pass}}
|
{{pass}}
|
||||||
</ul>
|
</ul>
|
||||||
|
{{pass}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- FIND CONTROLLER FUNCTIONS -->
|
<!-- FIND CONTROLLER FUNCTIONS -->
|
||||||
@@ -89,17 +100,13 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
|
|||||||
}}
|
}}
|
||||||
|
|
||||||
<!-- CONTROLLERS -->
|
<!-- CONTROLLERS -->
|
||||||
|
<h3 id="_controllers" rel="pagebookmark">
|
||||||
<h3 id="controllers" onclick="collapse('controllers_inner');" class="component">
|
<span class="component" onclick="collapse('controllers_inner');">{{=T("Controllers")}}</span>
|
||||||
{{=T("Controllers")}}
|
<span id="controllers" class="hashstick"> </span><a href="#" class="tophashlink btn btn-mini btn-warning"><span>top</span></a>
|
||||||
</h3>
|
</h3>
|
||||||
<div id="controllers_inner" class="component_contents">
|
<div id="controllers_inner" class="component_contents">
|
||||||
{{if not controllers:}}
|
{{if not controllers:}}<p><strong>{{=T("There are no controllers")}}</strong></p>{{else:}}
|
||||||
<p><strong>{{=T("There are no controllers")}}</strong></p>
|
<ul class="unstyled act_edit">
|
||||||
{{pass}}
|
|
||||||
<div class="controls comptools">
|
|
||||||
</div>
|
|
||||||
<ul>
|
|
||||||
{{for c in controllers:}}
|
{{for c in controllers:}}
|
||||||
<li>
|
<li>
|
||||||
<span class="filetools controls">
|
<span class="filetools controls">
|
||||||
@@ -110,26 +117,23 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
|
|||||||
<span class="file">
|
<span class="file">
|
||||||
{{=peekfile('controllers',c)}}
|
{{=peekfile('controllers',c)}}
|
||||||
</span>
|
</span>
|
||||||
<span class="extras">
|
<span class="extras celled">
|
||||||
{{if functions[c]:}}{{=T("exposes")}} {{pass}}{{=XML(', '.join([A(f,_href=URL(a=app,c=c[:-3],f=f)).xml() for f in functions[c]]))}}
|
{{if functions[c]:}}{{=T("exposes")}} {{pass}}{{=XML(', '.join([A(f,_href=URL(a=app,c=c[:-3],f=f)).xml() for f in functions[c]]))}}
|
||||||
</span>
|
</span>
|
||||||
</li>
|
</li>
|
||||||
{{pass}}
|
{{pass}}
|
||||||
</ul>
|
</ul>
|
||||||
|
{{pass}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- VIEWS -->
|
<!-- VIEWS -->
|
||||||
|
<h3 id="_views" rel="pagebookmark">
|
||||||
<h3 id="views" onclick="collapse('views_inner');" class="component">
|
<span class="component" onclick="collapse('views_inner');">{{=T("Views")}}</span>
|
||||||
{{=T("Views")}}
|
<span id="views" class="hashstick"> </span><a href="#" class="tophashlink btn btn-mini btn-warning"><span>top</span></a>
|
||||||
</h3>
|
</h3>
|
||||||
<div id="views_inner" class="component_contents">
|
<div id="views_inner" class="component_contents">
|
||||||
{{if not views:}}
|
{{if not views:}}<p><strong>{{=T("There are no views")}}</strong></p>{{else:}}
|
||||||
<p><strong>{{=T("There are no views")}}</strong></p>
|
<ul class="unstyled act_edit">
|
||||||
{{pass}}
|
|
||||||
<div class="controls comptools">
|
|
||||||
</div>
|
|
||||||
<ul>
|
|
||||||
{{for c in views:}}
|
{{for c in views:}}
|
||||||
<li>
|
<li>
|
||||||
<span class="filetools controls">
|
<span class="filetools controls">
|
||||||
@@ -139,23 +143,24 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
|
|||||||
<span class="file">
|
<span class="file">
|
||||||
{{=peekfile('views',c)}}
|
{{=peekfile('views',c)}}
|
||||||
</span>
|
</span>
|
||||||
<span class="extras">
|
<span class="extras celled">
|
||||||
{{if extend.has_key(c):}}{{=T("extends")}} <b>{{=extend[c]}}</b> {{pass}}
|
{{if extend.has_key(c):}}{{=T("extends")}} <b>{{=extend[c]}}</b> {{pass}}
|
||||||
{{if include[c]:}}{{=T("includes")}} {{pass}}{{=XML(', '.join([B(f).xml() for f in include[c]]))}}
|
{{if include[c]:}}{{=T("includes")}} {{pass}}{{=XML(', '.join([B(f).xml() for f in include[c]]))}}
|
||||||
</span>
|
</span>
|
||||||
</li>
|
</li>
|
||||||
{{pass}}
|
{{pass}}
|
||||||
</ul>
|
</ul>
|
||||||
|
{{pass}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- STATIC -->
|
<!-- STATIC -->
|
||||||
|
<h3 id="_static" rel="pagebookmark">
|
||||||
<h3 id="static" onclick="collapse('static_inner');" class="component">
|
<span class="component" onclick="collapse('static_inner');">{{=T("Static files")}}</span>
|
||||||
{{=T("Static files")}}
|
<span id="static" class="hashstick"> </span><a href="#" class="tophashlink btn btn-mini btn-warning"><span>top</span></a>
|
||||||
</h3>
|
</h3>
|
||||||
<div id="static_inner" class="component_contents">
|
<div id="static_inner" class="component_contents">
|
||||||
{{if not statics:}}<p><strong>{{=T("There are no static files")}}</strong></p>{{pass}}
|
{{if not statics:}}<p><strong>{{=T("There are no static files")}}</strong></p>{{else:}}
|
||||||
<ul>
|
<ul class="unstyled act_edit">
|
||||||
{{
|
{{
|
||||||
path=[]
|
path=[]
|
||||||
for file in statics+['']:
|
for file in statics+['']:
|
||||||
@@ -167,53 +172,52 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
|
|||||||
path.append(file_path[len(path)])
|
path.append(file_path[len(path)])
|
||||||
thispath='static__'+'__'.join(path)
|
thispath='static__'+'__'.join(path)
|
||||||
}}
|
}}
|
||||||
<li class="folder">
|
<li class="folder"><i> </i>
|
||||||
<a href="javascript:collapse('{{=thispath}}');" class="file">{{=path[-1]}}/</a>
|
<a href="javascript:collapse('{{=thispath}}');" class="file">{{=path[-1]}}/</a>
|
||||||
<ul id="{{=thispath}}" style="display: none;" class="sublist">{{
|
<ul id="{{=thispath}}" style="display: none;" class="sublist">
|
||||||
|
{{
|
||||||
else:
|
else:
|
||||||
path = path[:-1]
|
path = path[:-1]
|
||||||
}}
|
}}
|
||||||
</ul></li>
|
</ul>
|
||||||
|
</li>
|
||||||
{{
|
{{
|
||||||
pass
|
pass
|
||||||
pass
|
pass
|
||||||
if filename:
|
if filename:
|
||||||
}}<li>
|
}}
|
||||||
|
<li>
|
||||||
<span class="filetools controls">
|
<span class="filetools controls">
|
||||||
{{=editfile('static',file)}} {{=deletefile([app,'static',file])}}
|
{{=editfile('static',file)}} {{=deletefile([app,'static',file])}}
|
||||||
</span>
|
</span>
|
||||||
<span class="file">
|
<span class="file">
|
||||||
<a href="{{=URL(a=app,c='static',f=file)}}">{{=filename}}</a>
|
<a href="{{=URL(a=app,c='static',f=file)}}">{{=filename}}</a>
|
||||||
</span>
|
</span>
|
||||||
</li>{{
|
</li>
|
||||||
|
{{
|
||||||
pass
|
pass
|
||||||
pass
|
pass
|
||||||
}}
|
}}
|
||||||
{{pass}}
|
|
||||||
</ul>
|
</ul>
|
||||||
|
{{pass}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- MODULES -->
|
<!-- MODULES -->
|
||||||
|
<h3 id="_modules" rel="pagebookmark">
|
||||||
<h3 id="modules" onclick="collapse('modules_inner');" class="component">
|
<span class="component" onclick="collapse('modules_inner');">{{=T("Modules")}}</span>
|
||||||
{{=T("Modules")}}
|
<span id="modules" class="hashstick"> </span><a href="#" class="tophashlink btn btn-mini btn-warning"><span>top</span></a>
|
||||||
</h3>
|
</h3>
|
||||||
<div id="modules_inner" class="component_contents">
|
<div id="modules_inner" class="component_contents">
|
||||||
{{if not modules:}}
|
{{if not modules:}}<p><strong>{{=T("There are no modules")}}</strong></p>{{else:}}
|
||||||
<p><strong>{{=T("There are no modules")}}</strong></p>
|
<ul class="unstyled act_edit">
|
||||||
{{pass}}
|
|
||||||
<div class="controls comptools">
|
|
||||||
</div>
|
|
||||||
<ul>
|
|
||||||
{{for m in modules:}}
|
{{for m in modules:}}
|
||||||
<li>
|
<li>
|
||||||
{{=editfile('modules',m)}}
|
{{=editfile('modules',m)}}
|
||||||
{{if m!='__init__.py':}}<a class="button" href="{{=URL('delete',args=[app,'modules',m],vars=dict(sender=request.function+'/'+app))}}">{{=T("delete")}}</a>{{pass}}
|
{{if m!='__init__.py':}}<a class="button btn" href="{{=URL('delete',args=[app,'modules',m],vars=dict(sender=request.function+'/'+app))}}">{{=T("delete")}}</a>{{pass}}
|
||||||
{{=peekfile('modules',m)}}
|
{{=peekfile('modules',m)}}
|
||||||
</li>
|
</li>
|
||||||
{{pass}}
|
{{pass}}
|
||||||
</ul>
|
</ul>
|
||||||
|
{{pass}}
|
||||||
</div>
|
</div>
|
||||||
|
<!-- end "plugin" block -->
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,25 +1,21 @@
|
|||||||
{{extend 'layout.html'}}
|
{{extend 'layout.html'}}
|
||||||
|
|
||||||
{{block sectionclass}}resolve{{end}}
|
{{block sectionclass}}resolve{{end}}
|
||||||
|
<!-- begin "resolve" block -->
|
||||||
<h2>{{=T('Resolve Conflict file')}} "{{=filename}}"</h2>
|
<h2>{{=T('Resolve Conflict file')}} "{{=filename}}"</h2>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
function plus() {jQuery('.plus').show(); jQuery('.minus').hide(); }
|
function plus() {jQuery('.plus').show(); jQuery('.minus').hide(); }
|
||||||
function minus() {jQuery('.plus').hide(); jQuery('.minus').show(); }
|
function minus() {jQuery('.plus').hide(); jQuery('.minus').show(); }
|
||||||
function all() {jQuery('.plus').show(); jQuery('.minus').show(); }
|
function all() {jQuery('.plus').show(); jQuery('.minus').show(); }
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="controls">
|
<div class="controls">
|
||||||
<button onclick="plus()">new</button>
|
<button class="btn" onclick="plus()">new</button>
|
||||||
<button onclick="minus()">old</button>
|
<button class="btn" onclick="minus()">old</button>
|
||||||
<button onclick="all()">all</button>
|
<button class="btn" onclick="all()">all</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form">
|
<div class="form">
|
||||||
<form action="{{=URL(r=request,args=request.args)}}" method="post">
|
<form action="{{=URL(r=request,args=request.args)}}" method="post">
|
||||||
{{=diff}}
|
{{=diff}}
|
||||||
<input type="submit" name="merge" value="{{=T('merge')}}" /><br/>
|
<input class="btn" type="submit" name="merge" value="{{=T('merge')}}" /><br/>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
<!-- end "resolve" block -->
|
||||||
@@ -1,158 +1,160 @@
|
|||||||
{{extend 'layout.html'}}
|
{{extend 'layout.html'}}
|
||||||
{{import os, glob}}
|
{{import os, glob}}
|
||||||
|
|
||||||
{{block sectionclass}}site{{end}}
|
{{block sectionclass}}site{{end}}
|
||||||
|
<!-- begin "site" block -->
|
||||||
<div class="applist f60">
|
<div class="row-fluid">
|
||||||
|
<div class="applist f60 span7">
|
||||||
<div class="applist_inner">
|
<div class="applist_inner">
|
||||||
<h2>{{=T("Installed applications")}}</h2>
|
<h2>{{=T("Installed applications")}}</h2>
|
||||||
<ul>
|
<table width="100%" class="table">
|
||||||
{{for a in apps:}}
|
{{for a in apps:}}
|
||||||
<li class="application"> <!-- onmouseover="jQuery(this).children('p').show()" onmouseout="jQuery(this).children('p').hide()"-->
|
<tr>{{buttons = []}}
|
||||||
|
<td>
|
||||||
{{if a==request.application:}}
|
{{if a==request.application:}}
|
||||||
<h3 class="currentapp">{{=a}} ({{=T('currently running')}})</h3>
|
<h4 class="currentapp">{{=a}} ({{=T('currently running')}})</h4>
|
||||||
<p class="controls">
|
|
||||||
{{else:}}
|
{{else:}}
|
||||||
<h3 class="editableapp">{{=A(a,_href=URL(a,'default','index'))}}</h3>
|
<h4 class="editableapp">{{=A(a,_href=URL(a,'default','index'))}}</h4>
|
||||||
{{if MULTI_USER_MODE and db.app(name=a):}}(created by {{="%(first_name)s %(last_name)s" % db.auth_user[db.app(name=a).owner]}}){{pass}}
|
{{if MULTI_USER_MODE and db.app(name=a):}}(created by {{="%(first_name)s %(last_name)s" % db.auth_user[db.app(name=a).owner]}}){{pass}}
|
||||||
<p class="controls">
|
|
||||||
{{if not os.path.exists('applications/%s/compiled' % a):}}
|
{{if not os.path.exists('applications/%s/compiled' % a):}}
|
||||||
{{=sp_button(URL('design',args=a), T("Edit"))}}
|
{{buttons.append((URL('design',args=a), T("Edit")))}}
|
||||||
{{else:}}
|
{{else:}}
|
||||||
{{=button(URL(a,'appadmin','index'), T("appadmin"))}}
|
{{buttons.append((URL(a,'appadmin','index'), T("appadmin")))}}
|
||||||
{{pass}}
|
{{pass}}
|
||||||
{{=button(URL('about',args=a), T("About"))}}
|
{{buttons.append((URL('about',args=a), T("About")))}}
|
||||||
{{pass}}
|
{{pass}}
|
||||||
{{=button(URL('errors',args=a), T("Errors"))}}
|
{{buttons.append((URL('errors',args=a), T("Errors")))}}
|
||||||
{{=button(URL('cleanup',args=a), T("Clean"))}}
|
{{buttons.append((URL('cleanup',args=a), T("Clean")))}}
|
||||||
{{=button(URL('pack',args=a), T("Pack all"))}}
|
{{buttons.append((URL('pack',args=a), T("Pack all")))}}
|
||||||
|
{{buttons.append((URL('pack_custom',args=a), T("Pack custom")))}}
|
||||||
{{if not os.path.exists('applications/%s/compiled' % a):}}
|
{{if not os.path.exists('applications/%s/compiled' % a):}}
|
||||||
{{=button(URL('compile_app',args=a), T("Compile"))}}
|
{{buttons.append((URL('compile_app',args=a), T("Compile")))}}
|
||||||
{{else:}}
|
{{else:}}
|
||||||
{{=button(URL('pack',args=(a, 'compiled')), T("Pack compiled"))}}
|
{{buttons.append((URL('pack',args=(a, 'compiled')), T("Pack compiled")))}}
|
||||||
{{if glob.glob('applications/%s/controllers/*.py' % a):}}
|
{{if glob.glob('applications/%s/controllers/*.py' % a):}}
|
||||||
{{=button(URL('remove_compiled_app',args=a), T("Remove compiled"))}}
|
{{buttons.append((URL('remove_compiled_app',args=a), T("Remove compiled")))}}
|
||||||
{{pass}}
|
{{pass}}
|
||||||
{{pass}}
|
{{pass}}
|
||||||
{{if os.path.exists(os.path.join(apath(r=request),a,'.git')): }}
|
{{if os.path.exists(os.path.join(apath(r=request),a,'.git')): }}
|
||||||
{{=button(URL('git_pull',args=a), T("Git Pull"))}}
|
{{buttons.append((URL('git_pull',args=a), T("Git Pull")))}}
|
||||||
{{=button(URL('git_push',args=a), T("Git Push"))}}
|
{{buttons.append((URL('git_push',args=a), T("Git Push")))}}
|
||||||
{{pass}}
|
{{pass}}
|
||||||
{{if a!=request.application:}}
|
{{if a!=request.application:}}
|
||||||
{{=button(URL('uninstall',args=a), T("Uninstall"))}}
|
{{buttons.append((URL('uninstall',args=a), T("Uninstall")))}}
|
||||||
{{=button_enable(URL('enable',args=a), a)}}
|
|
||||||
{{pass}}
|
{{pass}}
|
||||||
</p>
|
</td>
|
||||||
</li>
|
<td>
|
||||||
|
<div class="btn-group">
|
||||||
|
<a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
|
||||||
|
{{=T('Manage')}}
|
||||||
|
<span class="caret"></span>
|
||||||
|
</a>
|
||||||
|
<ul class="dropdown-menu">
|
||||||
|
{{for link,name in buttons:}}
|
||||||
|
{{=LI(A(name,_href=link))}}
|
||||||
{{pass}}
|
{{pass}}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
{{=button_enable(URL('enable',args=a), a)}}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{{pass}}
|
||||||
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
</div> <!-- /applist -->
|
||||||
<div class="sidebar fl60">
|
<div class="sidebar fl60 span5">
|
||||||
<div class="sidebar_inner controls">
|
<div class="sidebar_inner controls well well-small">
|
||||||
<div class="pwdchange">
|
|
||||||
<!-- CHANGE ADMIN PWD -->
|
<!-- CHANGE ADMIN PWD -->
|
||||||
|
<div class="pwdchange pull-right">
|
||||||
{{if MULTI_USER_MODE:}}
|
{{if MULTI_USER_MODE:}}
|
||||||
{{=auth.navbar()}}
|
{{=auth.navbar()}}
|
||||||
{{else:}}
|
{{else:}}
|
||||||
{{=sp_button(URL('change_password'), T('Change admin password'))}}
|
{{=sp_button(URL('change_password'), T('Change admin password'))}}
|
||||||
{{pass}}
|
|
||||||
</div>
|
|
||||||
<!-- VERSION -->
|
|
||||||
{{if is_manager():}}
|
|
||||||
<div class="box">
|
|
||||||
<h3>{{=T("Version %s.%s.%s (%s) %s", myversion)}}</h3>
|
|
||||||
{{if session.check_version:}}
|
|
||||||
<p id="check_version">
|
|
||||||
{{=T('Checking for upgrades...')}}
|
|
||||||
<script>ajax('{{=URL('check_version')}}',[],'check_version');</script>{{session.check_version=False}}
|
|
||||||
{{else:}}
|
|
||||||
<p id="check_version">
|
|
||||||
{{=button("javascript:ajax('"+URL('check_version')+"',[],'check_version')", T('Check for upgrades'))}}
|
|
||||||
{{=button(URL('default','reload_routes'), T('Reload routes'))}}
|
{{=button(URL('default','reload_routes'), T('Reload routes'))}}
|
||||||
</p>
|
|
||||||
{{pass}}
|
{{pass}}
|
||||||
|
</div> <!-- /CHANGE ADMIN PWD -->
|
||||||
|
{{if is_manager():}}
|
||||||
|
<!-- VERSION -->
|
||||||
|
<div class="box">
|
||||||
|
<h4>{{=T("Version")}}</h4>
|
||||||
<p>
|
<p>
|
||||||
{{=T("Running on %s", request.env.server_software)}}
|
<tt>{{=myversion}}</tt><br/>
|
||||||
|
({{=T("Running on %s", request.env.server_software)}})
|
||||||
</p>
|
</p>
|
||||||
{{if session.is_mobile=='auto':}}<p>
|
<p id="check_version" class="row-buttons">
|
||||||
{{=A(T('Try the mobile interface'),_href=URL('plugin_jqmobile','about'))}}</p>
|
{{if session.check_version:}}
|
||||||
|
{{=T('Checking for upgrades...')}}
|
||||||
|
<script>ajax('{{=URL('check_version')}}',[],'check_version');</script>
|
||||||
|
{{session.check_version=False}}
|
||||||
|
{{else:}}
|
||||||
|
{{=button("javascript:ajax('"+URL('check_version')+"',[],'check_version')", T('Check for upgrades'))}}
|
||||||
{{pass}}
|
{{pass}}
|
||||||
</div>
|
</p>
|
||||||
|
{{if session.is_mobile=='auto':}}
|
||||||
|
<p>{{=A(T('Try the mobile interface'),_href=URL('plugin_jqmobile','about'))}}</p>
|
||||||
|
{{pass}}
|
||||||
|
</div> <!-- /VERSION -->
|
||||||
{{pass}}
|
{{pass}}
|
||||||
<!-- MULTI_USER_INTERFACE -->
|
|
||||||
{{if MULTI_USER_MODE and is_manager():}}
|
{{if MULTI_USER_MODE and is_manager():}}
|
||||||
|
<!-- MULTI_USER_INTERFACE -->
|
||||||
<div class="box">
|
<div class="box">
|
||||||
<h3>{{=T("Multi User Mode")}}</h3>
|
<h4>{{=T("Multi User Mode")}}</h4>
|
||||||
<p>
|
<p class="row-buttons">
|
||||||
{{=button(URL('bulk_register'),T('Bulk Register'))}}
|
{{=button(URL('bulk_register'),T('Bulk Register'))}}
|
||||||
{{=button(URL('manage_students'),T('Manage Students'))}}
|
{{=button(URL('manage_students',vars={'order':'auth_user.id'}),T('Manage Students'))}}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div> <!-- /MULTI_USER_INTERFACE -->
|
||||||
{{pass}}
|
{{pass}}
|
||||||
<!-- APP WIZARD -->
|
|
||||||
<div class="box">
|
|
||||||
<h3>{{=T("New application wizard")}}</h3>
|
|
||||||
<p>{{=button(URL('wizard','index'), T('Start wizard'))}}
|
|
||||||
{{=T("(requires internet access)")}}</p>
|
|
||||||
</div>
|
|
||||||
<!-- SCAFFOLD APP -->
|
<!-- SCAFFOLD APP -->
|
||||||
<div class="box">
|
<div class="box">
|
||||||
<h3>{{=T("New simple application")}}</h3>
|
<h4>{{=T("New simple application")}}</h4>
|
||||||
{{=form_create.custom.begin}}
|
{{=form_create.custom.begin}}
|
||||||
<table><tr><td>
|
|
||||||
{{=LABEL(T("Application name:"))}}
|
{{=LABEL(T("Application name:"))}}
|
||||||
</td><td>
|
|
||||||
{{=form_create.custom.widget.name}}
|
{{=form_create.custom.widget.name}}
|
||||||
</td><td>
|
<div class="controls"><button type="submit" class="btn">{{=T('Create')}}</button></div>
|
||||||
<button type="submit">{{=T('Create')}}</button>
|
|
||||||
</td></tr></table>
|
|
||||||
{{=form_create.custom.end}}
|
{{=form_create.custom.end}}
|
||||||
</div>
|
</div> <!-- /SCAFFOLD APP -->
|
||||||
<!-- UPLOAD PACKAGE -->
|
<!-- UPLOAD PACKAGE -->
|
||||||
<div class="box">
|
<div class="box">
|
||||||
<h3>{{=T("Upload and install packed application")}}</h3>
|
<h4>{{=T("Upload and install packed application")}}</h4>
|
||||||
{{=form_update.custom.begin}}
|
{{=form_update.custom.begin}}
|
||||||
<table><tr><td>
|
<label for="appupdate_name">{{=T("Application name:")}}</label>
|
||||||
{{=LABEL(T("Application name:"))}}
|
|
||||||
</td><td>
|
|
||||||
{{=form_update.custom.widget.name}}
|
{{=form_update.custom.widget.name}}
|
||||||
</td></tr><tr><td>
|
<label for="appupdate_file">{{=T("Upload a package:")}}</label>
|
||||||
{{=LABEL(T("Upload a package:"))}}
|
|
||||||
</td><td>
|
|
||||||
{{=form_update.custom.widget.file}}
|
{{=form_update.custom.widget.file}}
|
||||||
</td></tr><tr><td>
|
<label for="appupdate_url">{{=T("Or Get from URL:")}}</label>
|
||||||
{{=LABEL('Or ',T("Get from URL:"))}}
|
{{=form_update.custom.widget.url}}<small class="help-block">({{=T('can be a git repo')}})</small>
|
||||||
</td><td>
|
<div class="controls">
|
||||||
{{=form_update.custom.widget.url}}
|
<label class="checkbox">
|
||||||
</td></tr><tr><td>
|
{{=form_update.custom.widget.overwrite}} {{=T("Overwrite installed app")}}
|
||||||
({{=T('can be a git repo')}})
|
</label>
|
||||||
</td><td>
|
<button type="submit" class='btn'>{{=T('Install')}}</button>
|
||||||
{{=form_update.custom.widget.overwrite}}
|
|
||||||
{{=LABEL(T("Overwrite installed app"))}}
|
|
||||||
</td></tr><tr><td>
|
|
||||||
</td><td>
|
|
||||||
<button type="submit">{{=T('Install')}}</button>
|
|
||||||
</td></tr></table>
|
|
||||||
{{=form_update.custom.end}}
|
|
||||||
</div>
|
</div>
|
||||||
|
{{=form_update.custom.end}}
|
||||||
|
</div> <!-- /UPLOAD PACKAGE -->
|
||||||
<!-- DEPLOY ON GAE -->
|
<!-- DEPLOY ON GAE -->
|
||||||
<div class="box">
|
<div class="box">
|
||||||
<h3>{{=T("Deploy")}}</h3>
|
<h4>{{=T("Deploy")}}</h4>
|
||||||
<p>
|
<p class="row-buttons">
|
||||||
{{=button(URL('gae','deploy'), T('Deploy on Google App Engine'))}}
|
{{=button(URL('gae','deploy'), T('Deploy on Google App Engine'))}}
|
||||||
{{=button(URL('openshift','deploy'),T('Deploy to OpenShift'))}}
|
{{=button(URL('openshift','deploy'),T('Deploy to OpenShift'))}}
|
||||||
</p>
|
</p>
|
||||||
</div><br/>
|
</div> <!-- /DEPLOY ON GAE -->
|
||||||
{{if TWITTER_HASH:}}
|
<!-- APP WIZARD -->
|
||||||
<div class="box">
|
<div class="box">
|
||||||
<h3>{{=T("%s Recent Tweets"%TWITTER_HASH)}}</h3>
|
<h4>{{=T("New application wizard")}}</h4>
|
||||||
|
<p>{{=button(URL('wizard','index'), T('Start wizard'))}}<br/>
|
||||||
|
{{=T("(requires internet access, experimental)")}}</p>
|
||||||
|
</div> <!-- /APP WIZARD -->
|
||||||
|
{{if TWITTER_HASH:}}
|
||||||
|
<!-- TWITTER -->
|
||||||
|
<div class="box">
|
||||||
|
<h4>{{=T("%s Recent Tweets"%TWITTER_HASH)}}</h4>
|
||||||
<div id="tweets">{{=T('loading...')}}</div>
|
<div id="tweets">{{=T('loading...')}}</div>
|
||||||
<script>
|
<script>jQuery(document).ready(function(){jQuery('#tweets').load('{{=URL('twitter.load')}}');});</script>
|
||||||
jQuery(document).ready(function(){jQuery('#tweets').load('{{=URL('twitter.load')}}');});
|
</div> <!-- /TWITTER -->
|
||||||
</script>
|
|
||||||
</div>
|
|
||||||
{{pass}}
|
{{pass}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div> <!-- /sidebar -->
|
||||||
|
</div> <!-- /row-fluid
|
||||||
|
<!-- end "site" block -->
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{{extend 'layout.html'}}
|
{{extend 'layout.html'}}
|
||||||
|
|
||||||
{{block sectionclass}}test{{end}}
|
{{block sectionclass}}test{{end}}
|
||||||
|
<!-- begin "test" block -->
|
||||||
<h2>{{=T('Testing application')}} "{{=app}}"</h2>
|
<h2>{{=T('Testing application')}} "{{=app}}"</h2>
|
||||||
|
|
||||||
{{for controller in sorted(controllers):}}
|
{{for controller in sorted(controllers):}}
|
||||||
@@ -14,8 +14,14 @@ ajax('{{=URL(a=app,c=controller[:-3],f='_TEST')}}',[],'output_{{=controller[:-3]
|
|||||||
//--></script>
|
//--></script>
|
||||||
{{pass}}
|
{{pass}}
|
||||||
|
|
||||||
<p class="help">{{=T("""If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.
|
<div class="row-fluid">
|
||||||
|
<p class="help alert alert-info span6">{{=T("""If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.
|
||||||
A green title indicates that all tests (if defined) passed. In this case test results are not shown.""")}}</p>
|
A green title indicates that all tests (if defined) passed. In this case test results are not shown.""")}}</p>
|
||||||
<p class="help">{{=T('Functions with no doctests will result in [passed] tests.')}}</p>
|
</div>
|
||||||
<p class="help">{{=T('ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.')}}</p>
|
<div class="row-fluid">
|
||||||
|
<p class="help alert alert-info span6">{{=T('Functions with no doctests will result in [passed] tests.')}}</p>
|
||||||
|
</div>
|
||||||
|
<div class="row-fluid">
|
||||||
|
<p class="help alert alert-info span6">{{=T('ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.')}}</p>
|
||||||
|
</div>
|
||||||
|
<!--end "test" block -->
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
{{extend 'layout.html'}}
|
{{extend 'layout.html'}}
|
||||||
|
|
||||||
{{block sectionclass}}ticket{{end}}
|
{{block sectionclass}}ticket{{end}}
|
||||||
|
<!-- begin "ticket" block -->
|
||||||
<h2>{{=T('Error ticket')}} for "{{=app}}"</h2>
|
<h2>{{=T('Error ticket')}} for "{{=app}}"</h2>
|
||||||
<h3>{{=T('Ticket ID')}}</h3>
|
<h3>{{=T('Ticket ID')}}</h3>
|
||||||
<p>{{=ticket}}</p>
|
<p>{{=ticket}}</p>
|
||||||
@@ -11,7 +10,7 @@
|
|||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<th>web2py™</th>
|
<th>web2py™</th>
|
||||||
<td>{{=myversion}}</td>
|
<td>Version {{=myversion}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{{if snapshot:}}
|
{{if snapshot:}}
|
||||||
<tr>
|
<tr>
|
||||||
@@ -21,36 +20,30 @@
|
|||||||
{{pass}}
|
{{pass}}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
{{if traceback or code or layer:}}
|
{{if traceback or code or layer:}}
|
||||||
<h3>{{=T('Traceback')}}</h3>
|
<h3>{{=T('Traceback')}}</h3>
|
||||||
<div class="inspect">
|
<div class="inspect resp1">{{=traceback}}</div>
|
||||||
{{=traceback}}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{{if snapshot:}}
|
{{if snapshot:}}
|
||||||
{{try:}}
|
{{try:}}
|
||||||
|
|
||||||
<!-- ERROR SNAPSHOT -->
|
<!-- ERROR SNAPSHOT -->
|
||||||
|
<h3>{{=T('Error snapshot')}}
|
||||||
<h3>
|
<a href="#" rel="tooltip" data-placement="right" data-original-title="{{=T('Detailed traceback description')}}">
|
||||||
{{=T('Error snapshot')}}
|
{{=helpicon()}}
|
||||||
<span class="tooltip">{{=helpicon()}} <span>{{=T('Detailed traceback description')}}</span></span>
|
<span>{{=T("Detailed traceback description")}}</span>
|
||||||
|
</a>
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<!-- SNAPSHOT LIST -->
|
<!-- SNAPSHOT LIST -->
|
||||||
|
|
||||||
<div id="snapshot">
|
<div id="snapshot">
|
||||||
<!-- Exception details -->
|
<!-- Exception details -->
|
||||||
<p class="exception_object inspect">
|
<p class="exception_object inspect">
|
||||||
<code>{{=snapshot['etype']}}({{=snapshot['evalue']}})</code>
|
<code>{{=snapshot['etype']}}({{=snapshot['evalue']}})</code>
|
||||||
</p>
|
</p>
|
||||||
<p class="controls">
|
<p class="controls">
|
||||||
<a class="button" onclick="collapse('exception_inner');"><span>{{=T('inspect attributes')}}</span></a>
|
<a class="button btn" onclick="collapse('exception_inner');"><span>{{=T('inspect attributes')}}</span></a>
|
||||||
</p>
|
</p>
|
||||||
<div id="exception_inner" class="hide">
|
<div id="exception_inner" class="hide">
|
||||||
<div class="inspect">
|
<div class="inspect">
|
||||||
<h5>{{=T("Exception instance attributes")}}</h5>
|
<h4>{{=T("Exception instance attributes")}}</h4>
|
||||||
<table>
|
<table>
|
||||||
<tbody>
|
<tbody>
|
||||||
{{for k,v in snapshot['exception'].items():}}
|
{{for k,v in snapshot['exception'].items():}}
|
||||||
@@ -64,33 +57,32 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- FRAMES -->
|
<!-- FRAMES -->
|
||||||
<div id="frames">
|
<div id="frames">
|
||||||
<h4>{{=T('Frames')}}</h4>
|
<h4>{{=T('Frames')}}</h4>
|
||||||
<ul>
|
<ul class="unstyled">
|
||||||
{{for i, frame in enumerate(snapshot['frames']):}}
|
{{for i, frame in enumerate(snapshot['frames']):}}
|
||||||
<li>
|
<li>
|
||||||
{{is_hidden = (i != len(snapshot['frames'])-1 and 'hide' or 'inspect')}}
|
{{is_hidden = (i != len(snapshot['frames'])-1 and 'hide' or 'inspect')}}
|
||||||
<div class="framefile inspect controls">
|
<div class="framefile inspect controls">
|
||||||
<p>
|
<p>
|
||||||
<strong>File {{="%s in %s at line %s" % (frame['file'], frame['func'], frame['lnum'])}}</strong>
|
<strong>File {{="%s in %s at line %s" % (frame['file'], frame['func'], frame['lnum'])}}</strong>
|
||||||
<a class="button tbbutton" onclick="collapse('{{="%s_code_inner" % i}}');"><span>{{=T("code")}}</span></a>
|
<a class="button tbbutton btn" onclick="collapse('{{='%s_code_inner' % i}}');"><span>{{=T("code")}}</span></a>
|
||||||
<a class="button tbbutton" onclick="collapse('{{="%s_args_inner" % i}}');"><span>{{=T("arguments")}}</span></a>
|
<a class="button tbbutton btn" onclick="collapse('{{='%s_args_inner' % i}}');"><span>{{=T("arguments")}}</span></a>
|
||||||
<a class="button tbbutton" onclick="collapse('{{="%s_vars_inner" % i}}');"><span>{{=T("variables")}}</span></a>
|
<a class="button tbbutton btn" onclick="collapse('{{='%s_vars_inner' % i}}');"><span>{{=T("variables")}}</span></a>
|
||||||
</p>
|
</p>
|
||||||
<div id="{{="%s_args_inner" % i}}" class="{{=is_hidden}}">
|
<div id="{{='%s_args_inner' % i}}" class="{{=is_hidden}}" style="width:100%;overflow:auto">
|
||||||
<h5>Function argument list</h5>
|
<h5>Function argument list</h5>
|
||||||
<p>{{=frame['call']}}</p>
|
<p>{{=frame['call']}}</p>
|
||||||
</div>
|
</div>
|
||||||
<div id="{{="%s_code_inner" % i}}" class="{{=is_hidden}}">
|
<div id="{{='%s_code_inner' % i}}" class="{{=is_hidden}}" style="width:100%;overflow:auto">
|
||||||
<h5>Code listing</h5>
|
<h5>Code listing</h5>
|
||||||
{{if frame['lines']:}}
|
{{if frame['lines']:}}
|
||||||
<pre>{{=CODE('\n'.join([x[1] for x in sorted(frame['lines'].items(),key=lambda x: x[0])]),
|
<pre>{{=CODE('\n'.join([x[1] for x in sorted(frame['lines'].items(),key=lambda x: x[0])]),
|
||||||
language='python', link=None, counter=min(frame['lines'].keys()), highlight_line=frame['lnum'])}}</pre>
|
language='python', link=None, counter=min(frame['lines'].keys()), highlight_line=frame['lnum'])}}</pre>
|
||||||
{{pass}}
|
{{pass}}
|
||||||
</div>
|
</div>
|
||||||
<div id="{{="%s_vars_inner" % i}}" class="{{=is_hidden}}">
|
<div id="{{='%s_vars_inner' % i}}" class="{{=is_hidden}}" style="width:100%;overflow:auto">
|
||||||
<h5>Variables</h5>
|
<h5>Variables</h5>
|
||||||
<table>
|
<table>
|
||||||
<tbody>
|
<tbody>
|
||||||
@@ -108,20 +100,27 @@
|
|||||||
{{pass}}
|
{{pass}}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- VIEW ENVIRONMENT -->
|
<!-- VIEW ENVIRONMENT -->
|
||||||
<div class="viewenv">
|
<div class="viewenv">
|
||||||
<h4>Context</h4>
|
<h4><span>Context</span></h4>
|
||||||
<p class="controls">
|
<p class="controls">
|
||||||
<a class="button" onclick="jQuery('#locals').slideToggle()"><span>{{=T('locals')}}</span></a>
|
<a class="button btn" onclick="jQuery('#locals').slideToggle()"><span>{{=T('locals')}}</span></a>
|
||||||
<a class="button" onclick="jQuery('#request').slideToggle()"><span>{{=T('request')}}</span></a>
|
<a class="button btn" onclick="jQuery('#request').slideToggle()"><span>{{=T('request')}}</span></a>
|
||||||
<a class="button" onclick="jQuery('#session').slideToggle()"><span>{{=T('session')}}</span></a>
|
<a class="button btn" onclick="jQuery('#session').slideToggle()"><span>{{=T('session')}}</span></a>
|
||||||
<a class="button" onclick="jQuery('#response').slideToggle()"><span>{{=T('response')}}</span></a>
|
<a class="button btn" onclick="jQuery('#response').slideToggle()"><span>{{=T('response')}}</span></a>
|
||||||
</p>
|
</p>
|
||||||
<div class="hide inspect" id="locals"><h6>locals</h6>{{=BEAUTIFY(snapshot['locals'])}}</div>
|
<div class="hide inspect resp1" id="locals"><h4>locals</h4>
|
||||||
<div class="hide inspect" id="request"><h6>request</h6>{{=BEAUTIFY(snapshot['request'])}}</div>
|
{{=BEAUTIFY(snapshot.get('locals','no locals available in snapshot'))}}
|
||||||
<div class="hide inspect" id="session"><h6>session</h6>{{=BEAUTIFY(snapshot['session'])}}</div>
|
</div>
|
||||||
<div class="hide inspect" id="response"><h6>response</h6>{{=BEAUTIFY(snapshot['response'])}}</div>
|
<div class="hide inspect" id="request"><h4>request</h4>
|
||||||
|
{{=XML(snapshot.get('request','no request available in snapshot'))}}
|
||||||
|
</div>
|
||||||
|
<div class="hide inspect" id="session"><h4>session</h4>
|
||||||
|
{{=XML(snapshot.get('session','no session available in snapshot'))}}
|
||||||
|
</div>
|
||||||
|
<div class="hide inspect" id="response"><h4>response</h4>
|
||||||
|
{{=XML(snapshot.get('response','no response available in snapshot'))}}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{except Exception, e:}}
|
{{except Exception, e:}}
|
||||||
<!-- this should not happen, just in case... (cannot output normal hmtl as we don't know current open tags) -->
|
<!-- this should not happen, just in case... (cannot output normal hmtl as we don't know current open tags) -->
|
||||||
@@ -137,3 +136,4 @@
|
|||||||
{{else:}}
|
{{else:}}
|
||||||
<h3>{{=T('Ticket Missing')}}</h3>
|
<h3>{{=T('Ticket Missing')}}</h3>
|
||||||
{{pass}}
|
{{pass}}
|
||||||
|
<!-- end "ticket" block -->
|
||||||
|
|||||||
@@ -27,8 +27,17 @@ Tweet attributes
|
|||||||
"""
|
"""
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
{{import re}}
|
||||||
|
{{hashtag = re.compile('([#@])(\w+)')}}
|
||||||
|
{{link = re.compile('(?!<")https?\:\/\/[\w\./?&]+')}}
|
||||||
|
<table class="twitter">
|
||||||
{{ for t in tweets: }}
|
{{ for t in tweets: }}
|
||||||
{{ =DIV(H5(t["from_user_name"])) }}
|
<tr class="tweet">
|
||||||
{{ =DIV(t["text"]) }}
|
<td><img src="{{=t['profile_image_url_https']}}"/></td>
|
||||||
{{ =BR() }}
|
<td>
|
||||||
|
<a href="http://twitter.com/{{=t['from_user']}}">{{=t["from_user_name"]}}</a>:
|
||||||
|
{{=XML(hashtag.sub('<a href="http://twitter.com/\\g<2>">\\g<1>\\g<2></a>',link.sub('<a href="\\g<0>">\\g<0></a>',t["text"].encode('utf8'))),sanitize=True)}}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
{{ pass }}
|
{{ pass }}
|
||||||
|
</table>
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
{{extend 'layout.html'}}
|
{{extend 'layout.html'}}
|
||||||
|
<!-- begin "uninstall" block -->
|
||||||
<h2>{{=T('Are you sure you want to uninstall application "%s"?', app)}}</h2>
|
<h2>{{=T('Are you sure you want to uninstall application "%s"?', app)}}</h2>
|
||||||
<div class="center">
|
<div class="center">
|
||||||
{{=dialog}}
|
{{=dialog}}
|
||||||
</div>
|
</div>
|
||||||
|
<!-- end "uninstall" block -->
|
||||||
@@ -1,13 +1,17 @@
|
|||||||
{{extend 'layout.html'}}
|
{{extend 'layout.html'}}
|
||||||
|
{{
|
||||||
|
dlg = dialog
|
||||||
|
smt_button = dlg.element(_type="submit")
|
||||||
|
smt_button['_class'] = 'btn'
|
||||||
|
smt_button['_style'] = 'margin-right:4px;'
|
||||||
|
ccl_button = dlg.element(_type="button")
|
||||||
|
ccl_button['_class'] = 'btn'
|
||||||
|
}}
|
||||||
{{block sectionclass}}upgrade{{end}}
|
{{block sectionclass}}upgrade{{end}}
|
||||||
|
<!-- begin "shell" block -->
|
||||||
<h2>{{=T('web2py upgrade')}}</h2>
|
<h2>{{=T('web2py upgrade')}}</h2>
|
||||||
|
<p class="center"><div class="alert"><strong class="att">{{=T('ATTENTION:')}}</strong> {{=T('This is an experimental feature and it needs more testing. If you decide to upgrade you do it at your own risk')}}<br />
|
||||||
<p class="center"><strong class="att">{{=T('ATTENTION:')}}</strong> {{=T('This is an experimental feature and it needs more testing. If you decide to upgrade you do it at your own risk')}}<br />
|
{{=T('If start the upgrade, be patient, it may take a while to download')}}</p></div>
|
||||||
{{=T('If start the upgrade, be patient, it may take a while to download')}}</p>
|
|
||||||
|
|
||||||
<div class="center">
|
<div class="center">
|
||||||
{{=dialog}}
|
{{=dialog}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -1,20 +1,67 @@
|
|||||||
{{extend 'layout.html'}}
|
{{extend 'layout.html'}}
|
||||||
|
<!-- begin "user" block -->
|
||||||
<h2>{{=T( request.args(0).replace('_',' ').capitalize() )}}</h2>
|
<h2>{{=T( request.args(0).replace('_',' ').capitalize() )}}</h2>
|
||||||
<div id="web2py_user_form">
|
<div id="web2py_user_form">
|
||||||
|
{{if 'auth' in globals():}}
|
||||||
|
{{
|
||||||
|
# add bootstrap class to form
|
||||||
|
form['_class']='span4 well well-small'
|
||||||
|
# change form.custom.begin
|
||||||
|
form.custom.begin=XML("<%s %s>" % (form.tag,form._xml()[0]))
|
||||||
|
if request.args(0)=='login':
|
||||||
|
# delete empty label
|
||||||
|
d = form.elements("tr#auth_user_remember__row")
|
||||||
|
d[0][0] = " "
|
||||||
|
# remake remember checkbox
|
||||||
|
cbx_inp=form.element(_name='remember')
|
||||||
|
cbx_inp['_class']=""
|
||||||
|
cbx_lbl=form.element(_for='auth_user_remember')[0]
|
||||||
|
form.element('div',replace=LABEL(cbx_inp,cbx_lbl,_class="checkbox"))
|
||||||
|
# new form buttons
|
||||||
|
smt = form.element('input',_type='submit')
|
||||||
|
smt['_class']='btn'
|
||||||
|
btns = [smt]
|
||||||
|
if not 'register' in auth.settings.actions_disabled:
|
||||||
|
btns.append(A(T('register'),_href=URL(r=request,args='register'),_class='btn btn-lnk'))
|
||||||
|
pass
|
||||||
|
if not 'request_reset_password' in auth.settings.actions_disabled:
|
||||||
|
btns.append(A(T('lost password'),_href=URL(r=request,args='request_reset_password'),_class='btn btn-lnk'))
|
||||||
|
pass
|
||||||
|
form.element('input[type=submit]',replace=DIV(*btns,_class="controls-inline"))
|
||||||
|
pass
|
||||||
|
if request.args(0)in['register','profile']:
|
||||||
|
# remake is_manager checkbox
|
||||||
|
cbx_inp=form.element(_name='is_manager')
|
||||||
|
cbx_lbl=form.element(_for='auth_user_is_manager')[0]
|
||||||
|
form.element(_name='is_manager',replace=lambda cbx_inp : LABEL(cbx_inp,cbx_lbl,_class="checkbox"))
|
||||||
|
# delete is manager label
|
||||||
|
d = form.elements("tr#auth_user_is_manager__row")
|
||||||
|
d[0][0][0] = " "
|
||||||
|
# new form buttons
|
||||||
|
smt = form.element('input',_type='submit')
|
||||||
|
smt['_class']='btn'
|
||||||
|
form.element('input[type=submit]',replace=lambda button: DIV(button,_class="controls-inline"))
|
||||||
|
pass
|
||||||
|
if request.args(0)in ['request_reset_password','change_password']:
|
||||||
|
# new form buttons
|
||||||
|
smt = form.element('input',_type='submit')
|
||||||
|
smt['_class']='btn'
|
||||||
|
form.element('input[type=submit]',replace=lambda button: DIV(button,_class="controls-inline"))
|
||||||
|
pass
|
||||||
|
}}
|
||||||
|
{{=form.custom.begin}}
|
||||||
|
{{for e in form.components[0]:}}
|
||||||
|
{{= e[0][0]}}
|
||||||
|
{{= e[1][0]}}
|
||||||
|
{{pass}}
|
||||||
|
{{=form.custom.end}}
|
||||||
|
{{else:}}
|
||||||
{{=form}}
|
{{=form}}
|
||||||
{{if request.args(0)=='login':}}
|
|
||||||
{{if not 'register' in auth.settings.actions_disabled:}}
|
|
||||||
<br/><a href="{{=URL(r=request,args='register')}}">register</a>
|
|
||||||
{{pass}}
|
|
||||||
{{if not 'request_reset_password' in auth.settings.actions_disabled:}}
|
|
||||||
<br/><a href="{{=URL(r=request,args='request_reset_password')}}">lost password</a>
|
|
||||||
{{pass}}
|
|
||||||
{{pass}}
|
{{pass}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script language="javascript">
|
<script language="javascript">
|
||||||
<!--
|
//<!--
|
||||||
jQuery("#web2py_user_form input:visible:enabled:first").focus();
|
jQuery("#web2py_user_form input:visible:enabled:first").focus();
|
||||||
//-->
|
//-->
|
||||||
</script>
|
</script>
|
||||||
|
<!-- end "user" block -->
|
||||||
|
|||||||
@@ -1,44 +1,88 @@
|
|||||||
<!doctype html>
|
<!DOCTYPE html>
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||||
<meta http-equiv="P3P" content="CP=\"IDC DSP COR CURa ADMa OUR IND PHY ONL COM STA\"" />
|
<meta http-equiv="P3P" content="CP=\"IDC DSP COR CURa ADMa OUR IND PHY ONL COM STA\"" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>{{=response.title or URL()}}</title>
|
<title>{{=response.title or URL()}}</title>
|
||||||
{{response.files.append(URL('static','css/styles.css'))}}
|
{{
|
||||||
|
response.files.append(URL('static','css/bootstrap.min.css'))
|
||||||
|
response.files.append(URL('static','css/bootstrap_essentials.css'))
|
||||||
|
response.files.append(URL('static','css/bootstrap-responsive.min.css'))
|
||||||
|
}}
|
||||||
{{include 'web2py_ajax.html'}}
|
{{include 'web2py_ajax.html'}}
|
||||||
<script>jQuery.noConflict();</script>
|
<script>jQuery.noConflict();</script>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="{{=T('direction: ltr') == 'direction: rtl' and 'RTLbody' or ''}} {{block sectionclass}}home{{end}}">
|
<body class="{{=T('direction: ltr') == 'direction: rtl' and 'RTLbody' or ''}} {{block sectionclass}}home{{end}}">
|
||||||
<div id="header">
|
|
||||||
<h1 id="start">
|
<!-- NAVBAR
|
||||||
<a href="{{=URL('default', 'index')}}" class="button"><span>web2py™ {{=T('administrative interface')}}</span></a>
|
============== -->
|
||||||
</h1>
|
<div id="header" class="navbar navbar-inverse navbar-fixed-top">
|
||||||
|
<div class="navbar-inner">
|
||||||
|
<div class="container-fluid">
|
||||||
|
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
|
||||||
|
<span class="icon-bar"></span>
|
||||||
|
<span class="icon-bar"></span>
|
||||||
|
<span class="icon-bar"></span>
|
||||||
|
</button>
|
||||||
|
<div id="start" class="brand_wrapper">
|
||||||
|
<a href="{{=URL('default', 'index')}}" class="button brand" ><span>web2py™ {{=T('administrative interface')}}</span></a>
|
||||||
|
</div>
|
||||||
|
<div class="nav-collapse">
|
||||||
{{if response.menu is not None:}}
|
{{if response.menu is not None:}}
|
||||||
<ul id="menu">
|
<ul id="menu" class="nav pull-right">
|
||||||
{{for _name,_active,_link in response.menu:}}
|
{{for _name,_active,_link in response.menu:}}
|
||||||
<li>{{=A(SPAN(_name), _href=_link, _class=_active and 'button select' or 'button')}}</li>
|
<li>{{=A(SPAN(_name), _href=_link, _class=_active and 'button select' or 'button')}}</li>
|
||||||
{{pass}}
|
{{pass}}
|
||||||
</ul>
|
</ul>
|
||||||
{{pass}}
|
{{pass}}
|
||||||
</div>
|
</div><!--/.nav-collapse -->
|
||||||
<div id="main">
|
</div><!-- /container-fluid -->
|
||||||
<div id="main_inner">
|
</div><!-- /navbar-inner -->
|
||||||
<div class="flash">{{=response.flash or ''}}</div>
|
</div><!-- /#header -->
|
||||||
|
|
||||||
|
<!-- MAIN
|
||||||
|
=========== -->
|
||||||
|
<div id="main" class="container-fluid">
|
||||||
|
<div id="main_inner" class="row-fluid">
|
||||||
|
<div class="span12">
|
||||||
|
<div class="flash alert">{{=response.flash or ''}}</div>
|
||||||
{{include}}
|
{{include}}
|
||||||
</div>
|
</div><!-- /main span12 -->
|
||||||
</div>
|
</div><!-- /main row-fluid -->
|
||||||
<div id="footer" class="fixed">
|
</div><!-- /#main -->
|
||||||
{{=T('Powered by')}} {{=A('web2py', _href='http://www.web2py.com')}}™ {{=T('created by')}} Massimo Di Pierro ©2007-{{=request.now.year}} -
|
|
||||||
|
<!-- FOOTER
|
||||||
|
============== -->
|
||||||
|
<footer id="footer" class="fixed">
|
||||||
|
<p><span>{{=T('Powered by')}} {{=A('web2py', _href='http://www.web2py.com')}}™ {{=T('created by')}} Massimo Di Pierro ©2007-{{=request.now.year}}
|
||||||
{{if hasattr(T,'get_possible_languages_info'):}}
|
{{if hasattr(T,'get_possible_languages_info'):}}
|
||||||
<span>
|
- {{=T('Admin language')}}</span>
|
||||||
{{=T('Admin language')}}
|
|
||||||
<select name="adminlanguage" onchange="var date = new Date();cookieDate=date.setTime(date.getTime()+(100*24*60*60*1000));document.cookie='adminLanguage='+this.options[this.selectedIndex].id+'; expires='+cookieDate+'; path=/';window.location.reload()">
|
<select name="adminlanguage" onchange="var date = new Date();cookieDate=date.setTime(date.getTime()+(100*24*60*60*1000));document.cookie='adminLanguage='+this.options[this.selectedIndex].id+'; expires='+cookieDate+'; path=/';window.location.reload()">
|
||||||
{{for langinfo in sorted([(code,info[1]) for code,info in T.get_possible_languages_info().iteritems() if code != 'default']):}}
|
{{for langinfo in sorted([(code,info[1]) for code,info in T.get_possible_languages_info().iteritems() if code != 'default']):}}
|
||||||
<option {{=T.accepted_language==langinfo[0] and 'selected' or ''}} {{='id='+langinfo[0]}} >{{=langinfo[1]}}</option>
|
<option {{=T.accepted_language==langinfo[0] and 'selected' or ''}} {{='id='+langinfo[0]}} >{{=langinfo[1]}}</option>
|
||||||
{{pass}}
|
{{pass}}
|
||||||
</select>
|
</select>
|
||||||
</span>
|
{{else:}}
|
||||||
|
</span>{{pass}}
|
||||||
|
</p>
|
||||||
|
</footer><!-- /#footer -->
|
||||||
|
|
||||||
|
<!-- BS JAVASCRIPT
|
||||||
|
====================== -->
|
||||||
|
<script src="{{=URL('static','js/bootstrap.min.js')}}"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
jQuery(document).ready(function(){
|
||||||
|
jQuery("[rel=tooltip]").tooltip();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
{{if request.function in ('index','site'):}}
|
||||||
|
<a style="position:fixed;bottom:0;left:0;z-index:1000" href="https://groups.google.com/forum/?fromgroups#!forum/web2py" target="_blank">
|
||||||
|
<!-- http://webchat.freenode.net/?channels=web2py" //-->
|
||||||
|
<img src="{{=URL('static','images/questions.png')}}" />
|
||||||
|
</a>
|
||||||
{{pass}}
|
{{pass}}
|
||||||
</div>
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ for application "{{=request.args[0]}}"</h2>
|
|||||||
<h3>Commit form</h3>
|
<h3>Commit form</h3>
|
||||||
{{=form}}
|
{{=form}}
|
||||||
|
|
||||||
|
|
||||||
{{if repo['.'].rev()>=0:}}
|
{{if repo['.'].rev()>=0:}}
|
||||||
<h3>Last Revision</h3>
|
<h3>Last Revision</h3>
|
||||||
<table>
|
<table>
|
||||||
|
|||||||
@@ -9,6 +9,13 @@
|
|||||||
body {
|
body {
|
||||||
background: url('{{=URL('static','plugin_jqmobile/images/iphone.jpg')}}') no-repeat white;
|
background: url('{{=URL('static','plugin_jqmobile/images/iphone.jpg')}}') no-repeat white;
|
||||||
}
|
}
|
||||||
|
#back {
|
||||||
|
z-index: 1000;
|
||||||
|
padding: 10px;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
}
|
||||||
iframe {
|
iframe {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
margin-left: 320px;
|
margin-left: 320px;
|
||||||
@@ -35,6 +42,7 @@
|
|||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<iframe src="{{=URL('default','index',vars=dict(is_mobile='true'))}}"></iframe>
|
<iframe src="{{=URL('default','index',vars=dict(is_mobile='true'))}}"></iframe>
|
||||||
|
<div id="back"><a href="{{=URL('default','index',vars=dict(is_mobile='false'))}}">Back</a></div>
|
||||||
<div id="about">
|
<div id="about">
|
||||||
<h1><a href="http://web2py.com">web2py</a> plugin</h1>
|
<h1><a href="http://web2py.com">web2py</a> plugin</h1>
|
||||||
<h2>for <a href="http://jquerymobile.com/">jQuery Mobile</a></h2>
|
<h2>for <a href="http://jquerymobile.com/">jQuery Mobile</a></h2>
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user