Compare commits
2379 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f463de5a45 | ||
|
|
8829780def | ||
|
|
a302d52698 | ||
|
|
00087198e0 | ||
|
|
ea3aa62476 | ||
|
|
176c9f4ad9 | ||
|
|
0fdab02d68 | ||
|
|
0fcb5f2ccd | ||
|
|
27287d246a | ||
|
|
2234cd245c | ||
|
|
c5980cd312 | ||
|
|
4e8dbffd0e | ||
|
|
50dcd7a572 | ||
|
|
35f1cca768 | ||
|
|
e5bde6c0b1 | ||
|
|
d31bba2670 | ||
|
|
4f806a1db9 | ||
|
|
f64232df30 | ||
|
|
ecc2f0004c | ||
|
|
4f2e327d33 | ||
|
|
3ce3171dff | ||
|
|
0850cadfdc | ||
|
|
53a5a44def | ||
|
|
ad1d414485 | ||
|
|
ba22f9a3a5 | ||
|
|
51de1740f9 | ||
|
|
1c012b92d5 | ||
|
|
7377922211 | ||
|
|
fae120f1ea | ||
|
|
a915054602 | ||
|
|
dd97b9c8dd | ||
|
|
d1e25796e9 | ||
|
|
e38cfc5767 | ||
|
|
69c888d071 | ||
|
|
0138b1782d | ||
|
|
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 |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -52,5 +52,4 @@ applications/*/*.py[oc]
|
||||
applications/examples/static/epydoc
|
||||
applications/examples/static/sphinx
|
||||
applications/admin/cron/cron.master
|
||||
|
||||
|
||||
HOWTO-web2py-devel
|
||||
|
||||
38
.travis.yml
Normal file
38
.travis.yml
Normal file
@@ -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
|
||||
6
ABOUT
Normal file
6
ABOUT
Normal file
@@ -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>
|
||||
|
||||
97
CHANGELOG
97
CHANGELOG
@@ -1,3 +1,100 @@
|
||||
## 2.5.1
|
||||
|
||||
- New style virtual fields in grid
|
||||
- Conditional fields (experimental) ``db.table.field.show_id = db.table.otherfield==True`` or ``db.table.field.show_id = db.table.otherfiel.contains(values)``
|
||||
- auth.settings.manager_group_role="manager" enables http://.../app/appadmin/auth_manage and http://.../app/appadmin/manage for members of the "manager" group. (also experimental)
|
||||
- support for POST variables in DELETE
|
||||
- Fixed memory leak when using the TAG helper
|
||||
|
||||
|
||||
## 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
|
||||
|
||||
- overall faster web2py
|
||||
|
||||
0
Introduction
Normal file
0
Introduction
Normal file
2
LICENSE
2
LICENSE
@@ -3,7 +3,7 @@
|
||||
Web2py is Licensed under the LGPL license version 3
|
||||
(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
|
||||
|
||||
|
||||
32
Makefile
32
Makefile
@@ -5,7 +5,7 @@ all:
|
||||
clean:
|
||||
rm -f httpserver.log
|
||||
rm -f parameters*.py
|
||||
rm -f -r applications/*/compiled
|
||||
rm -f -r applications/*/compiled
|
||||
find ./ -name '*~' -exec rm -f {} \;
|
||||
find ./ -name '*.orig' -exec rm -f {} \;
|
||||
find ./ -name '*.rej' -exec rm -f {} \;
|
||||
@@ -29,7 +29,8 @@ update:
|
||||
wget -O gluon/contrib/simplejsonrpc.py http://rad2py.googlecode.com/hg/ide2py/simplejsonrpc.py
|
||||
echo "remember that pymysql was tweaked"
|
||||
src:
|
||||
echo 'Version 2.1.1 ('`date +%Y-%m-%d\ %H:%M:%S`') stable' > VERSION
|
||||
### Use semantic versioning
|
||||
echo 'Version 2.5.1-stable+timestamp.'`date +%Y.%m.%d.%H.%M.%S` > VERSION
|
||||
### rm -f all junk files
|
||||
make clean
|
||||
### clean up baisc apps
|
||||
@@ -42,7 +43,9 @@ src:
|
||||
rm -f applications/examples/databases/*
|
||||
rm -f applications/admin/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
|
||||
cp applications/welcome/views/appadmin.html applications/admin/views
|
||||
cp applications/welcome/views/appadmin.html applications/examples/views
|
||||
@@ -51,21 +54,20 @@ src:
|
||||
### build web2py_src.zip
|
||||
echo '' > NEWINSTALL
|
||||
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:
|
||||
make epydoc
|
||||
make src
|
||||
make app
|
||||
make win
|
||||
app:
|
||||
echo 'did you uncomment import_all in gluon/main.py?'
|
||||
python2.5 -c 'import compileall; compileall.compile_dir("gluon/")'
|
||||
python2.7 -c 'import compileall; compileall.compile_dir("gluon/")'
|
||||
#python web2py.py -S welcome -R __exit__.py
|
||||
#cd ../web2py_osx/site-packages/; unzip ../site-packages.zip
|
||||
find gluon -path '*.pyc' -exec cp {} ../web2py_osx/site-packages/{} \;
|
||||
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
|
||||
#find gluon -path '*.pyc' -exec cp {} ../web2py_osx/site-packages/{} \;
|
||||
#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.7
|
||||
find gluon -path '*.py' -exec cp {} ../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 LICENSE ../web2py_osx/web2py/web2py.app/Contents/Resources
|
||||
@@ -84,7 +86,6 @@ app:
|
||||
cd ../web2py_osx; zip -r web2py_osx.zip web2py
|
||||
mv ../web2py_osx/web2py_osx.zip .
|
||||
win:
|
||||
echo 'did you uncomment import_all in gluon/main.py?'
|
||||
python2.7 -c 'import compileall; compileall.compile_dir("gluon/")'
|
||||
#cd ../web2py_win/library/; unzip ../library.zip
|
||||
find gluon -path '*.pyc' -exec cp {} ../web2py_win/library/{} \;
|
||||
@@ -108,18 +109,17 @@ win:
|
||||
cd ../web2py_win; zip -r web2py_win.zip web2py
|
||||
mv ../web2py_win/web2py_win.zip .
|
||||
run:
|
||||
python2.5 web2py.py -a hello
|
||||
python2.7 web2py.py -a hello
|
||||
commit:
|
||||
python web2py.py --run_system_tests
|
||||
make src
|
||||
echo '' > NEWINSTALL
|
||||
hg commit -m "$(S)"
|
||||
#bzr commit -m "$(S)"
|
||||
git commit -a -m "$(S)"
|
||||
push:
|
||||
hg push
|
||||
git push
|
||||
git push mdipierro
|
||||
git push --tags
|
||||
tag:
|
||||
git tag -l '$(S)'
|
||||
hg tag -l '$(S)'
|
||||
@@ -130,5 +130,5 @@ pip:
|
||||
# after upload clean Web2py sources with rm -R ./dist
|
||||
# http://guide.python-distribute.org/creation.html
|
||||
python setup.py sdist
|
||||
python setup.py register
|
||||
python setup.py sdist upload
|
||||
sudo python setup.py register
|
||||
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
|
||||
|
||||
|
||||
## Tests
|
||||
|
||||
[](https://travis-ci.org/web2py/web2py)
|
||||
|
||||
[](https://coveralls.io/r/web2py/web2py)
|
||||
|
||||
## Installation Instructions
|
||||
|
||||
To start web2py there is NO NEED to install it. Just unzip and do:
|
||||
@@ -28,7 +35,7 @@ That's it!!!
|
||||
contrib/ > third party libraries
|
||||
tests/ > unittests
|
||||
applications/ > are the apps
|
||||
admin/ > web based IDE
|
||||
admin/ > web based IDE
|
||||
...
|
||||
examples/ > examples, docs, links
|
||||
...
|
||||
|
||||
2
VERSION
2
VERSION
@@ -1 +1 @@
|
||||
Version 2.1.1 (2012-10-15 06:40:52) stable
|
||||
Version 2.5.1-stable+timestamp.2013.06.06.10.35.58
|
||||
|
||||
10
__init__.py
10
__init__.py
@@ -1,10 +0,0 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
152
anyserver.py
152
anyserver.py
@@ -9,47 +9,52 @@ 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.
|
||||
"""
|
||||
|
||||
import os, sys, optparse, urllib
|
||||
import os
|
||||
import sys
|
||||
import optparse
|
||||
import urllib
|
||||
|
||||
path = os.path.dirname(os.path.abspath(__file__))
|
||||
os.chdir(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
|
||||
sys.path = [path] + [p for p in sys.path if not p == path]
|
||||
|
||||
|
||||
class Servers:
|
||||
@staticmethod
|
||||
def cgi(app, address=None, **options):
|
||||
from wsgiref.handlers import CGIHandler
|
||||
CGIHandler().run(app) # Just ignore host and port here
|
||||
CGIHandler().run(app) # Just ignore host and port here
|
||||
|
||||
@staticmethod
|
||||
def flup(app,address, **options):
|
||||
def flup(app, address, **options):
|
||||
import flup.server.fcgi
|
||||
flup.server.fcgi.WSGIServer(app, bindAddress=address).run()
|
||||
|
||||
@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
|
||||
|
||||
class QuietHandler(WSGIRequestHandler):
|
||||
def log_request(*args, **kw): pass
|
||||
def log_request(*args, **kw):
|
||||
pass
|
||||
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()
|
||||
|
||||
@staticmethod
|
||||
def cherrypy(app,address, **options):
|
||||
def cherrypy(app, address, **options):
|
||||
from cherrypy import wsgiserver
|
||||
server = wsgiserver.CherryPyWSGIServer(address, app)
|
||||
server.start()
|
||||
|
||||
@staticmethod
|
||||
def rocket(app,address, **options):
|
||||
def rocket(app, address, **options):
|
||||
from gluon.rocket import CherryPyWSGIServer
|
||||
server = CherryPyWSGIServer(address, app)
|
||||
server.start()
|
||||
|
||||
@staticmethod
|
||||
def rocket_with_repoze_profiler(app,address, **options):
|
||||
def rocket_with_repoze_profiler(app, address, **options):
|
||||
from gluon.rocket import CherryPyWSGIServer
|
||||
from repoze.profile.profiler import AccumulatingProfileMiddleware
|
||||
from gluon.settings import global_settings
|
||||
@@ -59,44 +64,44 @@ class Servers:
|
||||
log_filename='wsgi.prof',
|
||||
discard_first_request=True,
|
||||
flush_at_shutdown=True,
|
||||
path = '/__profile__'
|
||||
)
|
||||
path='/__profile__'
|
||||
)
|
||||
server = CherryPyWSGIServer(address, wrapped)
|
||||
server.start()
|
||||
|
||||
@staticmethod
|
||||
def paste(app,address,**options):
|
||||
def paste(app, address, **options):
|
||||
from paste import httpserver
|
||||
from paste.translogger import TransLogger
|
||||
httpserver.serve(app, host=address[0], port=address[1], **options)
|
||||
|
||||
@staticmethod
|
||||
def fapws(app,address, **options):
|
||||
def fapws(app, address, **options):
|
||||
import fapws._evwsgi as evwsgi
|
||||
from fapws import base
|
||||
evwsgi.start(address[0],str(address[1]))
|
||||
evwsgi.start(address[0], str(address[1]))
|
||||
evwsgi.set_base_module(base)
|
||||
|
||||
def app(environ, start_response):
|
||||
environ['wsgi.multiprocess'] = False
|
||||
return app(environ, start_response)
|
||||
evwsgi.wsgi_cb(('',app))
|
||||
evwsgi.wsgi_cb(('', app))
|
||||
evwsgi.run()
|
||||
|
||||
|
||||
@staticmethod
|
||||
def gevent(app,address, **options):
|
||||
from gevent import monkey; monkey.patch_all()
|
||||
def gevent(app, address, **options):
|
||||
from gevent import pywsgi
|
||||
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
|
||||
def bjoern(app,address, **options):
|
||||
def bjoern(app, address, **options):
|
||||
import bjoern
|
||||
bjoern.run(app, *address)
|
||||
|
||||
@staticmethod
|
||||
def tornado(app,address, **options):
|
||||
def tornado(app, address, **options):
|
||||
import tornado.wsgi
|
||||
import tornado.httpserver
|
||||
import tornado.ioloop
|
||||
@@ -106,7 +111,7 @@ class Servers:
|
||||
tornado.ioloop.IOLoop.instance().start()
|
||||
|
||||
@staticmethod
|
||||
def twisted(app,address, **options):
|
||||
def twisted(app, address, **options):
|
||||
from twisted.web import server, wsgi
|
||||
from twisted.python.threadpool import ThreadPool
|
||||
from twisted.internet import reactor
|
||||
@@ -118,42 +123,69 @@ class Servers:
|
||||
reactor.run()
|
||||
|
||||
@staticmethod
|
||||
def diesel(app,address, **options):
|
||||
def diesel(app, address, **options):
|
||||
from diesel.protocols.wsgi import WSGIApplication
|
||||
app = WSGIApplication(app, port=address[1])
|
||||
app.run()
|
||||
|
||||
@staticmethod
|
||||
def gunicorn(app,address, **options):
|
||||
def gunicorn(app, address, **options):
|
||||
from gunicorn.app.base import Application
|
||||
config = {'bind': "%s:%d" % address}
|
||||
config.update(options)
|
||||
sys.argv = ['anyserver.py']
|
||||
|
||||
class GunicornApplication(Application):
|
||||
def init(self, parser, opts, args):
|
||||
return config
|
||||
|
||||
def load(self):
|
||||
return app
|
||||
g = GunicornApplication()
|
||||
g.run()
|
||||
|
||||
@staticmethod
|
||||
def eventlet(app,address, **options):
|
||||
def eventlet(app, address, **options):
|
||||
from eventlet import wsgi, listen
|
||||
wsgi.server(listen(address), app)
|
||||
|
||||
@staticmethod
|
||||
def mongrel2(app,address,**options):
|
||||
def mongrel2(app, address, **options):
|
||||
import uuid
|
||||
sys.path.append(os.path.abspath(os.path.dirname(__file__)))
|
||||
from mongrel2 import handler
|
||||
conn = handler.Connection(str(uuid.uuid4()),
|
||||
"tcp://127.0.0.1:9997",
|
||||
"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):
|
||||
if servername == 'gevent':
|
||||
from gevent import monkey
|
||||
monkey.patch_all()
|
||||
elif servername == 'eventlet':
|
||||
import eventlet
|
||||
eventlet.monkey_patch()
|
||||
|
||||
import gluon.main
|
||||
|
||||
def run(servername,ip,port,softcron=True,logging=False,profiler=None):
|
||||
if logging:
|
||||
application = gluon.main.appfactory(wsgiapp=gluon.main.wsgibase,
|
||||
logfilename='httpserver.log',
|
||||
@@ -163,9 +195,10 @@ def run(servername,ip,port,softcron=True,logging=False,profiler=None):
|
||||
if softcron:
|
||||
from gluon.settings import global_settings
|
||||
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 :
|
||||
https://github.com/berry/Mongrel2-WSGI-Handler/blob/master/wsgi-handler.py
|
||||
@@ -190,20 +223,23 @@ def mongrel2_handler(application,conn,debug=False):
|
||||
# and responses. Unless I have missed something.
|
||||
|
||||
while True:
|
||||
if debug: print "WAITING FOR REQUEST"
|
||||
if debug:
|
||||
print "WAITING FOR REQUEST"
|
||||
|
||||
# receive a request
|
||||
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 debug: print "DISCONNECT"
|
||||
continue #effectively ignore the disconnect from the client
|
||||
if debug:
|
||||
print "DISCONNECT"
|
||||
continue # effectively ignore the disconnect from the client
|
||||
|
||||
# Set a couple of environment attributes a.k.a. header attributes
|
||||
# that are a must according to PEP 333
|
||||
environ = req.headers
|
||||
environ['SERVER_PROTOCOL'] = 'HTTP/1.1' # SimpleHandler expects a server_protocol, lets assume it is HTTP 1.1
|
||||
environ['SERVER_PROTOCOL'] = 'HTTP/1.1' # SimpleHandler expects a server_protocol, lets assume it is HTTP 1.1
|
||||
environ['REQUEST_METHOD'] = environ['METHOD']
|
||||
if ':' in environ['Host']:
|
||||
environ['SERVER_NAME'] = environ['Host'].split(':')[0]
|
||||
@@ -211,17 +247,19 @@ def mongrel2_handler(application,conn,debug=False):
|
||||
else:
|
||||
environ['SERVER_NAME'] = environ['Host']
|
||||
environ['SERVER_PORT'] = ''
|
||||
environ['SCRIPT_NAME'] = '' # empty for now
|
||||
environ['SCRIPT_NAME'] = '' # empty for now
|
||||
environ['PATH_INFO'] = urllib.unquote(environ['PATH'])
|
||||
if '?' in environ['URI']:
|
||||
environ['QUERY_STRING'] = environ['URI'].split('?')[1]
|
||||
else:
|
||||
environ['QUERY_STRING'] = ''
|
||||
if environ.has_key('Content-Length'):
|
||||
environ['CONTENT_LENGTH'] = environ['Content-Length'] # necessary for POST to work with Django
|
||||
if 'Content-Length' in environ:
|
||||
environ['CONTENT_LENGTH'] = environ[
|
||||
'Content-Length'] # necessary for POST to work with Django
|
||||
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
|
||||
# requests, errors and responses
|
||||
@@ -230,7 +268,8 @@ def mongrel2_handler(application,conn,debug=False):
|
||||
respIO = StringIO.StringIO()
|
||||
|
||||
# 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)
|
||||
|
||||
# Get the response and filter out the response (=data) itself,
|
||||
@@ -254,16 +293,20 @@ def mongrel2_handler(application,conn,debug=False):
|
||||
errors = errIO.getvalue()
|
||||
|
||||
# return the response
|
||||
if debug: print "RESPONSE: %r\n" % response
|
||||
if debug:
|
||||
print "RESPONSE: %r\n" % response
|
||||
if errors:
|
||||
if debug: print "ERRORS: %r" % errors
|
||||
if debug:
|
||||
print "ERRORS: %r" % 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():
|
||||
usage = "python anyserver.py -s tornado -i 127.0.0.1 -p 8000 -l -P"
|
||||
try:
|
||||
version = read_file('VERSION')
|
||||
version = open('VERSION','r')
|
||||
except IOError:
|
||||
version = ''
|
||||
parser = optparse.OptionParser(usage, None, optparse.Option, version)
|
||||
@@ -278,7 +321,7 @@ def main():
|
||||
default=False,
|
||||
dest='profiler',
|
||||
help='profiler filename')
|
||||
servers = ', '.join(x for x in dir(Servers) if not x[0]=='_')
|
||||
servers = ', '.join(x for x in dir(Servers) if not x[0] == '_')
|
||||
parser.add_option('-s',
|
||||
'--server',
|
||||
default='rocket',
|
||||
@@ -300,13 +343,10 @@ def main():
|
||||
dest='workers',
|
||||
help='number of workers number')
|
||||
(options, args) = parser.parse_args()
|
||||
print 'starting %s on %s:%s...' % (options.server,options.ip,options.port)
|
||||
run(options.server,options.ip,options.port,logging=options.logging,profiler=options.profiler)
|
||||
print 'starting %s on %s:%s...' % (
|
||||
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()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -21,7 +21,17 @@ default_expiration: "24h" # for static files
|
||||
|
||||
handlers:
|
||||
|
||||
- url: /(?P<a>.+?)/static/(?P<b>.+)
|
||||
# Warning! Static mapping - below - isn't compatible with
|
||||
# the parametric router's language logic.
|
||||
# You cannot use them together.
|
||||
|
||||
- url: /(.+?)/[^_]*\/?static/_\d.\d.\d\/?(.+)
|
||||
static_files: applications/\1/static/\2
|
||||
upload: applications/(.+?)/static/(.+)
|
||||
secure: optional
|
||||
expiration: "365d"
|
||||
|
||||
- url: /(.+?)/[^_]*\/?static/?(.+)
|
||||
static_files: applications/\1/static/\2
|
||||
upload: applications/(.+?)/static/(.+)
|
||||
secure: optional
|
||||
|
||||
@@ -2,8 +2,3 @@ def webapp_add_wsgi_middleware(app):
|
||||
from google.appengine.ext.appstats import recording
|
||||
app = recording.appstats_wsgi_middleware(app)
|
||||
return app
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
|
||||
|
||||
@@ -11,6 +11,11 @@ import copy
|
||||
import gluon.contenttype
|
||||
import gluon.fileutils
|
||||
|
||||
try:
|
||||
import pygraphviz as pgv
|
||||
except ImportError:
|
||||
pgv = None
|
||||
|
||||
response.subtitle = 'Database Administration (appadmin)'
|
||||
|
||||
# ## critical --- make a copy of the environment
|
||||
@@ -23,7 +28,7 @@ remote_addr = request.env.remote_addr
|
||||
try:
|
||||
hosts = (http_host, socket.gethostname(),
|
||||
socket.gethostbyname(http_host),
|
||||
'::1','127.0.0.1','::ffff:127.0.0.1')
|
||||
'::1', '127.0.0.1', '::ffff:127.0.0.1')
|
||||
except:
|
||||
hosts = (http_host, )
|
||||
|
||||
@@ -32,14 +37,20 @@ if request.env.http_x_forwarded_for or request.is_https:
|
||||
elif (remote_addr not in hosts) and (remote_addr != "127.0.0.1"):
|
||||
raise HTTP(200, T('appadmin is disabled because insecure channel'))
|
||||
|
||||
if (request.application=='admin' and not session.authorized) or \
|
||||
(request.application!='admin' and not gluon.fileutils.check_credentials(request)):
|
||||
if request.function in ('auth_manage','manage') and 'auth' in globals():
|
||||
auth.requires_membership(auth.settings.manager_group_role)(lambda: None)()
|
||||
menu = False
|
||||
elif (request.application == 'admin' and not session.authorized) or \
|
||||
(request.application != 'admin' and not gluon.fileutils.check_credentials(request)):
|
||||
redirect(URL('admin', 'default', 'index',
|
||||
vars=dict(send=URL(args=request.args,vars=request.vars))))
|
||||
vars=dict(send=URL(args=request.args, vars=request.vars))))
|
||||
else:
|
||||
menu = True
|
||||
|
||||
ignore_rw = True
|
||||
response.view = 'appadmin.html'
|
||||
response.menu = [[T('design'), False, URL('admin', 'default', 'design',
|
||||
if menu:
|
||||
response.menu = [[T('design'), False, URL('admin', 'default', 'design',
|
||||
args=[request.application])], [T('db'), False,
|
||||
URL('index')], [T('state'), False,
|
||||
URL('state')], [T('cache'), False,
|
||||
@@ -49,6 +60,10 @@ response.menu = [[T('design'), False, URL('admin', 'default', 'design',
|
||||
# ## 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):
|
||||
dbs = {}
|
||||
@@ -95,24 +110,23 @@ def get_query(request):
|
||||
return None
|
||||
|
||||
|
||||
def query_by_table_type(tablename,db,request=request):
|
||||
keyed = hasattr(db[tablename],'_primarykey')
|
||||
def query_by_table_type(tablename, db, request=request):
|
||||
keyed = hasattr(db[tablename], '_primarykey')
|
||||
if keyed:
|
||||
firstkey = db[tablename][db[tablename]._primarykey[0]]
|
||||
cond = '>0'
|
||||
if firstkey.type in ['string', 'text']:
|
||||
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:
|
||||
qry = '%s.%s.id>0' % tuple(request.args[:2])
|
||||
return qry
|
||||
|
||||
|
||||
|
||||
# ##########################################################
|
||||
# ## list all databases and tables
|
||||
# ###########################################################
|
||||
|
||||
def index():
|
||||
return dict(databases=databases)
|
||||
|
||||
@@ -127,7 +141,7 @@ def insert():
|
||||
form = SQLFORM(db[table], ignore_rw=ignore_rw)
|
||||
if form.accepts(request.vars, session):
|
||||
response.flash = T('new record inserted')
|
||||
return dict(form=form,table=db[table])
|
||||
return dict(form=form, table=db[table])
|
||||
|
||||
|
||||
# ##########################################################
|
||||
@@ -138,7 +152,8 @@ def insert():
|
||||
def download():
|
||||
import os
|
||||
db = get_database(request)
|
||||
return response.download(request,db)
|
||||
return response.download(request, db)
|
||||
|
||||
|
||||
def csv():
|
||||
import gluon.contenttype
|
||||
@@ -149,26 +164,27 @@ def csv():
|
||||
if not query:
|
||||
return None
|
||||
response.headers['Content-disposition'] = 'attachment; filename=%s_%s.csv'\
|
||||
% tuple(request.vars.query.split('.')[:2])
|
||||
return str(db(query,ignore_common_filters=True).select())
|
||||
% tuple(request.vars.query.split('.')[:2])
|
||||
return str(db(query, ignore_common_filters=True).select())
|
||||
|
||||
|
||||
def import_csv(table, file):
|
||||
table.import_from_csv_file(file)
|
||||
|
||||
|
||||
def select():
|
||||
import re
|
||||
db = get_database(request)
|
||||
dbname = request.args[0]
|
||||
regex = re.compile('(?P<table>\w+)\.(?P<field>\w+)=(?P<value>\d+)')
|
||||
if len(request.args)>1 and hasattr(db[request.args[1]],'_primarykey'):
|
||||
if len(request.args) > 1 and hasattr(db[request.args[1]], '_primarykey'):
|
||||
regex = re.compile('(?P<table>\w+)\.(?P<field>\w+)=(?P<value>.+)')
|
||||
if request.vars.query:
|
||||
match = regex.match(request.vars.query)
|
||||
if match:
|
||||
request.vars.query = '%s.%s.%s==%s' % (request.args[0],
|
||||
match.group('table'), match.group('field'),
|
||||
match.group('value'))
|
||||
match.group('table'), match.group('field'),
|
||||
match.group('value'))
|
||||
else:
|
||||
request.vars.query = session.last_query
|
||||
query = get_query(request)
|
||||
@@ -192,46 +208,50 @@ def select():
|
||||
session.last_query = request.vars.query
|
||||
form = FORM(TABLE(TR(T('Query:'), '', INPUT(_style='width:400px',
|
||||
_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',
|
||||
value=False), INPUT(_style='width:400px',
|
||||
_name='update_fields', _value=request.vars.update_fields
|
||||
or '')), TR(T('Delete:'), INPUT(_name='delete_check',
|
||||
or '')), TR(T('Delete:'), INPUT(_name='delete_check',
|
||||
_class='delete', _type='checkbox', value=False), ''),
|
||||
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):
|
||||
regex = re.compile(request.args[0] + '\.(?P<table>\w+)\..+')
|
||||
match = regex.match(form.vars.query.strip())
|
||||
if match:
|
||||
table = match.group('table')
|
||||
try:
|
||||
tb = None
|
||||
nrows = db(query).count()
|
||||
if form.vars.update_check and form.vars.update_fields:
|
||||
db(query).update(**eval_in_global_env('dict(%s)'
|
||||
% form.vars.update_fields))
|
||||
% form.vars.update_fields))
|
||||
response.flash = T('%s %%{row} updated', nrows)
|
||||
elif form.vars.delete_check:
|
||||
db(query).delete()
|
||||
response.flash = T('%s %%{row} deleted', nrows)
|
||||
nrows = db(query).count()
|
||||
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:
|
||||
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:
|
||||
import traceback
|
||||
tb = traceback.format_exc()
|
||||
(rows, nrows) = ([], 0)
|
||||
response.flash = DIV(T('Invalid Query'),PRE(str(e)))
|
||||
response.flash = DIV(T('Invalid Query'), PRE(str(e)))
|
||||
# begin handle upload csv
|
||||
csv_table = table or request.vars.table
|
||||
if csv_table:
|
||||
formcsv = FORM(str(T('or import from csv file'))+" ",
|
||||
INPUT(_type='file',_name='csvfile'),
|
||||
INPUT(_type='hidden',_value=csv_table,_name='table'),
|
||||
INPUT(_type='submit',_value=T('import')))
|
||||
formcsv = FORM(str(T('or import from csv file')) + " ",
|
||||
INPUT(_type='file', _name='csvfile'),
|
||||
INPUT(_type='hidden', _value=csv_table, _name='table'),
|
||||
INPUT(_type='submit', _value=T('import')))
|
||||
else:
|
||||
formcsv = None
|
||||
if formcsv and formcsv.process().accepted:
|
||||
@@ -240,7 +260,7 @@ def select():
|
||||
request.vars.csvfile.file)
|
||||
response.flash = T('data uploaded')
|
||||
except Exception, e:
|
||||
response.flash = DIV(T('unable to parse csv file'),PRE(str(e)))
|
||||
response.flash = DIV(T('unable to parse csv file'), PRE(str(e)))
|
||||
# end handle upload csv
|
||||
|
||||
return dict(
|
||||
@@ -251,9 +271,9 @@ def select():
|
||||
nrows=nrows,
|
||||
rows=rows,
|
||||
query=request.vars.query,
|
||||
formcsv = formcsv,
|
||||
tb = tb,
|
||||
)
|
||||
formcsv=formcsv,
|
||||
tb=tb,
|
||||
)
|
||||
|
||||
|
||||
# ##########################################################
|
||||
@@ -263,14 +283,17 @@ def select():
|
||||
|
||||
def update():
|
||||
(db, table) = get_table(request)
|
||||
keyed = hasattr(db[table],'_primarykey')
|
||||
keyed = hasattr(db[table], '_primarykey')
|
||||
record = None
|
||||
db[table]._common_filter = None
|
||||
if keyed:
|
||||
key = [f for f in request.vars if f in db[table]._primarykey]
|
||||
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:
|
||||
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:
|
||||
qry = query_by_table_type(table, db)
|
||||
@@ -280,20 +303,21 @@ def update():
|
||||
|
||||
if keyed:
|
||||
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'),
|
||||
ignore_rw=ignore_rw and not keyed,
|
||||
linkto=URL('select',
|
||||
form = SQLFORM(
|
||||
db[table], record, deletable=True, delete_label=T('Check to delete'),
|
||||
ignore_rw=ignore_rw and not keyed,
|
||||
linkto=URL('select',
|
||||
args=request.args[:1]), upload=URL(r=request,
|
||||
f='download', args=request.args[:1]))
|
||||
f='download', args=request.args[:1]))
|
||||
|
||||
if form.accepts(request.vars, session):
|
||||
session.flash = T('done!')
|
||||
qry = query_by_table_type(table, db)
|
||||
redirect(URL('select', args=request.args[:1],
|
||||
vars=dict(query=qry)))
|
||||
return dict(form=form,table=db[table])
|
||||
return dict(form=form, table=db[table])
|
||||
|
||||
|
||||
# ##########################################################
|
||||
@@ -304,11 +328,18 @@ def update():
|
||||
def state():
|
||||
return dict()
|
||||
|
||||
|
||||
def ccache():
|
||||
cache.ram.initialize()
|
||||
cache.disk.initialize()
|
||||
|
||||
form = FORM(
|
||||
P(TAG.BUTTON(T("Clear CACHE?"), _type="submit", _name="yes", _value="yes")),
|
||||
P(TAG.BUTTON(T("Clear RAM"), _type="submit", _name="ram", _value="ram")),
|
||||
P(TAG.BUTTON(T("Clear DISK"), _type="submit", _name="disk", _value="disk")),
|
||||
P(TAG.BUTTON(
|
||||
T("Clear CACHE?"), _type="submit", _name="yes", _value="yes")),
|
||||
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):
|
||||
@@ -332,11 +363,16 @@ def ccache():
|
||||
redirect(URL(r=request))
|
||||
|
||||
try:
|
||||
from guppy import hpy; hp=hpy()
|
||||
from guppy import hpy
|
||||
hp = hpy()
|
||||
except ImportError:
|
||||
hp = False
|
||||
|
||||
import shelve, os, copy, time, math
|
||||
import shelve
|
||||
import os
|
||||
import copy
|
||||
import time
|
||||
import math
|
||||
from gluon import portalocker
|
||||
|
||||
ram = {
|
||||
@@ -363,7 +399,7 @@ def ccache():
|
||||
|
||||
return (hours, minutes, seconds)
|
||||
|
||||
for key, value in cache.ram.storage.items():
|
||||
for key, value in cache.ram.storage.iteritems():
|
||||
if isinstance(value, dict):
|
||||
ram['hits'] = value['hit_total'] - value['misses']
|
||||
ram['misses'] = value['misses']
|
||||
@@ -379,11 +415,13 @@ def ccache():
|
||||
if value[0] < ram['oldest']:
|
||||
ram['oldest'] = value[0]
|
||||
ram['keys'].append((key, GetInHMS(time.time() - value[0])))
|
||||
|
||||
locker = open(os.path.join(request.folder,
|
||||
'cache/cache.lock'), 'a')
|
||||
folder = os.path.join(request.folder,'cache')
|
||||
if not os.path.exists(folder):
|
||||
os.mkdir(folder)
|
||||
locker = open(os.path.join(folder, 'cache.lock'), 'a')
|
||||
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:
|
||||
for key, value in disk_storage.items():
|
||||
if isinstance(value, dict):
|
||||
@@ -414,7 +452,8 @@ def ccache():
|
||||
total['misses'] = ram['misses'] + disk['misses']
|
||||
total['keys'] = ram['keys'] + disk['keys']
|
||||
try:
|
||||
total['ratio'] = total['hits'] * 100 / (total['hits'] + total['misses'])
|
||||
total['ratio'] = total['hits'] * 100 / (total['hits'] +
|
||||
total['misses'])
|
||||
except (KeyError, ZeroDivisionError):
|
||||
total['ratio'] = 0
|
||||
|
||||
@@ -442,4 +481,133 @@ def ccache():
|
||||
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)
|
||||
|
||||
def auth_manage():
|
||||
tablename = request.args(0)
|
||||
if not tablename or not tablename in auth.db.tables:
|
||||
return dict()
|
||||
table = auth.db[tablename]
|
||||
formname = '%s_grid' % tablename
|
||||
if tablename == auth.settings.table_user_name:
|
||||
auth.settings.table_user._plural = T('Users')
|
||||
auth.settings.table_membership._plural = T('Roles')
|
||||
auth.settings.table_membership._id.readable = False
|
||||
auth.settings.table_membership.user_id.label = T('User')
|
||||
auth.settings.table_membership.group_id.label = T('Role')
|
||||
grid = SQLFORM.smartgrid(table, args=request.args[:1], user_signature=True,
|
||||
linked_tables=[auth.settings.table_membership_name],
|
||||
maxtextlength=1000, formname=formname)
|
||||
else:
|
||||
table._id.readable = False
|
||||
auth.settings.table_permission.group_id.label = T('Role')
|
||||
auth.settings.table_permission.name.label = T('Permission')
|
||||
orderby = 'role' if table == auth.settings.table_group_name else 'group_id'
|
||||
grid = SQLFORM.grid(table, args=request.args[:1], orderby=table[orderby],
|
||||
user_signature=True, maxtextlength=1000, formname=formname)
|
||||
return grid if request.extension=='load' else dict(grid=grid)
|
||||
|
||||
def manage():
|
||||
tablename = request.args(0)
|
||||
if tablename in auth.db.tables:
|
||||
grid = SQLFORM.smartgrid(auth.db[tablename], args=request.args[:1])
|
||||
else:
|
||||
return dict()
|
||||
return grid if request.extension=='load' else dict(grid=grid)
|
||||
|
||||
@@ -5,35 +5,39 @@ import gluon.contrib.shell
|
||||
import gluon.dal
|
||||
import gluon.html
|
||||
import gluon.validators
|
||||
import code, thread
|
||||
import code
|
||||
import thread
|
||||
from gluon.debug import communicate, web_debugger, qdb_debugger
|
||||
import pydoc
|
||||
|
||||
|
||||
if DEMO_MODE or MULTI_USER_MODE:
|
||||
session.flash = T('disabled in demo mode')
|
||||
redirect(URL('default','site'))
|
||||
redirect(URL('default', 'site'))
|
||||
|
||||
FE = 10 ** 9
|
||||
|
||||
FE=10**9
|
||||
|
||||
def index():
|
||||
app = request.args(0) or 'admin'
|
||||
reset()
|
||||
# read buffer
|
||||
data = communicate()
|
||||
return dict(app=app,data=data)
|
||||
return dict(app=app, data=data)
|
||||
|
||||
|
||||
def callback():
|
||||
app = request.args[0]
|
||||
command = request.vars.statement
|
||||
session['debug_commands:'+app].append(command)
|
||||
session['debug_commands:' + app].append(command)
|
||||
output = communicate(command)
|
||||
k = len(session['debug_commands:'+app]) - 1
|
||||
k = len(session['debug_commands:' + app]) - 1
|
||||
return '[%i] %s%s\n' % (k + 1, command, output)
|
||||
|
||||
|
||||
def reset():
|
||||
app = request.args(0) or 'admin'
|
||||
session['debug_commands:'+app] = []
|
||||
session['debug_commands:' + app] = []
|
||||
return 'done'
|
||||
|
||||
|
||||
@@ -50,9 +54,9 @@ def interact():
|
||||
filename = web_debugger.filename
|
||||
lineno = web_debugger.lineno
|
||||
if filename:
|
||||
lines = dict([(i+1, l) for (i, l) in enumerate(
|
||||
[l.strip("\n").strip("\r") for l
|
||||
in open(filename).readlines()])])
|
||||
lines = dict([(i + 1, l) for (i, l) in enumerate(
|
||||
[l.strip("\n").strip("\r") for l
|
||||
in open(filename).readlines()])])
|
||||
filename = os.path.basename(filename)
|
||||
else:
|
||||
lines = {}
|
||||
@@ -64,8 +68,8 @@ def interact():
|
||||
f_globals = {}
|
||||
for name, value in env['globals'].items():
|
||||
if name not in gluon.html.__all__ and \
|
||||
name not in gluon.validators.__all__ and \
|
||||
name not in gluon.dal.__all__:
|
||||
name not in gluon.validators.__all__ and \
|
||||
name not in gluon.dal.__all__:
|
||||
f_globals[name] = pydoc.text.repr(value)
|
||||
else:
|
||||
f_locals = {}
|
||||
@@ -76,42 +80,48 @@ def interact():
|
||||
response.flash = T('"User Exception" debug mode. '
|
||||
'An error ticket could be issued!')
|
||||
|
||||
return dict(app=app, data="",
|
||||
filename=web_debugger.filename, lines=lines, lineno=lineno,
|
||||
f_globals=f_globals, f_locals=f_locals,
|
||||
return dict(app=app, data="",
|
||||
filename=web_debugger.filename, lines=lines, lineno=lineno,
|
||||
f_globals=f_globals, f_locals=f_locals,
|
||||
exception=web_debugger.exception_info)
|
||||
|
||||
|
||||
def step():
|
||||
web_debugger.do_step()
|
||||
redirect(URL("interact"))
|
||||
|
||||
|
||||
def next():
|
||||
web_debugger.do_next()
|
||||
redirect(URL("interact"))
|
||||
|
||||
|
||||
def cont():
|
||||
web_debugger.do_continue()
|
||||
redirect(URL("interact"))
|
||||
|
||||
|
||||
def ret():
|
||||
web_debugger.do_return()
|
||||
redirect(URL("interact"))
|
||||
|
||||
|
||||
def stop():
|
||||
web_debugger.do_quit()
|
||||
redirect(URL("interact"))
|
||||
|
||||
|
||||
def execute():
|
||||
app = request.args[0]
|
||||
command = request.vars.statement
|
||||
session['debug_commands:'+app].append(command)
|
||||
session['debug_commands:' + app].append(command)
|
||||
try:
|
||||
output = web_debugger.do_exec(command)
|
||||
if output is None:
|
||||
output = ""
|
||||
except Exception, e:
|
||||
output = T("Exception %s") % str(e)
|
||||
k = len(session['debug_commands:'+app]) - 1
|
||||
output = T("Exception %s") % str(e)
|
||||
k = len(session['debug_commands:' + app]) - 1
|
||||
return '[%i] %s%s\n' % (k + 1, command, output)
|
||||
|
||||
|
||||
@@ -120,52 +130,54 @@ def breakpoints():
|
||||
|
||||
# Get all .py files
|
||||
files = listdir(apath('', r=request), '.*\.py$')
|
||||
files = [filename for filename in files
|
||||
if filename and 'languages' not in filename
|
||||
and not filename.startswith("admin")
|
||||
and not filename.startswith("examples")]
|
||||
files = [filename for filename in files
|
||||
if filename and 'languages' not in filename
|
||||
and not filename.startswith("admin")
|
||||
and not filename.startswith("examples")]
|
||||
|
||||
form = SQLFORM.factory(
|
||||
Field('filename', requires=IS_IN_SET(files), label=T("Filename")),
|
||||
Field('lineno', 'integer', label=T("Line number"),
|
||||
requires=IS_NOT_EMPTY()),
|
||||
Field('temporary', 'boolean', label=T("Temporary"),
|
||||
Field('temporary', 'boolean', label=T("Temporary"),
|
||||
comment=T("deleted after first hit")),
|
||||
Field('condition', 'string', label=T("Condition"),
|
||||
comment=T("honored only if the expression evaluates to true")),
|
||||
)
|
||||
)
|
||||
|
||||
if form.accepts(request.vars, session):
|
||||
filename = os.path.join(request.env['applications_parent'],
|
||||
filename = os.path.join(request.env['applications_parent'],
|
||||
'applications', form.vars.filename)
|
||||
err = qdb_debugger.do_set_breakpoint(filename,
|
||||
form.vars.lineno,
|
||||
form.vars.temporary,
|
||||
form.vars.condition)
|
||||
err = qdb_debugger.do_set_breakpoint(filename,
|
||||
form.vars.lineno,
|
||||
form.vars.temporary,
|
||||
form.vars.condition)
|
||||
response.flash = T("Set Breakpoint on %s at line %s: %s") % (
|
||||
filename, form.vars.lineno, err or T('successful'))
|
||||
filename, form.vars.lineno, err or T('successful'))
|
||||
|
||||
for item in request.vars:
|
||||
if item[:7] == 'delete_':
|
||||
qdb_debugger.do_clear(item[7:])
|
||||
|
||||
breakpoints = [{'number': bp[0], 'filename': os.path.basename(bp[1]),
|
||||
'path': bp[1], 'lineno': bp[2],
|
||||
'temporary': bp[3], 'enabled': bp[4], 'hits': bp[5],
|
||||
'condition': bp[6]}
|
||||
for bp in qdb_debugger.do_list_breakpoint()]
|
||||
'path': bp[1], 'lineno': bp[2],
|
||||
'temporary': bp[3], 'enabled': bp[4], 'hits': bp[5],
|
||||
'condition': bp[6]}
|
||||
for bp in qdb_debugger.do_list_breakpoint()]
|
||||
|
||||
return dict(breakpoints=breakpoints, form=form)
|
||||
|
||||
|
||||
def toggle_breakpoint():
|
||||
"Set or clear a breakpoint"
|
||||
|
||||
|
||||
lineno = None
|
||||
ok = None
|
||||
try:
|
||||
filename = os.path.join(request.env['applications_parent'],
|
||||
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))
|
||||
if not request.vars.data:
|
||||
# ace send us the line number!
|
||||
lineno = int(request.vars.sel_start) + 1
|
||||
@@ -182,20 +194,44 @@ def toggle_breakpoint():
|
||||
if lineno is not None:
|
||||
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 and lineno == bp_lineno:
|
||||
err = qdb_debugger.do_clear_breakpoint(filename, lineno)
|
||||
response.flash = T("Removed Breakpoint on %s at line %s", (
|
||||
filename, lineno))
|
||||
response.flash = T("Removed Breakpoint on %s at line %s", (
|
||||
filename, lineno))
|
||||
ok = False
|
||||
break
|
||||
else:
|
||||
err = qdb_debugger.do_set_breakpoint(filename, lineno)
|
||||
response.flash = T("Set Breakpoint on %s at line %s: %s") % (
|
||||
filename, lineno, err or T('successful'))
|
||||
filename, lineno, err or T('successful'))
|
||||
ok = True
|
||||
else:
|
||||
response.flash = T("Unable to determine the line number!")
|
||||
except Exception, e:
|
||||
session.flash = str(e)
|
||||
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})
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -9,85 +9,92 @@ try:
|
||||
import shutil
|
||||
from gluon.fileutils import read_file, write_file
|
||||
except:
|
||||
session.flash='sorry, only on Unix systems'
|
||||
redirect(URL(request.application,'default','site'))
|
||||
session.flash = 'sorry, only on Unix systems'
|
||||
redirect(URL(request.application, 'default', 'site'))
|
||||
|
||||
if MULTI_USER_MODE and not is_manager():
|
||||
session.flash = 'Not Authorized'
|
||||
redirect(URL('default','site'))
|
||||
redirect(URL('default', 'site'))
|
||||
|
||||
forever = 10 ** 8
|
||||
|
||||
forever=10**8
|
||||
|
||||
def kill():
|
||||
p = cache.ram('gae_upload',lambda:None,forever)
|
||||
if not p or p.poll()!=None:
|
||||
p = cache.ram('gae_upload', lambda: None, forever)
|
||||
if not p or p.poll() is not None:
|
||||
return 'oops'
|
||||
os.kill(p.pid, signal.SIGKILL)
|
||||
cache.ram('gae_upload',lambda:None,-1)
|
||||
cache.ram('gae_upload', lambda: None, -1)
|
||||
|
||||
|
||||
class EXISTS(object):
|
||||
def __init__(self, error_message='file not found'):
|
||||
self.error_message = error_message
|
||||
|
||||
def __call__(self, value):
|
||||
if os.path.exists(value):
|
||||
return (value,None)
|
||||
return (value,self.error_message)
|
||||
return (value, None)
|
||||
return (value, self.error_message)
|
||||
|
||||
|
||||
def deploy():
|
||||
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(
|
||||
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'))),
|
||||
Field('google_application_id',requires=IS_MATCH('[\w\-]+'),label=T('Google Application Id')),
|
||||
Field('applications','list:string',
|
||||
requires=IS_IN_SET(apps,multiple=True),
|
||||
Field('google_application_id', requires=IS_MATCH(
|
||||
'[\w\-]+'), label=T('Google Application Id')),
|
||||
Field('applications', 'list:string',
|
||||
requires=IS_IN_SET(apps, multiple=True),
|
||||
label=T('web2py apps to deploy')),
|
||||
Field('email',requires=IS_EMAIL(),label=T('GAE Email')),
|
||||
Field('password','password',requires=IS_NOT_EMPTY(),label=T('GAE Password')))
|
||||
cmd = output = errors= ""
|
||||
if form.accepts(request,session):
|
||||
Field('email', requires=IS_EMAIL(), label=T('GAE Email')),
|
||||
Field('password', 'password', requires=IS_NOT_EMPTY(), label=T('GAE Password')))
|
||||
cmd = output = errors = ""
|
||||
if form.accepts(request, session):
|
||||
try:
|
||||
kill()
|
||||
except:
|
||||
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/\(.*')
|
||||
yaml = apath('../app.yaml', r=request)
|
||||
if not os.path.exists(yaml):
|
||||
example = apath('../app.example.yaml', r=request)
|
||||
shutil.copyfile(example,yaml)
|
||||
shutil.copyfile(example, yaml)
|
||||
data = read_file(yaml)
|
||||
data = re.sub('application:.*','application: %s' % form.vars.google_application_id,data)
|
||||
data = regex.sub('(applications/(%s)/.*)|' % '|'.join(ignore_apps),data)
|
||||
data = re.sub('application:.*', 'application: %s' %
|
||||
form.vars.google_application_id, data)
|
||||
data = regex.sub(
|
||||
'(applications/(%s)/.*)|' % '|'.join(ignore_apps), data)
|
||||
write_file(yaml, data)
|
||||
|
||||
path = request.env.applications_parent
|
||||
cmd = '%s --email=%s --passin update %s' % \
|
||||
(form.vars.appcfg, form.vars.email, path)
|
||||
p = cache.ram('gae_upload',
|
||||
lambda s=subprocess,c=cmd:s.Popen(c, shell=True,
|
||||
stdin=s.PIPE,
|
||||
stdout=s.PIPE,
|
||||
stderr=s.PIPE, close_fds=True),-1)
|
||||
p.stdin.write(form.vars.password+'\n')
|
||||
lambda s=subprocess, c=cmd: s.Popen(c, shell=True,
|
||||
stdin=s.PIPE,
|
||||
stdout=s.PIPE,
|
||||
stderr=s.PIPE, close_fds=True), -1)
|
||||
p.stdin.write(form.vars.password + '\n')
|
||||
fcntl.fcntl(p.stdout.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():
|
||||
p = cache.ram('gae_upload',lambda:None,forever)
|
||||
if not p or p.poll()!=None:
|
||||
p = cache.ram('gae_upload', lambda: None, forever)
|
||||
if not p or p.poll() is not None:
|
||||
return '<done/>'
|
||||
try:
|
||||
output = p.stdout.read()
|
||||
except:
|
||||
output=''
|
||||
output = ''
|
||||
try:
|
||||
errors = p.stderr.read()
|
||||
except:
|
||||
errors=''
|
||||
return (output+errors).replace('\n','<br/>')
|
||||
|
||||
|
||||
errors = ''
|
||||
return (output + errors).replace('\n', '<br/>')
|
||||
|
||||
@@ -2,10 +2,10 @@ from gluon.fileutils import read_file, write_file
|
||||
|
||||
if DEMO_MODE or MULTI_USER_MODE:
|
||||
session.flash = T('disabled in demo mode')
|
||||
redirect(URL('default','site'))
|
||||
redirect(URL('default', 'site'))
|
||||
if not have_mercurial:
|
||||
session.flash=T("Sorry, could not find mercurial installed")
|
||||
redirect(URL('default','design',args=request.args(0)))
|
||||
session.flash = T("Sorry, could not find mercurial installed")
|
||||
redirect(URL('default', 'design', args=request.args(0)))
|
||||
|
||||
_hgignore_content = """\
|
||||
syntax: glob
|
||||
@@ -22,6 +22,7 @@ sessions/*
|
||||
errors/*
|
||||
"""
|
||||
|
||||
|
||||
def hg_repo(path):
|
||||
import os
|
||||
uio = ui.ui()
|
||||
@@ -37,13 +38,14 @@ def hg_repo(path):
|
||||
write_file(hgignore, _hgignore_content)
|
||||
return repo
|
||||
|
||||
|
||||
def commit():
|
||||
app = request.args(0)
|
||||
path = apath(app, r=request)
|
||||
repo = hg_repo(path)
|
||||
form = FORM('Comment:',INPUT(_name='comment',requires=IS_NOT_EMPTY()),
|
||||
INPUT(_type='submit',_value=T('Commit')))
|
||||
if form.accepts(request.vars,session):
|
||||
form = FORM('Comment:', INPUT(_name='comment', requires=IS_NOT_EMPTY()),
|
||||
INPUT(_type='submit', _value=T('Commit')))
|
||||
if form.accepts(request.vars, session):
|
||||
oldid = repo[repo.lookup('.')]
|
||||
addremove(repo)
|
||||
repo.commit(text=form.vars.comment)
|
||||
@@ -51,34 +53,33 @@ def commit():
|
||||
response.flash = 'no changes'
|
||||
try:
|
||||
files = TABLE(*[TR(file) for file in repo[repo.lookup('.')].files()])
|
||||
changes = TABLE(TR(TH('revision'),TH('description')))
|
||||
changes = TABLE(TR(TH('revision'), TH('description')))
|
||||
for change in repo.changelog:
|
||||
ctx=repo.changectx(change)
|
||||
ctx = repo.changectx(change)
|
||||
revision, description = ctx.rev(), ctx.description()
|
||||
changes.append(TR(A(revision,_href=URL('revision',
|
||||
args=(app,revision))),
|
||||
changes.append(TR(A(revision, _href=URL('revision',
|
||||
args=(app, revision))),
|
||||
description))
|
||||
except:
|
||||
files = []
|
||||
changes = []
|
||||
return dict(form=form,files=files,changes=changes,repo=repo)
|
||||
return dict(form=form, files=files, changes=changes, repo=repo)
|
||||
|
||||
|
||||
def revision():
|
||||
app = request.args(0)
|
||||
path = apath(app, r=request)
|
||||
repo = hg_repo(path)
|
||||
revision = request.args(1)
|
||||
ctx=repo.changectx(revision)
|
||||
form=FORM(INPUT(_type='submit',_value=T('Revert')))
|
||||
ctx = repo.changectx(revision)
|
||||
form = FORM(INPUT(_type='submit', _value=T('Revert')))
|
||||
if form.accepts(request.vars):
|
||||
hg.update(repo, revision)
|
||||
session.flash = "reverted to revision %s" % ctx.rev()
|
||||
redirect(URL('default','design',args=app))
|
||||
redirect(URL('default', 'design', args=app))
|
||||
return dict(
|
||||
files=ctx.files(),
|
||||
rev=str(ctx.rev()),
|
||||
desc=ctx.description(),
|
||||
form=form
|
||||
)
|
||||
|
||||
|
||||
)
|
||||
|
||||
@@ -1,29 +1,36 @@
|
||||
import os
|
||||
from distutils import dir_util
|
||||
try:
|
||||
from distutils import dir_util
|
||||
except ImportError:
|
||||
session.flash = T('requires distutils, but not installed')
|
||||
redirect(URL('default', 'site'))
|
||||
try:
|
||||
from git import *
|
||||
except ImportError:
|
||||
session.flash = T('requires python-git, but not installed')
|
||||
redirect(URL('default','site'))
|
||||
redirect(URL('default', 'site'))
|
||||
|
||||
|
||||
def deploy():
|
||||
apps = sorted(file for file in os.listdir(apath(r=request)))
|
||||
form = SQLFORM.factory(
|
||||
Field('osrepo',default='/tmp',label=T('Path to local openshift repo root.'),
|
||||
requires=EXISTS(error_message=T('directory not found'))),
|
||||
Field('osname',default='web2py',label=T('WSGI reference name')),
|
||||
Field('applications','list:string',
|
||||
requires=IS_IN_SET(apps,multiple=True),
|
||||
Field(
|
||||
'osrepo', default='/tmp', label=T('Path to local openshift repo root.'),
|
||||
requires=EXISTS(error_message=T('directory not found'))),
|
||||
Field('osname', default='web2py', label=T('WSGI reference name')),
|
||||
Field('applications', 'list:string',
|
||||
requires=IS_IN_SET(apps, multiple=True),
|
||||
label=T('web2py apps to deploy')))
|
||||
|
||||
cmd = output = errors= ""
|
||||
if form.accepts(request,session):
|
||||
cmd = output = errors = ""
|
||||
if form.accepts(request, session):
|
||||
try:
|
||||
kill()
|
||||
except:
|
||||
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/\(.*')
|
||||
w2p_origin = os.getcwd()
|
||||
osrepo = form.vars.osrepo
|
||||
@@ -34,23 +41,25 @@ def deploy():
|
||||
assert repo.bare == False
|
||||
|
||||
for i in form.vars.applications:
|
||||
appsrc = os.path.join(apath(r=request),i)
|
||||
appdest = os.path.join(osrepo,'wsgi',osname,'applications',i)
|
||||
dir_util.copy_tree(appsrc,appdest)
|
||||
appsrc = os.path.join(apath(r=request), i)
|
||||
appdest = os.path.join(osrepo, 'wsgi', osname, 'applications', i)
|
||||
dir_util.copy_tree(appsrc, appdest)
|
||||
#shutil.copytree(appsrc,appdest)
|
||||
index.add(['wsgi/'+osname+'/applications/'+i])
|
||||
index.add(['wsgi/' + osname + '/applications/' + i])
|
||||
new_commit = index.commit("Deploy from Web2py IDE")
|
||||
|
||||
|
||||
origin = repo.remotes.origin
|
||||
origin.push
|
||||
origin.push()
|
||||
#Git code ends here
|
||||
return dict(form=form,command=cmd)
|
||||
|
||||
return dict(form=form, command=cmd)
|
||||
|
||||
|
||||
class EXISTS(object):
|
||||
def __init__(self, error_message='file not found'):
|
||||
self.error_message = error_message
|
||||
|
||||
def __call__(self, value):
|
||||
if os.path.exists(value):
|
||||
return (value,None)
|
||||
return (value,self.error_message)
|
||||
return (value, None)
|
||||
return (value, self.error_message)
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
response.files=response.files[:3]
|
||||
response.menu=[]
|
||||
response.files = response.files[:3]
|
||||
response.menu = []
|
||||
|
||||
|
||||
def index():
|
||||
return locals()
|
||||
|
||||
|
||||
def about():
|
||||
return locals()
|
||||
|
||||
|
||||
|
||||
@@ -1,25 +1,29 @@
|
||||
import sys
|
||||
import cStringIO
|
||||
import gluon.contrib.shell
|
||||
import code, thread
|
||||
import code
|
||||
import thread
|
||||
from gluon.shell import env
|
||||
|
||||
if DEMO_MODE or MULTI_USER_MODE:
|
||||
session.flash = T('disabled in demo mode')
|
||||
redirect(URL('default','site'))
|
||||
redirect(URL('default', 'site'))
|
||||
|
||||
FE = 10 ** 9
|
||||
|
||||
FE=10**9
|
||||
|
||||
def index():
|
||||
app = request.args(0) or 'admin'
|
||||
reset()
|
||||
return dict(app=app)
|
||||
|
||||
|
||||
def callback():
|
||||
app = request.args[0]
|
||||
command = request.vars.statement
|
||||
escape = command[:1]!='!'
|
||||
history = session['history:'+app] = session.get('history:'+app,gluon.contrib.shell.History())
|
||||
escape = command[:1] != '!'
|
||||
history = session['history:' + app] = session.get(
|
||||
'history:' + app, gluon.contrib.shell.History())
|
||||
if not escape:
|
||||
command = command[1:]
|
||||
if command == '%reset':
|
||||
@@ -27,21 +31,20 @@ def callback():
|
||||
return '*** reset ***'
|
||||
elif command[0] == '%':
|
||||
try:
|
||||
command=session['commands:'+app][int(command[1:])]
|
||||
command = session['commands:' + app][int(command[1:])]
|
||||
except ValueError:
|
||||
return ''
|
||||
session['commands:'+app].append(command)
|
||||
environ=env(app,True)
|
||||
output = gluon.contrib.shell.run(history,command,environ)
|
||||
k = len(session['commands:'+app]) - 1
|
||||
session['commands:' + app].append(command)
|
||||
environ = env(app, True, extra_request=dict(is_https=request.is_https))
|
||||
output = gluon.contrib.shell.run(history, command, environ)
|
||||
k = len(session['commands:' + app]) - 1
|
||||
#output = PRE(output)
|
||||
#return TABLE(TR('In[%i]:'%k,PRE(command)),TR('Out[%i]:'%k,output))
|
||||
return 'In [%i] : %s%s\n' % (k + 1, command, output)
|
||||
|
||||
|
||||
def reset():
|
||||
app = request.args(0) or 'admin'
|
||||
session['commands:'+app] = []
|
||||
session['history:'+app] = gluon.contrib.shell.History()
|
||||
session['commands:' + app] = []
|
||||
session['history:' + app] = gluon.contrib.shell.History()
|
||||
return 'done'
|
||||
|
||||
|
||||
|
||||
@@ -2,10 +2,12 @@ import os
|
||||
from gluon.settings import global_settings, read_file
|
||||
#
|
||||
|
||||
|
||||
def index():
|
||||
app = request.args(0)
|
||||
return dict(app=app)
|
||||
|
||||
|
||||
def profiler():
|
||||
"""
|
||||
to use the profiler start web2py with -F profiler.log
|
||||
@@ -19,13 +21,11 @@ def profiler():
|
||||
else:
|
||||
size = 0
|
||||
if os.path.exists(filename):
|
||||
data = read_file('profiler.log','rb')
|
||||
if size<len(data):
|
||||
data = read_file('profiler.log', 'rb')
|
||||
if size < len(data):
|
||||
data = data[size:]
|
||||
else:
|
||||
size=0
|
||||
size = 0
|
||||
size += len(data)
|
||||
response.cookies[KEY] = size
|
||||
return data
|
||||
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ def list_apps():
|
||||
@service.jsonrpc
|
||||
def list_files(app, pattern='.*\.py$'):
|
||||
files = listdir(apath('%s/' % app, r=request), pattern)
|
||||
return [x.replace('\\','/') for x in files]
|
||||
return [x.replace('\\', '/') for x in files]
|
||||
|
||||
|
||||
@service.jsonrpc
|
||||
@@ -43,7 +43,7 @@ def read_file(filename, b64=False):
|
||||
try:
|
||||
data = f.read()
|
||||
if not b64:
|
||||
data = data.replace('\r','')
|
||||
data = data.replace('\r', '')
|
||||
else:
|
||||
data = base64.b64encode(data)
|
||||
finally:
|
||||
@@ -82,6 +82,7 @@ def install(app_name, filename, data, overwrite=True):
|
||||
|
||||
return installed
|
||||
|
||||
|
||||
@service.jsonrpc
|
||||
def attach_debugger(host='localhost', port=6000, authkey='secret password'):
|
||||
import gluon.contrib.qdb as qdb
|
||||
@@ -90,7 +91,7 @@ def attach_debugger(host='localhost', port=6000, authkey='secret password'):
|
||||
|
||||
if isinstance(authkey, unicode):
|
||||
authkey = authkey.encode('utf8')
|
||||
|
||||
|
||||
if not hasattr(gluon.debug, 'qdb_listener'):
|
||||
# create a remote debugger server and wait for connection
|
||||
address = (host, port) # family is deduced to be 'AF_INET'
|
||||
@@ -124,7 +125,7 @@ def detach_debugger():
|
||||
gluon.debug.qdb_debugger = None
|
||||
return True
|
||||
|
||||
|
||||
def call():
|
||||
session.forget()
|
||||
return service()
|
||||
|
||||
|
||||
@@ -1,64 +1,73 @@
|
||||
# -*- 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.fileutils import abspath, read_file, write_file
|
||||
|
||||
def reset(session):
|
||||
session.app={
|
||||
'name':'',
|
||||
'params':[('title','My New App'),
|
||||
('subtitle','powered by web2py'),
|
||||
('author','you'),
|
||||
('author_email','you@example.com'),
|
||||
('keywords',''),
|
||||
('description',''),
|
||||
('layout_theme','Default'),
|
||||
('database_uri','sqlite://storage.sqlite'),
|
||||
('security_key',str(uuid.uuid4())),
|
||||
('email_server','localhost'),
|
||||
('email_sender','you@example.com'),
|
||||
('email_login',''),
|
||||
('login_method','local'),
|
||||
('login_config',''),
|
||||
('plugins',[])],
|
||||
'tables':['auth_user'],
|
||||
'table_auth_user':['username','first_name',
|
||||
'last_name','email','password'],
|
||||
'pages':['index','error'],
|
||||
'page_index':'# Welcome to my new app',
|
||||
'page_error':'# Error: the document does not exist',
|
||||
}
|
||||
|
||||
if not session.app: reset(session)
|
||||
def reset(session):
|
||||
session.app = {
|
||||
'name': '',
|
||||
'params': [('title', 'My New App'),
|
||||
('subtitle', 'powered by web2py'),
|
||||
('author', 'you'),
|
||||
('author_email', 'you@example.com'),
|
||||
('keywords', ''),
|
||||
('description', ''),
|
||||
('layout_theme', 'Default'),
|
||||
('database_uri', 'sqlite://storage.sqlite'),
|
||||
('security_key', str(uuid.uuid4())),
|
||||
('email_server', 'localhost'),
|
||||
('email_sender', 'you@example.com'),
|
||||
('email_login', ''),
|
||||
('login_method', 'local'),
|
||||
('login_config', ''),
|
||||
('plugins', [])],
|
||||
'tables': ['auth_user'],
|
||||
'table_auth_user': ['username', 'first_name',
|
||||
'last_name', 'email', 'password'],
|
||||
'pages': ['index', 'error'],
|
||||
'page_index': '# Welcome to my new app',
|
||||
'page_error': '# Error: the document does not exist',
|
||||
}
|
||||
|
||||
if not session.app:
|
||||
reset(session)
|
||||
|
||||
|
||||
def listify(x):
|
||||
if not isinstance(x,(list,tuple)):
|
||||
if not isinstance(x, (list, tuple)):
|
||||
return x and [x] or []
|
||||
return x
|
||||
|
||||
|
||||
def clean(name):
|
||||
return re.sub('\W+','_',name.strip().lower())
|
||||
return re.sub('\W+', '_', name.strip().lower())
|
||||
|
||||
|
||||
def index():
|
||||
response.view='wizard/step.html'
|
||||
response.view = 'wizard/step.html'
|
||||
reset(session)
|
||||
apps=os.listdir(os.path.join(request.folder,'..'))
|
||||
form=SQLFORM.factory(Field('name',requires=[IS_NOT_EMPTY(),
|
||||
IS_ALPHANUMERIC()]))
|
||||
apps = os.listdir(os.path.join(request.folder, '..'))
|
||||
form = SQLFORM.factory(Field('name', requires=[IS_NOT_EMPTY(),
|
||||
IS_ALPHANUMERIC()]), _class='span5 well well-small')
|
||||
if form.accepts(request.vars):
|
||||
app = form.vars.name
|
||||
session.app['name'] = app
|
||||
if MULTI_USER_MODE and db(db.app.name==app)\
|
||||
(db.app.owner!=auth.user.id).count():
|
||||
if MULTI_USER_MODE and db(db.app.name == app)(db.app.owner != auth.user.id).count():
|
||||
session.flash = 'App belongs already to other user'
|
||||
elif app in apps:
|
||||
meta = os.path.normpath(\
|
||||
meta = os.path.normpath(
|
||||
os.path.join(os.path.normpath(request.folder),
|
||||
'..',app,'wizard.metadata'))
|
||||
'..', app, 'wizard.metadata'))
|
||||
if os.path.exists(meta):
|
||||
try:
|
||||
metafile = open(meta,'rb')
|
||||
metafile = open(meta, 'rb')
|
||||
try:
|
||||
session.app = pickle.load(metafile)
|
||||
finally:
|
||||
@@ -67,14 +76,14 @@ def index():
|
||||
except:
|
||||
session.flash = T("The app exists, was NOT created by wizard, continue to overwrite!")
|
||||
redirect(URL('step1'))
|
||||
return dict(step='Start',form=form)
|
||||
return dict(step='Start', form=form)
|
||||
|
||||
|
||||
def step1():
|
||||
from gluon.contrib.simplejson import loads
|
||||
import urllib
|
||||
if not session.themes:
|
||||
url=LAYOUTS_APP+'/default/layouts.json'
|
||||
url = LAYOUTS_APP + '/default/layouts.json'
|
||||
try:
|
||||
data = urllib.urlopen(url).read()
|
||||
session.themes = ['Default'] + loads(data)['layouts']
|
||||
@@ -82,145 +91,160 @@ def step1():
|
||||
session.themes = ['Default']
|
||||
themes = session.themes
|
||||
if not session.plugins:
|
||||
url = PLUGINS_APP+'/default/plugins.json'
|
||||
url = PLUGINS_APP + '/default/plugins.json'
|
||||
try:
|
||||
data = urllib.urlopen(url).read()
|
||||
session.plugins = loads(data)['plugins']
|
||||
except:
|
||||
session.plugins = []
|
||||
plugins = [x.split('.')[2] for x in session.plugins]
|
||||
response.view='wizard/step.html'
|
||||
response.view = 'wizard/step.html'
|
||||
params = dict(session.app['params'])
|
||||
form=SQLFORM.factory(
|
||||
Field('title',default=params.get('title',None),
|
||||
requires=IS_NOT_EMPTY()),
|
||||
Field('subtitle',default=params.get('subtitle',None)),
|
||||
Field('author',default=params.get('author',None)),
|
||||
Field('author_email',default=params.get('author_email',None)),
|
||||
Field('keywords',default=params.get('keywords',None)),
|
||||
Field('description','text',
|
||||
default=params.get('description',None)),
|
||||
Field('layout_theme',requires=IS_IN_SET(themes),
|
||||
default=params.get('layout_theme',themes[0])),
|
||||
Field('database_uri',default=params.get('database_uri',None)),
|
||||
Field('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('login_method',requires=IS_IN_SET(('local','janrain')),
|
||||
default=params.get('login_method','local')),
|
||||
Field('login_config',default=params.get('login_config',None)),
|
||||
Field('plugins','list:string',requires=IS_IN_SET(plugins,multiple=True)))
|
||||
form = SQLFORM.factory(
|
||||
Field('title', default=params.get('title', None),
|
||||
requires=IS_NOT_EMPTY()),
|
||||
Field('subtitle', default=params.get('subtitle', None)),
|
||||
Field('author', default=params.get('author', None)),
|
||||
Field(
|
||||
'author_email', default=params.get('author_email', None)),
|
||||
Field('keywords', default=params.get('keywords', None)),
|
||||
Field('description', 'text',
|
||||
default=params.get('description', None)),
|
||||
Field('layout_theme', requires=IS_IN_SET(themes),
|
||||
default=params.get('layout_theme', themes[0])),
|
||||
Field(
|
||||
'database_uri', default=params.get('database_uri', None)),
|
||||
Field(
|
||||
'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('login_method', requires=IS_IN_SET(('local', 'janrain')),
|
||||
default=params.get('login_method', 'local')),
|
||||
Field(
|
||||
'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):
|
||||
session.app['params']=[(key,form.vars.get(key,None))
|
||||
for key,value in session.app['params']]
|
||||
redirect(URL('step2'))
|
||||
return dict(step='1: Setting Parameters',form=form)
|
||||
session.app['params'] = [(key, form.vars.get(key, None))
|
||||
for key, value in session.app['params']]
|
||||
redirect(URL('step2') + '/#xwizard_form')
|
||||
return dict(step='1: Setting Parameters', form=form)
|
||||
|
||||
|
||||
def step2():
|
||||
response.view='wizard/step.html'
|
||||
form=SQLFORM.factory(Field('table_names','list:string',
|
||||
default=session.app['tables']))
|
||||
response.view = 'wizard/step.html'
|
||||
form = SQLFORM.factory(Field('table_names', 'list:string',
|
||||
default=session.app['tables']), _class="span7 well well-small")
|
||||
if form.accepts(request.vars):
|
||||
table_names = [clean(t) for t in listify(form.vars.table_names) \
|
||||
if t.strip()]
|
||||
if [t for t in table_names if t.startswith('auth_') and \
|
||||
not t=='auth_user']:
|
||||
table_names = [clean(t) for t in listify(form.vars.table_names)
|
||||
if t.strip()]
|
||||
if [t for t in table_names if t.startswith('auth_') and
|
||||
not t == 'auth_user']:
|
||||
form.error.table_names = \
|
||||
T('invalid table names (auth_* tables already defined)')
|
||||
else:
|
||||
session.app['tables']=table_names
|
||||
session.app['tables'] = table_names
|
||||
for table in session.app['tables']:
|
||||
if not 'table_'+table in session.app:
|
||||
session.app['table_'+table]=['name']
|
||||
if not table=='auth_user':
|
||||
name = table+'_manage'
|
||||
if not 'table_' + table in session.app:
|
||||
session.app['table_' + table] = ['name']
|
||||
if not table == 'auth_user':
|
||||
name = table + '_manage'
|
||||
if not name in session.app['pages']:
|
||||
session.app['pages'].append(name)
|
||||
session.app['page_'+name] = \
|
||||
session.app['page_' + name] = \
|
||||
'## Manage %s\n\n{{=form}}' % (table)
|
||||
if session.app['tables']:
|
||||
redirect(URL('step3',args=0))
|
||||
redirect(URL('step3', args=0) + '/#xwizard_form')
|
||||
else:
|
||||
redirect(URL('step4'))
|
||||
return dict(step='2: Tables',form=form)
|
||||
redirect(URL('step4') + '/#xwizard_form')
|
||||
return dict(step='2: Tables', form=form)
|
||||
|
||||
|
||||
def step3():
|
||||
response.view='wizard/step.html'
|
||||
n=int(request.args(0) or 0)
|
||||
m=len(session.app['tables'])
|
||||
if n>=m: redirect(URL('step2'))
|
||||
table=session.app['tables'][n]
|
||||
form=SQLFORM.factory(Field('field_names','list:string',
|
||||
default=session.app.get('table_'+table,[])))
|
||||
response.view = 'wizard/step.html'
|
||||
n = int(request.args(-1) or 0)
|
||||
m = len(session.app['tables'])
|
||||
if n >= m:
|
||||
redirect(URL('step2'))
|
||||
table = session.app['tables'][n]
|
||||
form = SQLFORM.factory(Field('field_names', 'list:string',
|
||||
default=session.app.get('table_' + table, [])), _class="span7 well well-small")
|
||||
if form.accepts(request.vars) and form.vars.field_names:
|
||||
fields=listify(form.vars.field_names)
|
||||
if table=='auth_user':
|
||||
for field in ['first_name','last_name','username','email','password']:
|
||||
fields = listify(form.vars.field_names)
|
||||
if table == 'auth_user':
|
||||
for field in ['first_name', 'last_name', 'username', 'email', 'password']:
|
||||
if not field in fields:
|
||||
fields.append(field)
|
||||
session.app['table_'+table]=[t.strip().lower()
|
||||
for t in listify(form.vars.field_names)
|
||||
if t.strip()]
|
||||
session.app['table_' + table] = [t.strip().lower()
|
||||
for t in listify(form.vars.field_names)
|
||||
if t.strip()]
|
||||
try:
|
||||
tables=sort_tables(session.app['tables'])
|
||||
tables = sort_tables(session.app['tables'])
|
||||
except RuntimeError:
|
||||
response.flash=T('invalid circular reference')
|
||||
response.flash = T('invalid circular reference')
|
||||
else:
|
||||
if n<m-1:
|
||||
redirect(URL('step3',args=n+1))
|
||||
if n < m - 1:
|
||||
redirect(URL('step3', args=n + 1) + '/#xwizard_form')
|
||||
else:
|
||||
redirect(URL('step4'))
|
||||
return dict(step='3: Fields for table "%s" (%s of %s)' \
|
||||
% (table,n+1,m),table=table,form=form)
|
||||
redirect(URL('step4') + '/#xwizard_form')
|
||||
return dict(step='3: Fields for table "%s" (%s of %s)'
|
||||
% (table, n + 1, m), table=table, form=form)
|
||||
|
||||
|
||||
def step4():
|
||||
response.view='wizard/step.html'
|
||||
form=SQLFORM.factory(Field('pages','list:string',
|
||||
default=session.app['pages']))
|
||||
response.view = 'wizard/step.html'
|
||||
form = SQLFORM.factory(Field('pages', 'list:string',
|
||||
default=session.app['pages']), _class="span7 well well-small")
|
||||
if form.accepts(request.vars):
|
||||
session.app['pages']=[clean(t)
|
||||
for t in listify(form.vars.pages)
|
||||
if t.strip()]
|
||||
session.app['pages'] = [clean(t)
|
||||
for t in listify(form.vars.pages)
|
||||
if t.strip()]
|
||||
if session.app['pages']:
|
||||
redirect(URL('step5',args=0))
|
||||
redirect(URL('step5', args=0) + '/#xwizard_form')
|
||||
else:
|
||||
redirect(URL('step6'))
|
||||
return dict(step='4: Pages',form=form)
|
||||
redirect(URL('step6') + '/#xwizard_form')
|
||||
return dict(step='4: Pages', form=form)
|
||||
|
||||
|
||||
def step5():
|
||||
response.view='wizard/step.html'
|
||||
n=int(request.args(0) or 0)
|
||||
m=len(session.app['pages'])
|
||||
if n>=m: redirect(URL('step4'))
|
||||
page=session.app['pages'][n]
|
||||
markmin_url='http://web2py.com/examples/static/markmin.html'
|
||||
form=SQLFORM.factory(Field('content','text',
|
||||
default=session.app.get('page_'+page,[]),
|
||||
comment=A('use markmin',
|
||||
_href=markmin_url,_target='_blank')),
|
||||
formstyle='table2cols')
|
||||
response.view = 'wizard/step.html'
|
||||
n = int(request.args(-1) or 0)
|
||||
m = len(session.app['pages'])
|
||||
if n >= m:
|
||||
redirect(URL('step4'))
|
||||
page = session.app['pages'][n]
|
||||
markmin_url = 'http://web2py.com/examples/static/markmin.html'
|
||||
form = SQLFORM.factory(Field('content', 'text',
|
||||
default=session.app.get('page_' + page, []),
|
||||
comment=A('use markmin',
|
||||
_href=markmin_url, _target='_blank')),
|
||||
formstyle='table2cols', _class="span7 well well-small")
|
||||
if form.accepts(request.vars):
|
||||
session.app['page_'+page]=form.vars.content
|
||||
if n<m-1:
|
||||
redirect(URL('step5',args=n+1))
|
||||
session.app['page_' + page] = form.vars.content
|
||||
if n < m - 1:
|
||||
redirect(URL('step5', args=n + 1) + '/#xwizard_form')
|
||||
else:
|
||||
redirect(URL('step6'))
|
||||
return dict(step='5: View for page "%s" (%s of %s)' % (page,n+1,m),form=form)
|
||||
redirect(URL('step6') + '/#xwizard_form')
|
||||
return dict(step='5: View for page "%s" (%s of %s)' % (page, n + 1, m), form=form)
|
||||
|
||||
|
||||
def step6():
|
||||
response.view='wizard/step.html'
|
||||
response.view = 'wizard/step.html'
|
||||
params = dict(session.app['params'])
|
||||
app = session.app['name']
|
||||
form=SQLFORM.factory(
|
||||
Field('generate_model','boolean',default=True),
|
||||
Field('generate_controller','boolean',default=True),
|
||||
Field('generate_views','boolean',default=True),
|
||||
Field('generate_menu','boolean',default=True),
|
||||
Field('apply_layout','boolean',default=True),
|
||||
Field('erase_database','boolean',default=True),
|
||||
Field('populate_database','boolean',default=True))
|
||||
form = SQLFORM.factory(
|
||||
Field('generate_model', 'boolean', default=True),
|
||||
Field('generate_controller', 'boolean', default=True),
|
||||
Field('generate_views', 'boolean', default=True),
|
||||
Field('generate_menu', 'boolean', default=True),
|
||||
Field('apply_layout', 'boolean', default=True),
|
||||
Field('erase_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 DEMO_MODE:
|
||||
session.flash = T('Application cannot be generated in demo mode')
|
||||
@@ -228,159 +252,173 @@ def step6():
|
||||
create(form.vars)
|
||||
session.flash = 'Application %s created' % app
|
||||
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():
|
||||
return dict(app=session.app['name'])
|
||||
|
||||
|
||||
def sort_tables(tables):
|
||||
import re
|
||||
regex = re.compile('(%s)' % '|'.join(tables))
|
||||
is_auth_user = 'auth_user' in tables
|
||||
d={}
|
||||
d = {}
|
||||
for table in tables:
|
||||
d[table]=[]
|
||||
d[table] = []
|
||||
for field in session.app['table_%s' % table]:
|
||||
d[table]+=regex.findall(field)
|
||||
tables=[]
|
||||
d[table] += regex.findall(field)
|
||||
tables = []
|
||||
if is_auth_user:
|
||||
tables.append('auth_user')
|
||||
def append(table,trail=[]):
|
||||
|
||||
def append(table, trail=[]):
|
||||
if table in trail:
|
||||
raise RuntimeError
|
||||
for t in d[table]:
|
||||
# if not t==table: (problem, no dropdown for self references)
|
||||
append(t,trail=trail+[table])
|
||||
append(t, trail=trail + [table])
|
||||
if not table in tables:
|
||||
tables.append(table)
|
||||
for table in d: append(table)
|
||||
for table in d:
|
||||
append(table)
|
||||
return tables
|
||||
|
||||
def make_table(table,fields):
|
||||
rawtable=table
|
||||
if table!='auth_user': table='t_'+table
|
||||
s=''
|
||||
s+='\n'+'#'*40+'\n'
|
||||
s+="db.define_table('%s',\n" % table
|
||||
first_field='id'
|
||||
|
||||
def make_table(table, fields):
|
||||
rawtable = table
|
||||
if table != 'auth_user':
|
||||
table = 't_' + table
|
||||
s = ''
|
||||
s += '\n' + '#' * 40 + '\n'
|
||||
s += "db.define_table('%s',\n" % table
|
||||
first_field = 'id'
|
||||
for field in fields:
|
||||
items=[x.lower() for x in field.split()]
|
||||
items = [x.lower() for x in field.split()]
|
||||
has = {}
|
||||
keys = []
|
||||
for key in ['notnull','unique','integer','double','boolean','float',
|
||||
'boolean', 'date','time','datetime','text','wiki',
|
||||
'html','file','upload','image','true',
|
||||
'hidden','readonly','writeonly','multiple',
|
||||
'notempty','required']:
|
||||
for key in ['notnull', 'unique', 'integer', 'double', 'boolean', 'float',
|
||||
'boolean', 'date', 'time', 'datetime', 'text', 'wiki',
|
||||
'html', 'file', 'upload', 'image', 'true',
|
||||
'hidden', 'readonly', 'writeonly', 'multiple',
|
||||
'notempty', 'required']:
|
||||
if key in items[1:]:
|
||||
keys.append(key)
|
||||
has[key] = True
|
||||
tables = session.app['tables']
|
||||
refs = [t for t in tables if t in items]
|
||||
items = items[:1] + [x for x in items[1:] \
|
||||
if not x in keys and not x in tables]
|
||||
items = items[:1] + [x for x in items[1:]
|
||||
if not x in keys and not x in tables]
|
||||
barename = name = '_'.join(items)
|
||||
if table[:2]=='t_': name='f_'+name
|
||||
if first_field=='id': first_field=name
|
||||
if table[:2] == 't_': name = 'f_' + name
|
||||
if first_field == 'id':
|
||||
first_field = name
|
||||
|
||||
### determine field type
|
||||
ftype='string'
|
||||
deftypes={'integer':'integer','double':'double','boolean':'boolean',
|
||||
'float':'double','bool':'boolean',
|
||||
'date':'date','time':'time','datetime':'datetime',
|
||||
'text':'text','file':'upload','image':'upload',
|
||||
'upload':'upload','wiki':'text', 'html':'text'}
|
||||
for key,t in deftypes.items():
|
||||
ftype = 'string'
|
||||
deftypes = {'integer': 'integer', 'double': 'double', 'boolean': 'boolean',
|
||||
'float': 'double', 'bool': 'boolean',
|
||||
'date': 'date', 'time': 'time', 'datetime': 'datetime',
|
||||
'text': 'text', 'file': 'upload', 'image': 'upload',
|
||||
'upload': 'upload', 'wiki': 'text', 'html': 'text'}
|
||||
for key, t in deftypes.items():
|
||||
if key in has:
|
||||
ftype = t
|
||||
if refs:
|
||||
key = refs[0]
|
||||
if not key=='auth_user': key='t_'+key
|
||||
if not key == 'auth_user':
|
||||
key = 't_' + key
|
||||
if 'multiple' in has:
|
||||
ftype='list:reference %s' % key
|
||||
ftype = 'list:reference %s' % key
|
||||
else:
|
||||
ftype='reference %s' % key
|
||||
if ftype=='string' and 'multiple' in has:
|
||||
ftype='list:string'
|
||||
elif ftype=='integer' and 'multiple' in has:
|
||||
ftype='list:integer'
|
||||
elif name=='password':
|
||||
ftype='password'
|
||||
s+=" Field('%s', type='%s'" % (name, ftype)
|
||||
ftype = 'reference %s' % key
|
||||
if ftype == 'string' and 'multiple' in has:
|
||||
ftype = 'list:string'
|
||||
elif ftype == 'integer' and 'multiple' in has:
|
||||
ftype = 'list:integer'
|
||||
elif name == 'password':
|
||||
ftype = 'password'
|
||||
s += " Field('%s', type='%s'" % (name, ftype)
|
||||
|
||||
### determine field attributes
|
||||
if 'notnull' in has or 'notempty' in has or 'required' in has:
|
||||
s+=', notnull=True'
|
||||
s += ', notnull=True'
|
||||
if 'unique' in has:
|
||||
s+=', unique=True'
|
||||
if ftype=='boolean' and 'true' in has:
|
||||
s+=",\n default=True"
|
||||
s += ', unique=True'
|
||||
if ftype == 'boolean' and 'true' in has:
|
||||
s += ",\n default=True"
|
||||
|
||||
### determine field representation
|
||||
elif 'wiki' in has:
|
||||
s+=",\n represent=lambda x, row: MARKMIN(x)"
|
||||
s+=",\n comment='WIKI (markmin)'"
|
||||
s += ",\n represent=lambda x, row: MARKMIN(x)"
|
||||
s += ",\n comment='WIKI (markmin)'"
|
||||
elif 'html' in has:
|
||||
s+=",\n represent=lambda x, row: XML(x,sanitize=True)"
|
||||
s+=",\n comment='HTML (sanitized)'"
|
||||
s += ",\n represent=lambda x, row: XML(x,sanitize=True)"
|
||||
s += ",\n comment='HTML (sanitized)'"
|
||||
### determine field access
|
||||
if name=='password' or 'writeonly' in has:
|
||||
s+=",\n readable=False"
|
||||
if name == 'password' or 'writeonly' in has:
|
||||
s += ",\n readable=False"
|
||||
elif 'hidden' in has:
|
||||
s+=",\n writable=False, readable=False"
|
||||
s += ",\n writable=False, readable=False"
|
||||
elif 'readonly' in has:
|
||||
s+=",\n writable=False"
|
||||
s += ",\n writable=False"
|
||||
|
||||
### make up a label
|
||||
s+=",\n label=T('%s')),\n" % \
|
||||
s += ",\n label=T('%s')),\n" % \
|
||||
' '.join(x.capitalize() for x in barename.split('_'))
|
||||
if table=='auth_user':
|
||||
s+=" Field('created_on','datetime',default=request.now,\n"
|
||||
s+=" label=T('Created On'),writable=False,readable=False),\n"
|
||||
s+=" Field('modified_on','datetime',default=request.now,\n"
|
||||
s+=" label=T('Modified On'),writable=False,readable=False,\n"
|
||||
s+=" update=request.now),\n"
|
||||
s+=" Field('registration_key',default='',\n"
|
||||
s+=" writable=False,readable=False),\n"
|
||||
s+=" Field('reset_password_key',default='',\n"
|
||||
s+=" writable=False,readable=False),\n"
|
||||
s+=" Field('registration_id',default='',\n"
|
||||
s+=" writable=False,readable=False),\n"
|
||||
if table == 'auth_user':
|
||||
s += " Field('created_on','datetime',default=request.now,\n"
|
||||
s += " label=T('Created On'),writable=False,readable=False),\n"
|
||||
s += " Field('modified_on','datetime',default=request.now,\n"
|
||||
s += " label=T('Modified On'),writable=False,readable=False,\n"
|
||||
s += " update=request.now),\n"
|
||||
s += " Field('registration_key',default='',\n"
|
||||
s += " writable=False,readable=False),\n"
|
||||
s += " Field('reset_password_key',default='',\n"
|
||||
s += " writable=False,readable=False),\n"
|
||||
s += " Field('registration_id',default='',\n"
|
||||
s += " writable=False,readable=False),\n"
|
||||
elif 'auth_user' in session.app['tables']:
|
||||
s+=" auth.signature,\n"
|
||||
s+=" format='%("+first_field+")s',\n"
|
||||
s+=" migrate=settings.migrate)\n\n"
|
||||
if table=='auth_user':
|
||||
s+="""
|
||||
db.auth_user.first_name.requires = IS_NOT_EMPTY(error_message=auth.messages.is_empty)
|
||||
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)
|
||||
s += " auth.signature,\n"
|
||||
s += " format='%(" + first_field + ")s',\n"
|
||||
s += " migrate=settings.migrate)\n\n"
|
||||
if table == 'auth_user':
|
||||
s += """
|
||||
db.auth_user.first_name.requires = IS_NOT_EMPTY(
|
||||
error_message=auth.messages.is_empty)
|
||||
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.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))
|
||||
"""
|
||||
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
|
||||
|
||||
|
||||
def fix_db(filename):
|
||||
params = dict(session.app['params'])
|
||||
content = read_file(filename,'rb')
|
||||
content = read_file(filename, 'rb')
|
||||
if 'auth_user' in session.app['tables']:
|
||||
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',
|
||||
params['database_uri'])
|
||||
content = content.replace('auth.define_tables()',\
|
||||
auth_user+'auth.define_tables(migrate = settings.migrate)')
|
||||
params['database_uri'])
|
||||
content = content.replace('auth.define_tables()',
|
||||
auth_user + 'auth.define_tables(migrate = settings.migrate)')
|
||||
content += """
|
||||
mail.settings.server = settings.email_server
|
||||
mail.settings.sender = settings.email_sender
|
||||
mail.settings.login = settings.email_login
|
||||
"""
|
||||
if params['login_method']=='janrain':
|
||||
content+="""
|
||||
if params['login_method'] == 'janrain':
|
||||
content += """
|
||||
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,
|
||||
api_key = settings.login_config.split(':')[-1],
|
||||
domain = settings.login_config.split(':')[0],
|
||||
@@ -388,14 +426,15 @@ auth.settings.login_form = RPXAccount(request,
|
||||
"""
|
||||
write_file(filename, content, 'wb')
|
||||
|
||||
|
||||
def make_menu(pages):
|
||||
s=''
|
||||
s+='response.title = settings.title\n'
|
||||
s+='response.subtitle = settings.subtitle\n'
|
||||
s+="response.meta.author = '%(author)s <%(author_email)s>' % settings\n"
|
||||
s+='response.meta.keywords = settings.keywords\n'
|
||||
s+='response.meta.description = settings.description\n'
|
||||
s+='response.menu = [\n'
|
||||
s = ''
|
||||
s += 'response.title = settings.title\n'
|
||||
s += 'response.subtitle = settings.subtitle\n'
|
||||
s += "response.meta.author = '%(author)s <%(author_email)s>' % settings\n"
|
||||
s += 'response.meta.keywords = settings.keywords\n'
|
||||
s += 'response.meta.description = settings.description\n'
|
||||
s += 'response.menu = [\n'
|
||||
for page in pages:
|
||||
if not page.startswith('error'):
|
||||
if page.endswith('_manage'):
|
||||
@@ -403,65 +442,70 @@ def make_menu(pages):
|
||||
else:
|
||||
page_name = page
|
||||
page_name = ' '.join(x.capitalize() for x in page_name.split('_'))
|
||||
s+="(T('%s'),URL('default','%s')==URL(),URL('default','%s'),[]),\n" \
|
||||
% (page_name,page,page)
|
||||
s+=']'
|
||||
s += "(T('%s'),URL('default','%s')==URL(),URL('default','%s'),[]),\n" \
|
||||
% (page_name, page, page)
|
||||
s += ']'
|
||||
return s
|
||||
|
||||
def make_page(page,contents):
|
||||
if 'auth_user' in session.app['tables'] and not page in ('index','error'):
|
||||
s="@auth.requires_login()\ndef %s():\n" % page
|
||||
|
||||
def make_page(page, contents):
|
||||
if 'auth_user' in session.app['tables'] and not page in ('index', 'error'):
|
||||
s = "@auth.requires_login()\ndef %s():\n" % page
|
||||
else:
|
||||
s="def %s():\n" % page
|
||||
items = page.rsplit('_',1)
|
||||
if items[0] in session.app['tables'] and len(items)==2 and items[1]=='manage':
|
||||
s+=" form = SQLFORM.smartgrid(db.t_%s,onupdate=auth.archive)\n" % items[0]
|
||||
s+=" return locals()\n\n"
|
||||
s = "def %s():\n" % page
|
||||
items = page.rsplit('_', 1)
|
||||
if items[0] in session.app['tables'] and len(items) == 2 and items[1] == 'manage':
|
||||
s += " form = SQLFORM.smartgrid(db.t_%s,onupdate=auth.archive)\n" % items[0]
|
||||
s += " return locals()\n\n"
|
||||
else:
|
||||
s+=" return dict()\n\n"
|
||||
s += " return dict()\n\n"
|
||||
return s
|
||||
|
||||
def make_view(page,contents):
|
||||
s="{{extend 'layout.html'}}\n\n"
|
||||
s+=str(MARKMIN(contents))
|
||||
|
||||
def make_view(page, contents):
|
||||
s = "{{extend 'layout.html'}}\n\n"
|
||||
s += str(MARKMIN(contents))
|
||||
return s
|
||||
|
||||
|
||||
def populate(tables):
|
||||
s = 'from gluon.contrib.populate import populate\n'
|
||||
s+= 'if db(db.auth_user).isempty():\n'
|
||||
s += 'if db(db.auth_user).isempty():\n'
|
||||
for table in sort_tables(tables):
|
||||
t=table=='auth_user' and 'auth_user' or 't_'+table
|
||||
s+=" populate(db.%s,10)\n" % t
|
||||
t = table == 'auth_user' and 'auth_user' or 't_' + table
|
||||
s += " populate(db.%s,10)\n" % t
|
||||
return s
|
||||
|
||||
|
||||
def create(options):
|
||||
if DEMO_MODE:
|
||||
session.flash = T('disabled in demo mode')
|
||||
redirect(URL('step6'))
|
||||
params = dict(session.app['params'])
|
||||
app = session.app['name']
|
||||
if app_create(app,request,force=True,key=params['security_key']):
|
||||
if app_create(app, request, force=True, key=params['security_key']):
|
||||
if MULTI_USER_MODE:
|
||||
db.app.insert(name=app,owner=auth.user.id)
|
||||
db.app.insert(name=app, owner=auth.user.id)
|
||||
else:
|
||||
session.flash = 'Failure to create application'
|
||||
redirect(URL('step6'))
|
||||
|
||||
### save metadata in newapp/wizard.metadata
|
||||
try:
|
||||
meta = os.path.join(request.folder,'..',app,'wizard.metadata')
|
||||
file=open(meta,'wb')
|
||||
pickle.dump(session.app,file)
|
||||
meta = os.path.join(request.folder, '..', app, 'wizard.metadata')
|
||||
file = open(meta, 'wb')
|
||||
pickle.dump(session.app, file)
|
||||
file.close()
|
||||
except IOError:
|
||||
session.flash = 'Failure to write wizard metadata'
|
||||
redirect(URL('step6'))
|
||||
|
||||
### apply theme
|
||||
if options.apply_layout and params['layout_theme']!='Default':
|
||||
if options.apply_layout and params['layout_theme'] != 'Default':
|
||||
try:
|
||||
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)
|
||||
except:
|
||||
session.flash = T("unable to download layout")
|
||||
@@ -469,55 +513,58 @@ def create(options):
|
||||
### apply plugins
|
||||
for plugin in params['plugins']:
|
||||
try:
|
||||
plugin_name = 'web2py.plugin.'+plugin+'.w2p'
|
||||
stream = urllib.urlopen(PLUGINS_APP+'/static/'+plugin_name)
|
||||
plugin_name = 'web2py.plugin.' + plugin + '.w2p'
|
||||
stream = urllib.urlopen(PLUGINS_APP + '/static/' + plugin_name)
|
||||
plugin_install(app, stream, request, plugin_name)
|
||||
except Exception, e:
|
||||
session.flash = T("unable to download plugin: %s" % plugin)
|
||||
|
||||
### write configuration file into newapp/models/0.py
|
||||
model = os.path.join(request.folder,'..',app,'models','0.py')
|
||||
model = os.path.join(request.folder, '..', app, 'models', '0.py')
|
||||
file = open(model, 'wb')
|
||||
try:
|
||||
file.write("from gluon.storage import Storage\n")
|
||||
file.write("settings = Storage()\n\n")
|
||||
file.write("settings.migrate = True\n")
|
||||
for key,value in session.app['params']:
|
||||
file.write("settings.%s = %s\n" % (key,repr(value)))
|
||||
for key, value in session.app['params']:
|
||||
file.write("settings.%s = %s\n" % (key, repr(value)))
|
||||
finally:
|
||||
file.close()
|
||||
|
||||
### write configuration file into newapp/models/menu.py
|
||||
if options.generate_menu:
|
||||
model = os.path.join(request.folder,'..',app,'models','menu.py')
|
||||
file = open(model,'wb')
|
||||
model = os.path.join(request.folder, '..', app, 'models', 'menu.py')
|
||||
file = open(model, 'wb')
|
||||
try:
|
||||
file.write(make_menu(session.app['pages']))
|
||||
finally:
|
||||
file.close()
|
||||
|
||||
### customize the auth_user table
|
||||
model = os.path.join(request.folder,'..',app,'models','db.py')
|
||||
model = os.path.join(request.folder, '..', app, 'models', 'db.py')
|
||||
fix_db(model)
|
||||
|
||||
### create newapp/models/db_wizard.py
|
||||
if options.generate_model:
|
||||
model = os.path.join(request.folder,'..',app,'models','db_wizard.py')
|
||||
file = open(model,'wb')
|
||||
model = os.path.join(
|
||||
request.folder, '..', app, 'models', 'db_wizard.py')
|
||||
file = open(model, 'wb')
|
||||
try:
|
||||
file.write('### we prepend t_ to tablenames and f_ to fieldnames for disambiguity\n\n')
|
||||
tables = sort_tables(session.app['tables'])
|
||||
for table in tables:
|
||||
if table=='auth_user': continue
|
||||
file.write(make_table(table,session.app['table_'+table]))
|
||||
if table == 'auth_user':
|
||||
continue
|
||||
file.write(make_table(table, session.app['table_' + table]))
|
||||
finally:
|
||||
file.close()
|
||||
|
||||
model = os.path.join(request.folder,'..',app,
|
||||
'models','db_wizard_populate.py')
|
||||
if os.path.exists(model): os.unlink(model)
|
||||
model = os.path.join(request.folder, '..', app,
|
||||
'models', 'db_wizard_populate.py')
|
||||
if os.path.exists(model):
|
||||
os.unlink(model)
|
||||
if options.populate_database and session.app['tables']:
|
||||
file = open(model,'wb')
|
||||
file = open(model, 'wb')
|
||||
try:
|
||||
file.write(populate(session.app['tables']))
|
||||
finally:
|
||||
@@ -525,8 +572,9 @@ def create(options):
|
||||
|
||||
### create newapp/controllers/default.py
|
||||
if options.generate_controller:
|
||||
controller = os.path.join(request.folder,'..',app,'controllers','default.py')
|
||||
file = open(controller,'wb')
|
||||
controller = os.path.join(
|
||||
request.folder, '..', app, 'controllers', 'default.py')
|
||||
file = open(controller, 'wb')
|
||||
try:
|
||||
file.write("""# -*- coding: utf-8 -*-
|
||||
### required - do no delete
|
||||
@@ -536,23 +584,24 @@ def call(): return service()
|
||||
### end requires
|
||||
""")
|
||||
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:
|
||||
file.close()
|
||||
|
||||
### create newapp/views/default/*.html
|
||||
if options.generate_views:
|
||||
for page in session.app['pages']:
|
||||
view = os.path.join(request.folder,'..',app,'views','default',page+'.html')
|
||||
file = open(view,'wb')
|
||||
view = os.path.join(
|
||||
request.folder, '..', app, 'views', 'default', page + '.html')
|
||||
file = open(view, 'wb')
|
||||
try:
|
||||
file.write(make_view(page,session.app.get('page_'+page,'')))
|
||||
file.write(
|
||||
make_view(page, session.app.get('page_' + page, '')))
|
||||
finally:
|
||||
file.close()
|
||||
|
||||
if options.erase_database:
|
||||
path = os.path.join(request.folder,'..',app,'databases','*')
|
||||
path = os.path.join(request.folder, '..', app, 'databases', '*')
|
||||
for file in glob.glob(path):
|
||||
os.unlink(file)
|
||||
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
EXPIRATION_MINUTES=60
|
||||
DIGITS=('0','1','2','3','4','5','6','7','8','9')
|
||||
import os, time, stat, cPickle, logging
|
||||
path=os.path.join(request.folder,'sessions')
|
||||
path = os.path.join(request.folder,'sessions')
|
||||
if not os.path.exists(path):
|
||||
os.mkdir(path)
|
||||
now=time.time()
|
||||
now = time.time()
|
||||
for filename in os.listdir(path):
|
||||
fullpath=os.path.join(path,filename)
|
||||
if os.path.isfile(fullpath) and filename.startswith(DIGITS):
|
||||
@@ -18,6 +18,4 @@ for filename in os.listdir(path):
|
||||
if (now - filetime) > expiration:
|
||||
os.unlink(fullpath)
|
||||
except:
|
||||
logging.exception('failure to check %s'%fullpath)
|
||||
|
||||
|
||||
logging.exception('failure to check %s' % fullpath)
|
||||
|
||||
480
applications/admin/languages/cs.py
Normal file
480
applications/admin/languages/cs.py
Normal file
@@ -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é',
|
||||
}
|
||||
@@ -1,119 +1,126 @@
|
||||
# coding: utf8
|
||||
# Translation by: Klaus Kappel <kkappel@yahoo.de>
|
||||
{
|
||||
'!langcode!': 'de',
|
||||
'!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',
|
||||
'%s %%{row} deleted': '%s Zeilen gelöscht',
|
||||
'%s %%{row} updated': '%s Zeilen aktualisiert',
|
||||
'%Y-%m-%d': '%Y-%m-%d',
|
||||
'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
|
||||
'(requires internet access)': '(requires internet access)',
|
||||
'"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 %%{row} Zeilen gel?scht',
|
||||
'%s %%{row} updated': '%s %%{row} Zeilen aktualisiert',
|
||||
'%Y-%m-%d': '%d.%m.%Y',
|
||||
'%Y-%m-%d %H:%M:%S': '%d.%m.%Y %H:%M:%S',
|
||||
'(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")',
|
||||
'@markmin\x01Searching: **%s** %%{file}': 'Searching: **%s** files',
|
||||
'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',
|
||||
'@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: %s': 'Eine neue Version von web2py ist verf?gbar: %s',
|
||||
'Abort': 'Abbrechen',
|
||||
'About': 'Über',
|
||||
'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',
|
||||
'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',
|
||||
'About': '?ber',
|
||||
'About application': '?ber die 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 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 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 language': 'Admin language',
|
||||
'administrative interface': 'administrative interface',
|
||||
'Admin language': 'Admin-Sprache',
|
||||
'administrative interface': 'Administrative Schnittstelle',
|
||||
'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:': ' und benenne sie um:',
|
||||
'appadmin': 'appadmin',
|
||||
'appadmin is disabled because insecure channel': 'Appadmin ist deaktiviert, wegen der Benutzung eines unsicheren Kanals',
|
||||
'Application': 'Anwendung',
|
||||
'application "%s" uninstalled': 'Anwendung "%s" deinstalliert',
|
||||
'application compiled': 'Anwendung kompiliert',
|
||||
'application is compiled and cannot be designed': 'Die Anwendung ist kompiliert kann deswegen nicht mehr geändert werden',
|
||||
'Application name:': 'Application name:',
|
||||
'Are you sure you want to delete file "%s"?': 'Sind Sie sich sicher, dass Sie diese Datei löschen wollen "%s"?',
|
||||
'application is compiled and cannot be designed': 'Die Anwendung ist kompiliert kann deswegen nicht mehr ge?ndert werden',
|
||||
'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 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 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',
|
||||
'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: This is an experimental feature and it needs more testing.': 'ACHTUNG: Dies ist eine experimentelle Funktion und benötigt noch weitere Tests.',
|
||||
'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: 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!',
|
||||
'Authentication': 'Authentifizierung',
|
||||
'Available databases and tables': 'Verfügbare Datenbanken und Tabellen',
|
||||
'back': 'zurück',
|
||||
'beautify': 'beautify',
|
||||
'cache': 'Cache',
|
||||
'cache, errors and sessions cleaned': 'Zwischenspeicher (cache), Fehler und Sitzungen (sessions) gelöscht',
|
||||
'call': 'call',
|
||||
'can be a git repo': 'can be a git repo',
|
||||
'Available databases and tables': 'Verf?gbare Datenbanken und Tabellen',
|
||||
'back': 'zur?ck',
|
||||
'beautify': 'versch?nern',
|
||||
'cache': 'Pufferspeicher',
|
||||
'cache, errors and sessions cleaned': 'Zwischenspeicher (cache), Fehler und Sitzungen (sessions) gel?scht',
|
||||
'call': 'Aufruf',
|
||||
'can be a git repo': 'kann ein git Repository 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 create file': 'Kann Datei nicht erstellen',
|
||||
'cannot upload file "%(filename)s"': 'Kann Datei nicht Hochladen "%(filename)s"',
|
||||
'Change admin password': 'Administrator-Passwort ändern',
|
||||
'Change Password': 'Passwort ändern',
|
||||
'change password': 'Passwort ändern',
|
||||
'check all': 'alles auswählen',
|
||||
'Change admin password': 'Administrator-Passwort ?ndern',
|
||||
'Change Password': 'Passwort ?ndern',
|
||||
'change password': 'Passwort ?ndern',
|
||||
'check all': 'alles ausw?hlen',
|
||||
'Check for upgrades': 'check for upgrades',
|
||||
'Check to delete': 'Markiere zum löschen',
|
||||
'Checking for upgrades...': 'Auf Updates überprüfen...',
|
||||
'Clean': 'löschen',
|
||||
'click here for online examples': 'hier klicken für online Beispiele',
|
||||
'click here for the administrative interface': 'hier klicken für die Administrationsoberfläche ',
|
||||
'Check to delete': 'Markiere zum l?schen',
|
||||
'Checking for upgrades...': 'Auf Updates ?berpr?fen...',
|
||||
'Clean': 'leeren',
|
||||
'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 row to expand traceback': 'Klicke auf die Zeile f?r Fehlerverfolgung',
|
||||
'click to check for upgrades': 'hier klicken um nach Upgrades zu suchen',
|
||||
'Client IP': 'Client IP',
|
||||
'code': 'code',
|
||||
'collapse/expand all': 'collapse/expand all',
|
||||
'collapse/expand all': 'alles zu- bzw. aufklappen',
|
||||
'Compile': 'kompilieren',
|
||||
'compiled application removed': 'kompilierte Anwendung gelöscht',
|
||||
'compiled application removed': 'kompilierte Anwendung gel?scht',
|
||||
'Controller': 'Controller',
|
||||
'Controllers': 'Controller',
|
||||
'controllers': 'Controllers',
|
||||
'Copyright': 'Urheberrecht',
|
||||
'Count': 'Anzahl',
|
||||
'Create': 'erstellen',
|
||||
'create file with filename:': 'erzeuge Datei mit Dateinamen:',
|
||||
'create new application:': 'erzeuge neue Anwendung:',
|
||||
'Create new simple application': 'Erzeuge neue Anwendung',
|
||||
'created by': 'created by',
|
||||
'created by': 'erstellt von',
|
||||
'crontab': 'crontab',
|
||||
'Current request': 'Aktuelle Anfrage (request)',
|
||||
'Current response': 'Aktuelle Antwort (response)',
|
||||
'Current session': 'Aktuelle Sitzung (session)',
|
||||
'currently running': 'currently running',
|
||||
'currently running': 'aktuell in Betrieb',
|
||||
'currently saved or': 'des derzeit gespeicherten oder',
|
||||
'customize me!': 'pass mich an!',
|
||||
'data uploaded': 'Daten hochgeladen',
|
||||
'Database': 'Datenbank',
|
||||
'database': 'Datenbank',
|
||||
'database %s select': 'Datenbank %s ausgewählt',
|
||||
'database %s select': 'Datenbank %s ausgew?hlt',
|
||||
'database administration': 'Datenbankadministration',
|
||||
'Date and Time': 'Datum und Uhrzeit',
|
||||
'db': 'db',
|
||||
'DB Model': 'DB Modell',
|
||||
'Debug': 'Debug',
|
||||
'defines tables': 'definiere Tabellen',
|
||||
'Delete': 'Löschen',
|
||||
'delete': 'löschen',
|
||||
'delete all checked': 'lösche alle markierten',
|
||||
'delete plugin': 'Plugin löschen',
|
||||
'Delete:': 'Löschen:',
|
||||
'Deploy': 'deploy',
|
||||
'Delete': 'L?schen',
|
||||
'delete': 'l?schen',
|
||||
'delete all checked': 'l?sche alle markierten',
|
||||
'delete plugin': 'Plugin l?schen',
|
||||
'Delete:': 'L?schen:',
|
||||
'Deploy': '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',
|
||||
'design': 'design',
|
||||
'DESIGN': 'design',
|
||||
'Design for': 'Design für',
|
||||
'Design for': 'Design f?r',
|
||||
'Detailed traceback description': 'Detailed traceback description',
|
||||
'direction: ltr': 'direction: ltr',
|
||||
'Disable': 'Disable',
|
||||
'Disable': 'Deaktivieren',
|
||||
'documentation': 'Dokumentation',
|
||||
'done!': 'fertig!',
|
||||
'download layouts': 'download layouts',
|
||||
'Download .w2p': 'Download .w2p',
|
||||
'download layouts': 'Layouts herunterladen',
|
||||
'download plugins': 'download plugins',
|
||||
'E-mail': 'E-mail',
|
||||
'EDIT': 'BEARBEITEN',
|
||||
@@ -129,56 +136,64 @@
|
||||
'Editing file "%s"': 'Bearbeite Datei "%s"',
|
||||
'Editing Language file': 'Sprachdatei bearbeiten',
|
||||
'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',
|
||||
'escape': 'escape',
|
||||
'Exception instance attributes': 'Atribute der Ausnahmeinstanz',
|
||||
'Expand Abbreviation': 'Kürzel erweitern',
|
||||
'Expand Abbreviation': 'K?rzel erweitern',
|
||||
'export as csv file': 'Exportieren als CSV-Datei',
|
||||
'exposes': 'stellt zur Verfügung',
|
||||
'exposes': 'stellt zur Verf?gung',
|
||||
'extends': 'erweitert',
|
||||
'failed to reload module': 'neu laden des Moduls fehlgeschlagen',
|
||||
'File': 'Datei',
|
||||
'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" 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 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 saved on %(time)s': 'Datei gespeichert am %(time)s',
|
||||
'file saved on %s': 'Datei gespeichert auf %s',
|
||||
'filter': 'filter',
|
||||
'First name': 'Vorname',
|
||||
'Frames': 'Frames',
|
||||
'Functions with no doctests will result in [passed] tests.': 'Funktionen ohne doctests erzeugen [passed] in Tests',
|
||||
'Get from URL:': 'Get from URL:',
|
||||
'Git Pull': 'Git Pull',
|
||||
'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',
|
||||
'Hello World': 'Hallo Welt',
|
||||
'Help': 'Hilfe',
|
||||
'Home': 'Home',
|
||||
'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',
|
||||
'Import/Export': 'Importieren/Exportieren',
|
||||
'includes': 'Einfügen',
|
||||
'includes': 'Einf?gen',
|
||||
'Index': 'Index',
|
||||
'index': 'index',
|
||||
'insert new': 'neu einfügen',
|
||||
'insert new %s': 'neu einfügen %s',
|
||||
'insert new': 'neu einf?gen',
|
||||
'insert new %s': 'neu einf?gen %s',
|
||||
'inspect attributes': 'inspect attributes',
|
||||
'Install': 'installieren',
|
||||
'Installed applications': 'Installierte Anwendungen',
|
||||
'internal error': 'interner Fehler',
|
||||
'Internal State': 'interner Status',
|
||||
'Invalid action': 'Ungültige Aktion',
|
||||
'Invalid email': 'Ungültige Email',
|
||||
'invalid password': 'Ungültiges Passwort',
|
||||
'Invalid Query': 'Ungültige Abfrage',
|
||||
'invalid request': 'ungültige Anfrage',
|
||||
'invalid ticket': 'ungültiges Ticket',
|
||||
'Invalid action': 'Ung?ltige Aktion',
|
||||
'Invalid email': 'Ung?ltige Email',
|
||||
'invalid password': 'Ung?ltiges Passwort',
|
||||
'Invalid Query': 'Ung?ltige Abfrage',
|
||||
'invalid request': 'ung?ltige Anfrage',
|
||||
'invalid ticket': 'ung?ltiges Ticket',
|
||||
'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 files (static strings) updated': 'Sprachdatei (statisch Strings) aktualisiert',
|
||||
'languages': 'Sprachen',
|
||||
@@ -187,8 +202,9 @@
|
||||
'Last name': 'Nachname',
|
||||
'Last saved on:': 'Zuletzt gespeichert am:',
|
||||
'Layout': 'Layout',
|
||||
'License for': 'Lizenz für',
|
||||
'License for': 'Lizenz f?r',
|
||||
'loading...': 'lade...',
|
||||
'locals': 'locals',
|
||||
'located in the file': 'located in Datei',
|
||||
'Login': 'Anmelden',
|
||||
'login': 'anmelden',
|
||||
@@ -196,33 +212,37 @@
|
||||
'Logout': 'abmelden',
|
||||
'Lost Password': 'Passwort vergessen',
|
||||
'lost password?': 'Passwort vergessen?',
|
||||
'Main Menu': 'Menú principal',
|
||||
'Main Menu': 'Men? principal',
|
||||
'Manage': 'Verwalten',
|
||||
'Match Pair': 'Paare finden',
|
||||
'Menu Model': 'Menü Modell',
|
||||
'Menu Model': 'Men? Modell',
|
||||
'merge': 'verbinden',
|
||||
'Merge Lines': 'Zeilen zusammenfügen',
|
||||
'Merge Lines': 'Zeilen zusammenf?gen',
|
||||
'Models': 'Modelle',
|
||||
'models': 'Modelle',
|
||||
'Modules': 'Module',
|
||||
'modules': 'Module',
|
||||
'Name': 'Name',
|
||||
'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 inserted': 'neuer Datensatz eingefügt',
|
||||
'New simple application': 'New simple application',
|
||||
'next 100 rows': 'nächsten 100 Zeilen',
|
||||
'Next Edit Point': 'nächster Bearbeitungsschritt',
|
||||
'new record inserted': 'neuer Datensatz eingef?gt',
|
||||
'New simple application': 'Neue einfache Anwendung',
|
||||
'next 100 rows': 'n?chsten 100 Zeilen',
|
||||
'Next Edit Point': 'n?chster Bearbeitungsschritt',
|
||||
'NO': 'NEIN',
|
||||
'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 provide app url:': 'oder geben Sie eine Anwendungs-URL an:',
|
||||
'or provide application url:': 'oder geben Sie eine Anwendungs-URL an:',
|
||||
'Origin': 'Herkunft',
|
||||
'Original/Translation': 'Original/Übersetzung',
|
||||
'Overwrite installed app': 'installierte Anwendungen überschreiben',
|
||||
'Original/Translation': 'Original/?bersetzung',
|
||||
'Overwrite installed app': 'installierte Anwendungen ?berschreiben',
|
||||
'Pack all': 'verpacke alles',
|
||||
'Pack compiled': 'Verpacke kompiliert',
|
||||
'Pack custom': 'Verpacke individuell',
|
||||
'pack plugin': 'Plugin verpacken',
|
||||
'Password': 'Passwort',
|
||||
'Peeking at file': 'Dateiansicht',
|
||||
@@ -230,9 +250,10 @@
|
||||
'Plugin "%s" in application': 'Plugin "%s" in Anwendung',
|
||||
'plugins': 'plugins',
|
||||
'Plugins': 'Plugins',
|
||||
'Powered by': 'Unterstützt von',
|
||||
'Powered by': 'Unterst?tzt von',
|
||||
'previous 100 rows': 'vorherige 100 zeilen',
|
||||
'Previous Edit Point': 'vorheriger Bearbeitungsschritt',
|
||||
'Project Progress': 'Projekt Fortschritt',
|
||||
'Query:': 'Abfrage:',
|
||||
'record': 'Datensatz',
|
||||
'record does not exist': 'Datensatz existiert nicht',
|
||||
@@ -240,33 +261,38 @@
|
||||
'Record ID': 'Datensatz ID',
|
||||
'register': 'Registrierung',
|
||||
'Register': 'registrieren',
|
||||
'Registration key': 'Registrierungsschlüssel',
|
||||
'Reload routes': 'Reload routes',
|
||||
'Remove compiled': 'kompilat gelöscht',
|
||||
'Reset Password key': 'Passwortschlüssel zurücksetzen',
|
||||
'Registration key': 'Registrierungsschl?ssel',
|
||||
'reload': 'Neu laden',
|
||||
'Reload routes': 'Routen neu laden',
|
||||
'Remove compiled': 'Bytecode l?schen',
|
||||
'request': 'request',
|
||||
'Reset Password key': 'Passwortschl?ssel zur?cksetzen',
|
||||
'Resolve Conflict file': 'bereinige Konflikt-Datei',
|
||||
'response': 'Antwort',
|
||||
'restore': 'wiederherstellen',
|
||||
'revert': 'zurückkehren',
|
||||
'revert': 'zur?ckkehren',
|
||||
'Role': 'Rolle',
|
||||
'Rows in table': 'Zeilen in Tabelle',
|
||||
'Rows selected': 'Zeilen ausgewählt',
|
||||
'Running on %s': 'Running on %s',
|
||||
'Rows selected': 'Zeilen ausgew?hlt',
|
||||
'Running on %s': 'L?uft auf %s',
|
||||
'save': 'sichern',
|
||||
'Save via Ajax': 'via Ajax sichern',
|
||||
'Saved file hash:': 'Gespeicherter Datei-Hash:',
|
||||
'selected': 'ausgewählt(e)',
|
||||
'session expired': 'Sitzung Abgelaufen',
|
||||
'Select Files to Package': 'Dateien zum Paketieren w?hlen',
|
||||
'selected': 'ausgew?hlt(e)',
|
||||
'session': 'Sitzung',
|
||||
'session expired': 'Sitzung abgelaufen',
|
||||
'shell': 'shell',
|
||||
'Site': 'Seite',
|
||||
'some files could not be removed': 'einige Dateien konnten nicht gelöscht werden',
|
||||
'Start wizard': 'start wizard',
|
||||
'some files could not be removed': 'einige Dateien konnten nicht gel?scht werden',
|
||||
'Start wizard': 'Assistent starten',
|
||||
'state': 'Status',
|
||||
'static': 'statische Dateien',
|
||||
'Static files': 'statische Dateien',
|
||||
'Stylesheet': 'Stylesheet',
|
||||
'Submit': 'Submit',
|
||||
'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 name': 'Tabellen Name',
|
||||
'test': 'Test',
|
||||
@@ -276,42 +302,45 @@
|
||||
'test_try': 'test_try',
|
||||
'Testing application': 'Teste die Anwendung',
|
||||
'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 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 "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': '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 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': '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 models': 'Keine Modelle vorhanden',
|
||||
'There are no modules': 'Keine Module vorhanden',
|
||||
'There are no plugins': 'There are no plugins',
|
||||
'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',
|
||||
'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.',
|
||||
'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',
|
||||
'Ticket': 'Ticket',
|
||||
'Timestamp': 'Timestamp',
|
||||
'Ticket ID': 'Ticket ID',
|
||||
'Timestamp': 'Zeitstempel',
|
||||
'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]',
|
||||
'translation strings for the application': 'Übersetzungs-Strings für die Anwendung',
|
||||
'Translation strings for the application': 'Translation strings for the application',
|
||||
'Traceback': 'Traceback',
|
||||
'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 something like': 'versuche so etwas wie',
|
||||
'Unable to check for upgrades': 'überprüfen von Upgrades nicht möglich',
|
||||
'unable to create application "%s"': 'erzeugen von Anwendung "%s" nicht möglich',
|
||||
'unable to delete file "%(filename)s"': 'löschen von Datein "%(filename)s" nicht möglich',
|
||||
'Unable to download': 'herunterladen nicht möglich',
|
||||
'Unable to download app': 'herunterladen der Anwendung nicht möglich',
|
||||
'unable to parse csv file': 'analysieren der cvs Datei nicht möglich',
|
||||
'unable to uninstall "%s"': 'deinstallieren von "%s" nicht möglich',
|
||||
'uncheck all': 'alles demarkieren',
|
||||
'Try the mobile interface': 'Try the mobile interface',
|
||||
'Unable to check for upgrades': '?berpr?fen von Upgrades nicht m?glich',
|
||||
'unable to create application "%s"': 'erzeugen von Anwendung "%s" nicht m?glich',
|
||||
'unable to delete file "%(filename)s"': 'l?schen von Datein "%(filename)s" nicht m?glich',
|
||||
'Unable to download': 'herunterladen nicht m?glich',
|
||||
'Unable to download app': 'herunterladen der Anwendung nicht m?glich',
|
||||
'unable to parse csv file': 'analysieren der cvs Datei nicht m?glich',
|
||||
'unable to uninstall "%s"': 'deinstallieren von "%s" nicht m?glich',
|
||||
'uncheck all': 'Selektionen entfernen',
|
||||
'Uninstall': 'deinstallieren',
|
||||
'update': 'aktualisieren',
|
||||
'update all languages': 'aktualisiere alle Sprachen',
|
||||
@@ -319,33 +348,35 @@
|
||||
'upgrade web2py now': 'jetzt web2py upgraden',
|
||||
'upload': 'upload',
|
||||
'Upload & install packed application': 'Verpackte Anwendung hochladen und installieren',
|
||||
'Upload a package:': 'Upload a package:',
|
||||
'Upload and install packed application': 'Upload and install packed application',
|
||||
'Upload a package:': 'Ein Packet hochladen:',
|
||||
'Upload and install packed application': 'Verpackte Anwendung hochladen und installieren',
|
||||
'upload application:': 'lade Anwendung hoch:',
|
||||
'Upload existing application': 'lade existierende Anwendung hoch',
|
||||
'upload file:': 'lade Datei hoch:',
|
||||
'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 an url:': 'Use an url:',
|
||||
'user': 'user',
|
||||
'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:': 'Verwende URL:',
|
||||
'user': 'Nutzer',
|
||||
'User ID': 'Benutzer ID',
|
||||
'variables': 'variables',
|
||||
'variables': 'Variablen',
|
||||
'Version': 'Version',
|
||||
'Version %s.%s.%s (%s) %s': 'Version %s.%s.%s (%s) %s',
|
||||
'versioning': 'Versionierung',
|
||||
'View': 'View',
|
||||
'view': 'View',
|
||||
'Views': 'Views',
|
||||
'views': 'Views',
|
||||
'Versioning': 'Versionierung',
|
||||
'View': 'Ansicht',
|
||||
'view': 'Ansicht',
|
||||
'Views': 'Ansichten',
|
||||
'views': 'Ansichten',
|
||||
'Web Framework': 'Web Framework',
|
||||
'web2py is up to date': 'web2py ist auf dem neuesten Stand',
|
||||
'web2py Recent Tweets': 'neuste Tweets von web2py',
|
||||
'Welcome %s': 'Willkommen %s',
|
||||
'Welcome to web2py': 'Willkommen zu web2py',
|
||||
'Which called the function': 'Which called the function',
|
||||
'Wrap with Abbreviation': 'mit Kürzel einhüllen',
|
||||
'Which called the function': 'welche die Funktion aufrief',
|
||||
'Wrap with Abbreviation': 'mit K?rzel einh?llen',
|
||||
'xml': 'xml',
|
||||
'YES': 'JA',
|
||||
'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 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 visited the url': 'Sie besuchten die URL',
|
||||
}
|
||||
|
||||
@@ -3,154 +3,28 @@
|
||||
'!langcode!': 'es',
|
||||
'!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',
|
||||
'%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} 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")',
|
||||
'@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',
|
||||
'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',
|
||||
'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 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': 'Additional code for your application',
|
||||
'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 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:': ' y renombrelo:',
|
||||
'appadmin': 'appadmin',
|
||||
@@ -158,47 +32,115 @@
|
||||
'application "%s" uninstalled': 'aplicación "%s" desinstalada',
|
||||
'application compiled': 'aplicación compilada',
|
||||
'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',
|
||||
'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',
|
||||
'breakpoint': 'breakpoint',
|
||||
'breakpoints': 'breakpoints',
|
||||
'browse': 'buscar',
|
||||
'cache': 'cache',
|
||||
'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 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 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 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 open': 'click to open',
|
||||
'Client IP': 'IP del Cliente',
|
||||
'code': 'código',
|
||||
'Code listing': 'Code listing',
|
||||
'collapse/expand all': 'collapse/expand all',
|
||||
'commit (mercurial)': 'commit (mercurial)',
|
||||
'Compile': 'compilar',
|
||||
'compiled application removed': 'aplicación compilada removida',
|
||||
'continue': 'continue',
|
||||
'Controllers': 'Controladores',
|
||||
'controllers': 'controladores',
|
||||
'Count': 'Count',
|
||||
'Create': 'crear',
|
||||
'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 simple application': 'Cree una nueva aplicación',
|
||||
'created by': 'creado por',
|
||||
'crontab': 'crontab',
|
||||
'Current request': 'Solicitud en curso',
|
||||
'Current response': 'Respuesta en curso',
|
||||
'Current session': 'Sesión en curso',
|
||||
'currently saved or': 'actualmente guardado o',
|
||||
'customize me!': 'Adaptame!',
|
||||
'data uploaded': 'datos subidos',
|
||||
'database': 'base de datos',
|
||||
'database %s select': 'selección en base de datos %s',
|
||||
'database administration': 'administración base de datos',
|
||||
'Date and Time': 'Fecha y Hora',
|
||||
'db': 'db',
|
||||
'Debug': 'Debug',
|
||||
'defines tables': 'define tablas',
|
||||
'Delete': 'Elimine',
|
||||
'delete': 'eliminar',
|
||||
'delete all checked': 'eliminar marcados',
|
||||
'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': 'DISEÑO',
|
||||
'Design for': 'Diseño para',
|
||||
'direction: ltr': 'direction: ltr',
|
||||
'docs': 'docs',
|
||||
'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 current record': 'Edite el registro actual',
|
||||
'Edit Profile': 'Editar Perfil',
|
||||
'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',
|
||||
'exposes': 'expone',
|
||||
'exposes:': 'exposes:',
|
||||
'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 because:': 'no es posible recargar el módulo por:',
|
||||
'File': 'File',
|
||||
'file "%(filename)s" created': 'archivo "%(filename)s" creado',
|
||||
'file "%(filename)s" deleted': 'archivo "%(filename)s" eliminado',
|
||||
'file "%(filename)s" uploaded': 'archivo "%(filename)s" subido',
|
||||
@@ -208,76 +150,211 @@
|
||||
'file does not exist': 'archivo no existe',
|
||||
'file saved on %(time)s': 'archivo guardado %(time)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',
|
||||
'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',
|
||||
'insert new': 'inserte nuevo',
|
||||
'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 State': 'Estado Interno',
|
||||
'Invalid action': 'Acción inválida',
|
||||
'Invalid email': 'Correo inválido',
|
||||
'invalid password': 'contraseña inválida',
|
||||
'Invalid Query': 'Consulta inválida',
|
||||
'invalid request': 'solicitud inválida',
|
||||
'invalid ticket': 'tiquete inválido',
|
||||
'Key bindings': 'Key bindings',
|
||||
'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 updated': 'lenguajes actualizados',
|
||||
'Last name': 'Apellido',
|
||||
'Last saved on:': 'Guardado en:',
|
||||
'License for': 'Licencia para',
|
||||
'loading...': 'cargando...',
|
||||
'Locals##debug': 'Locals',
|
||||
'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',
|
||||
'merge': 'combinar',
|
||||
'Models': 'Modelos',
|
||||
'models': 'modelos',
|
||||
'Modules': 'Módulos',
|
||||
'modules': 'módulos',
|
||||
'Name': 'Nombre',
|
||||
'new application "%s" created': 'nueva aplicación "%s" creada',
|
||||
'new plugin installed': 'nuevo plugin instalado',
|
||||
'New Record': 'Registro nuevo',
|
||||
'new record inserted': 'nuevo registro insertado',
|
||||
'next': 'next',
|
||||
'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',
|
||||
'or alternatively': 'or alternatively',
|
||||
'or import from csv file': 'o importar desde archivo CSV',
|
||||
'or provide app 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',
|
||||
'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',
|
||||
'Peeking at file': 'Visualizando archivo',
|
||||
'Please': 'Please',
|
||||
'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',
|
||||
'Private files': 'Private files',
|
||||
'private files': 'private files',
|
||||
'Query:': 'Consulta:',
|
||||
'record': 'registro',
|
||||
'record does not exist': 'el registro no existe',
|
||||
'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',
|
||||
'return': 'return',
|
||||
'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 file:': 'Save file:',
|
||||
'Save via Ajax': 'Save via Ajax',
|
||||
'Saved file hash:': 'Hash del archivo guardado:',
|
||||
'selected': 'seleccionado(s)',
|
||||
'session expired': 'sesión expirada',
|
||||
'Set Breakpoint on %s at line %s: %s': 'Set Breakpoint on %s at line %s: %s',
|
||||
'shell': 'shell',
|
||||
'Site': 'sitio',
|
||||
'some files could not be removed': 'algunos archivos no pudieron ser removidos',
|
||||
'Start searching': 'Start searching',
|
||||
'state': 'estado',
|
||||
'static': 'estáticos',
|
||||
'Static': 'Static',
|
||||
'Static files': 'Archivos estáticos',
|
||||
'step': 'step',
|
||||
'stop': 'stop',
|
||||
'submit': 'enviar',
|
||||
'successful': 'successful',
|
||||
'Sure you want to delete this object?': '¿Está seguro que desea eliminar este objeto?',
|
||||
'table': 'tabla',
|
||||
'Table name': 'Nombre de la tabla',
|
||||
'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': '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': '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',
|
||||
'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í',
|
||||
'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 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': 'Translation strings for the application',
|
||||
'try': 'intente',
|
||||
'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 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 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 uninstall "%s"': 'no es posible instalar "%s"',
|
||||
'unable to upgrade because "%s"': 'no es posible actualizar porque "%s"',
|
||||
'uncheck all': 'desmarcar todos',
|
||||
'Uninstall': 'desinstalar',
|
||||
'update': 'actualizar',
|
||||
'update all languages': 'actualizar todos los lenguajes',
|
||||
'Update:': 'Actualice:',
|
||||
'upgrade web2py now': 'actualize web2py ahora',
|
||||
'Upload': 'Upload',
|
||||
'Upload & install packed application': 'Suba e instale aplicación empaquetada',
|
||||
'upload application:': 'subir aplicación:',
|
||||
'Upload existing application': 'Suba esta aplicación',
|
||||
'upload file:': 'suba archivo:',
|
||||
'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',
|
||||
'Version': 'Versión',
|
||||
'versioning': 'versiones',
|
||||
'Versioning': 'Versioning',
|
||||
'view': 'vista',
|
||||
'Views': 'Vistas',
|
||||
'views': 'vistas',
|
||||
'web2py Recent Tweets': 'Tweets Recientes de web2py',
|
||||
'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',
|
||||
'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"',
|
||||
'%Y-%m-%d': '%d-%m-%Y',
|
||||
'%Y-%m-%d %H:%M:%S': '%d-%m-%Y %H:%M:%S',
|
||||
'%s %%{row} deleted': 'lignes %s supprimé',
|
||||
'%s %%{row} updated': 'lignes %s mis à jour',
|
||||
'(requires internet access)': '(requires internet access)',
|
||||
'%s %%{row} deleted': 'lignes %s supprimées',
|
||||
'%s %%{row} updated': 'lignes %s mises à jour',
|
||||
'(requires internet access)': '(nécessite un accès Internet)',
|
||||
'(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: 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. ',
|
||||
@@ -17,59 +17,59 @@
|
||||
'ATTENTION: you cannot edit the running application!': "ATTENTION: vous ne pouvez pas modifier l'application qui tourne!",
|
||||
'About': 'à propos',
|
||||
'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 language': 'Admin language',
|
||||
'Admin language': "Language de l'admin",
|
||||
'Administrator Password:': 'Mot de passe Administrateur:',
|
||||
'Application name:': 'Application name:',
|
||||
'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 plugin "%s"?': 'Etes-vous sûr de vouloir effacer le plugin "%s"?',
|
||||
'Are you sure you want to delete this object?': 'Are you sure you want to delete this object?',
|
||||
'Application name:': "Nom de l'application:",
|
||||
'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"?': 'Êtes-vous sûr de vouloir supprimer le plugin "%s"?',
|
||||
'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 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',
|
||||
'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:': 'Cannot compile: there are errors in your app:',
|
||||
'Change admin password': 'change admin password',
|
||||
'Check for upgrades': 'check for upgrades',
|
||||
'Cannot compile: there are errors in your app:': 'Ne peut pas compiler: il y a des erreurs dans votre application:',
|
||||
'Change admin password': 'Changer le mot de passe admin',
|
||||
'Check for upgrades': 'Vérifier les mises à jour',
|
||||
'Check to delete': 'Cocher pour supprimer',
|
||||
'Checking for upgrades...': 'Vérification des mises à jour ... ',
|
||||
'Clean': 'nettoyer',
|
||||
'Compile': 'compiler',
|
||||
'Controllers': 'Contrôleurs',
|
||||
'Create': 'create',
|
||||
'Create': 'Créer',
|
||||
'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 session': 'Session en cours',
|
||||
'Date and Time': 'Date et heure',
|
||||
'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:',
|
||||
'Deploy': 'deploy',
|
||||
'Deploy': 'Déployer',
|
||||
'Deploy on Google App Engine': 'Déployer sur Google App Engine',
|
||||
'EDIT': 'MODIFIER',
|
||||
'Edit': 'modifier',
|
||||
'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 file': 'Modifier le fichier',
|
||||
'Editing file "%s"': 'Modifier le fichier "% s" ',
|
||||
'Enterprise Web Framework': 'Enterprise Web Framework',
|
||||
'Error logs for "%(app)s"': 'Journal d\'erreurs pour "%(app)s"',
|
||||
'Errors': 'erreurs',
|
||||
'Exception instance attributes': 'Exception instance attributes',
|
||||
'Functions with no doctests will result in [passed] tests.': 'Des fonctions sans doctests entraînera tests [passed] .',
|
||||
'Exception instance attributes': "Attributs d'instance Exception",
|
||||
'Functions with no doctests will result in [passed] tests.': 'Des fonctions sans doctests entraîneront des tests [passed] .',
|
||||
'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',
|
||||
'Install': 'install',
|
||||
'Installed applications': 'Les applications installées',
|
||||
'Install': 'Installer',
|
||||
'Installed applications': 'Applications installées',
|
||||
'Internal State': 'État Interne',
|
||||
'Invalid Query': 'Requête 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',
|
||||
'Last saved on:': 'Dernière sauvegarde le:',
|
||||
'License for': 'Licence pour',
|
||||
@@ -79,13 +79,13 @@
|
||||
'Models': 'Modèles',
|
||||
'Modules': 'Modules',
|
||||
'NO': 'NON',
|
||||
'New Record': 'Nouvel Entrée',
|
||||
'New application wizard': 'New application wizard',
|
||||
'New simple application': 'New simple application',
|
||||
'New Record': 'Nouvelle Entrée',
|
||||
'New application wizard': 'Assistant nouvelle application',
|
||||
'New simple application': 'Nouvelle application simple',
|
||||
'No databases in this application': 'Aucune base de données dans cette application',
|
||||
'Original/Translation': 'Original / Traduction',
|
||||
'Overwrite installed app': 'overwrite installed app',
|
||||
'PAM authenticated user, cannot change password here': 'PAM authenticated user, cannot change password here',
|
||||
'Overwrite installed app': "Écraser l'application installée",
|
||||
'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 compiled': 'paquet compilé',
|
||||
'Peeking at file': 'Jeter un oeil au fichier',
|
||||
@@ -97,101 +97,101 @@
|
||||
'Resolve Conflict file': 'Résoudre les conflits de fichiers',
|
||||
'Rows in table': 'Lignes de la table',
|
||||
'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')",
|
||||
'Save': 'Save',
|
||||
"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': 'Enregistrer',
|
||||
'Saved file hash:': 'Hash du Fichier enregistré:',
|
||||
'Site': 'site',
|
||||
'Start wizard': 'start wizard',
|
||||
'Site': 'Site',
|
||||
'Start wizard': "Démarrer l'assistant",
|
||||
'Static files': 'Fichiers statiques',
|
||||
'Sure you want to delete this object?': 'Vous êtes sûr de vouloir supprimer cet objet? ',
|
||||
'TM': 'MD',
|
||||
'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 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 controllers': "Il n'existe pas de contrôleurs",
|
||||
'There are no models': "Il n'existe pas de modèles",
|
||||
'There are no modules': "Il n'existe pas de modules",
|
||||
'There are no plugins': 'There are no plugins',
|
||||
'There are no static files': "Il n'existe 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 views': "Il n'existe pas de vues",
|
||||
'These files are served without processing, your images go here': 'These files are served without processing, your images go here',
|
||||
'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': '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': "Les couches de présentation, les vues sont également appelées modples",
|
||||
'There are no controllers': "Il n'y a pas de contrôleurs",
|
||||
'There are no models': "Il n'y a pas de modèles",
|
||||
'There are no modules': "Il n'y a pas de modules",
|
||||
'There are no plugins': "Il n'y a pas de plugins",
|
||||
'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, seule la langue par défaut est prise en charge",
|
||||
'There are no views': "Il n'y a pas de vues",
|
||||
'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 ',
|
||||
'Ticket': 'Ticket',
|
||||
'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',
|
||||
'Unable to check for upgrades': 'Impossible de vérifier les mises à niveau',
|
||||
'Translation strings for the application': "Chaînes de traduction pour l'application",
|
||||
'Unable to check for upgrades': 'Impossible de vérifier les mises à jour',
|
||||
'Unable to download': 'Impossible de télécharger',
|
||||
'Unable to download app': 'Impossible de télécharger app',
|
||||
'Unable to download app because:': 'Unable to download app because:',
|
||||
'Unable to download because': 'Unable to download because',
|
||||
'Unable to download app': "Impossible de télécharger l'app",
|
||||
'Unable to download app because:': "Impossible de télécharger l'app car:",
|
||||
'Unable to download because': 'Impossible de télécharger car',
|
||||
'Uninstall': 'désinstaller',
|
||||
'Update:': 'Mise à jour:',
|
||||
'Upload & install packed application': 'Upload & install packed application',
|
||||
'Upload a package:': 'Upload a package:',
|
||||
'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 an url:': 'Use an url:',
|
||||
'Upload & install packed application': "Charger & installer l'application empaquetée",
|
||||
'Upload a package:': 'Charger un paquet:',
|
||||
'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 afin de construire des requêtes plus complexes. ',
|
||||
'Use an url:': 'Utiliser une url:',
|
||||
'Version': 'Version',
|
||||
'Views': 'Vues',
|
||||
'Web Framework': 'Web Framework',
|
||||
'Web Framework': 'Framework Web',
|
||||
'YES': 'OUI',
|
||||
'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 not supported on google app engine': 'admin désactivé car non pris 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",
|
||||
'administrative interface': 'administrative interface',
|
||||
'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ée car non prise en charge sur Google Apps engine',
|
||||
'admin disabled because unable to access password file': "admin désactivée car incapable d'accéder au fichier mot de passe",
|
||||
'administrative interface': "interface d'administration",
|
||||
'and rename it (required):': 'et renommez-la (obligatoire):',
|
||||
'and rename it:': 'et renommez-le:',
|
||||
'appadmin': 'appadmin',
|
||||
'appadmin is disabled because insecure channel': 'appadmin est désactivé parce que canal non sécurisé',
|
||||
'application "%s" uninstalled': 'application "%s" désinstallé',
|
||||
'application %(appname)s installed with md5sum: %(digest)s': 'application %(appname)s installed with md5sum: %(digest)s',
|
||||
'application "%s" uninstalled': 'application "%s" désinstallée',
|
||||
'application %(appname)s installed with md5sum: %(digest)s': 'application %(appname)s installée avec md5sum: %(digest)s',
|
||||
'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',
|
||||
'back': 'retour',
|
||||
'cache': 'cache',
|
||||
'cache, errors and sessions cleaned': 'cache, erreurs et sessions nettoyé',
|
||||
'cannot create file': 'ne peu pas créer de fichier',
|
||||
'cannot upload file "%(filename)s"': 'ne peu pas charger le fichier "%(filename)s"',
|
||||
'check all': 'tous vérifier ',
|
||||
'click to check for upgrades': 'Cliquez pour vérifier les mises à niveau',
|
||||
'cache, errors and sessions cleaned': 'cache, erreurs et sessions nettoyés',
|
||||
'cannot create file': 'ne peut pas créer de fichier',
|
||||
'cannot upload file "%(filename)s"': 'ne peut pas charger le fichier "%(filename)s"',
|
||||
'check all': 'tout vérifier ',
|
||||
'click to check for upgrades': 'Cliquez pour vérifier les mises jour',
|
||||
'code': 'code',
|
||||
'collapse/expand all': 'collapse/expand all',
|
||||
'compiled application removed': 'application compilée enlevé',
|
||||
'collapse/expand all': 'tout réduire/agrandir',
|
||||
'compiled application removed': 'application compilée enlevée',
|
||||
'controllers': 'contrôleurs',
|
||||
'create file with filename:': 'créer un fichier avec nom de fichier:',
|
||||
'create new application:': 'créer une nouvelle application:',
|
||||
'created by': 'créé par',
|
||||
'crontab': 'crontab',
|
||||
'currently running': 'currently running',
|
||||
'currently saved or': 'actuellement enregistrés ou',
|
||||
'currently running': 'tourne actuellement',
|
||||
'currently saved or': 'actuellement enregistré ou',
|
||||
'data uploaded': 'données chargées',
|
||||
'database': 'base de données',
|
||||
'database %s select': 'base de données %s sélectionner',
|
||||
'database administration': 'administration base de données',
|
||||
'db': 'db',
|
||||
'db': 'bdd',
|
||||
'defines tables': 'définit les tables',
|
||||
'delete': 'supprimer',
|
||||
'delete all checked': 'supprimer tout ce qui est cocher',
|
||||
'delete plugin': ' supprimer plugin',
|
||||
'delete all checked': 'supprimer tout ce qui est coché',
|
||||
'delete plugin': ' supprimer le plugin',
|
||||
'design': 'conception',
|
||||
'direction: ltr': 'direction: ltr',
|
||||
'docs': 'docs',
|
||||
'done!': 'fait!',
|
||||
'download layouts': 'download layouts',
|
||||
'download plugins': 'download plugins',
|
||||
'download layouts': 'télécharger layouts',
|
||||
'download plugins': 'télécharger plugins',
|
||||
'edit controller': 'modifier contrôleur',
|
||||
'edit views:': 'edit views:',
|
||||
'export as csv file': 'exportation au format CSV',
|
||||
'edit views:': 'modifier vues:',
|
||||
'export as csv file': 'export au format CSV',
|
||||
'exposes': 'expose',
|
||||
'exposes:': 'exposes:',
|
||||
'exposes:': 'expose:',
|
||||
'extends': 'étend',
|
||||
'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" deleted': 'fichier "%(filename)s" supprimé',
|
||||
'file "%(filename)s" uploaded': 'fichier "%(filename)s" chargé',
|
||||
@@ -200,7 +200,7 @@
|
||||
'file does not exist': "fichier n'existe pas",
|
||||
'file saved on %(time)s': 'fichier enregistré le %(time)s',
|
||||
'file saved on %s': 'fichier enregistré le %s',
|
||||
'filter': 'filter',
|
||||
'filter': 'filtre',
|
||||
'htmledit': 'edition html',
|
||||
'includes': 'inclus',
|
||||
'index': 'index',
|
||||
@@ -219,14 +219,14 @@
|
||||
'modules': 'modules',
|
||||
'new application "%s" created': 'nouvelle application "%s" créée',
|
||||
'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',
|
||||
'no match': 'no match',
|
||||
'no match': 'aucune correspondance',
|
||||
'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:",
|
||||
'pack plugin': 'paquet plugin',
|
||||
'password changed': 'password changed',
|
||||
'password changed': 'mot de passe modifié',
|
||||
'plugin "%(plugin)s" deleted': 'plugin "%(plugin)s" supprimé',
|
||||
'plugins': 'plugins',
|
||||
'previous 100 rows': '100 lignes précédentes',
|
||||
@@ -245,9 +245,9 @@
|
||||
'submit': 'envoyer',
|
||||
'table': 'table',
|
||||
'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 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 presentations layer, views are also known as templates': 'la couche des présentations, les vues sont également connus en tant que modèles',
|
||||
'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éfinir les tables et ensembles de la base de données',
|
||||
'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',
|
||||
'to previous version.': 'à la version précédente.',
|
||||
'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 parse csv file': "impossible d'analyser les fichiers CSV",
|
||||
'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',
|
||||
'update': 'mettre à jour',
|
||||
'update all languages': 'mettre à jour toutes les langues',
|
||||
'upgrade now': 'upgrade now',
|
||||
'upgrade web2py now': 'upgrade web2py now',
|
||||
'upload': 'upload',
|
||||
'upgrade now': 'mettre à jour maintenant',
|
||||
'upgrade web2py now': 'mettre à jour web2py maintenant',
|
||||
'upload': 'charger',
|
||||
'upload application:': "charger l'application:",
|
||||
'upload file:': 'charger le fichier:',
|
||||
'upload plugin file:': 'charger fichier plugin:',
|
||||
'user': 'user',
|
||||
'user': 'utilisateur',
|
||||
'variables': 'variables',
|
||||
'versioning': 'versioning',
|
||||
'view': 'vue',
|
||||
'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 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',
|
||||
'administrative interface': 'administrative interface',
|
||||
'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:': 'e rinominala:',
|
||||
'appadmin': 'appadmin ',
|
||||
@@ -144,8 +145,10 @@
|
||||
'Get from URL:': 'Get from URL:',
|
||||
'Git Pull': 'Git Pull',
|
||||
'Git Push': 'Git Push',
|
||||
'graph model': 'graph model',
|
||||
'Hello World': 'Salve Mondo',
|
||||
'Help': 'aiuto',
|
||||
'Hide/Show Translated strings': 'Hide/Show Translated strings',
|
||||
'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.',
|
||||
'Import/Export': 'Importa/Esporta',
|
||||
@@ -195,6 +198,8 @@
|
||||
'NO': 'NO',
|
||||
'No databases in this application': 'Nessun database presente in questa applicazione',
|
||||
'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 provide app url:': "oppure fornisci url dell'applicazione:",
|
||||
'Original/Translation': 'Originale/Traduzione',
|
||||
@@ -219,6 +224,7 @@
|
||||
'record does not exist': 'il record non esiste',
|
||||
'record id': 'ID del record',
|
||||
'register': 'registrazione',
|
||||
'reload': 'reload',
|
||||
'Remove compiled': 'rimozione codice compilato',
|
||||
'request': 'request',
|
||||
'Resolve Conflict file': 'File di risoluzione conflitto',
|
||||
@@ -242,6 +248,7 @@
|
||||
'Start wizard': 'start wizard',
|
||||
'state': 'stato',
|
||||
'static': 'statico',
|
||||
'Static': 'Static',
|
||||
'Static files': 'Files statici',
|
||||
'Stylesheet': 'Foglio di stile (stylesheet)',
|
||||
'submit': 'invia',
|
||||
@@ -261,6 +268,7 @@
|
||||
'There are no models': 'Non ci sono modelli',
|
||||
'There are no modules': 'Non ci sono moduli',
|
||||
'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 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")',
|
||||
@@ -280,6 +288,7 @@
|
||||
'Translation strings for the application': 'Translation strings for the application',
|
||||
'try': 'prova',
|
||||
'try something like': 'prova qualcosa come',
|
||||
'Try the mobile interface': 'Try the mobile interface',
|
||||
'try view': 'try view',
|
||||
'Unable to check for upgrades': 'Impossibile controllare presenza di aggiornamenti',
|
||||
'unable to create application "%s"': 'impossibile creare applicazione "%s"',
|
||||
@@ -298,6 +307,7 @@
|
||||
'Update:': 'Aggiorna:',
|
||||
'upgrade web2py now': 'upgrade web2py now',
|
||||
'upload': 'upload',
|
||||
'Upload': 'Upload',
|
||||
'Upload & install packed application': 'Carica ed installa pacchetto con applicazione',
|
||||
'Upload a package:': 'Upload a package:',
|
||||
'Upload and install packed application': 'Upload and install packed application',
|
||||
@@ -308,6 +318,7 @@
|
||||
'Use an url:': 'Use an url:',
|
||||
'variables': 'variables',
|
||||
'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',
|
||||
'versioning': 'sistema di versioni',
|
||||
'Versioning': 'Versioning',
|
||||
|
||||
@@ -92,7 +92,7 @@
|
||||
'Database': 'База данных',
|
||||
'database': 'база данных',
|
||||
'database %s select': 'Выбор базы данных %s ',
|
||||
'database administration': 'администраторирование базы данных',
|
||||
'database administration': 'администрирование базы данных',
|
||||
'Date and Time': 'Дата и время',
|
||||
'db': 'бд',
|
||||
'DB Model': 'Модель БД',
|
||||
@@ -134,7 +134,7 @@
|
||||
'Editing Language file': 'Правка языкового файла',
|
||||
'Editing Plural Forms File': 'Editing Plural Forms File',
|
||||
'Enterprise Web Framework': 'Enterprise Web Framework',
|
||||
'Error logs for "%(app)s"': 'Журнал ошибок для "%(app)"',
|
||||
'Error logs for "%(app)s"': 'Журнал ошибок для "%(app)s"',
|
||||
'Error snapshot': 'Error snapshot',
|
||||
'Error ticket': 'Error ticket',
|
||||
'Errors': 'Ошибка',
|
||||
|
||||
212
applications/admin/languages/sr-cr.py
Normal file
212
applications/admin/languages/sr-cr.py
Normal file
@@ -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',
|
||||
}
|
||||
212
applications/admin/languages/sr-lt.py
Normal file
212
applications/admin/languages/sr-lt.py
Normal file
@@ -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': 'Додаток не існує, або ви не авторизовані',
|
||||
'appadmin': 'Aдм.панель',
|
||||
'appadmin is disabled because insecure channel': "адмін.панель відключено через використання ненадійного каналу зв'язку",
|
||||
'Application': 'Додаток (Application)',
|
||||
'application "%s" uninstalled': 'додаток "%s" вилучено',
|
||||
'application %(appname)s installed with md5sum: %(digest)s': 'додаток %(appname)s встановлено з md5sum: %(digest)s',
|
||||
'Application cannot be generated in demo mode': 'В демо-режимі генерувати додатки не можна',
|
||||
'application compiled': 'додаток скомпільовано',
|
||||
'Application exists already': 'Додаток вже існує',
|
||||
'application is compiled and cannot be designed': 'додаток скомпільований. налаштування змінювати не можна',
|
||||
'Application name:': 'Назва додатку:',
|
||||
'are not used': 'не використовуються',
|
||||
@@ -160,6 +162,7 @@
|
||||
'Error snapshot': 'Розгорнутий знімок стану (Error snapshot)',
|
||||
'Error ticket': 'Позначка (ticket) про помилку',
|
||||
'Errors': 'Помилки',
|
||||
'Errors in form, please check it out.': 'Помилка у формі, будь-ласка перевірте її.',
|
||||
'Exception %(extype)s: %(exvalue)s': 'Виключення %(extype)s: %(exvalue)s',
|
||||
'Exception %s': 'Виключення %s',
|
||||
'Exception instance attributes': 'Атрибути примірника класу Exception (виключення)',
|
||||
@@ -388,6 +391,7 @@
|
||||
'There are no models': 'Моделей, наразі, нема',
|
||||
'There are no modules': 'Модулів поки що нема',
|
||||
'There are no plugins': 'Жодної втулки, наразі, не встановлено',
|
||||
'There are no private files': 'Приватних файлів поки що нема',
|
||||
'There are no static files': 'Статичних файлів, наразі, нема',
|
||||
'There are no translators': 'Перекладів нема',
|
||||
'There are no translators, only default language is supported': 'Перекладів нема, підтримується тільки мова оригіналу',
|
||||
@@ -418,6 +422,7 @@
|
||||
'Traceback': 'Стек викликів (Traceback)',
|
||||
'Translation strings for the application': 'Пари рядків <оригінал>:<переклад> для вибраної мови',
|
||||
'try something like': 'спробуйте щось схоже на',
|
||||
'Try the mobile interface': 'Спробуйте мобільний інтерфейс',
|
||||
'try view': 'дивитись результат',
|
||||
'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]), щоб запустити їх на виконання.',
|
||||
@@ -463,7 +468,7 @@
|
||||
'Views': 'Відображення (Views)',
|
||||
'views': 'відображення',
|
||||
'WARNING:': 'ПОПЕРЕДЖЕННЯ:',
|
||||
'Web Framework': 'Web Framework',
|
||||
'Web Framework': 'Веб-каркас (Web Framework)',
|
||||
'web2py apps to deploy': 'Готові до розгортання додатки web2py',
|
||||
'web2py Debugger': 'Ладнач web2py',
|
||||
'web2py downgrade': 'повернення на попередню версію web2py',
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
EXPIRATION = 60 * 60 # logout after 60 minutes of inactivity
|
||||
CHECK_VERSION = True
|
||||
WEB2PY_URL = 'http://web2py.com'
|
||||
WEB2PY_VERSION_URL = WEB2PY_URL+'/examples/default/version'
|
||||
WEB2PY_VERSION_URL = WEB2PY_URL + '/examples/default/version'
|
||||
|
||||
###########################################################################
|
||||
# Preferences for EditArea
|
||||
@@ -13,15 +13,15 @@ TEXT_EDITOR = 'codemirror' or 'ace' or 'edit_area' or 'amy'
|
||||
|
||||
## Editor Color scheme (only for ace)
|
||||
TEXT_EDITOR_THEME = (
|
||||
"chrome", "clouds", "clouds_midnight", "cobalt", "crimson_editor", "dawn",
|
||||
"chrome", "clouds", "clouds_midnight", "cobalt", "crimson_editor", "dawn",
|
||||
"dreamweaver", "eclipse", "idle_fingers", "kr_theme", "merbivore",
|
||||
"merbivore_soft", "monokai", "mono_industrial", "pastel_on_dark",
|
||||
"merbivore_soft", "monokai", "mono_industrial", "pastel_on_dark",
|
||||
"solarized_dark", "solarized_light", "textmate", "tomorrow",
|
||||
"tomorrow_night", "tomorrow_night_blue", "tomorrow_night_bright",
|
||||
"tomorrow_night_eighties", "twilight", "vibrant_ink")[0]
|
||||
|
||||
## Editor Keyboard bindings (only for ace and codemirror)
|
||||
TEXT_EDITOR_KEYBINDING = '' # 'emacs' or 'vi'
|
||||
TEXT_EDITOR_KEYBINDING = '' # 'emacs' or 'vi'
|
||||
|
||||
### edit_area only
|
||||
# The default font size, measured in 'points'. The value must be an integer > 0
|
||||
@@ -59,9 +59,9 @@ GAE_APPCFG = os.path.abspath(os.path.join('/usr/local/bin/appcfg.py'))
|
||||
|
||||
# To use web2py as a teaching tool, set MULTI_USER_MODE to True
|
||||
MULTI_USER_MODE = False
|
||||
EMAIL_SERVER = 'localhost'
|
||||
EMAIL_SENDER = 'professor@example.com'
|
||||
EMAIL_LOGIN = None
|
||||
EMAIL_SERVER = 'localhost'
|
||||
EMAIL_SENDER = 'professor@example.com'
|
||||
EMAIL_LOGIN = None
|
||||
|
||||
# configurable twitterbox, set to None/False to suppress
|
||||
TWITTER_HASH = "web2py"
|
||||
@@ -78,5 +78,3 @@ PLUGINS_APP = 'http://web2py.com/plugins'
|
||||
# set the language
|
||||
if 'adminLanguage' in request.cookies and not (request.cookies['adminLanguage'] is None):
|
||||
T.force(request.cookies['adminLanguage'].value)
|
||||
|
||||
|
||||
|
||||
@@ -28,5 +28,3 @@ from gluon.languages import findT, update_all_languages
|
||||
from gluon.myregex import *
|
||||
from gluon.restricted import *
|
||||
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.admin import apath
|
||||
from gluon.fileutils import read_file
|
||||
@@ -24,7 +26,8 @@ elif not request.is_local and not DEMO_MODE:
|
||||
try:
|
||||
_config = {}
|
||||
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']:
|
||||
raise HTTP(200, T('admin disabled because no admin password'))
|
||||
@@ -38,7 +41,8 @@ except IOError:
|
||||
raise HTTP(200,
|
||||
T('admin disabled because not supported on google app engine'))
|
||||
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):
|
||||
@@ -50,7 +54,7 @@ def verify_password(password):
|
||||
elif _config['password'].startswith('pam_user:'):
|
||||
session.pam_user = _config['password'][9:].strip()
|
||||
import gluon.contrib.pam
|
||||
return gluon.contrib.pam.authenticate(session.pam_user,password)
|
||||
return gluon.contrib.pam.authenticate(session.pam_user, password)
|
||||
else:
|
||||
return _config['password'] == CRYPT()(password)[0]
|
||||
|
||||
@@ -63,6 +67,7 @@ deny_file = os.path.join(request.folder, 'private', 'hosts.deny')
|
||||
allowed_number_of_attempts = 5
|
||||
expiration_failed_logins = 3600
|
||||
|
||||
|
||||
def read_hosts_deny():
|
||||
import datetime
|
||||
hosts = {}
|
||||
@@ -75,7 +80,7 @@ def read_hosts_deny():
|
||||
continue
|
||||
fields = line.strip().split()
|
||||
if len(fields) > 2:
|
||||
hosts[fields[0].strip()] = ( # ip
|
||||
hosts[fields[0].strip()] = ( # ip
|
||||
int(fields[1].strip()), # n attemps
|
||||
int(fields[2].strip()) # last attempts
|
||||
)
|
||||
@@ -83,28 +88,30 @@ def read_hosts_deny():
|
||||
f.close()
|
||||
return hosts
|
||||
|
||||
|
||||
def write_hosts_deny(denied_hosts):
|
||||
f = open(deny_file, 'w')
|
||||
portalocker.lock(f, portalocker.LOCK_EX)
|
||||
for key, val in denied_hosts.items():
|
||||
if time.time()-val[1] < expiration_failed_logins:
|
||||
if time.time() - val[1] < expiration_failed_logins:
|
||||
line = '%s %s %s\n' % (key, val[0], val[1])
|
||||
f.write(line)
|
||||
portalocker.unlock(f)
|
||||
f.close()
|
||||
|
||||
|
||||
def login_record(success=True):
|
||||
denied_hosts = read_hosts_deny()
|
||||
val = (0,0)
|
||||
val = (0, 0)
|
||||
if success and request.client in denied_hosts:
|
||||
del denied_hosts[request.client]
|
||||
elif not success and not request.is_local:
|
||||
val = denied_hosts.get(request.client,(0,0))
|
||||
if time.time()-val[1]<expiration_failed_logins \
|
||||
val = denied_hosts.get(request.client, (0, 0))
|
||||
if time.time() - val[1] < expiration_failed_logins \
|
||||
and val[0] >= allowed_number_of_attempts:
|
||||
return val[0] # locked out
|
||||
time.sleep(2**val[0])
|
||||
val = (val[0]+1,int(time.time()))
|
||||
return val[0] # locked out
|
||||
time.sleep(2 ** val[0])
|
||||
val = (val[0] + 1, int(time.time()))
|
||||
denied_hosts[request.client] = val
|
||||
write_hosts_deny(denied_hosts)
|
||||
return val[0]
|
||||
@@ -124,9 +131,9 @@ if session.authorized:
|
||||
session.last_time = t0
|
||||
|
||||
|
||||
if request.vars.is_mobile in ('true','false','auto'):
|
||||
if request.vars.is_mobile in ('true', 'false', 'auto'):
|
||||
session.is_mobile = request.vars.is_mobile or 'auto'
|
||||
if request.controller=='default' and request.function=='index':
|
||||
if request.controller == 'default' and request.function == 'index':
|
||||
if not request.vars.is_mobile:
|
||||
session.is_mobile = 'auto'
|
||||
if not session.is_mobile:
|
||||
@@ -141,14 +148,14 @@ else:
|
||||
if request.controller == "webservices":
|
||||
basic = request.env.http_authorization
|
||||
if not basic or not basic[:6].lower() == 'basic ':
|
||||
raise HTTP(401,"Wrong credentials")
|
||||
raise HTTP(401, "Wrong credentials")
|
||||
(username, password) = base64.b64decode(basic[6:]).split(':')
|
||||
if not verify_password(password) or MULTI_USER_MODE:
|
||||
time.sleep(10)
|
||||
raise HTTP(403,"Not authorized")
|
||||
raise HTTP(403, "Not authorized")
|
||||
elif not session.authorized and not \
|
||||
(request.controller+'/'+request.function in
|
||||
('default/index','default/user','plugin_jqmobile/index','plugin_jqmobile/about')):
|
||||
(request.controller + '/' + request.function in
|
||||
('default/index', 'default/user', 'plugin_jqmobile/index', 'plugin_jqmobile/about')):
|
||||
|
||||
if request.env.query_string:
|
||||
query_string = '?' + request.env.query_string
|
||||
@@ -165,7 +172,6 @@ elif session.authorized and \
|
||||
request.function == 'index':
|
||||
redirect(URL(request.application, 'default', 'site'))
|
||||
|
||||
if request.controller=='appadmin' and DEMO_MODE:
|
||||
if request.controller == 'appadmin' and DEMO_MODE:
|
||||
session.flash = 'Appadmin disabled in demo mode'
|
||||
redirect(URL('default','sites'))
|
||||
|
||||
redirect(URL('default', 'sites'))
|
||||
|
||||
@@ -2,37 +2,39 @@
|
||||
|
||||
import os
|
||||
|
||||
def A_button(*a,**b):
|
||||
|
||||
def A_button(*a, **b):
|
||||
b['_data-role'] = 'button'
|
||||
b['_data-inline'] = 'true'
|
||||
return A(*a,**b)
|
||||
return A(*a, **b)
|
||||
|
||||
def button(href, label):
|
||||
if is_mobile:
|
||||
ret = A_button(SPAN(label), _href=href)
|
||||
else:
|
||||
ret = A(SPAN(label),_class='button',_href=href)
|
||||
ret = A(SPAN(label), _class='button btn', _href=href)
|
||||
return ret
|
||||
|
||||
def button_enable(href, app):
|
||||
if os.path.exists(os.path.join(apath(app,r=request),'DISABLED')):
|
||||
label = SPAN(T('Enable'),_style='color:red')
|
||||
if os.path.exists(os.path.join(apath(app, r=request), 'DISABLED')):
|
||||
label = SPAN(T('Enable'), _style='color:red')
|
||||
else:
|
||||
label = SPAN(T('Disable'),_style='color:green')
|
||||
id = 'enable_'+app
|
||||
return A(label,_class='button',_id=id,callback=href,target=id)
|
||||
label = SPAN(T('Disable'), _style='color:green')
|
||||
id = 'enable_' + app
|
||||
return A(label, _class='button btn', _id=id, callback=href, target=id)
|
||||
|
||||
def sp_button(href, label):
|
||||
if request.user_agent().is_mobile:
|
||||
ret = A_button(SPAN(label), _href=href)
|
||||
else:
|
||||
ret = A(SPAN(label),_class='button special',_href=href)
|
||||
ret = A(SPAN(label), _class='button special btn btn-inverse', _href=href)
|
||||
return ret
|
||||
|
||||
def helpicon():
|
||||
return IMG(_src=URL('static', 'images/help.png'), _alt='help')
|
||||
|
||||
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,37 +4,39 @@
|
||||
if MULTI_USER_MODE:
|
||||
db = DAL('sqlite://storage.sqlite') # if not, use SQLite or other DB
|
||||
from gluon.tools import *
|
||||
auth = Auth(globals(),db) # authentication/authorization
|
||||
crud = Crud(globals(),db) # for CRUD helpers using auth
|
||||
service = Service(globals()) # for json, xml, jsonrpc, xmlrpc, amfrpc
|
||||
auth = Auth(
|
||||
globals(), db) # authentication/authorization
|
||||
crud = Crud(
|
||||
globals(), db) # for CRUD helpers using auth
|
||||
service = Service(
|
||||
globals()) # for json, xml, jsonrpc, xmlrpc, amfrpc
|
||||
plugins = PluginManager()
|
||||
|
||||
mail = auth.settings.mailer
|
||||
mail.settings.server = EMAIL_SERVER
|
||||
mail.settings.sender = EMAIL_SENDER
|
||||
mail.settings.login = EMAIL_LOGIN
|
||||
mail.settings.login = EMAIL_LOGIN
|
||||
|
||||
auth.settings.extra_fields['auth_user'] = \
|
||||
[Field('is_manager','boolean',default=False,writable=False)]
|
||||
[Field('is_manager', 'boolean', default=False, writable=False)]
|
||||
auth.define_tables() # creates all needed tables
|
||||
auth.settings.registration_requires_verification = False
|
||||
auth.settings.registration_requires_approval = True
|
||||
auth.settings.reset_password_requires_verification = True
|
||||
|
||||
db.define_table('app',Field('name'),Field('owner',db.auth_user))
|
||||
db.define_table('app', Field('name'), Field('owner', db.auth_user))
|
||||
|
||||
if not session.authorized and MULTI_USER_MODE:
|
||||
if auth.user and not request.function=='user':
|
||||
if auth.user and not request.function == 'user':
|
||||
session.authorized = True
|
||||
elif not request.function=='user':
|
||||
redirect(URL('default','user/login'))
|
||||
elif not request.function == 'user':
|
||||
redirect(URL('default', 'user/login'))
|
||||
|
||||
|
||||
def is_manager():
|
||||
if not MULTI_USER_MODE:
|
||||
return True
|
||||
elif auth.user and (auth.user.id==1 or auth.user.is_manager):
|
||||
elif auth.user and (auth.user.id == 1 or auth.user.is_manager):
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
|
||||
|
||||
@@ -7,31 +7,31 @@ _c = request.controller
|
||||
_f = request.function
|
||||
response.title = '%s %s' % (_f, '/'.join(request.args))
|
||||
response.subtitle = 'admin'
|
||||
response.menu = [(T('Site'), _f == 'site', URL(_a,'default','site'))]
|
||||
response.menu = [(T('Site'), _f == 'site', URL(_a, 'default', 'site'))]
|
||||
|
||||
if request.vars.app or request.args:
|
||||
_t = request.vars.app or request.args[0]
|
||||
response.menu.append((T('Edit'), _c == 'default' and _f == 'design',
|
||||
URL(_a,'default','design',args=_t)))
|
||||
URL(_a, 'default', 'design', args=_t)))
|
||||
response.menu.append((T('About'), _c == 'default' and _f == 'about',
|
||||
URL(_a,'default','about',args=_t,)))
|
||||
URL(_a, 'default', 'about', args=_t,)))
|
||||
response.menu.append((T('Errors'), _c == 'default' and _f == 'errors',
|
||||
URL(_a,'default','errors',args=_t)))
|
||||
URL(_a, 'default', 'errors', args=_t)))
|
||||
response.menu.append((T('Versioning'),
|
||||
_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:
|
||||
response.menu = [(T('Login'), True, URL('site'))]
|
||||
else:
|
||||
response.menu.append((T('Logout'), False,
|
||||
URL(_a,'default',f='logout')))
|
||||
response.menu.append((T('Debug'), False,
|
||||
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'))
|
||||
|
||||
URL(_a, 'default', f='logout')))
|
||||
response.menu.append((T('Debug'), False,
|
||||
URL(_a, 'debug', 'interact')))
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
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/start.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/start.js'))
|
||||
|
||||
@@ -1,2 +1 @@
|
||||
|
||||
|
||||
|
||||
0
applications/admin/private/hosts.deny
Normal file
0
applications/admin/private/hosts.deny
Normal file
9
applications/admin/static/css/bootstrap-responsive.min.css
vendored
Normal file
9
applications/admin/static/css/bootstrap-responsive.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
9
applications/admin/static/css/bootstrap.min.css
vendored
Normal file
9
applications/admin/static/css/bootstrap.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
579
applications/admin/static/css/bootstrap_adapters.css
vendored
Normal file
579
applications/admin/static/css/bootstrap_adapters.css
vendored
Normal file
@@ -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;
|
||||
}
|
||||
}
|
||||
351
applications/admin/static/css/bootstrap_essentials.css
vendored
Normal file
351
applications/admin/static/css/bootstrap_essentials.css
vendored
Normal file
@@ -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;
|
||||
color: #3C3C3D;
|
||||
text-shadow: 1px 1px 0 #FFFFFF;
|
||||
background:#ECECEC;
|
||||
//background:#ECECEC;
|
||||
white-space: nowrap; overflow: visible;
|
||||
cursor: pointer; text-decoration: none;
|
||||
border: 1px solid #CACACA;
|
||||
@@ -1244,8 +1244,64 @@ color: #222;
|
||||
border-radius:2px;
|
||||
}
|
||||
.ie9 #query_panel {padding-bottom:2px;}
|
||||
|
||||
.error, .error a {color:red}
|
||||
.pluralsform thead td {font-weight:bold; font-size:1.2em; padding-bottom:5px}
|
||||
.pluralsform td {padding-left:5px}
|
||||
.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;
|
||||
}
|
||||
.header {
|
||||
// background:<fill here for header image>;
|
||||
/* background:<fill here for header image>; */
|
||||
}
|
||||
|
||||
|
||||
@@ -92,7 +92,7 @@ div.flash {
|
||||
position:fixed;
|
||||
padding:10px;
|
||||
top:48px;
|
||||
right:50px;
|
||||
right:250px;
|
||||
min-width:280px;
|
||||
opacity:0.95;
|
||||
margin:0px 0px 10px 10px;
|
||||
@@ -115,6 +115,10 @@ div.flash {
|
||||
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.error_wrapper {display:block}
|
||||
@@ -182,11 +186,12 @@ div.error {
|
||||
* will look better with the declarations below
|
||||
* 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_grid {width:100%}
|
||||
.web2py_grid table {width:100%}
|
||||
.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 {
|
||||
background-color:#EAEAEA;
|
||||
|
||||
232
applications/admin/static/css/web2py_bootstrap.css
Normal file
232
applications/admin/static/css/web2py_bootstrap.css
Normal file
@@ -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%;
|
||||
}
|
||||
}
|
||||
122
applications/admin/static/css/web2py_bootstrap_nojs.css
Normal file
122
applications/admin/static/css/web2py_bootstrap_nojs.css
Normal file
@@ -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;}
|
||||
|
||||
BIN
applications/admin/static/images/chat.png
Normal file
BIN
applications/admin/static/images/chat.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.6 KiB |
BIN
applications/admin/static/images/glyphicons-halflings-white.png
Normal file
BIN
applications/admin/static/images/glyphicons-halflings-white.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 8.6 KiB |
BIN
applications/admin/static/images/glyphicons-halflings.png
Normal file
BIN
applications/admin/static/images/glyphicons-halflings.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 12 KiB |
BIN
applications/admin/static/images/menu_responsive.png
Normal file
BIN
applications/admin/static/images/menu_responsive.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.5 KiB |
BIN
applications/admin/static/images/questions.png
Normal file
BIN
applications/admin/static/images/questions.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.9 KiB |
@@ -11,7 +11,7 @@ function prepareMultiPartPOST(data) {
|
||||
var reqdata = '--' + boundary + '\r\n';
|
||||
//console.log(data.length);
|
||||
for (var i=0;i < data.length;i++) {
|
||||
reqdata += 'content-disposition: form-data; name="';
|
||||
reqdata += 'content-disposition: form-data; name="';
|
||||
reqdata += data[i].Name + '"';
|
||||
reqdata += "\r\n\r\n" ;
|
||||
reqdata += data[i].Data;
|
||||
@@ -43,8 +43,9 @@ function doHighlight(highlight) {
|
||||
if (window.ace_editor) {
|
||||
window.ace_editor.gotoLine(highlight.lineno);
|
||||
} else if (window.mirror) {
|
||||
window.mirror.setSelection({line:highlight.lineno,ch:0},
|
||||
{line:highlight.end,ch:0});
|
||||
// Put the cursor at the offending line:
|
||||
window.mirror.setCursor({line:highlight.lineno-1,
|
||||
ch:highlight.offset+1});
|
||||
} else if (window.eamy) {
|
||||
// not implemented
|
||||
} else if (window.textarea) {
|
||||
@@ -56,11 +57,11 @@ function doClickSave() {
|
||||
var data = getData();
|
||||
var dataForPost = prepareMultiPartPOST(new Array(
|
||||
prepareDataForSave('data', data),
|
||||
prepareDataForSave('file_hash',
|
||||
prepareDataForSave('file_hash',
|
||||
jQuery("input[name='file_hash']").val()),
|
||||
prepareDataForSave('saved_on',
|
||||
prepareDataForSave('saved_on',
|
||||
jQuery("input[name='saved_on']").val()),
|
||||
prepareDataForSave('saved_on',
|
||||
prepareDataForSave('saved_on',
|
||||
jQuery("input[name='saved_on']").val()),
|
||||
prepareDataForSave('from_ajax','true')));
|
||||
// console.info(area.textarea.value);
|
||||
@@ -69,7 +70,7 @@ function doClickSave() {
|
||||
jQuery("input[name='saved_on']").val('saving now...')
|
||||
jQuery.ajax({
|
||||
type: "POST",
|
||||
contentType: 'multipart/form-data;boundary="'
|
||||
contentType: 'multipart/form-data;boundary="'
|
||||
+ dataForPost[1] + '"',
|
||||
url: self.location.href,
|
||||
dataType: "json",
|
||||
@@ -105,7 +106,7 @@ function doClickSave() {
|
||||
doHighlight(json.highlight);
|
||||
} else {
|
||||
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());
|
||||
var output = '<b>exposes:</b> ';
|
||||
@@ -148,8 +149,12 @@ function getSelectionRange() {
|
||||
return sel;
|
||||
}
|
||||
|
||||
function doToggleBreakpoint(filename, url) {
|
||||
var sel = getSelectionRange();
|
||||
function doToggleBreakpoint(filename, url, sel) {
|
||||
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(
|
||||
prepareDataForSave('filename', filename),
|
||||
prepareDataForSave('sel_start', sel["start"]),
|
||||
@@ -170,15 +175,26 @@ function doToggleBreakpoint(filename, url) {
|
||||
success: function(json,text,xhr){
|
||||
// show flash message (if any)
|
||||
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();
|
||||
try {
|
||||
if (json.error) {
|
||||
window.location.href=json.redirect;
|
||||
} else {
|
||||
// mark the breakpoint if ok=True
|
||||
// remove mark if ok=False
|
||||
// do nothing if ok = null
|
||||
if (json.ok==true && window.mirror) {
|
||||
// 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
|
||||
editor.setMarker(json.lineno-1, "%N%")
|
||||
} else {
|
||||
// do nothing if ok = null
|
||||
}
|
||||
// alert(json.ok + json.lineno);
|
||||
}
|
||||
} catch(e) { on_error(); }
|
||||
@@ -188,6 +204,43 @@ function doToggleBreakpoint(filename, url) {
|
||||
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) {
|
||||
jQuery.ajax({
|
||||
@@ -197,4 +250,3 @@ function keepalive(url) {
|
||||
success: function(){},
|
||||
error: function(x) { on_error(); } });
|
||||
}
|
||||
|
||||
|
||||
4
applications/admin/static/js/analytics.min.js
vendored
Normal file
4
applications/admin/static/js/analytics.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
6
applications/admin/static/js/bootstrap.min.js
vendored
Normal file
6
applications/admin/static/js/bootstrap.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
13
applications/admin/static/js/dd_belatedpng.js
Normal file
13
applications/admin/static/js/dd_belatedpng.js
Normal file
File diff suppressed because one or more lines are too long
60
applications/admin/static/js/jquery.flot.resize.js
Normal file
60
applications/admin/static/js/jquery.flot.resize.js
Normal file
@@ -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);
|
||||
8
applications/admin/static/js/jquery.js
vendored
8
applications/admin/static/js/jquery.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
44
applications/admin/static/js/share.js
Normal file
44
applications/admin/static/js/share.js
Normal file
@@ -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;
|
||||
} );
|
||||
});
|
||||
@@ -35,6 +35,7 @@ function web2py_ajax_init(target) {
|
||||
jQuery('.hidden', target).hide();
|
||||
jQuery('.error', target).hide().slideDown('slow');
|
||||
web2py_ajax_fields(target);
|
||||
web2py_show_if(target);
|
||||
};
|
||||
|
||||
function web2py_event_handlers() {
|
||||
@@ -44,18 +45,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();});
|
||||
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.ajaxSuccess(function(e, xhr) {
|
||||
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;
|
||||
};
|
||||
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() {
|
||||
var flash = jQuery('.flash');
|
||||
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_event_handlers();
|
||||
});
|
||||
@@ -91,8 +112,6 @@ function web2py_ajax_page(method, action, data, target) {
|
||||
'complete':function(xhr,text){
|
||||
var html=xhr.responseText;
|
||||
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);
|
||||
if(content=='prepend') t.prepend(html);
|
||||
else if(content=='append') t.append(html);
|
||||
@@ -100,17 +119,14 @@ function web2py_ajax_page(method, action, data, target) {
|
||||
web2py_trap_form(action,target);
|
||||
web2py_trap_link(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){
|
||||
jQuery(function(){
|
||||
var element = jQuery("#" + target).get(0);
|
||||
var jelement = jQuery("#" + target);
|
||||
var element = jelement.get(0);
|
||||
var statement = "jQuery('#" + target + "').get(0).reload();";
|
||||
element.reload = function (){
|
||||
// Continue if times is Infinity or
|
||||
@@ -119,6 +135,7 @@ function web2py_component(action, target, timeout, times){
|
||||
web2py_ajax_page('get', action, null, target);} }; // reload
|
||||
// Method to check timing limit
|
||||
element.reload_check = function (){
|
||||
if (jelement.hasClass('w2p_component_stop')) {clearInterval(this.timing);return false;}
|
||||
if (this.reload_counter == Infinity){return true;}
|
||||
else {
|
||||
if (!isNaN(this.reload_counter)){
|
||||
@@ -200,3 +217,26 @@ function web2py_validate_entropy(myfield, req_entropy) {
|
||||
if(!myfield.hasClass('entropy_check')) myfield.on('keyup', validator).on('keydown', validator).addClass('entropy_check');
|
||||
}
|
||||
|
||||
function web2py_show_if(target) {
|
||||
var triggers = {};
|
||||
var show_if = function () {
|
||||
var t = jQuery(this);
|
||||
var id = t.attr('id');
|
||||
t.attr('value', t.val());
|
||||
for(var k = 0; k < triggers[id].length; k++) {
|
||||
var dep = jQuery('#' + triggers[id][k], target);
|
||||
var tr = jQuery('#' + triggers[id][k] + '__row', target);
|
||||
if(t.is(dep.attr('data-show-if'))) tr.slideDown();
|
||||
else tr.hide();
|
||||
}
|
||||
};
|
||||
jQuery('[data-show-trigger]', target).each(function () {
|
||||
var name = jQuery(this).attr('data-show-trigger');
|
||||
if(!triggers[name]) triggers[name] = [];
|
||||
triggers[name].push(jQuery(this).attr('id'));
|
||||
});
|
||||
for(var name in triggers) {
|
||||
jQuery('#' + name, target).change(show_if).keyup(show_if);
|
||||
show_if.call(jQuery('#' + name, target));
|
||||
};
|
||||
}
|
||||
35
applications/admin/static/js/web2py_bootstrap.js
Normal file
35
applications/admin/static/js/web2py_bootstrap.js
Normal file
@@ -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');
|
||||
});
|
||||
@@ -2,7 +2,7 @@
|
||||
<script><!--
|
||||
jQuery(document).ready(function(){
|
||||
jQuery("table.sortable tbody tr").mouseover( function() {
|
||||
jQuery(this).addClass("highlight"); }).mouseout( function() {
|
||||
jQuery(this).addClass("highlight"); }).mouseout( function() {
|
||||
jQuery(this).removeClass("highlight"); });
|
||||
jQuery('table.sortable tbody tr:odd').addClass('odd');
|
||||
jQuery('table.sortable tbody tr:even').addClass('even');
|
||||
@@ -63,11 +63,11 @@
|
||||
<br/><br/>
|
||||
<h4>{{=T("%s selected", nrows)}}</h4>
|
||||
{{if start>0:}}{{=A(T('previous 100 rows'),_href=URL('select',args=request.args[0],vars=dict(start=start-100)),_class="btn")}}{{pass}}
|
||||
{{if stop<nrows:}}{{=A(T('next 100 rows'),_href=URL('select',args=request.args[0],vars=dict(start=start+100)),_class="btn")}}{{pass}}
|
||||
{{if stop<nrows:}}{{=A(T('next 100 rows'),_href=URL('select',args=request.args[0],vars=dict(start=start+100)),_class="btn")}}{{pass}}
|
||||
{{if rows:}}
|
||||
<div style="overflow: auto;" width="80%">
|
||||
{{linkto=URL('update',args=request.args[0])}}
|
||||
{{upload=URL('download',args=request.args[0])}}
|
||||
{{upload=URL('download',args=request.args[0])}}
|
||||
{{=SQLTABLE(rows,linkto,upload,orderby=True,_class='sortable')}}
|
||||
</div>
|
||||
{{pass}}
|
||||
@@ -75,7 +75,7 @@
|
||||
<a href="{{=URL('csv',args=request.args[0],vars=dict(query=query))}}" class="btn">{{=T("export as csv file")}}</a>
|
||||
{{=formcsv or ''}}
|
||||
|
||||
{{elif request.function=='insert':}}
|
||||
{{elif request.function=='insert':}}
|
||||
<h2>{{=T("Database")}} {{=A(request.args[0],_href=URL('index'))}}
|
||||
{{if hasattr(table,'_primarykey'):}}
|
||||
{{fieldname=table._primarykey[0]}}
|
||||
@@ -83,7 +83,7 @@
|
||||
{{tablename=request.args[1]}}
|
||||
{{cond = table[fieldname].type in ['string','text'] and '!=""' or '>0'}}
|
||||
{{=T("Table")}} {{=A(tablename,_href=URL('select',args=dbname,vars=dict(query='%s.%s.%s%s'%(dbname,tablename,fieldname,cond))))}}
|
||||
{{else:}}
|
||||
{{else:}}
|
||||
{{=T("Table")}} {{=A(request.args[1],_href=URL('select',args=request.args[0],vars=dict(query='%s.%s.id>0'%tuple(request.args[:2]))))}}
|
||||
{{pass}}
|
||||
</h2>
|
||||
@@ -95,7 +95,7 @@
|
||||
{{fieldname=request.vars.keys()[0]}}
|
||||
{{dbname=request.args[0]}}
|
||||
{{tablename=request.args[1]}}
|
||||
{{cond = table[fieldname].type in ['string','text'] and '!=""' or '>0'}}
|
||||
{{cond = table[fieldname].type in ['string','text'] and '!=""' or '>0'}}
|
||||
{{=T("Table")}} {{=A(tablename,_href=URL('select',args=dbname,vars=dict(query='%s.%s.%s%s'%(dbname,tablename,fieldname,cond))))}}
|
||||
{{=T("Record")}} {{=A('%s=%s'%request.vars.items()[0],_href=URL('update',args=request.args[:2],vars=request.vars))}}
|
||||
{{else:}}
|
||||
@@ -131,7 +131,7 @@
|
||||
dict(ratio=total['ratio'], hits=total['hits'], misses=total['misses']))}}
|
||||
</p>
|
||||
<p>
|
||||
{{=T("Size of cache:")}}
|
||||
{{=T("Size of cache:")}}
|
||||
{{if object_stats:}}
|
||||
{{=T.M("**%(items)s** %%{item(items)}, **%(bytes)s** %%{byte(bytes)}", dict(items=total['objects'], bytes=total['bytes']))}}
|
||||
{{if total['bytes'] > 524287:}}
|
||||
@@ -151,7 +151,7 @@
|
||||
</div>
|
||||
<br />
|
||||
{{pass}}
|
||||
|
||||
|
||||
<h4>{{=T("RAM")}}</h4>
|
||||
<p>{{=T.M("Number of entries: **%s**", ram['entries'])}}</p>
|
||||
{{if ram['entries'] > 0:}}
|
||||
@@ -179,16 +179,16 @@
|
||||
</div>
|
||||
<br />
|
||||
{{pass}}
|
||||
|
||||
|
||||
<h4>{{=T("DISK")}}</h4>
|
||||
<p>{{=T.M("Number of entries: **%s**", disk['entries'])}}</p>
|
||||
{{if disk['entries'] > 0:}}
|
||||
<p>
|
||||
{{=T.M("Hit Ratio: **%(ratio)s%%** (**%(hits)s** %%{hit(hits)} and **%(misses)s** %%{miss(misses)})",
|
||||
dict(ratio=disk['ratio'], hits=disk['hits'], misses=disk['misses']))}}
|
||||
dict(ratio=disk['ratio'], hits=disk['hits'], misses=disk['misses']))}}
|
||||
</p>
|
||||
<p>
|
||||
{{=T("Size of cache:")}}
|
||||
{{=T("Size of cache:")}}
|
||||
{{if object_stats:}}
|
||||
{{=T.M("**%(items)s** %%{item(items)}, **%(bytes)s** %%{byte(bytes)}", dict( items=disk['objects'], bytes=disk['bytes']))}}
|
||||
{{if disk['bytes'] > 524287:}}
|
||||
@@ -209,11 +209,11 @@
|
||||
<br />
|
||||
{{pass}}
|
||||
</div>
|
||||
|
||||
|
||||
<div class="list-header">
|
||||
<h3>{{=T("Manage Cache")}}</h3>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="content">
|
||||
<p>
|
||||
{{=form}}
|
||||
@@ -222,3 +222,64 @@
|
||||
</div>
|
||||
<div class="clear"></div>
|
||||
{{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}}
|
||||
|
||||
{{if request.function == 'auth_manage':}}
|
||||
<h2>{{=T('Manage Access Control')}}</h2>
|
||||
<ul class="nav nav-tabs">
|
||||
<li class="active"><a href="#users" data-toggle="tab">Users</a></li>
|
||||
<li><a href="#roles" data-toggle="tab">Roles</a></li>
|
||||
<li><a href="#permissions" data-toggle="tab">Permissions</a></li>
|
||||
</ul>
|
||||
|
||||
<div class="tab-content">
|
||||
<div class="tab-pane active" id="users">
|
||||
{{=LOAD(f='auth_manage.load', args=auth.settings.table_user_name,ajax=True)}}
|
||||
</div>
|
||||
<div class="tab-pane" id="roles">
|
||||
{{=LOAD(f='auth_manage.load', args=auth.settings.table_group_name,ajax=True)}}
|
||||
</div>
|
||||
<div class="tab-pane" id="permissions">
|
||||
{{=LOAD(f='auth_manage.load', args=auth.settings.table_permission_name,ajax=True)}}
|
||||
</div>
|
||||
</div>
|
||||
{{elif request.function == 'manage':}}
|
||||
<h2>{{=T('Manage Access Control')}}</h2>
|
||||
<ul class="nav nav-tabs">
|
||||
{{for k,tablename in enumerate(auth.db.tables):}}
|
||||
<li><a href="#table-{{=tablename}}" data-toggle="tab">{{=tablename}}</a></li>
|
||||
{{pass}}
|
||||
</ul>
|
||||
|
||||
<div class="tab-content">
|
||||
{{for tablename in auth.db.tables:}}
|
||||
<div class="tab-pane" id="table-{{=tablename}}">
|
||||
{{=LOAD(f='manage.load', args=tablename,ajax=True)}}
|
||||
</div>
|
||||
{{pass}}
|
||||
</div>
|
||||
{{pass}}
|
||||
|
||||
137
applications/admin/views/debug/breakpoints.html
Normal file
137
applications/admin/views/debug/breakpoints.html
Normal file
@@ -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 -->
|
||||
191
applications/admin/views/debug/interact.html
Normal file
191
applications/admin/views/debug/interact.html
Normal file
@@ -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'}}
|
||||
|
||||
{{block sectionclass}}about{{end}}
|
||||
|
||||
<!-- begin "about" block -->
|
||||
<h2>{{=T("About application")}} "{{=app}}"</h2>
|
||||
<h3>{{=T("About")}} {{=app}}</h3>
|
||||
<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>
|
||||
<p class="controls">{{=button(URL('edit/%s/LICENSE' % (app)), T('Edit'))}}</p>
|
||||
<div class="license_text legalese">{{=license}}</div>
|
||||
</ul>
|
||||
|
||||
<script language="javascript" type="text/javascript" src="{{=URL('static','js/jquery.flot.js')}}"></script>
|
||||
|
||||
<div class="license_text legalese well well-small">{{=license}}</div>
|
||||
<h3>{{=T('Project Progress')}}</h3>
|
||||
<p>
|
||||
<center>
|
||||
<div id="placeholder" style="width:600px;height:300px;"></div>
|
||||
</center>
|
||||
<script language="javascript" type="text/javascript" src="{{=URL('static','js/jquery.flot.js')}}"></script>
|
||||
<script language="javascript" type="text/javascript" src="{{=URL('static','js/jquery.flot.resize.js')}}"></script>
|
||||
<div class="row-fluid">
|
||||
<div class="span2"> </div>
|
||||
<div class="span8 center">
|
||||
<div id="placeholder"></div>
|
||||
</div>
|
||||
<div class="span2"> </div>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
jQuery(function () { jQuery.plot(jQuery("#placeholder"), [ {{=progress}} ]); });
|
||||
jQuery(document).ready(function() {
|
||||
jQuery.plot(jQuery("#placeholder"), [ {{=progress}} ]);
|
||||
})
|
||||
</script>
|
||||
</p>
|
||||
<!-- end "about" block -->
|
||||
@@ -1,5 +1,20 @@
|
||||
{{extend 'layout.html'}}
|
||||
|
||||
<h1>{{=T('Bulk Student Registration')}}</h1>
|
||||
|
||||
{{=form}}
|
||||
{{
|
||||
# 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]))
|
||||
# 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'}}
|
||||
|
||||
{{block sectionclass}}change_password{{end}}
|
||||
|
||||
<h2>Change Admin Password</h2>
|
||||
|
||||
<!-- begin "change_password" block -->
|
||||
<h2>web2py™ {{=T('Web Framework')}}</h2>
|
||||
<h3>{{=T('Change Admin Password')}}</h3>
|
||||
<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>
|
||||
|
||||
<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'}}
|
||||
|
||||
{{
|
||||
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}}
|
||||
|
||||
<!-- begin "delete" block -->
|
||||
<h2>{{=T('Are you sure you want to delete file "%s"?', filename)}}</h2>
|
||||
<div class="center">
|
||||
{{=dialog}}
|
||||
</div>
|
||||
|
||||
<!-- end "delete" block -->
|
||||
@@ -1,9 +1,16 @@
|
||||
{{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}}
|
||||
|
||||
<!-- begin "delete_plugin" block -->
|
||||
<h2>{{=T('Are you sure you want to delete plugin "%s"?', plugin)}}</h2>
|
||||
<div class="center">
|
||||
{{=dialog}}
|
||||
</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))
|
||||
def editfile(path,file,vars={}):
|
||||
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):
|
||||
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={}):
|
||||
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={}):
|
||||
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):
|
||||
form=FORM(T("upload file:")," ",
|
||||
INPUT(_type="file",_name="file")," ",T("and rename it:")," ",
|
||||
INPUT(_type="text",_name="filename",requires=IS_NOT_EMPTY),
|
||||
INPUT(_type="hidden",_name="location",_value=location),
|
||||
INPUT(_type="hidden",_name="token",_value=session.token),
|
||||
INPUT(_type="hidden",_name="sender",_value=URL('design',args=app, anchor=anchor)),
|
||||
INPUT(_type="submit",_value=T("upload")),_action=URL('upload_file'))
|
||||
form=FORM(
|
||||
LABEL(T("upload file:")),
|
||||
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="token",_value=session.token),
|
||||
INPUT(_type="hidden",_name="sender",_value=URL('design',args=app, anchor=anchor)),
|
||||
_action=URL('upload_file'),
|
||||
_class="generatedbyw2p well well-small")
|
||||
return form
|
||||
def file_create_form(location, anchor=None):
|
||||
form=FORM(T("create file with filename:")," ",
|
||||
INPUT(_type="text",_name="filename",requires=IS_NOT_EMPTY),
|
||||
INPUT(_type="hidden",_name="location",_value=location),
|
||||
INPUT(_type="hidden",_name="sender",_value=URL('design',args=app)),
|
||||
INPUT(_type="hidden",_name="token",_value=session.token),
|
||||
INPUT(_type="hidden",_name="id",_value=anchor),
|
||||
INPUT(_type="submit",_value=T("Create")),_action=URL('create_file'))
|
||||
def file_create_form(location, anchor=None, helptext=""):
|
||||
form=FORM(
|
||||
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="sender",_value=URL('design',args=app)),
|
||||
INPUT(_type="hidden",_name="token",_value=session.token),
|
||||
INPUT(_type="hidden",_name="id",_value=anchor),
|
||||
_action=URL('create_file'),
|
||||
_class="generatedbyw2p well well-small")
|
||||
return form
|
||||
def upload_plugin_form(app, anchor=None):
|
||||
form=FORM(T("upload plugin file:")," ",
|
||||
INPUT(_type="file",_name="pluginfile"),
|
||||
INPUT(_type="hidden",_name="id",_value=anchor),
|
||||
INPUT(_type="hidden",_name="token",_value=session.token),
|
||||
INPUT(_type="submit",_value=T("upload")))
|
||||
form=FORM(
|
||||
LABEL(T("upload plugin file:")),
|
||||
INPUT(_type="file",_name="pluginfile"),
|
||||
INPUT(_type="hidden",_name="id",_value=anchor),
|
||||
INPUT(_type="hidden",_name="token",_value=session.token),
|
||||
DIV(TAG['BUTTON'](T("Upload"),_type="submit",_class="btn"),_class="controls"),
|
||||
_class="generatedbyw2p well well-small")
|
||||
return form
|
||||
def deletefile(arglist, vars={}):
|
||||
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))
|
||||
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)'))),
|
||||
_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}}
|
||||
<!-- begin "design" block -->
|
||||
|
||||
<h2>{{=T("Edit application")}} "{{=A(app,_href=URL(app,'default','index'),_target="_blank")}}"</h2>
|
||||
|
||||
<!-- COLLAPSE/JUMP-TO BUTTONS -->
|
||||
<div class="right-full controls">
|
||||
<p>
|
||||
<p class="buttons-row">
|
||||
{{=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">
|
||||
{{=button('#models', T("models"))}}
|
||||
{{=button('#controllers', T("controllers"))}}
|
||||
@@ -63,43 +86,50 @@ def deletefile(arglist, vars={}):
|
||||
{{=button('#private', T("private files"))}}
|
||||
{{=button('#plugins', T("plugins"))}}
|
||||
</span>
|
||||
</p>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- MODELS -->
|
||||
|
||||
<h3 id="models" onclick="collapse('models_inner');" class="component">
|
||||
{{=T("Models")}}
|
||||
<span class="tooltip">{{=helpicon()}} <span>{{=T("The data representation, define database tables and sets")}}</span></span>
|
||||
<h3 id="_models" rel="pagebookmark">
|
||||
<span class="component" onclick="collapse('models_inner');">{{=T("Models")}}</span>
|
||||
<a href="#models" rel="tooltip" data-placement="right" data-original-title="{{=T('The data representation, define database tables and sets')}}">
|
||||
{{=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>
|
||||
<div id="models_inner" class="component_contents">
|
||||
{{if not models:}}<p><strong>{{=T("There are no models")}}</strong></p>{{else:}}
|
||||
<div class="controls comptools">
|
||||
{{=button(URL(a=app,c='appadmin',f='index'), T('database administration'))}}
|
||||
{{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')}}
|
||||
{{if not models:}}<p><strong>{{=T("There are no models")}}</strong></p>{{else:}}
|
||||
<div class="controls comptools">
|
||||
{{=button(URL(a=app,c='appadmin',f='index'), T('database administration'))}}
|
||||
{{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')}}
|
||||
{{pass}}
|
||||
{{=button(URL(a=app, c='appadmin',f='graph_model'), T('graph model'))}}
|
||||
</div>
|
||||
<ul class="unstyled act_edit">
|
||||
{{for m in models:}}
|
||||
{{id="models__"+m.replace('.','__')}}
|
||||
<li id="{{='_'+id}}" rel="pagebookmark"><span id="{{=id}}" class="hashstick"> </span>
|
||||
<span class="filetools controls">
|
||||
{{=editfile('models',m, dict(id=id))}}
|
||||
{{=deletefile([app, 'models', m], dict(id=id, id2='models'))}}
|
||||
</span>
|
||||
<span class="file">
|
||||
{{=peekfile('models',m, dict(id=id))}}
|
||||
</span>
|
||||
<span class="extras">
|
||||
{{if len(defines[m]):}}{{=T("defines tables")}} {{pass}}{{=XML(', '.join([B(table).xml() for table in defines[m]]))}}
|
||||
</span>
|
||||
</li>
|
||||
{{pass}}
|
||||
</ul>
|
||||
{{pass}}
|
||||
</div>
|
||||
{{pass}}
|
||||
|
||||
<ul>
|
||||
{{for m in models:}}
|
||||
{{id="models__"+m.replace('.','__')}}
|
||||
<li id="{{=id}}">
|
||||
<span class="filetools controls">
|
||||
{{=editfile('models',m, dict(id=id))}}
|
||||
{{=deletefile([app, 'models', m], dict(id=id, id2='models'))}}
|
||||
</span>
|
||||
<span class="file">
|
||||
{{=peekfile('models',m, dict(id=id))}}
|
||||
</span>
|
||||
<span class="extras">
|
||||
{{if len(defines[m]):}}{{=T("defines tables")}} {{pass}}{{=XML(', '.join([B(table).xml() for table in defines[m]]))}}
|
||||
</span>
|
||||
</li>
|
||||
{{pass}}
|
||||
</ul>
|
||||
<div class="controls formfield">{{=file_create_form('%s/models/' % app, 'models')}}</div>
|
||||
<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>
|
||||
|
||||
<!-- FIND CONTROLLER FUNCTIONS -->
|
||||
@@ -109,289 +139,333 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
|
||||
}}
|
||||
|
||||
<!-- CONTROLLERS -->
|
||||
|
||||
<h3 id="controllers" onclick="collapse('controllers_inner');" class="component">
|
||||
{{=T("Controllers")}}
|
||||
<span class="tooltip">{{=helpicon()}} <span>{{=T("The application logic, each URL path is mapped in one exposed function in the controller")}}</span></span>
|
||||
<h3 id="_controllers" rel="pagebookmark">
|
||||
<span class="component" onclick="collapse('controllers_inner');">{{=T("Controllers")}}</span>
|
||||
<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')}}">
|
||||
{{=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>
|
||||
<div id="controllers_inner" class="component_contents">
|
||||
{{if not controllers:}}<p><strong>{{=T("There are no controllers")}}</strong></p>{{else:}}
|
||||
<div class="controls comptools">
|
||||
{{=button(URL(r=request,c='shell',f='index',args=app), T("shell"))}}
|
||||
{{=button(URL('test',args=app), T("test"))}}
|
||||
{{=button(URL('edit',args=[app,'cron','crontab']), T("crontab"))}}
|
||||
</div>
|
||||
{{pass}}
|
||||
<ul>
|
||||
{{for c in controllers:}}
|
||||
{{id="controllers__"+c.replace('.','__')}}
|
||||
<li id="{{=id}}">
|
||||
<span class="filetools controls">
|
||||
{{=editfile('controllers',c, dict(id=id))}}
|
||||
{{=deletefile([app, 'controllers', c], dict(id=id, id2='controllers'))}}
|
||||
{{=testfile('controllers',c)}}
|
||||
</span>
|
||||
<span class="file">
|
||||
{{=peekfile('controllers',c, dict(id=id))}}
|
||||
</span>
|
||||
<span class="extras">
|
||||
{{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>
|
||||
</li>
|
||||
{{if not controllers:}}<p><strong>{{=T("There are no controllers")}}</strong></p>{{else:}}
|
||||
<div class="controls comptools">
|
||||
{{=button(URL(r=request,c='shell',f='index',args=app), T("shell"))}}
|
||||
{{=button(URL('test',args=app), T("test"))}}
|
||||
{{=button(URL('edit',args=[app,'cron','crontab']), T("crontab"))}}
|
||||
</div>
|
||||
<ul class="unstyled act_edit">
|
||||
{{for c in controllers:}}
|
||||
{{id="controllers__"+c.replace('.','__')}}
|
||||
<li id="{{='_'+id}}" rel="pagebookmark"><span id="{{=id}}" class="hashstick"> </span>
|
||||
<span class="filetools controls">
|
||||
{{=editfile('controllers',c, dict(id=id))}}
|
||||
{{=deletefile([app, 'controllers', c], dict(id=id, id2='controllers'))}}
|
||||
{{=testfile('controllers',c)}}
|
||||
</span>
|
||||
<span class="file">
|
||||
{{=peekfile('controllers',c, dict(id=id))}}
|
||||
</span>
|
||||
<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]]))}}
|
||||
</span>
|
||||
</li>
|
||||
{{pass}}
|
||||
</ul>
|
||||
{{pass}}
|
||||
</ul>
|
||||
<div class="controls formfield">{{=file_create_form('%s/controllers/' % app, 'controllers')}}</div>
|
||||
<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>
|
||||
|
||||
<!-- VIEWS -->
|
||||
|
||||
<h3 id="views" onclick="collapse('views_inner');" class="component">
|
||||
{{=T("Views")}}
|
||||
<span class="tooltip">{{=helpicon()}} <span>{{=T("The presentations layer, views are also known as templates")}}</span></span>
|
||||
<h3 id="_views" rel="pagebookmark">
|
||||
<span class="component" onclick="collapse('views_inner');">{{=T("Views")}}</span>
|
||||
<a href="#views" rel="tooltip" data-placement="right" data-original-title="{{=T('The presentations layer, views are also known as templates')}}">
|
||||
{{=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>
|
||||
<div id="views_inner" class="component_contents">
|
||||
<div class="controls comptools">
|
||||
{{=button(LAYOUTS_APP, T("download layouts"))}}
|
||||
</div>
|
||||
{{if not views:}}<p><strong>{{=T("There are no views")}}</strong></p>{{pass}}
|
||||
<ul>
|
||||
{{for c in views:}}
|
||||
{{id="views__"+c.replace('/','__').replace('.','__')}}
|
||||
<li id="{{=id}}">
|
||||
<span class="filetools controls">
|
||||
{{=editfile('views',c, dict(id=id))}}
|
||||
{{=deletefile([app, 'views', c], dict(id=id, id2='views'))}}
|
||||
</span>
|
||||
<span class="file">
|
||||
{{=peekfile('views',c, dict(id=id))}}
|
||||
</span>
|
||||
<span class="extras">
|
||||
{{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]]))}}
|
||||
</span>
|
||||
</li>
|
||||
{{if not views:}}<p><strong>{{=T("There are no views")}}</strong></p>{{else:}}
|
||||
<div class="controls comptools">
|
||||
{{=button(LAYOUTS_APP, T("download layouts"))}}
|
||||
</div>
|
||||
<ul class="unstyled act_edit">
|
||||
{{for c in views:}}
|
||||
{{id="views__"+c.replace('/','__').replace('.','__')}}
|
||||
<li id="{{='_'+id}}" rel="pagebookmark"><span id="{{=id}}" class="hashstick"> </span>
|
||||
<span class="filetools controls">
|
||||
{{=editfile('views',c, dict(id=id))}}
|
||||
{{=deletefile([app, 'views', c], dict(id=id, id2='views'))}}
|
||||
</span>
|
||||
<span class="file">
|
||||
{{=peekfile('views',c, dict(id=id))}}
|
||||
</span>
|
||||
<span class="extras celled celled-one">
|
||||
{{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]]))}}
|
||||
</span>
|
||||
</li>
|
||||
{{pass}}
|
||||
</ul>
|
||||
{{pass}}
|
||||
</ul>
|
||||
<div class="controls formfield">{{=file_create_form('%s/views/' % app, 'views')}}</div>
|
||||
<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>
|
||||
|
||||
<!-- LANGUAGES -->
|
||||
|
||||
<h3 id="languages" onclick="collapse('languages_inner');" class="component">
|
||||
{{=T("Languages")}}
|
||||
<span class="tooltip">{{=helpicon()}} <span>{{=T("Translation strings for the application")}}</span></span>
|
||||
<h3 id="_languages" rel="pagebookmark">
|
||||
<span class="component" onclick="collapse('languages_inner');">{{=T("Languages")}}</span>
|
||||
<a href="#languages" rel="tooltip" data-placement="right" data-original-title="{{=T('Translation strings for the application')}}">
|
||||
{{=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>
|
||||
<div id="languages_inner" class="component_contents">
|
||||
<div class="controls comptools">
|
||||
{{=button(URL('update_languages/'+app), T('update all languages'))}}
|
||||
</div>
|
||||
{{if not languages:}}<p><strong>{{=T("There are no translators, only default language is supported")}}</strong></p>{{pass}}
|
||||
<table>
|
||||
{{for lang in sorted(languages):
|
||||
file = lang+'.py'
|
||||
id = "languages__"+file.replace('.','__')}}
|
||||
<tr id="{{=id}}">
|
||||
<td>
|
||||
<span class="filetools controls">
|
||||
{{=editlanguagefile('languages',file)}}
|
||||
{{=deletefile([app, 'languages', file], dict(id=id, id2='languages'))}}
|
||||
</span>
|
||||
<span class="file">
|
||||
{{=peekfile('languages',file, dict(id=id))}}
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
|
||||
(
|
||||
{{=T("Plural-Forms:")}}
|
||||
{{p=languages[lang][3:7]}}
|
||||
{{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])}}
|
||||
{{else:}}
|
||||
{{if p[3] == 1:}}
|
||||
{{=B(T("are not used"))}}
|
||||
{{else:}}
|
||||
{{pfile=p[0]}}
|
||||
{{if p[1]!=0:}}
|
||||
<span class="filetools controls">
|
||||
{{=editpluralsfile('languages',pfile,dict(nplurals=p[3]))}}
|
||||
</span>
|
||||
<span class="file">
|
||||
{{=peekfile('languages',pfile,dict(id=id))}}
|
||||
</span>
|
||||
{{else:}}
|
||||
<b>{{=T("are not used yet")}}</b>
|
||||
{{if not languages:}}<p><strong>{{=T("There are no translators, only default language is supported")}}</strong></p>{{else:}}
|
||||
<div class="controls comptools">
|
||||
{{=button(URL('update_languages/'+app), T('update all languages'))}}
|
||||
</div>
|
||||
<ul class="unstyled act_edit">
|
||||
{{for lang in sorted(languages):
|
||||
file = lang+'.py'
|
||||
id = "languages__"+file.replace('.','__')}}
|
||||
<li id="{{='_'+id}}" rel="pagebookmark" class="li-row"><span id="{{=id}}" class="hashstick"> </span>
|
||||
<span class="li-controls">
|
||||
<span class="filetools controls">
|
||||
{{=editlanguagefile('languages',file)}}
|
||||
{{=deletefile([app, 'languages', file], dict(id=id, id2='languages'))}}
|
||||
</span>
|
||||
<span class="">
|
||||
{{=peekfile('languages',file, dict(id=id))}}
|
||||
</span>
|
||||
</span> <!-- /li-row -->
|
||||
<span class="extras celled">
|
||||
(
|
||||
{{=T("Plural-Forms:")}}
|
||||
{{p=languages[lang][3:7]}}
|
||||
{{if p[2] == 'default':}}
|
||||
<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:}}
|
||||
{{if p[3] == 1:}}
|
||||
{{=B(T("are not used"))}}
|
||||
{{else:}}
|
||||
{{pfile=p[0]}}
|
||||
{{if p[1]!=0:}}<span style="display:inline-block;margin-top:-10px;">
|
||||
<span class="filetools controls">
|
||||
{{=editpluralsfile('languages',pfile,dict(nplurals=p[3]))}}
|
||||
</span>
|
||||
<span class="file">
|
||||
{{=peekfile('languages',pfile,dict(id=id))}}
|
||||
</span></span>
|
||||
{{else:}}
|
||||
<b>{{=T("are not used yet")}}</b>
|
||||
{{pass}}
|
||||
{{pass}}
|
||||
{{pass}}
|
||||
)
|
||||
</span>
|
||||
</li>
|
||||
{{pass}}
|
||||
{{pass}}
|
||||
</ul>
|
||||
{{pass}}
|
||||
)
|
||||
</td>
|
||||
</tr>
|
||||
{{pass}}
|
||||
</table>
|
||||
{{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>
|
||||
|
||||
<!-- STATIC -->
|
||||
|
||||
<h3 id="static" onclick="collapse('static_inner');" class="component">
|
||||
{{=T("Static files")}}
|
||||
<span class="tooltip">{{=helpicon()}} <span>{{=T("These files are served without processing, your images go here")}}</span></span>
|
||||
<h3 id="_static" rel="pagebookmark">
|
||||
<span class="component" onclick="collapse('static_inner');">{{=T("Static")}}</span>
|
||||
<a href="#static" rel="tooltip" data-placement="right" data-original-title="{{=T('These files are served without processing, your images go here')}}">
|
||||
{{=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>
|
||||
<div id="static_inner" class="component_contents">
|
||||
<div class="controls comptools">
|
||||
</div>
|
||||
{{if not statics:}}<p><strong>{{=T("There are no static files")}}</strong></p>{{pass}}
|
||||
<ul>
|
||||
{{if not statics:}}<p><strong>{{=T("There are no static files")}}</strong></p>{{else:}}
|
||||
<ul class="unstyled act_edit">
|
||||
{{
|
||||
path=[]
|
||||
for file in statics+['']:
|
||||
items=file.split('/')
|
||||
file_path=items[:-1]
|
||||
filename=items[-1]
|
||||
while path!=file_path:
|
||||
if len(file_path)>=len(path) and all([v==file_path[k] for k,v in enumerate(path)]):
|
||||
path.append(file_path[len(path)])
|
||||
thispath='static__'+'__'.join(path)
|
||||
path=[]
|
||||
for file in statics+['']:
|
||||
items=file.split('/')
|
||||
file_path=items[:-1]
|
||||
filename=items[-1]
|
||||
while path!=file_path:
|
||||
if len(file_path)>=len(path) and all([v==file_path[k] for k,v in enumerate(path)]):
|
||||
path.append(file_path[len(path)])
|
||||
thispath='static__'+'__'.join(path)
|
||||
}}
|
||||
<li class="folder">
|
||||
<a href="javascript:collapse('{{=thispath}}');" class="file">{{=path[-1]}}/</a>
|
||||
<ul id="{{=thispath}}" style="display: none;" class="sublist">{{
|
||||
else:
|
||||
path = path[:-1]
|
||||
}}
|
||||
</ul></li>
|
||||
<li class="folder"><i> </i>
|
||||
<a href="javascript:collapse('{{=thispath}}');" class="file">{{=path[-1]}}/</a>
|
||||
<ul id="{{=thispath}}" style="display: none;" class="sublist">{{
|
||||
else:
|
||||
path = path[:-1]
|
||||
}}
|
||||
</ul></li>
|
||||
{{
|
||||
pass
|
||||
pass
|
||||
if filename:
|
||||
}}<li>
|
||||
<span class="filetools controls">
|
||||
{{=editfile('static',file, dict(id="static"))}} {{=deletefile([app,'static',file], dict(id="static",id2="static"))}}
|
||||
</span>
|
||||
<span class="file">
|
||||
<a href="{{=URL(a=app,c='static',f=file)}}">{{=filename}}</a>
|
||||
</span>
|
||||
</li>{{
|
||||
pass
|
||||
pass
|
||||
pass
|
||||
pass
|
||||
if filename:
|
||||
}}
|
||||
<li>
|
||||
<span class="filetools controls">
|
||||
{{=editfile('static',file, dict(id="static"))}} {{=deletefile([app,'static',file], dict(id="static",id2="static"))}}
|
||||
</span>
|
||||
<span class="file">
|
||||
<a href="{{=URL(a=app,c='static',f=file)}}">{{=filename}}</a>
|
||||
</span>
|
||||
</li>{{
|
||||
pass
|
||||
pass
|
||||
}}
|
||||
</ul>
|
||||
{{pass}}
|
||||
</ul>
|
||||
<div class="controls formfield">{{=file_create_form('%s/static/' % app, 'static')}}
|
||||
{{=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>
|
||||
|
||||
<!-- MODULES -->
|
||||
|
||||
<h3 id="modules" onclick="collapse('modules_inner');" class="component">
|
||||
{{=T("Modules")}}
|
||||
<span class="tooltip">{{=helpicon()}} <span>{{=T("Additional code for your application")}}</span></span>
|
||||
<h3 id="_modules" rel="pagebookmark">
|
||||
<span class="component" onclick="collapse('modules_inner');">{{=T("Modules")}}</span>
|
||||
<a href="#modules" rel="tooltip" data-placement="right" data-original-title="{{=T('Additional code for your application')}}">
|
||||
{{=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>
|
||||
<div id="modules_inner" class="component_contents">
|
||||
<div class="controls comptools">
|
||||
</div>
|
||||
{{if not modules:}}<p><strong>{{=T("There are no modules")}}</strong></p>{{pass}}
|
||||
<ul>
|
||||
{{for m in modules:}}
|
||||
{{id="modules__"+m.replace('/','__').replace('.','__')}}
|
||||
<li id="{{=id}}">
|
||||
<span class="filetols controls">
|
||||
{{=editfile('modules',m,dict(id=id))}}
|
||||
{{if m!='__init__.py':}}
|
||||
{{=deletefile([app, 'modules', m], dict(id=id, id2='modules'))}}
|
||||
{{pass}}
|
||||
</span>
|
||||
<span class="file">
|
||||
{{=peekfile('modules',m, dict(id=id))}}
|
||||
</span>
|
||||
</li>
|
||||
{{if not modules:}}<p><strong>{{=T("There are no modules")}}</strong></p>{{else:}}
|
||||
<ul class="unstyled act_edit">
|
||||
{{for m in modules:}}
|
||||
{{id="modules__"+m.replace('/','__').replace('.','__')}}
|
||||
<li id="{{='_'+id}}" rel="pagebookmark"><span id="{{=id}}" class="hashstick"> </span>
|
||||
<span class="filetols controls">
|
||||
{{=editfile('modules',m,dict(id=id))}}
|
||||
{{if m!='__init__.py':}}
|
||||
{{=deletefile([app, 'modules', m], dict(id=id, id2='modules'))}}
|
||||
{{pass}}
|
||||
</span>
|
||||
<span class="file">
|
||||
{{=peekfile('modules',m, dict(id=id))}}
|
||||
</span>
|
||||
</li>
|
||||
{{pass}}
|
||||
</ul>
|
||||
{{pass}}
|
||||
</ul>
|
||||
<div class="controls formfield">{{=file_create_form('%s/modules/' % app, 'modules')}}
|
||||
{{=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>
|
||||
|
||||
<!-- PRIVATE -->
|
||||
|
||||
<h3 id="private" onclick="collapse('private_inner');" class="component">
|
||||
{{=T("Private files")}}
|
||||
<span class="tooltip">{{=helpicon()}} <span>{{=T("These files are not served, they are only available from within your app")}}</span></span>
|
||||
<h3 id="_private" rel="pagebookmark">
|
||||
<span class="component" onclick="collapse('private_inner');">{{=T("Private files")}}</span>
|
||||
<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')}}">
|
||||
{{=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>
|
||||
<div id="private_inner" class="component_contents">
|
||||
<div class="controls comptools">
|
||||
</div>
|
||||
{{if not privates:}}<p><strong>{{=T("There are no private files")}}</strong></p>{{pass}}
|
||||
<ul>
|
||||
{{
|
||||
path=[]
|
||||
for file in privates+['']:
|
||||
items=file.split('/')
|
||||
file_path=items[:-1]
|
||||
filename=items[-1]
|
||||
while path!=file_path:
|
||||
if len(file_path)>=len(path) and all([v==file_path[k] for k,v in enumerate(path)]):
|
||||
path.append(file_path[len(path)])
|
||||
thispath='private__'+'__'.join(path)
|
||||
}}
|
||||
<li class="folder">
|
||||
<a href="javascript:collapse('{{=thispath}}');" class="file">{{=path[-1]}}/</a>
|
||||
<ul id="{{=thispath}}" style="display: none;" class="sublist">{{
|
||||
else:
|
||||
path = path[:-1]
|
||||
}}
|
||||
</ul></li>
|
||||
{{
|
||||
pass
|
||||
pass
|
||||
if filename:
|
||||
}}<li>
|
||||
<span class="filetools controls">
|
||||
{{=editfile('private',file, dict(id="private"))}} {{=deletefile([app,'private',file], dict(id="private",id2="private"))}}
|
||||
</span>
|
||||
<span class="file">
|
||||
{{=peekfile('private',file, dict(id="private"))}}
|
||||
</span>
|
||||
</li>{{
|
||||
pass
|
||||
pass
|
||||
}}
|
||||
{{if not privates:}}<p><strong>{{=T("There are no private files")}}</strong></p>{{else:}}
|
||||
<ul class="unstyled act_edit">
|
||||
{{
|
||||
path=[]
|
||||
for file in privates+['']:
|
||||
items=file.split('/')
|
||||
file_path=items[:-1]
|
||||
filename=items[-1]
|
||||
while path!=file_path:
|
||||
if len(file_path)>=len(path) and all([v==file_path[k] for k,v in enumerate(path)]):
|
||||
path.append(file_path[len(path)])
|
||||
thispath='private__'+'__'.join(path)
|
||||
}}
|
||||
<li class="folder">
|
||||
<a href="javascript:collapse('{{=thispath}}');" class="file">{{=path[-1]}}/</a>
|
||||
<ul id="{{=thispath}}" style="display: none;" class="sublist">{{
|
||||
else:
|
||||
path = path[:-1]
|
||||
}}
|
||||
</ul>
|
||||
</li>
|
||||
{{
|
||||
pass
|
||||
pass
|
||||
if filename:
|
||||
}}
|
||||
<li>
|
||||
<span class="filetools controls">
|
||||
{{=editfile('private',file, dict(id="private"))}} {{=deletefile([app,'private',file], dict(id="private",id2="private"))}}
|
||||
</span>
|
||||
<span class="file">
|
||||
{{=peekfile('private',file, dict(id="private"))}}
|
||||
</span>
|
||||
</li>{{
|
||||
pass
|
||||
pass
|
||||
}}
|
||||
{{pass}}
|
||||
</ul>
|
||||
<div class="controls formfield">{{=file_create_form('%s/private/' % app, 'private')}}
|
||||
{{=file_upload_form('%s/private/' % app, 'private')}}</div>
|
||||
</ul>
|
||||
<div class="controls formfield">
|
||||
<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>
|
||||
|
||||
|
||||
<!-- PLUGINS -->
|
||||
|
||||
<h3 id="plugins" onclick="collapse('plugins_inner');" class="component">
|
||||
{{=T("Plugins")}}
|
||||
<span class="tooltip">{{=helpicon()}} <span>{{=T("To create a plugin, name a file/folder plugin_[name]")}}</span></span>
|
||||
<h3 id="_plugins" rel="pagebookmark">
|
||||
<span class="component" onclick="collapse('plugins_inner');">{{=T("Plugins")}}</span>
|
||||
<a href="#plugins" rel="tooltip" data-placement="right" data-original-title="{{=T('To create a plugin, name a file/folder plugin_[name]')}}">
|
||||
{{=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>
|
||||
<div id="plugins_inner" class="component_contents">
|
||||
<div class="controls comptools">
|
||||
{{=button(PLUGINS_APP, T('download plugins'))}}
|
||||
</div>
|
||||
<div class="controls">
|
||||
</div>
|
||||
{{if plugins:}}
|
||||
<ul>
|
||||
{{for plugin in plugins:}}
|
||||
{{id="plugins__"+plugin.replace('/','__').replace('.','__')}}
|
||||
<li id="{{=id}}">
|
||||
{{=A('plugin_%s' % plugin, _class='file', _href=URL('plugin', args=[app, plugin], vars=dict(id=id, id2='plugins')))}}
|
||||
</li>
|
||||
{{pass}}
|
||||
</ul>
|
||||
{{else:}}
|
||||
<p><strong>{{=T('There are no plugins')}}</strong></p>
|
||||
{{pass}}
|
||||
<div class="controls formfield">{{=upload_plugin_form(app, 'plugins')}}</div>
|
||||
<div class="controls comptools">
|
||||
{{=button(PLUGINS_APP, T('download plugins'))}}
|
||||
</div>
|
||||
{{if plugins:}}
|
||||
<ul class="unstyled act_edit">
|
||||
{{for plugin in plugins:}}
|
||||
{{id="plugins__"+plugin.replace('/','__').replace('.','__')}}
|
||||
<li id="{{=id}}">
|
||||
{{=A('plugin_%s' % plugin, _class='file', _href=URL('plugin', args=[app, plugin], vars=dict(id=id, id2='plugins')))}}
|
||||
</li>
|
||||
{{pass}}
|
||||
</ul>
|
||||
{{else:}}
|
||||
<p><strong>{{=T('There are no plugins')}}</strong></p>
|
||||
{{pass}}
|
||||
<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>
|
||||
|
||||
|
||||
<script>
|
||||
function filter_files() {
|
||||
if(jQuery('#search').val()){
|
||||
@@ -400,7 +474,7 @@ function filter_files() {
|
||||
files=data['files'];
|
||||
message=data['message'];
|
||||
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();
|
||||
});
|
||||
} else {
|
||||
@@ -416,4 +490,4 @@ jQuery(document).ready(function(){
|
||||
jQuery('#search_start').click(function(e){ filter_files(); });
|
||||
});
|
||||
</script>
|
||||
|
||||
<!-- end "design" block -->
|
||||
|
||||
@@ -1,8 +1,18 @@
|
||||
{{extend 'layout.html'}}
|
||||
|
||||
<!-- begin "edit" block -->
|
||||
{{
|
||||
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':}}
|
||||
{{include 'default/amy_ajax.html'}}
|
||||
@@ -25,6 +35,13 @@
|
||||
<link rel="stylesheet" href="{{=cm}}/lib/util/dialog.css">
|
||||
<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">
|
||||
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':}}
|
||||
<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>
|
||||
@@ -88,7 +105,7 @@ jQuery(document).ready(function(){
|
||||
<h2>{{=T('Editing file "%s"',filename)}}</h2>
|
||||
|
||||
{{if functions:}}
|
||||
<p class="formfield">
|
||||
<p class="formfield well well-small">
|
||||
<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]))}}
|
||||
</span>
|
||||
@@ -98,15 +115,15 @@ jQuery(document).ready(function(){
|
||||
{{pass}}
|
||||
</p>
|
||||
{{pass}}
|
||||
|
||||
<p class="right controls">
|
||||
<div class='row-fluid'>
|
||||
<p class="right controls pull-right">
|
||||
{{if filetype=='python':}}
|
||||
{{=A(SPAN(T('toggle 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'],
|
||||
URL(c='debug', f='toggle_breakpoint')),
|
||||
_class="button special")}}
|
||||
_class="button special btn btn-inverse")}}
|
||||
{{pass}}
|
||||
{{=button(URL('design',args=request.vars.app if request.vars.app else request.args[0], anchor=request.vars.id), T('back'))}}
|
||||
{{if edit_controller:}}
|
||||
@@ -116,25 +133,59 @@ jQuery(document).ready(function(){
|
||||
{{=button(view_link, T('try view'))}}
|
||||
{{pass}}
|
||||
{{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}}
|
||||
<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>
|
||||
</div>
|
||||
<div id="editor_area" class="row-fluid">
|
||||
|
||||
<div id="editor_area">
|
||||
<form action="{{=URL('edit',args=filename)}}" method="post" name="editform" id="editform">
|
||||
<a value="save" name="save" onclick="return doClickSave();" class="icon saveicon">
|
||||
{{=IMG(_src=URL('static', 'images/save_icon.png'), _alt=T('Save'))}}
|
||||
</a>
|
||||
{{=T('Saved file hash:')}}
|
||||
<input type="input" name="file_hash" value="{{=file_hash}}" readonly="readonly"/>
|
||||
{{=T('Last saved on:')}} <input type="input" name="saved_on" value="{{=saved_on}}" readonly="readonly"/>
|
||||
<br><hr>
|
||||
<ul class="nav nav-list span2 well" rel="pagebookmark">
|
||||
{{dirs=[{'name':'models', 'reg':'.*\.py$'},
|
||||
{'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'))}}
|
||||
</a>
|
||||
</div>
|
||||
<div class="editor-bar-column">
|
||||
<div class="row-fluid">
|
||||
<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':}}
|
||||
<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>
|
||||
{{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>
|
||||
function isFullScreen(instance) {
|
||||
return /\bCodeMirror-fullscreen\b/.test(instance.getWrapperElement().className);
|
||||
@@ -191,12 +242,19 @@ jQuery(document).ready(function(){
|
||||
autofocus: true,
|
||||
onCursorActivity: function() {
|
||||
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(
|
||||
document.getElementById("body"),cm_opts);
|
||||
var hlLine = editor.setLineClass(0, "activeline");
|
||||
window.mirror = editor;
|
||||
jQuery(function(){jQuery('.CodeMirror-scroll').css("height","auto").css("overflow-x","auto");});
|
||||
</script>
|
||||
{{elif TEXT_EDITOR == 'ace':}}
|
||||
<div id="editor" style="height: 500px; width: auto; position: relative">{{=data}}</div>
|
||||
@@ -226,52 +284,59 @@ window.onload = function() {
|
||||
<textarea cols="80" rows="25" id="body" style="direction:ltr;" name="data">{{=data}}</textarea>
|
||||
<script>window.textarea = area.textarea;</script>
|
||||
{{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>
|
||||
{{=T('to previous version.')}}
|
||||
<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.')}}
|
||||
</div>
|
||||
<br/>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div class="help">
|
||||
{{if TEXT_EDITOR=='edit_area' and filetype=='html':}}
|
||||
<h3>{{=T('Key bindings for ZenCoding Plugin')}}</h3>
|
||||
<ul>
|
||||
{{=shortcut('Ctrl+S', T('Save via Ajax'))}}
|
||||
{{=shortcut('Ctrl+,', T('Expand Abbreviation'))}}
|
||||
{{=shortcut('Ctrl+M', T('Match Pair'))}}
|
||||
{{=shortcut('Ctrl+H', T('Wrap with Abbreviation'))}}
|
||||
{{=shortcut('Shift+Ctrl+M', T('Merge Lines'))}}
|
||||
{{=shortcut('Ctrl+Shift+←', T('Previous Edit Point'))}}
|
||||
{{=shortcut('Ctrl+Shift+→', T('Next Edit Point'))}}
|
||||
{{=shortcut('Ctrl+Shift+↑', T('Go to Matching Pair'))}}
|
||||
</ul>
|
||||
{{elif TEXT_EDITOR == 'codemirror' and filetype=='html':}}
|
||||
<h3>{{=T('Key bindings for ZenCoding Plugin')}}</h3>
|
||||
<ul>
|
||||
{{=shortcut('Ctrl+S', T('Save via Ajax'))}}
|
||||
{{=shortcut('Ctrl+F11', T('Toggle Fullscreen'))}}
|
||||
{{=shortcut('Ctrl-F / Cmd-F', T('Start searching'))}}
|
||||
{{=shortcut('Ctrl-G / Cmd-G', T('Find Next'))}}
|
||||
{{=shortcut('Shift-Ctrl-G / Shift-Cmd-G', T('Find Previous'))}}
|
||||
{{=shortcut('Shift-Ctrl-F / Cmd-Option-F', T('Replace'))}}
|
||||
{{=shortcut('Shift-Ctrl-R / Shift-Cmd-Option-F', T('Replace All'))}}
|
||||
{{=shortcut('Tab', T('Expand Abbreviation'))}}
|
||||
</ul>
|
||||
{{elif TEXT_EDITOR == 'codemirror':}}
|
||||
<h3>{{=T("Key bindings")}}</h3>
|
||||
<ul>
|
||||
{{=shortcut('Ctrl+S', T('Save via Ajax'))}}
|
||||
{{=shortcut('Ctrl+F11', T('Toggle Fullscreen'))}}
|
||||
{{=shortcut('Ctrl-F / Cmd-F', T('Start searching'))}}
|
||||
{{=shortcut('Ctrl-G / Cmd-G', T('Find Next'))}}
|
||||
{{=shortcut('Shift-Ctrl-G / Shift-Cmd-G', T('Find Previous'))}}
|
||||
{{=shortcut('Shift-Ctrl-F / Cmd-Option-F', T('Replace'))}}
|
||||
{{=shortcut('Shift-Ctrl-R / Shift-Cmd-Option-F', T('Replace All'))}}
|
||||
</ul>
|
||||
{{else:}}
|
||||
<h3>{{=T("Key bindings")}}</h3>
|
||||
<ul>
|
||||
{{=shortcut('Ctrl+S', T('Save via Ajax'))}}
|
||||
</ul>
|
||||
{{pass}}
|
||||
<div class="row-fluid">
|
||||
<div class="help span4 alert alert-block alert-info">
|
||||
{{if TEXT_EDITOR=='edit_area' and filetype=='html':}}
|
||||
<h3>{{=T('Key bindings for ZenCoding Plugin')}}</h3>
|
||||
<ul class="keybindings unstyled">
|
||||
{{=shortcut('Ctrl+S', T('Save via Ajax'))}}
|
||||
{{=shortcut('Ctrl+,', T('Expand Abbreviation'))}}
|
||||
{{=shortcut('Ctrl+M', T('Match Pair'))}}
|
||||
{{=shortcut('Ctrl+H', T('Wrap with Abbreviation'))}}
|
||||
{{=shortcut('Shift+Ctrl+M', T('Merge Lines'))}}
|
||||
{{=shortcut('Ctrl+Shift+←', T('Previous Edit Point'))}}
|
||||
{{=shortcut('Ctrl+Shift+→', T('Next Edit Point'))}}
|
||||
{{=shortcut('Ctrl+Shift+↑', T('Go to Matching Pair'))}}
|
||||
</ul>
|
||||
{{elif TEXT_EDITOR == 'codemirror' and filetype=='html':}}
|
||||
<h3>{{=T('Key bindings for ZenCoding Plugin')}}</h3>
|
||||
<ul class="keybindings unstyled">
|
||||
{{=shortcut('Ctrl+S', T('Save via Ajax'))}}
|
||||
{{=shortcut('Ctrl+F11', T('Toggle Fullscreen'))}}
|
||||
{{=shortcut('Ctrl-F / Cmd-F', T('Start searching'))}}
|
||||
{{=shortcut('Ctrl-G / Cmd-G', T('Find Next'))}}
|
||||
{{=shortcut('Shift-Ctrl-G / Shift-Cmd-G', T('Find Previous'))}}
|
||||
{{=shortcut('Shift-Ctrl-F / Cmd-Option-F', T('Replace'))}}
|
||||
{{=shortcut('Shift-Ctrl-R / Shift-Cmd-Option-F', T('Replace All'))}}
|
||||
{{=shortcut('Tab', T('Expand Abbreviation'))}}
|
||||
</ul>
|
||||
{{elif TEXT_EDITOR == 'codemirror':}}
|
||||
<h3>{{=T("Key bindings")}}</h3>
|
||||
<ul class="keybindings unstyled">
|
||||
{{=shortcut('Ctrl+S', T('Save via Ajax'))}}
|
||||
{{=shortcut('Ctrl+F11', T('Toggle Fullscreen'))}}
|
||||
{{=shortcut('Ctrl-F / Cmd-F', T('Start searching'))}}
|
||||
{{=shortcut('Ctrl-G / Cmd-G', T('Find Next'))}}
|
||||
{{=shortcut('Shift-Ctrl-G / Shift-Cmd-G', T('Find Previous'))}}
|
||||
{{=shortcut('Shift-Ctrl-F / Cmd-Option-F', T('Replace'))}}
|
||||
{{=shortcut('Shift-Ctrl-R / Shift-Cmd-Option-F', T('Replace All'))}}
|
||||
</ul>
|
||||
{{else:}}
|
||||
<h3>{{=T("Key bindings")}}</h3>
|
||||
<ul class="keybindings unstyled">
|
||||
{{=shortcut('Ctrl+S', T('Save via Ajax'))}}
|
||||
</ul>
|
||||
{{pass}}
|
||||
</div>
|
||||
</div>
|
||||
<!-- end "edit" block -->
|
||||
|
||||
@@ -7,18 +7,20 @@ function delkey(id) {
|
||||
return false;
|
||||
}
|
||||
function hideShowTranslated(){
|
||||
jQuery(".translated").closest("p").toggle();
|
||||
jQuery(".translated").closest("div.row-fluid").toggle();
|
||||
}
|
||||
</script>
|
||||
|
||||
{{block sectionclass}}edit_language{{end}}
|
||||
|
||||
<!-- begin "edit_language" block -->
|
||||
<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>
|
||||
</a>
|
||||
</div>
|
||||
<div class="languageform">
|
||||
{{=form}}
|
||||
</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;
|
||||
}
|
||||
</script>
|
||||
|
||||
{{block sectionclass}}edit_language{{end}}
|
||||
|
||||
<!-- begin "edit_language(plurals)" block -->
|
||||
<h2>{{=T("Editing Plural Forms File")}} "{{=filename}}"</h2>
|
||||
<div class="pluralsform">
|
||||
{{=form}}
|
||||
</div>
|
||||
|
||||
<!-- end "edit_language(plurals)" block -->
|
||||
@@ -1,142 +1,124 @@
|
||||
{{extend 'layout.html'}}
|
||||
{{import os, stat, time}}
|
||||
|
||||
{{block sectionclass}}errors{{end}}
|
||||
|
||||
<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>
|
||||
<!-- begin "errors" block -->
|
||||
{{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:
|
||||
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}}
|
||||
|
||||
<h2>{{=T('Error logs for "%(app)s"',dict(app=app))}}</h2>
|
||||
|
||||
<div class="errorform">
|
||||
<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: }}
|
||||
{{base_url = 'db' in method and 'ticketdb' or 'ticket' }}
|
||||
<h3>{{=T('Click row to expand traceback')}}</h3>
|
||||
<p class="controls">
|
||||
{{if 'db' in method:}}
|
||||
source : db
|
||||
<a class="button" 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>
|
||||
{{else:}}
|
||||
source : filesystem
|
||||
{{=switchbutton}}
|
||||
<a class="button" href="{{=URL(args=[app, 'old'])}}"><span>lists by ticket</span></a>
|
||||
{{pass}}
|
||||
</p>
|
||||
<table id="trck_errors" class="sortable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{{=T("Delete")}}</th>
|
||||
<th>{{=T("Count")}}</th>
|
||||
<th>{{=T("File")}}</th>
|
||||
<th>{{=T("Error")}}</th>
|
||||
<th></th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{for e in errors:}}
|
||||
<tr class="error_ticket">
|
||||
<td><input type="checkbox" name="delete_{{=e['hash']}}" /></td>
|
||||
<td>{{=e['count']}}</td>
|
||||
<td>{{=e['causer']}}</td>
|
||||
<td>{{=A(e['last_line'],_href="#",_onclick="collapse('%s');"%e['hash'])}}</td>
|
||||
<td>+</td>
|
||||
<td>{{=A(T('details'),_href=URL(base_url,args=[app,e['ticket']]))}}</td>
|
||||
</tr>
|
||||
<tr id="{{=e['hash']}}" class="traceback">
|
||||
<td colspan="6">
|
||||
<div>
|
||||
{{=CODE(e['pickel']['traceback'])}}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{{pass}}
|
||||
</tbody>
|
||||
</table>
|
||||
{{ else: }}
|
||||
<h3>{{=T('Click row to view a ticket')}}</h3>
|
||||
<p class="controls">
|
||||
{{if 'db' in method:}}
|
||||
source : db
|
||||
<a class="button" 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>
|
||||
{{else:}}
|
||||
source : filesystem
|
||||
{{=switchbutton}}
|
||||
<a class="button" href="{{=URL(args=[app, 'new'])}}"><span>lists by exception</span></a>
|
||||
{{pass}}
|
||||
</p>
|
||||
<table class="sortable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{{=T("Delete")}}</th>
|
||||
<th>{{=T("Ticket")}}</th>
|
||||
<th>{{=T("Date and Time")}}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{for ticket in tickets:}}
|
||||
<tr>
|
||||
<td><input type="checkbox" name="delete_{{=ticket}}"/></td>
|
||||
{{if 'db' in method:}}
|
||||
<td><a href="{{=URL('ticketdb',args=[app,ticket])}}">{{=ticket}}</a></td>
|
||||
<td>{{=time.strftime('%Y-%m-%d %H:%M:%S',times[ticket].timetuple())}}</td>
|
||||
{{else:}}
|
||||
<td><a href="{{=URL('ticket',args=[app,ticket])}}">{{=ticket}}</a></td>
|
||||
<td>{{=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(os.stat(os.path.join(request.folder,'../%s/errors/%s' % (app,ticket)))[stat.ST_CTIME]))}}</td>
|
||||
{{pass}}
|
||||
</tr>
|
||||
{{pass}}
|
||||
</tbody>
|
||||
</table>
|
||||
{{ pass }}
|
||||
</form>
|
||||
<form name="myform" method="post">
|
||||
{{ if 'new' in method: }}
|
||||
{{base_url = 'db' in method and 'ticketdb' or 'ticket' }}
|
||||
<p class="controls row-fluid">
|
||||
<div class="controls controls-row">
|
||||
{{if 'db' in method:}}
|
||||
<span class="uneditable-input">source : db</span>
|
||||
<a class="button btn" href="{{=URL(args=[app, 'new'])}}"><span>switch to : filesystem</span></a>
|
||||
<a class="button btn" href="{{=URL(args=[app, 'dbold'])}}"><span>lists by ticket</span></a>
|
||||
{{else:}}
|
||||
<span class="uneditable-input">source : filesystem</span>
|
||||
{{=switchbutton}}
|
||||
<a class="button btn" href="{{=URL(args=[app, 'old'])}}"><span>lists by ticket</span></a>
|
||||
{{pass}}
|
||||
</div>
|
||||
</p>
|
||||
<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>
|
||||
<tr>
|
||||
<th class="column1 cbcentered"><input type="checkbox" name="delete_all}" /></th>
|
||||
<th class="column2">{{=T("Count")}}</th>
|
||||
<th class="column3">{{=T("File")}}</th>
|
||||
<th>{{=T("Error")}}</th>
|
||||
<th class="columnN"></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{for e in errors:}}
|
||||
<tr class="error_ticket">
|
||||
<td class="cbcentered"><input type="checkbox" name="delete_{{=e['hash']}}" /></td>
|
||||
<td>{{=e['count']}}</td>
|
||||
<td>{{=e['causer']}}</td>
|
||||
<td>{{=A(e['last_line'],_href="#",_onclick="collapse('%s');return false;"%e['hash'])}}</td>
|
||||
<td>+ {{=A(T('details'),_href=URL(base_url,args=[app,e['ticket']]))}}</td>
|
||||
</tr>
|
||||
<tr id="{{=e['hash']}}" class="traceback">
|
||||
<td colspan="5">
|
||||
<div class="ticket_code">
|
||||
{{=CODE(e['pickel']['traceback'])}}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{{pass}}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
{{ else: }}
|
||||
<p class="controls row-fluid">
|
||||
<div class="controls controls-row">
|
||||
{{if 'db' in method:}}
|
||||
<span class="uneditable-input">source : db</span>
|
||||
<a class="button btn" href="{{=URL(args=[app, 'old'])}}"><span>switch to : filesystem</span></a>
|
||||
<a class="button btn" href="{{=URL(args=[app, 'dbnew'])}}"><span>lists by exception</span></a>
|
||||
{{else:}}
|
||||
<span class="uneditable-input">source : filesystem</span>
|
||||
{{=switchbutton}}
|
||||
<a class="button btn" href="{{=URL(args=[app, 'new'])}}"><span>lists by exception</span></a>
|
||||
{{pass}}
|
||||
</div>
|
||||
</p>
|
||||
<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>
|
||||
<tr>
|
||||
<th class="column1 cbcentered"><input type="checkbox" name="delete_all}" /></th>
|
||||
<th>{{=T("Ticket")}}</th>
|
||||
<th class="columnN1">{{=T("Date and Time")}}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{for ticket in tickets:}}
|
||||
<tr>
|
||||
<td class="cbcentered"><input type="checkbox" name="delete_{{=ticket}}"/></td>
|
||||
{{if 'db' in method:}}
|
||||
<td><a href="{{=URL('ticketdb',args=[app,ticket])}}">{{=ticket}}</a></td>
|
||||
<td>{{=time.strftime('%Y-%m-%d %H:%M:%S',times[ticket].timetuple())}}</td>
|
||||
{{else:}}
|
||||
<td><a href="{{=URL('ticket',args=[app,ticket])}}">{{=ticket}}</a></td>
|
||||
<td>{{=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(os.stat(os.path.join(request.folder,'../%s/errors/%s' % (app,ticket)))[stat.ST_CTIME]))}}</td>
|
||||
{{pass}}
|
||||
</tr>
|
||||
{{pass}}
|
||||
</tbody>
|
||||
</table>
|
||||
</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'}}
|
||||
|
||||
{{
|
||||
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">
|
||||
<h2>{{=T('This will pull changes from the remote repo for application "%s"?', app)}}</h2>
|
||||
{{=dialog}}
|
||||
</div>
|
||||
<!-- end "git_pull" block -->
|
||||
@@ -1,6 +1,15 @@
|
||||
{{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>
|
||||
<center>
|
||||
{{=form}}
|
||||
</center>
|
||||
<!-- end "git_push" block -->
|
||||
@@ -1,26 +1,23 @@
|
||||
{{extend 'layout.html'}}
|
||||
<script type="text/javascript">
|
||||
jQuery(function() {
|
||||
jQuery("#password").focus();
|
||||
});
|
||||
</script>
|
||||
|
||||
{{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:}}
|
||||
<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>
|
||||
<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">{{=T('ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.')}}</p>
|
||||
<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">
|
||||
jQuery(document).ready(function(){
|
||||
jQuery("#password").focus();
|
||||
});
|
||||
</script>
|
||||
<!-- end "index" block -->
|
||||
@@ -1,5 +1,163 @@
|
||||
{{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'
|
||||
|
||||
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
|
||||
}}
|
||||
|
||||
<h1>{{=T('Manage Admin Users/Students')}}</h1>
|
||||
|
||||
{{=grid}}
|
||||
<h2>{{=T('Manage Admin Users/Students')}}</h2>
|
||||
{{=grid}}
|
||||
32
applications/admin/views/default/pack_custom.html
Normal file
32
applications/admin/views/default/pack_custom.html
Normal file
@@ -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'}}
|
||||
|
||||
{{block sectionclass}}peek{{end}}
|
||||
|
||||
<!-- begin "peek" block -->
|
||||
<h2>{{=T("Peeking at file")}} "{{=filename}}"</h2>
|
||||
|
||||
<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('edit',args=request.args, vars=request.vars), T('Edit'))}}
|
||||
</p>
|
||||
|
||||
<div class="code-wrapper">
|
||||
{{
|
||||
if filename[-3:]=='.py': language='python'
|
||||
else: language='html'
|
||||
}}
|
||||
{{=CODE(data,language=language,link='/examples/global/vars/')}}
|
||||
|
||||
</div>
|
||||
<!-- end "peek" block -->
|
||||
@@ -6,11 +6,17 @@ def all(items):
|
||||
def peekfile(path,file):
|
||||
return A(file.replace('\\\\','/'),_href=URL('peek', args=(app, 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):
|
||||
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):
|
||||
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):
|
||||
form=FORM(T("upload file:")," ",
|
||||
INPUT(_type="file",_name="file")," ",T("and rename it:")," ",
|
||||
@@ -29,57 +35,62 @@ def file_create_form(location):
|
||||
INPUT(_type="submit",_value=T("submit")),_action=URL('create_file'))
|
||||
return form
|
||||
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}}
|
||||
<!-- begin "plugin" block -->
|
||||
<h2>{{=T('Plugin "%s" in application', request.args(1))}} "{{=app}}"</h2>
|
||||
|
||||
<h2>
|
||||
{{=T('Plugin "%s" in application', request.args(1))}} "{{=app}}"
|
||||
</h2>
|
||||
<!-- COLLAPSE/JUMP-TO BUTTONS -->
|
||||
<div class="right-full controls">
|
||||
<a class="button special" href="#" onclick="jQuery('h3').click();return false"><span>{{=T("collapse/expand all")}}</span></a>
|
||||
<span class="buttongroup">
|
||||
{{=button("#models", T("models"))}}
|
||||
{{=button("#controllers", T("controllers"))}}
|
||||
{{=button("#views", T("views"))}}
|
||||
{{=button("#static", T("static"))}}
|
||||
{{=button("#modules", T("modules"))}}
|
||||
</span>
|
||||
<span class="buttongroup">
|
||||
{{=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('pack_plugin',args=request.args), T("pack plugin"))}}
|
||||
</span>
|
||||
<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">
|
||||
{{=button('#models', T("models"))}}
|
||||
{{=button('#controllers', T("controllers"))}}
|
||||
{{=button('#views', T("views"))}}
|
||||
{{=button('#static', T("static"))}}
|
||||
{{=button('#modules', T("modules"))}}
|
||||
</span>
|
||||
<span class="buttongroup">
|
||||
{{=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('pack_plugin',args=request.args), T("pack plugin"))}}
|
||||
</span>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- MODELS -->
|
||||
|
||||
<h3 id="models" onclick="collapse('models_inner');" class="component">
|
||||
{{=T("Models")}}
|
||||
<h3 id="_models" rel="pagebookmark">
|
||||
<span class="component" onclick="collapse('models_inner');">{{=T("Models")}}</span>
|
||||
<span id="models" class="hashstick"> </span><a href="#" class="tophashlink btn btn-mini btn-warning"><span>top</span></a>
|
||||
</h3>
|
||||
<div id="models_inner" class="component_contents">
|
||||
{{if not models:}}
|
||||
<p><strong>{{=T("There are no models")}}</strong></p>
|
||||
{{pass}}
|
||||
<div class="controls comptools">
|
||||
</div>
|
||||
<ul>
|
||||
{{for m in models:}}
|
||||
<li>
|
||||
<span class="filetools controls">
|
||||
{{=editfile('models',m)}}
|
||||
{{=deletefile([app, 'models', m])}}
|
||||
</span>
|
||||
<span class="file">
|
||||
{{=peekfile('models',m)}}
|
||||
</span>
|
||||
<span class="extras">
|
||||
{{if len(defines[m]):}}{{=T("defines tables")}} {{pass}}{{=XML(', '.join([B(table).xml() for table in defines[m]]))}}
|
||||
</span>
|
||||
</li>
|
||||
{{pass}}
|
||||
</ul>
|
||||
{{if not models:}}<p><strong>{{=T("There are no models")}}</strong></p>{{else:}}
|
||||
<ul class="unstyled act-edit">
|
||||
{{for m in models:}}
|
||||
<li>
|
||||
<span class="filetools controls">
|
||||
{{=editfile('models',m)}}
|
||||
{{=deletefile([app, 'models', m])}}
|
||||
</span>
|
||||
<span class="file">
|
||||
{{=peekfile('models',m)}}
|
||||
</span>
|
||||
<span class="extras">
|
||||
{{if len(defines[m]):}}{{=T("defines tables")}} {{pass}}{{=XML(', '.join([B(table).xml() for table in defines[m]]))}}
|
||||
</span>
|
||||
</li>
|
||||
{{pass}}
|
||||
</ul>
|
||||
{{pass}}
|
||||
</div>
|
||||
|
||||
<!-- FIND CONTROLLER FUNCTIONS -->
|
||||
@@ -89,131 +100,124 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
|
||||
}}
|
||||
|
||||
<!-- CONTROLLERS -->
|
||||
|
||||
<h3 id="controllers" onclick="collapse('controllers_inner');" class="component">
|
||||
{{=T("Controllers")}}
|
||||
<h3 id="_controllers" rel="pagebookmark">
|
||||
<span class="component" onclick="collapse('controllers_inner');">{{=T("Controllers")}}</span>
|
||||
<span id="controllers" class="hashstick"> </span><a href="#" class="tophashlink btn btn-mini btn-warning"><span>top</span></a>
|
||||
</h3>
|
||||
<div id="controllers_inner" class="component_contents">
|
||||
{{if not controllers:}}
|
||||
<p><strong>{{=T("There are no controllers")}}</strong></p>
|
||||
{{pass}}
|
||||
<div class="controls comptools">
|
||||
</div>
|
||||
<ul>
|
||||
{{for c in controllers:}}
|
||||
<li>
|
||||
<span class="filetools controls">
|
||||
{{=editfile('controllers',c)}}
|
||||
{{=deletefile([app,'controllers',c])}}
|
||||
{{=testfile('controllers',c)}}
|
||||
</span>
|
||||
<span class="file">
|
||||
{{=peekfile('controllers',c)}}
|
||||
</span>
|
||||
<span class="extras">
|
||||
{{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>
|
||||
</li>
|
||||
{{pass}}
|
||||
</ul>
|
||||
{{if not controllers:}}<p><strong>{{=T("There are no controllers")}}</strong></p>{{else:}}
|
||||
<ul class="unstyled act_edit">
|
||||
{{for c in controllers:}}
|
||||
<li>
|
||||
<span class="filetools controls">
|
||||
{{=editfile('controllers',c)}}
|
||||
{{=deletefile([app,'controllers',c])}}
|
||||
{{=testfile('controllers',c)}}
|
||||
</span>
|
||||
<span class="file">
|
||||
{{=peekfile('controllers',c)}}
|
||||
</span>
|
||||
<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]]))}}
|
||||
</span>
|
||||
</li>
|
||||
{{pass}}
|
||||
</ul>
|
||||
{{pass}}
|
||||
</div>
|
||||
|
||||
<!-- VIEWS -->
|
||||
|
||||
<h3 id="views" onclick="collapse('views_inner');" class="component">
|
||||
{{=T("Views")}}
|
||||
<h3 id="_views" rel="pagebookmark">
|
||||
<span class="component" onclick="collapse('views_inner');">{{=T("Views")}}</span>
|
||||
<span id="views" class="hashstick"> </span><a href="#" class="tophashlink btn btn-mini btn-warning"><span>top</span></a>
|
||||
</h3>
|
||||
<div id="views_inner" class="component_contents">
|
||||
{{if not views:}}
|
||||
<p><strong>{{=T("There are no views")}}</strong></p>
|
||||
{{pass}}
|
||||
<div class="controls comptools">
|
||||
</div>
|
||||
<ul>
|
||||
{{for c in views:}}
|
||||
<li>
|
||||
<span class="filetools controls">
|
||||
{{=editfile('views',c)}}
|
||||
{{=deletefile([app,'views',c])}}
|
||||
</span>
|
||||
<span class="file">
|
||||
{{=peekfile('views',c)}}
|
||||
</span>
|
||||
<span class="extras">
|
||||
{{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]]))}}
|
||||
</span>
|
||||
</li>
|
||||
{{pass}}
|
||||
</ul>
|
||||
{{if not views:}}<p><strong>{{=T("There are no views")}}</strong></p>{{else:}}
|
||||
<ul class="unstyled act_edit">
|
||||
{{for c in views:}}
|
||||
<li>
|
||||
<span class="filetools controls">
|
||||
{{=editfile('views',c)}}
|
||||
{{=deletefile([app, 'views', c])}}
|
||||
</span>
|
||||
<span class="file">
|
||||
{{=peekfile('views',c)}}
|
||||
</span>
|
||||
<span class="extras celled">
|
||||
{{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]]))}}
|
||||
</span>
|
||||
</li>
|
||||
{{pass}}
|
||||
</ul>
|
||||
{{pass}}
|
||||
</div>
|
||||
|
||||
<!-- STATIC -->
|
||||
|
||||
<h3 id="static" onclick="collapse('static_inner');" class="component">
|
||||
{{=T("Static files")}}
|
||||
<h3 id="_static" rel="pagebookmark">
|
||||
<span class="component" onclick="collapse('static_inner');">{{=T("Static files")}}</span>
|
||||
<span id="static" class="hashstick"> </span><a href="#" class="tophashlink btn btn-mini btn-warning"><span>top</span></a>
|
||||
</h3>
|
||||
<div id="static_inner" class="component_contents">
|
||||
{{if not statics:}}<p><strong>{{=T("There are no static files")}}</strong></p>{{pass}}
|
||||
<ul>
|
||||
{{
|
||||
path=[]
|
||||
for file in statics+['']:
|
||||
items=file.split('/')
|
||||
file_path=items[:-1]
|
||||
filename=items[-1]
|
||||
while path!=file_path:
|
||||
if len(file_path)>=len(path) and all([v==file_path[k] for k,v in enumerate(path)]):
|
||||
path.append(file_path[len(path)])
|
||||
thispath='static__'+'__'.join(path)
|
||||
}}
|
||||
<li class="folder">
|
||||
<a href="javascript:collapse('{{=thispath}}');" class="file">{{=path[-1]}}/</a>
|
||||
<ul id="{{=thispath}}" style="display: none;" class="sublist">{{
|
||||
else:
|
||||
path = path[:-1]
|
||||
}}
|
||||
</ul></li>
|
||||
{{
|
||||
pass
|
||||
pass
|
||||
if filename:
|
||||
}}<li>
|
||||
<span class="filetools controls">
|
||||
{{=editfile('static',file)}} {{=deletefile([app,'static',file])}}
|
||||
</span>
|
||||
<span class="file">
|
||||
<a href="{{=URL(a=app,c='static',f=file)}}">{{=filename}}</a>
|
||||
</span>
|
||||
</li>{{
|
||||
pass
|
||||
pass
|
||||
}}
|
||||
{{pass}}
|
||||
</ul>
|
||||
{{if not statics:}}<p><strong>{{=T("There are no static files")}}</strong></p>{{else:}}
|
||||
<ul class="unstyled act_edit">
|
||||
{{
|
||||
path=[]
|
||||
for file in statics+['']:
|
||||
items=file.split('/')
|
||||
file_path=items[:-1]
|
||||
filename=items[-1]
|
||||
while path!=file_path:
|
||||
if len(file_path)>=len(path) and all([v==file_path[k] for k,v in enumerate(path)]):
|
||||
path.append(file_path[len(path)])
|
||||
thispath='static__'+'__'.join(path)
|
||||
}}
|
||||
<li class="folder"><i> </i>
|
||||
<a href="javascript:collapse('{{=thispath}}');" class="file">{{=path[-1]}}/</a>
|
||||
<ul id="{{=thispath}}" style="display: none;" class="sublist">
|
||||
{{
|
||||
else:
|
||||
path = path[:-1]
|
||||
}}
|
||||
</ul>
|
||||
</li>
|
||||
{{
|
||||
pass
|
||||
pass
|
||||
if filename:
|
||||
}}
|
||||
<li>
|
||||
<span class="filetools controls">
|
||||
{{=editfile('static',file)}} {{=deletefile([app,'static',file])}}
|
||||
</span>
|
||||
<span class="file">
|
||||
<a href="{{=URL(a=app,c='static',f=file)}}">{{=filename}}</a>
|
||||
</span>
|
||||
</li>
|
||||
{{
|
||||
pass
|
||||
pass
|
||||
}}
|
||||
</ul>
|
||||
{{pass}}
|
||||
</div>
|
||||
|
||||
<!-- MODULES -->
|
||||
|
||||
<h3 id="modules" onclick="collapse('modules_inner');" class="component">
|
||||
{{=T("Modules")}}
|
||||
<h3 id="_modules" rel="pagebookmark">
|
||||
<span class="component" onclick="collapse('modules_inner');">{{=T("Modules")}}</span>
|
||||
<span id="modules" class="hashstick"> </span><a href="#" class="tophashlink btn btn-mini btn-warning"><span>top</span></a>
|
||||
</h3>
|
||||
<div id="modules_inner" class="component_contents">
|
||||
{{if not modules:}}
|
||||
<p><strong>{{=T("There are no modules")}}</strong></p>
|
||||
{{pass}}
|
||||
<div class="controls comptools">
|
||||
</div>
|
||||
<ul>
|
||||
{{for m in modules:}}
|
||||
<li>
|
||||
{{=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}}
|
||||
{{=peekfile('modules',m)}}
|
||||
</li>
|
||||
{{pass}}
|
||||
</ul>
|
||||
{{if not modules:}}<p><strong>{{=T("There are no modules")}}</strong></p>{{else:}}
|
||||
<ul class="unstyled act_edit">
|
||||
{{for m in modules:}}
|
||||
<li>
|
||||
{{=editfile('modules',m)}}
|
||||
{{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)}}
|
||||
</li>
|
||||
{{pass}}
|
||||
</ul>
|
||||
{{pass}}
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<!-- end "plugin" block -->
|
||||
|
||||
@@ -1,25 +1,21 @@
|
||||
{{extend 'layout.html'}}
|
||||
|
||||
{{block sectionclass}}resolve{{end}}
|
||||
|
||||
<!-- begin "resolve" block -->
|
||||
<h2>{{=T('Resolve Conflict file')}} "{{=filename}}"</h2>
|
||||
|
||||
<script>
|
||||
function plus() {jQuery('.plus').show(); jQuery('.minus').hide(); }
|
||||
function minus() {jQuery('.plus').hide(); jQuery('.minus').show(); }
|
||||
function all() {jQuery('.plus').show(); jQuery('.minus').show(); }
|
||||
</script>
|
||||
|
||||
<div class="controls">
|
||||
<button onclick="plus()">new</button>
|
||||
<button onclick="minus()">old</button>
|
||||
<button onclick="all()">all</button>
|
||||
<button class="btn" onclick="plus()">new</button>
|
||||
<button class="btn" onclick="minus()">old</button>
|
||||
<button class="btn" onclick="all()">all</button>
|
||||
</div>
|
||||
|
||||
<div class="form">
|
||||
<form action="{{=URL(r=request,args=request.args)}}" method="post">
|
||||
{{=diff}}
|
||||
<input type="submit" name="merge" value="{{=T('merge')}}" /><br/>
|
||||
<input class="btn" type="submit" name="merge" value="{{=T('merge')}}" /><br/>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<!-- end "resolve" block -->
|
||||
@@ -1,158 +1,154 @@
|
||||
{{extend 'layout.html'}}
|
||||
{{import os, glob}}
|
||||
|
||||
{{block sectionclass}}site{{end}}
|
||||
|
||||
<div class="applist f60">
|
||||
<div class="applist_inner">
|
||||
<h2>{{=T("Installed applications")}}</h2>
|
||||
<ul>
|
||||
{{for a in apps:}}
|
||||
<li class="application"> <!-- onmouseover="jQuery(this).children('p').show()" onmouseout="jQuery(this).children('p').hide()"-->
|
||||
{{if a==request.application:}}
|
||||
<h3 class="currentapp">{{=a}} ({{=T('currently running')}})</h3>
|
||||
<p class="controls">
|
||||
{{else:}}
|
||||
<h3 class="editableapp">{{=A(a,_href=URL(a,'default','index'))}}</h3>
|
||||
{{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):}}
|
||||
{{=sp_button(URL('design',args=a), T("Edit"))}}
|
||||
{{else:}}
|
||||
{{=button(URL(a,'appadmin','index'), T("appadmin"))}}
|
||||
{{pass}}
|
||||
{{=button(URL('about',args=a), T("About"))}}
|
||||
{{pass}}
|
||||
{{=button(URL('errors',args=a), T("Errors"))}}
|
||||
{{=button(URL('cleanup',args=a), T("Clean"))}}
|
||||
{{=button(URL('pack',args=a), T("Pack all"))}}
|
||||
{{if not os.path.exists('applications/%s/compiled' % a):}}
|
||||
{{=button(URL('compile_app',args=a), T("Compile"))}}
|
||||
{{else:}}
|
||||
{{=button(URL('pack',args=(a, 'compiled')), T("Pack compiled"))}}
|
||||
{{if glob.glob('applications/%s/controllers/*.py' % a):}}
|
||||
{{=button(URL('remove_compiled_app',args=a), T("Remove compiled"))}}
|
||||
{{pass}}
|
||||
{{pass}}
|
||||
{{if os.path.exists(os.path.join(apath(r=request),a,'.git')): }}
|
||||
{{=button(URL('git_pull',args=a), T("Git Pull"))}}
|
||||
{{=button(URL('git_push',args=a), T("Git Push"))}}
|
||||
{{pass}}
|
||||
{{if a!=request.application:}}
|
||||
{{=button(URL('uninstall',args=a), T("Uninstall"))}}
|
||||
{{=button_enable(URL('enable',args=a), a)}}
|
||||
{{pass}}
|
||||
</p>
|
||||
</li>
|
||||
{{pass}}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="sidebar fl60">
|
||||
<div class="sidebar_inner controls">
|
||||
<div class="pwdchange">
|
||||
<!-- begin "site" block -->
|
||||
<div class="row-fluid">
|
||||
<div class="applist f60 span7">
|
||||
<div class="applist_inner">
|
||||
<h2>{{=T("Installed applications")}}</h2>
|
||||
<table width="100%" class="table">
|
||||
{{for a in apps:}}
|
||||
<tr>{{buttons = []}}
|
||||
<td>
|
||||
{{if a==request.application:}}
|
||||
<h4 class="currentapp">{{=a}} ({{=T('currently running')}})</h4>
|
||||
{{else:}}
|
||||
<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 not os.path.exists('applications/%s/compiled' % a):}}
|
||||
{{buttons.append((URL('design',args=a), T("Edit")))}}
|
||||
{{else:}}
|
||||
{{buttons.append((URL(a,'appadmin','index'), T("appadmin")))}}
|
||||
{{pass}}
|
||||
{{buttons.append((URL('about',args=a), T("About")))}}
|
||||
{{pass}}
|
||||
{{buttons.append((URL('errors',args=a), T("Errors")))}}
|
||||
{{buttons.append((URL('cleanup',args=a), T("Clean")))}}
|
||||
{{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):}}
|
||||
{{buttons.append((URL('compile_app',args=a), T("Compile")))}}
|
||||
{{else:}}
|
||||
{{buttons.append((URL('pack',args=(a, 'compiled')), T("Pack compiled")))}}
|
||||
{{if glob.glob('applications/%s/controllers/*.py' % a):}}
|
||||
{{buttons.append((URL('remove_compiled_app',args=a), T("Remove compiled")))}}
|
||||
{{pass}}
|
||||
{{pass}}
|
||||
{{if os.path.exists(os.path.join(apath(r=request),a,'.git')): }}
|
||||
{{buttons.append((URL('git_pull',args=a), T("Git Pull")))}}
|
||||
{{buttons.append((URL('git_push',args=a), T("Git Push")))}}
|
||||
{{pass}}
|
||||
{{if a!=request.application:}}
|
||||
{{buttons.append((URL('uninstall',args=a), T("Uninstall")))}}
|
||||
{{pass}}
|
||||
</td>
|
||||
<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}}
|
||||
</ul>
|
||||
</div>
|
||||
{{=button_enable(URL('enable',args=a), a)}}
|
||||
</td>
|
||||
</tr>
|
||||
{{pass}}
|
||||
</table>
|
||||
</div>
|
||||
</div> <!-- /applist -->
|
||||
<div class="sidebar fl60 span5">
|
||||
<div class="sidebar_inner controls well well-small">
|
||||
<!-- CHANGE ADMIN PWD -->
|
||||
{{if MULTI_USER_MODE:}}
|
||||
{{=auth.navbar()}}
|
||||
{{else:}}
|
||||
{{=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'))}}
|
||||
<div class="pwdchange pull-right">
|
||||
{{if MULTI_USER_MODE:}}
|
||||
{{=auth.navbar()}}
|
||||
{{else:}}
|
||||
{{=sp_button(URL('change_password'), T('Change admin password'))}}
|
||||
{{=button(URL('default','reload_routes'), T('Reload routes'))}}
|
||||
</p>
|
||||
{{pass}}
|
||||
</div> <!-- /CHANGE ADMIN PWD -->
|
||||
{{if is_manager():}}
|
||||
<!-- VERSION -->
|
||||
<div class="box">
|
||||
<h4>{{=T("Version")}}</h4>
|
||||
<p>
|
||||
<tt>{{=myversion}}</tt><br/>
|
||||
({{=T("Running on %s", request.env.server_software)}})
|
||||
</p>
|
||||
<p id="check_version" class="row-buttons">
|
||||
{{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}}
|
||||
</p>
|
||||
{{if session.is_mobile=='auto':}}
|
||||
<p>{{=A(T('Try the mobile interface'),_href=URL('plugin_jqmobile','about'))}}</p>
|
||||
{{pass}}
|
||||
</div> <!-- /VERSION -->
|
||||
{{pass}}
|
||||
<p>
|
||||
{{=T("Running on %s", request.env.server_software)}}
|
||||
</p>
|
||||
{{if session.is_mobile=='auto':}}<p>
|
||||
{{=A(T('Try the mobile interface'),_href=URL('plugin_jqmobile','about'))}}</p>
|
||||
{{if MULTI_USER_MODE and is_manager():}}
|
||||
<!-- MULTI_USER_INTERFACE -->
|
||||
<div class="box">
|
||||
<h4>{{=T("Multi User Mode")}}</h4>
|
||||
<p class="row-buttons">
|
||||
{{=button(URL('bulk_register'),T('Bulk Register'))}}
|
||||
{{=button(URL('manage_students',vars={'order':'auth_user.id'}),T('Manage Students'))}}
|
||||
</p>
|
||||
</div> <!-- /MULTI_USER_INTERFACE -->
|
||||
{{pass}}
|
||||
<!-- SCAFFOLD APP -->
|
||||
<div class="box">
|
||||
<h4>{{=T("New simple application")}}</h4>
|
||||
{{=form_create.custom.begin}}
|
||||
{{=LABEL(T("Application name:"))}}
|
||||
{{=form_create.custom.widget.name}}
|
||||
<div class="controls"><button type="submit" class="btn">{{=T('Create')}}</button></div>
|
||||
{{=form_create.custom.end}}
|
||||
</div> <!-- /SCAFFOLD APP -->
|
||||
<!-- UPLOAD PACKAGE -->
|
||||
<div class="box">
|
||||
<h4>{{=T("Upload and install packed application")}}</h4>
|
||||
{{=form_update.custom.begin}}
|
||||
<label for="appupdate_name">{{=T("Application name:")}}</label>
|
||||
{{=form_update.custom.widget.name}}
|
||||
<label for="appupdate_file">{{=T("Upload a package:")}}</label>
|
||||
{{=form_update.custom.widget.file}}
|
||||
<label for="appupdate_url">{{=T("Or Get from URL:")}}</label>
|
||||
{{=form_update.custom.widget.url}}<small class="help-block">({{=T('can be a git repo')}})</small>
|
||||
<div class="controls">
|
||||
<label class="checkbox">
|
||||
{{=form_update.custom.widget.overwrite}} {{=T("Overwrite installed app")}}
|
||||
</label>
|
||||
<button type="submit" class='btn'>{{=T('Install')}}</button>
|
||||
</div>
|
||||
{{=form_update.custom.end}}
|
||||
</div> <!-- /UPLOAD PACKAGE -->
|
||||
<!-- DEPLOY ON GAE -->
|
||||
<div class="box">
|
||||
<h4>{{=T("Deploy")}}</h4>
|
||||
<p class="row-buttons">
|
||||
{{=button(URL('gae','deploy'), T('Deploy on Google App Engine'))}}
|
||||
{{=button(URL('openshift','deploy'),T('Deploy to OpenShift'))}}
|
||||
</p>
|
||||
</div> <!-- /DEPLOY ON GAE -->
|
||||
<!-- APP WIZARD -->
|
||||
<div class="box">
|
||||
<h4>{{=T("New application wizard")}}</h4>
|
||||
<p>{{=button(URL('wizard','index'), T('Start wizard'))}}<br/>
|
||||
{{=T("(requires internet access, experimental)")}}</p>
|
||||
</div> <!-- /APP WIZARD -->
|
||||
<a class="twitter-timeline" href="https://twitter.com/web2py" data-widget-id="340456915207327745">Tweets by @web2py</a>
|
||||
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+"://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
|
||||
</div>
|
||||
{{pass}}
|
||||
<!-- MULTI_USER_INTERFACE -->
|
||||
{{if MULTI_USER_MODE and is_manager():}}
|
||||
<div class="box">
|
||||
<h3>{{=T("Multi User Mode")}}</h3>
|
||||
<p>
|
||||
{{=button(URL('bulk_register'),T('Bulk Register'))}}
|
||||
{{=button(URL('manage_students'),T('Manage Students'))}}
|
||||
</p>
|
||||
</div>
|
||||
{{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 -->
|
||||
<div class="box">
|
||||
<h3>{{=T("New simple application")}}</h3>
|
||||
{{=form_create.custom.begin}}
|
||||
<table><tr><td>
|
||||
{{=LABEL(T("Application name:"))}}
|
||||
</td><td>
|
||||
{{=form_create.custom.widget.name}}
|
||||
</td><td>
|
||||
<button type="submit">{{=T('Create')}}</button>
|
||||
</td></tr></table>
|
||||
{{=form_create.custom.end}}
|
||||
</div>
|
||||
<!-- UPLOAD PACKAGE -->
|
||||
<div class="box">
|
||||
<h3>{{=T("Upload and install packed application")}}</h3>
|
||||
{{=form_update.custom.begin}}
|
||||
<table><tr><td>
|
||||
{{=LABEL(T("Application name:"))}}
|
||||
</td><td>
|
||||
{{=form_update.custom.widget.name}}
|
||||
</td></tr><tr><td>
|
||||
{{=LABEL(T("Upload a package:"))}}
|
||||
</td><td>
|
||||
{{=form_update.custom.widget.file}}
|
||||
</td></tr><tr><td>
|
||||
{{=LABEL('Or ',T("Get from URL:"))}}
|
||||
</td><td>
|
||||
{{=form_update.custom.widget.url}}
|
||||
</td></tr><tr><td>
|
||||
({{=T('can be a git repo')}})
|
||||
</td><td>
|
||||
{{=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>
|
||||
<!-- DEPLOY ON GAE -->
|
||||
<div class="box">
|
||||
<h3>{{=T("Deploy")}}</h3>
|
||||
<p>
|
||||
{{=button(URL('gae','deploy'), T('Deploy on Google App Engine'))}}
|
||||
{{=button(URL('openshift','deploy'),T('Deploy to OpenShift'))}}
|
||||
</p>
|
||||
</div><br/>
|
||||
{{if TWITTER_HASH:}}
|
||||
<div class="box">
|
||||
<h3>{{=T("%s Recent Tweets"%TWITTER_HASH)}}</h3>
|
||||
<div id="tweets">{{=T('loading...')}}</div>
|
||||
<script>
|
||||
jQuery(document).ready(function(){jQuery('#tweets').load('{{=URL('twitter.load')}}');});
|
||||
</script>
|
||||
</div>
|
||||
{{pass}}
|
||||
</div>
|
||||
</div>
|
||||
</div> <!-- /sidebar -->
|
||||
</div> <!-- /row-fluid
|
||||
<!-- end "site" block -->
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{{extend 'layout.html'}}
|
||||
|
||||
{{block sectionclass}}test{{end}}
|
||||
|
||||
<!-- begin "test" block -->
|
||||
<h2>{{=T('Testing application')}} "{{=app}}"</h2>
|
||||
|
||||
{{for controller in sorted(controllers):}}
|
||||
@@ -14,8 +14,14 @@ ajax('{{=URL(a=app,c=controller[:-3],f='_TEST')}}',[],'output_{{=controller[:-3]
|
||||
//--></script>
|
||||
{{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.
|
||||
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>
|
||||
<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("""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>
|
||||
</div>
|
||||
<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'}}
|
||||
|
||||
{{block sectionclass}}ticket{{end}}
|
||||
|
||||
<!-- begin "ticket" block -->
|
||||
<h2>{{=T('Error ticket')}} for "{{=app}}"</h2>
|
||||
<h3>{{=T('Ticket ID')}}</h3>
|
||||
<p>{{=ticket}}</p>
|
||||
@@ -11,122 +10,122 @@
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>web2py™</th>
|
||||
<td>{{=myversion}}</td>
|
||||
<td>Version {{=myversion}}</td>
|
||||
</tr>
|
||||
{{if snapshot:}}
|
||||
<tr>
|
||||
<th>Python</th>
|
||||
<td>{{=snapshot.get('pyver','')}}</td>
|
||||
</tr>
|
||||
</tr>
|
||||
{{pass}}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
{{if traceback or code or layer:}}
|
||||
<h3>{{=T('Traceback')}}</h3>
|
||||
<div class="inspect">
|
||||
{{=traceback}}
|
||||
</div>
|
||||
|
||||
<div class="inspect resp1">{{=traceback}}</div>
|
||||
{{if snapshot:}}
|
||||
{{try:}}
|
||||
|
||||
<!-- ERROR SNAPSHOT -->
|
||||
|
||||
<h3>
|
||||
{{=T('Error snapshot')}}
|
||||
<span class="tooltip">{{=helpicon()}} <span>{{=T('Detailed traceback description')}}</span></span>
|
||||
</h3>
|
||||
|
||||
<!-- SNAPSHOT LIST -->
|
||||
|
||||
<div id="snapshot">
|
||||
<!-- Exception details -->
|
||||
<p class="exception_object inspect">
|
||||
<code>{{=snapshot['etype']}}({{=snapshot['evalue']}})</code>
|
||||
</p>
|
||||
<p class="controls">
|
||||
<a class="button" onclick="collapse('exception_inner');"><span>{{=T('inspect attributes')}}</span></a>
|
||||
</p>
|
||||
<div id="exception_inner" class="hide">
|
||||
<div class="inspect">
|
||||
<h5>{{=T("Exception instance attributes")}}</h5>
|
||||
<table>
|
||||
<tbody>
|
||||
{{for k,v in snapshot['exception'].items():}}
|
||||
<tr>
|
||||
<th>{{=k}}</th>
|
||||
<td>{{=v}}</td>
|
||||
</tr>
|
||||
{{pass}}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<!-- ERROR SNAPSHOT -->
|
||||
<h3>{{=T('Error snapshot')}}
|
||||
<a href="#" rel="tooltip" data-placement="right" data-original-title="{{=T('Detailed traceback description')}}">
|
||||
{{=helpicon()}}
|
||||
<span>{{=T("Detailed traceback description")}}</span>
|
||||
</a>
|
||||
</h3>
|
||||
<!-- SNAPSHOT LIST -->
|
||||
<div id="snapshot">
|
||||
<!-- Exception details -->
|
||||
<p class="exception_object inspect">
|
||||
<code>{{=snapshot['etype']}}({{=snapshot['evalue']}})</code>
|
||||
</p>
|
||||
<p class="controls">
|
||||
<a class="button btn" onclick="collapse('exception_inner');"><span>{{=T('inspect attributes')}}</span></a>
|
||||
</p>
|
||||
<div id="exception_inner" class="hide">
|
||||
<div class="inspect">
|
||||
<h4>{{=T("Exception instance attributes")}}</h4>
|
||||
<table>
|
||||
<tbody>
|
||||
{{for k,v in snapshot['exception'].items():}}
|
||||
<tr>
|
||||
<th>{{=k}}</th>
|
||||
<td>{{=v}}</td>
|
||||
</tr>
|
||||
{{pass}}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- FRAMES -->
|
||||
<div id="frames">
|
||||
<h4>{{=T('Frames')}}</h4>
|
||||
<ul class="unstyled">
|
||||
{{for i, frame in enumerate(snapshot['frames']):}}
|
||||
<li>
|
||||
{{is_hidden = (i != len(snapshot['frames'])-1 and 'hide' or 'inspect')}}
|
||||
<div class="framefile inspect controls">
|
||||
<p>
|
||||
<strong>File {{="%s in %s at line %s" % (frame['file'], frame['func'], frame['lnum'])}}</strong>
|
||||
<a class="button tbbutton btn" onclick="collapse('{{='%s_code_inner' % i}}');"><span>{{=T("code")}}</span></a>
|
||||
<a class="button tbbutton btn" onclick="collapse('{{='%s_args_inner' % i}}');"><span>{{=T("arguments")}}</span></a>
|
||||
<a class="button tbbutton btn" onclick="collapse('{{='%s_vars_inner' % i}}');"><span>{{=T("variables")}}</span></a>
|
||||
</p>
|
||||
<div id="{{='%s_args_inner' % i}}" class="{{=is_hidden}}" style="width:100%;overflow:auto">
|
||||
<h5>Function argument list</h5>
|
||||
<p>{{=frame['call']}}</p>
|
||||
</div>
|
||||
<div id="{{='%s_code_inner' % i}}" class="{{=is_hidden}}" style="width:100%;overflow:auto">
|
||||
<h5>Code listing</h5>
|
||||
{{if frame['lines']:}}
|
||||
<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>
|
||||
{{pass}}
|
||||
</div>
|
||||
<div id="{{='%s_vars_inner' % i}}" class="{{=is_hidden}}" style="width:100%;overflow:auto">
|
||||
<h5>Variables</h5>
|
||||
<table>
|
||||
<tbody>
|
||||
{{for k,v in frame['dump'].items():}}
|
||||
<tr>
|
||||
<th>{{=k}}</th>
|
||||
<td>{{=v}}</td>
|
||||
</tr>
|
||||
{{pass}}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- FRAMES -->
|
||||
<div id="frames">
|
||||
<h4>{{=T('Frames')}}</h4>
|
||||
<ul>
|
||||
{{for i, frame in enumerate(snapshot['frames']):}}
|
||||
<li>
|
||||
{{is_hidden = (i != len(snapshot['frames'])-1 and 'hide' or 'inspect')}}
|
||||
<div class="framefile inspect controls">
|
||||
<p>
|
||||
<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" 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>
|
||||
</p>
|
||||
<div id="{{="%s_args_inner" % i}}" class="{{=is_hidden}}">
|
||||
<h5>Function argument list</h5>
|
||||
<p>{{=frame['call']}}</p>
|
||||
</div>
|
||||
<div id="{{="%s_code_inner" % i}}" class="{{=is_hidden}}">
|
||||
<h5>Code listing</h5>
|
||||
{{if frame['lines']:}}
|
||||
<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>
|
||||
{{pass}}
|
||||
</div>
|
||||
<div id="{{="%s_vars_inner" % i}}" class="{{=is_hidden}}">
|
||||
<h5>Variables</h5>
|
||||
<table>
|
||||
<tbody>
|
||||
{{for k,v in frame['dump'].items():}}
|
||||
<tr>
|
||||
<th>{{=k}}</th>
|
||||
<td>{{=v}}</td>
|
||||
</tr>
|
||||
{{pass}}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</li>
|
||||
{{pass}}
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<!-- VIEW ENVIRONMENT -->
|
||||
<div class="viewenv">
|
||||
<h4>Context</h4>
|
||||
<p class="controls">
|
||||
<a class="button" onclick="jQuery('#locals').slideToggle()"><span>{{=T('locals')}}</span></a>
|
||||
<a class="button" onclick="jQuery('#request').slideToggle()"><span>{{=T('request')}}</span></a>
|
||||
<a class="button" onclick="jQuery('#session').slideToggle()"><span>{{=T('session')}}</span></a>
|
||||
<a class="button" onclick="jQuery('#response').slideToggle()"><span>{{=T('response')}}</span></a>
|
||||
</p>
|
||||
<div class="hide inspect" id="locals"><h6>locals</h6>{{=BEAUTIFY(snapshot['locals'])}}</div>
|
||||
<div class="hide inspect" id="request"><h6>request</h6>{{=BEAUTIFY(snapshot['request'])}}</div>
|
||||
<div class="hide inspect" id="session"><h6>session</h6>{{=BEAUTIFY(snapshot['session'])}}</div>
|
||||
<div class="hide inspect" id="response"><h6>response</h6>{{=BEAUTIFY(snapshot['response'])}}</div>
|
||||
</div>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- VIEW ENVIRONMENT -->
|
||||
<div class="viewenv">
|
||||
<h4><span>Context</span></h4>
|
||||
<p class="controls">
|
||||
<a class="button btn" onclick="jQuery('#locals').slideToggle()"><span>{{=T('locals')}}</span></a>
|
||||
<a class="button btn" onclick="jQuery('#request').slideToggle()"><span>{{=T('request')}}</span></a>
|
||||
<a class="button btn" onclick="jQuery('#session').slideToggle()"><span>{{=T('session')}}</span></a>
|
||||
<a class="button btn" onclick="jQuery('#response').slideToggle()"><span>{{=T('response')}}</span></a>
|
||||
</p>
|
||||
<div class="hide inspect resp1" id="locals"><h4>locals</h4>
|
||||
{{=BEAUTIFY(snapshot.get('locals','no locals available in snapshot'))}}
|
||||
</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>
|
||||
{{except Exception, e:}}
|
||||
<!-- this should not happen, just in case... (cannot output normal hmtl as we don't know current open tags) -->
|
||||
{{import traceback;tb=traceback.format_exc().replace("\n","\\n") }}
|
||||
<script language='javascript'>alert("Exception during snapshot rendering: {{=tb}} ");</script>
|
||||
<!-- this should not happen, just in case... (cannot output normal hmtl as we don't know current open tags) -->
|
||||
{{import traceback;tb=traceback.format_exc().replace("\n","\\n") }}
|
||||
<script language='javascript'>alert("Exception during snapshot rendering: {{=tb}} ");</script>
|
||||
{{pass}}
|
||||
{{pass}}
|
||||
|
||||
@@ -137,3 +136,4 @@
|
||||
{{else:}}
|
||||
<h3>{{=T('Ticket Missing')}}</h3>
|
||||
{{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: }}
|
||||
{{ =DIV(H5(t["from_user_name"])) }}
|
||||
{{ =DIV(t["text"]) }}
|
||||
{{ =BR() }}
|
||||
<tr class="tweet">
|
||||
<td><img src="{{=t['profile_image_url_https']}}"/></td>
|
||||
<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 }}
|
||||
</table>
|
||||
@@ -1,7 +1,7 @@
|
||||
{{extend 'layout.html'}}
|
||||
|
||||
<!-- begin "uninstall" block -->
|
||||
<h2>{{=T('Are you sure you want to uninstall application "%s"?', app)}}</h2>
|
||||
<div class="center">
|
||||
{{=dialog}}
|
||||
</div>
|
||||
|
||||
<!-- end "uninstall" block -->
|
||||
@@ -1,13 +1,17 @@
|
||||
{{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}}
|
||||
|
||||
<!-- begin "shell" block -->
|
||||
<h2>{{=T('web2py upgrade')}}</h2>
|
||||
|
||||
<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>
|
||||
|
||||
<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 />
|
||||
{{=T('If start the upgrade, be patient, it may take a while to download')}}</p></div>
|
||||
<div class="center">
|
||||
{{=dialog}}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -1,20 +1,67 @@
|
||||
{{extend 'layout.html'}}
|
||||
<!-- begin "user" block -->
|
||||
<h2>{{=T( request.args(0).replace('_',' ').capitalize() )}}</h2>
|
||||
<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}}
|
||||
{{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}}
|
||||
</div>
|
||||
|
||||
<script language="javascript">
|
||||
<!--
|
||||
//<!--
|
||||
jQuery("#web2py_user_form input:visible:enabled:first").focus();
|
||||
//-->
|
||||
</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">
|
||||
|
||||
<head>
|
||||
<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 name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<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'}}
|
||||
<script>jQuery.noConflict();</script>
|
||||
</head>
|
||||
|
||||
<body class="{{=T('direction: ltr') == 'direction: rtl' and 'RTLbody' or ''}} {{block sectionclass}}home{{end}}">
|
||||
<div id="header">
|
||||
<h1 id="start">
|
||||
<a href="{{=URL('default', 'index')}}" class="button"><span>web2py™ {{=T('administrative interface')}}</span></a>
|
||||
</h1>
|
||||
{{if response.menu is not None:}}
|
||||
<ul id="menu">
|
||||
{{for _name,_active,_link in response.menu:}}
|
||||
<li>{{=A(SPAN(_name), _href=_link, _class=_active and 'button select' or 'button')}}</li>
|
||||
{{pass}}
|
||||
</ul>
|
||||
{{pass}}
|
||||
</div>
|
||||
<div id="main">
|
||||
<div id="main_inner">
|
||||
<div class="flash">{{=response.flash or ''}}</div>
|
||||
{{include}}
|
||||
</div>
|
||||
</div>
|
||||
<div id="footer" class="fixed">
|
||||
{{=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'):}}
|
||||
<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()">
|
||||
{{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>
|
||||
{{pass}}
|
||||
</select>
|
||||
</span>
|
||||
{{pass}}
|
||||
</div>
|
||||
|
||||
<!-- NAVBAR
|
||||
============== -->
|
||||
<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:}}
|
||||
<ul id="menu" class="nav pull-right">
|
||||
{{for _name,_active,_link in response.menu:}}
|
||||
<li>{{=A(SPAN(_name), _href=_link, _class=_active and 'button select' or 'button')}}</li>
|
||||
{{pass}}
|
||||
</ul>
|
||||
{{pass}}
|
||||
</div><!--/.nav-collapse -->
|
||||
</div><!-- /container-fluid -->
|
||||
</div><!-- /navbar-inner -->
|
||||
</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}}
|
||||
</div><!-- /main span12 -->
|
||||
</div><!-- /main row-fluid -->
|
||||
</div><!-- /#main -->
|
||||
|
||||
<!-- 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'):}}
|
||||
- {{=T('Admin language')}}</span>
|
||||
<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']):}}
|
||||
<option {{=T.accepted_language==langinfo[0] and 'selected' or ''}} {{='id='+langinfo[0]}} >{{=langinfo[1]}}</option>
|
||||
{{pass}}
|
||||
</select>
|
||||
{{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}}
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -7,7 +7,6 @@ for application "{{=request.args[0]}}"</h2>
|
||||
<h3>Commit form</h3>
|
||||
{{=form}}
|
||||
|
||||
|
||||
{{if repo['.'].rev()>=0:}}
|
||||
<h3>Last Revision</h3>
|
||||
<table>
|
||||
|
||||
@@ -9,6 +9,13 @@
|
||||
body {
|
||||
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 {
|
||||
position: absolute;
|
||||
margin-left: 320px;
|
||||
@@ -35,6 +42,7 @@
|
||||
</head>
|
||||
<body>
|
||||
<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">
|
||||
<h1><a href="http://web2py.com">web2py</a> plugin</h1>
|
||||
<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