Compare commits
2056 Commits
build-3012
...
develop
| Author | SHA1 | Date |
|---|---|---|
|
|
64a93dd42f | |
|
|
eb52813822 | |
|
|
8613a03d00 | |
|
|
8f0b8929ba | |
|
|
08e1c5274d | |
|
|
5f347ccfac | |
|
|
ca2bf19b7a | |
|
|
fad1f9d6d9 | |
|
|
51838fb413 | |
|
|
45cb401112 | |
|
|
9078515984 | |
|
|
52ae83e2f4 | |
|
|
b454cf9ead | |
|
|
65f5624ff9 | |
|
|
e82450dfe9 | |
|
|
f1992eaa78 | |
|
|
bdeecc76c6 | |
|
|
8c8024c12b | |
|
|
c183af3d6b | |
|
|
ab424c21d2 | |
|
|
753f35b24d | |
|
|
624853c868 | |
|
|
71d8571eb9 | |
|
|
fae16c7483 | |
|
|
253a6c566b | |
|
|
ed561be4b5 | |
|
|
eb69640667 | |
|
|
9b0a9d1f32 | |
|
|
e1cc5483a2 | |
|
|
73d2a7a020 | |
|
|
eb298d6859 | |
|
|
93c4154648 | |
|
|
fbd871d204 | |
|
|
0d82f6ee16 | |
|
|
1279b16ec0 | |
|
|
e3cff0a825 | |
|
|
6a6e4cde09 | |
|
|
1dd15fb0aa | |
|
|
9282369e54 | |
|
|
828191d683 | |
|
|
c0031cfe3d | |
|
|
9b17546082 | |
|
|
eed3d51f4b | |
|
|
4eac68b645 | |
|
|
fe6157e8cf | |
|
|
675bf2b69c | |
|
|
4ffc0d9b3b | |
|
|
7b665325f7 | |
|
|
eab17b3340 | |
|
|
4fafe30141 | |
|
|
7f85c91601 | |
|
|
d424026f17 | |
|
|
a4f8935b3a | |
|
|
4f837ae67f | |
|
|
0053775c7e | |
|
|
9d6c71829f | |
|
|
d00a0c08f7 | |
|
|
7e2c917ca0 | |
|
|
a84a55f178 | |
|
|
25ecab2c65 | |
|
|
b2f344fd30 | |
|
|
3bba9ec619 | |
|
|
86e03e0ba7 | |
|
|
67fd15c75c | |
|
|
b7a41c6465 | |
|
|
a8d5b8e735 | |
|
|
f977b7298e | |
|
|
9a41e8a236 | |
|
|
3d113e3877 | |
|
|
c7e80a0694 | |
|
|
9058c8af1d | |
|
|
08008a6dc3 | |
|
|
8645328cce | |
|
|
38388d2afb | |
|
|
e4d5fccdf5 | |
|
|
5f3a327d35 | |
|
|
51ed748013 | |
|
|
dcdf9e55a3 | |
|
|
7c9e449c4b | |
|
|
e7923dca9b | |
|
|
55372bf83d | |
|
|
0f556bfad4 | |
|
|
817719d539 | |
|
|
cd229a0b42 | |
|
|
b6e2fe7494 | |
|
|
ad1d8ea373 | |
|
|
2d5d93787f | |
|
|
676cbaa656 | |
|
|
d4e0e41186 | |
|
|
49d3e2a4ac | |
|
|
97d23a6bcb | |
|
|
0f7b9b2884 | |
|
|
0d25814e6e | |
|
|
1e0faa7309 | |
|
|
10e6fedb5c | |
|
|
d6dc79b478 | |
|
|
1071dec044 | |
|
|
403a830157 | |
|
|
c3bd62c0cc | |
|
|
71716b2240 | |
|
|
3a6d86e23c | |
|
|
d1b9c8b19a | |
|
|
615158baf2 | |
|
|
a392d59df4 | |
|
|
8bfb339fd5 | |
|
|
15f9beecf6 | |
|
|
fcc49c52a1 | |
|
|
e9d2ed7617 | |
|
|
685a566c85 | |
|
|
4c95ad58ac | |
|
|
8519b56c5a | |
|
|
62d66fac75 | |
|
|
f4b1ab59e0 | |
|
|
0b60c8d0cc | |
|
|
d4fcb0c19f | |
|
|
98b70724a4 | |
|
|
8f9f7d90fa | |
|
|
81627fc37f | |
|
|
49888b9b5b | |
|
|
b2c2129d42 | |
|
|
35a5f9f17c | |
|
|
b942265652 | |
|
|
b657511310 | |
|
|
a687356d72 | |
|
|
f4c71f9778 | |
|
|
1120d8be31 | |
|
|
5fba0f8d97 | |
|
|
ab1575365d | |
|
|
3369b39341 | |
|
|
f5b090a20b | |
|
|
cc664889f8 | |
|
|
cfe0129a6d | |
|
|
a525082f26 | |
|
|
7f5b6152f0 | |
|
|
0df9beb786 | |
|
|
85c0c5812f | |
|
|
4ede79ba51 | |
|
|
155ee69863 | |
|
|
8d49ea0368 | |
|
|
93dc5ccd35 | |
|
|
7b6a571550 | |
|
|
0db6bac749 | |
|
|
c23305634f | |
|
|
481f8099af | |
|
|
23ce65d0bd | |
|
|
ce1c4673b2 | |
|
|
a2c607b449 | |
|
|
e4f6444d35 | |
|
|
dbdc5e5296 | |
|
|
3b45014af0 | |
|
|
55c532b44f | |
|
|
c73e78d6e6 | |
|
|
488aa4c03d | |
|
|
2cc56f7ad7 | |
|
|
e6046f74b6 | |
|
|
aa9555aa1e | |
|
|
39dfbadbd8 | |
|
|
b7732c11f8 | |
|
|
7faac7b61b | |
|
|
98cae96d5d | |
|
|
0f30107481 | |
|
|
42c77a8049 | |
|
|
69f4bc837a | |
|
|
89411738cb | |
|
|
9d7fea284a | |
|
|
198adfe395 | |
|
|
383d9deeb3 | |
|
|
7945c52cbb | |
|
|
9e84bcc0df | |
|
|
6007abd6a8 | |
|
|
be5a127b4c | |
|
|
93a824501b | |
|
|
3309c7f69a | |
|
|
b04bb0c55b | |
|
|
8cafb23b3e | |
|
|
2c76628926 | |
|
|
b678bfd70d | |
|
|
9d63882e69 | |
|
|
d4546c6975 | |
|
|
a9b9e592bb | |
|
|
dcb842035f | |
|
|
9c0e643b23 | |
|
|
94747d9fe0 | |
|
|
81cf0dadb0 | |
|
|
254d1ecac7 | |
|
|
754be7877e | |
|
|
8a8f1d14f9 | |
|
|
bd2d9410b5 | |
|
|
1e623e77de | |
|
|
a0b255a5d5 | |
|
|
342960e57b | |
|
|
36a184638f | |
|
|
1ce4d4f4e6 | |
|
|
810ae15769 | |
|
|
f26733fa46 | |
|
|
55f6839521 | |
|
|
4a3630f786 | |
|
|
71458e3983 | |
|
|
5ff152233b | |
|
|
3677181e09 | |
|
|
46111f041d | |
|
|
1dd160e19f | |
|
|
f07a96165d | |
|
|
3e9d2e371e | |
|
|
3d14ddbe74 | |
|
|
28487f271e | |
|
|
51f1a7e58e | |
|
|
a027ed7096 | |
|
|
70dd62606b | |
|
|
21301017ca | |
|
|
1772f5a46f | |
|
|
4804877452 | |
|
|
1d0a01c7ee | |
|
|
04a45394a0 | |
|
|
2c6f1ef0de | |
|
|
2786c74175 | |
|
|
8835455795 | |
|
|
2d7a6db541 | |
|
|
9b427b7a24 | |
|
|
315f532719 | |
|
|
04a7445f68 | |
|
|
6368897b21 | |
|
|
d7eef09946 | |
|
|
f8462dbb84 | |
|
|
8ddb4ce80d | |
|
|
6b66764082 | |
|
|
5673d9b21e | |
|
|
c163d6b0ba | |
|
|
61eddbb2bc | |
|
|
48547d2cb1 | |
|
|
c3563a9197 | |
|
|
08fafbf2de | |
|
|
cbaf1ea4f9 | |
|
|
d9004980e6 | |
|
|
5d87d1a358 | |
|
|
3245024925 | |
|
|
d3a9a7c1e5 | |
|
|
f389250aa8 | |
|
|
d5dcc71e35 | |
|
|
67241e7be7 | |
|
|
5ab863bc33 | |
|
|
89c4df9650 | |
|
|
e6ac929303 | |
|
|
fb3cf004b9 | |
|
|
531bf25376 | |
|
|
27b66783c1 | |
|
|
2402cf6992 | |
|
|
387a9b141d | |
|
|
625a9dc0e4 | |
|
|
a09f922463 | |
|
|
9b6f6f74e9 | |
|
|
db9ad36627 | |
|
|
ea0131cb4e | |
|
|
c5439f7a18 | |
|
|
78debaa8ab | |
|
|
8bbdedd082 | |
|
|
3c4e59faa9 | |
|
|
b532308e28 | |
|
|
63289a29af | |
|
|
5d60c3db81 | |
|
|
8f58fe4017 | |
|
|
82007bb41c | |
|
|
358f42bba2 | |
|
|
ab5b6a5fb5 | |
|
|
b04b8cfee2 | |
|
|
45e6122439 | |
|
|
d0115a8cd9 | |
|
|
ec7a79c8bb | |
|
|
df9cbf3ba7 | |
|
|
33d0de6f0c | |
|
|
8b350ca3b6 | |
|
|
abade1915e | |
|
|
eba86ccdd5 | |
|
|
a388d5e1d0 | |
|
|
98dbb358bd | |
|
|
93961806eb | |
|
|
6366bc5c6e | |
|
|
ae138b79c0 | |
|
|
ed9887f9e9 | |
|
|
3dc4af65e0 | |
|
|
ab5947d94a | |
|
|
8979d732f2 | |
|
|
b9eff8dac0 | |
|
|
c42dfdbb30 | |
|
|
94ac48c8b5 | |
|
|
ac469c2741 | |
|
|
d7a4e46355 | |
|
|
051477d19f | |
|
|
47fd0cb68d | |
|
|
371f68a616 | |
|
|
69a37495b5 | |
|
|
78ae753d87 | |
|
|
4944c5983d | |
|
|
182deaa177 | |
|
|
1281caccf2 | |
|
|
604b6f6b59 | |
|
|
996fbe51d0 | |
|
|
d4b412e223 | |
|
|
2d408eb3a7 | |
|
|
c8a8ecc40d | |
|
|
b51207dd3e | |
|
|
f2f6b978f8 | |
|
|
b8b1146320 | |
|
|
541bca6b28 | |
|
|
c1a2e76186 | |
|
|
79ba0ebc70 | |
|
|
8718ac4588 | |
|
|
0dd8e90a7f | |
|
|
3b0c2d1a42 | |
|
|
ccfb48459d | |
|
|
6d1ad051fe | |
|
|
652b33ec51 | |
|
|
ca615eb9d9 | |
|
|
8e3272c7d5 | |
|
|
5831e7d709 | |
|
|
3c3ea6cbba | |
|
|
3db0a30fef | |
|
|
7ed94b5dc0 | |
|
|
b83dfb2114 | |
|
|
29d64b7d0f | |
|
|
36bd2788b2 | |
|
|
119a180a82 | |
|
|
91c85d5e59 | |
|
|
5d171ec016 | |
|
|
4732138cbd | |
|
|
d07cff3721 | |
|
|
2afd8500bd | |
|
|
0377f73b9f | |
|
|
47b1e843ed | |
|
|
77359f7fc2 | |
|
|
d603dd2911 | |
|
|
eea46feb5d | |
|
|
7dbd061a86 | |
|
|
db6a94ded1 | |
|
|
15af2d7469 | |
|
|
9a0b4f4ddb | |
|
|
c779277b4d | |
|
|
a0dc7fa92d | |
|
|
0993c9a6b6 | |
|
|
b876e1e253 | |
|
|
3300b5a37a | |
|
|
3695b2f5d4 | |
|
|
d976cdf866 | |
|
|
fa35930c75 | |
|
|
cd1930a2bc | |
|
|
b5a18f6501 | |
|
|
fd1c0714d3 | |
|
|
4f6bf663dd | |
|
|
0c2102b308 | |
|
|
ba59e7b20b | |
|
|
3f1a3402d8 | |
|
|
c60959126c | |
|
|
c404cc0bb1 | |
|
|
ef79d3a8c0 | |
|
|
499cd7e16b | |
|
|
727147ffee | |
|
|
3175f77b7f | |
|
|
6833c68e40 | |
|
|
9668b59e23 | |
|
|
8aa463c054 | |
|
|
136a3c399d | |
|
|
e973a5f55c | |
|
|
5a00f45d5c | |
|
|
39be8f2955 | |
|
|
bca4f17c8f | |
|
|
f9aee04dd5 | |
|
|
3945e97319 | |
|
|
be1cca46b1 | |
|
|
898154a775 | |
|
|
94308e9c1d | |
|
|
828939ff68 | |
|
|
7d7dc7a620 | |
|
|
3b451427fc | |
|
|
f904bdfc1c | |
|
|
faecb69db9 | |
|
|
2cc14be759 | |
|
|
6e29efd307 | |
|
|
fb537806ca | |
|
|
22d4553f6f | |
|
|
a0e4c5fc33 | |
|
|
44f78edc63 | |
|
|
4a09e56d8b | |
|
|
7cf5648b78 | |
|
|
e55ad12b61 | |
|
|
c907d9c3ba | |
|
|
c44db20385 | |
|
|
7af01a6c61 | |
|
|
5b750cc3d9 | |
|
|
106ea91361 | |
|
|
041ebccaf1 | |
|
|
86d77df2c9 | |
|
|
a3c511d2b0 | |
|
|
adafcb8569 | |
|
|
48335a9d9c | |
|
|
5fd4015ee2 | |
|
|
e2b4c901dc | |
|
|
176ba1febe | |
|
|
24aab60556 | |
|
|
8868ff718f | |
|
|
bbe83a008f | |
|
|
e878c64c3c | |
|
|
8f63547f34 | |
|
|
97e0a8d36a | |
|
|
7176fecd7b | |
|
|
37ed2dddd4 | |
|
|
cb0cb654c8 | |
|
|
40fbc7b430 | |
|
|
81c1c17a2f | |
|
|
c2ffbff216 | |
|
|
4dd95af2fa | |
|
|
20eb17b044 | |
|
|
703309aa65 | |
|
|
3ae52098c6 | |
|
|
bd45275107 | |
|
|
edb6bd0b90 | |
|
|
cdd12d621d | |
|
|
cb1a8f54c5 | |
|
|
05d8db9cfa | |
|
|
af1140fa05 | |
|
|
7b0d6c153e | |
|
|
dbb5c4a520 | |
|
|
ee95d07dfc | |
|
|
884203844b | |
|
|
a420767446 | |
|
|
4ff3d2d83c | |
|
|
d80627b5d4 | |
|
|
73c566fa9e | |
|
|
e305898a74 | |
|
|
2a31e81c65 | |
|
|
6ad9aed71f | |
|
|
2459b3d447 | |
|
|
0476e5ebb6 | |
|
|
e5dc8b57ec | |
|
|
52c8b48d81 | |
|
|
4144d6d123 | |
|
|
1c0a6b2138 | |
|
|
17b0ea6111 | |
|
|
95008f49e6 | |
|
|
9164a1058d | |
|
|
23830144d8 | |
|
|
eb488e374b | |
|
|
8f84e5d12d | |
|
|
238fc8a382 | |
|
|
9dc101d3f6 | |
|
|
1a11cc331c | |
|
|
8cf7048b7f | |
|
|
4c161025e8 | |
|
|
6546cc08bc | |
|
|
fd9632a26c | |
|
|
861722e5d4 | |
|
|
30aa9eeed2 | |
|
|
1de7a1f2f2 | |
|
|
963cc238e8 | |
|
|
dd4239f1f3 | |
|
|
fe6c372d3d | |
|
|
df90496d30 | |
|
|
b85a2b236c | |
|
|
0406a64531 | |
|
|
3fed41899a | |
|
|
6e131f6b5d | |
|
|
c29d3459e6 | |
|
|
c16be14207 | |
|
|
aeb2e50692 | |
|
|
d2c525f498 | |
|
|
b563f22a32 | |
|
|
4accb2296f | |
|
|
23e0a7096c | |
|
|
3bf694d816 | |
|
|
b4200a1b87 | |
|
|
286841c3d0 | |
|
|
9b59ef6121 | |
|
|
5a8c85e765 | |
|
|
c07bf115e6 | |
|
|
06e085fd13 | |
|
|
9b72852a54 | |
|
|
0f25b00571 | |
|
|
8e792d1658 | |
|
|
84481a4fec | |
|
|
cff277d437 | |
|
|
b0672a9cb3 | |
|
|
4fed7cbb1a | |
|
|
684fff910c | |
|
|
64c42b5de3 | |
|
|
38f9d4869b | |
|
|
317fdb2171 | |
|
|
6d5edf93bf | |
|
|
335d7667b5 | |
|
|
0a871c738a | |
|
|
1d355a3a96 | |
|
|
c1a4481bf2 | |
|
|
5315d88903 | |
|
|
e5afb83f81 | |
|
|
812cedb0e1 | |
|
|
a07ff74dc0 | |
|
|
27a3b3c09b | |
|
|
21d6801185 | |
|
|
66a7f81317 | |
|
|
6fed528e84 | |
|
|
2b96b4d8ef | |
|
|
d8685a00bd | |
|
|
d0d2a41e96 | |
|
|
2edfccda87 | |
|
|
3062238465 | |
|
|
67fbf932ee | |
|
|
5598b2ef17 | |
|
|
60ef40a51b | |
|
|
fcd9dd15f4 | |
|
|
b7615c3fcd | |
|
|
10e67e4cbb | |
|
|
fef31f097f | |
|
|
c108bdd058 | |
|
|
f42383f0b4 | |
|
|
2102f8807a | |
|
|
c8a111f5f5 | |
|
|
e491461f64 | |
|
|
9b94ea6351 | |
|
|
7149392fe2 | |
|
|
20c8df7121 | |
|
|
1ca3f5f245 | |
|
|
1e988931a4 | |
|
|
f75d2c8c46 | |
|
|
fad3b73d67 | |
|
|
46202a2373 | |
|
|
bbab6cdb9f | |
|
|
6a57530a8b | |
|
|
b3922ec025 | |
|
|
dd03c215c4 | |
|
|
20c02f0f2a | |
|
|
02f3201cb2 | |
|
|
65bc188af1 | |
|
|
484482e5bd | |
|
|
036d982ab7 | |
|
|
fb7e4a287e | |
|
|
0a32c1fac9 | |
|
|
c5767efbaa | |
|
|
3981c47f9f | |
|
|
84e3609602 | |
|
|
199086d06b | |
|
|
fa082230b8 | |
|
|
b589ad8553 | |
|
|
981b83cea2 | |
|
|
e25b88d062 | |
|
|
550a458c8d | |
|
|
100e14cad0 | |
|
|
529d3fc891 | |
|
|
6ea439b435 | |
|
|
2b80e277c9 | |
|
|
96a93c7daf | |
|
|
6ff25ad1b7 | |
|
|
4405e08c0a | |
|
|
db7525ad64 | |
|
|
50ed5116f7 | |
|
|
17207fc0b8 | |
|
|
2de5f3a3c2 | |
|
|
e943a3235e | |
|
|
957c5dc3e9 | |
|
|
5c0ed0d773 | |
|
|
6fd7a6531b | |
|
|
a9c0315697 | |
|
|
0cac99e407 | |
|
|
f8eca9d538 | |
|
|
6e78f61f9c | |
|
|
78b9cd0156 | |
|
|
295d613165 | |
|
|
1080ac4a47 | |
|
|
c2f7fe7c32 | |
|
|
5bd67d431c | |
|
|
ee54464cfc | |
|
|
245b39f67d | |
|
|
3606b4f281 | |
|
|
0fcd8bc873 | |
|
|
84e984a549 | |
|
|
e30aacc91d | |
|
|
22e207c9cc | |
|
|
bffab7564d | |
|
|
3f5cceb031 | |
|
|
a4d8bc70b0 | |
|
|
87278e6adb | |
|
|
7f4947a590 | |
|
|
c0b9b66b9d | |
|
|
d19756b537 | |
|
|
d35778f5e2 | |
|
|
edab0fe9fc | |
|
|
ef823df8eb | |
|
|
15bd48ce3b | |
|
|
505f2d5592 | |
|
|
961183bd47 | |
|
|
8d99f362a2 | |
|
|
6c179d3220 | |
|
|
caef794231 | |
|
|
178d4fcb3f | |
|
|
1717fc1a15 | |
|
|
9e718cccdc | |
|
|
5bbc5999d7 | |
|
|
4eb009d76d | |
|
|
cb344665cb | |
|
|
c6c1e96e85 | |
|
|
80fb8b2fce | |
|
|
7a86300755 | |
|
|
97b1b03946 | |
|
|
a63b5cd61f | |
|
|
362d0a7ba9 | |
|
|
08a69da490 | |
|
|
480de3e89f | |
|
|
2110c4b1ce | |
|
|
e769eb0531 | |
|
|
4ef2dcdc04 | |
|
|
2438e45a1b | |
|
|
2ec02ee436 | |
|
|
4dcb1c4dd8 | |
|
|
e88cf16702 | |
|
|
56b49d4790 | |
|
|
f5def534fe | |
|
|
d4a517ab7c | |
|
|
5cc9868f4d | |
|
|
690219e60e | |
|
|
4f98bb7644 | |
|
|
dc7469d400 | |
|
|
9fe595e523 | |
|
|
0f67c4f041 | |
|
|
5535a44393 | |
|
|
cf21f61985 | |
|
|
b4a94f596b | |
|
|
8c5bba305c | |
|
|
e577d71d5d | |
|
|
72092edf2b | |
|
|
8e725686f9 | |
|
|
e36385b41d | |
|
|
f95ed1ac0c | |
|
|
4d4cbde465 | |
|
|
6c35c02bdf | |
|
|
20faef891c | |
|
|
d9e91d2a2f | |
|
|
b2beb8db74 | |
|
|
9721833ab8 | |
|
|
e26b713943 | |
|
|
35726ec8d5 | |
|
|
053bc5f78a | |
|
|
0a85d4a1f5 | |
|
|
1faf1ab722 | |
|
|
a9a42ae62a | |
|
|
05651ca74c | |
|
|
8350d8793a | |
|
|
b8e058396e | |
|
|
97f26e5e13 | |
|
|
918788f643 | |
|
|
697ac3e74d | |
|
|
803e9d4014 | |
|
|
2f4107ce68 | |
|
|
8e1e281d21 | |
|
|
b2fe71e482 | |
|
|
6dae6ba53c | |
|
|
791f536c8b | |
|
|
cb35148876 | |
|
|
6e4432feb1 | |
|
|
0af1efe8b2 | |
|
|
89b3273125 | |
|
|
7c60153c21 | |
|
|
4c69f76e42 | |
|
|
13175f64f1 | |
|
|
b67af9d847 | |
|
|
6c88cd1215 | |
|
|
eb4c327eff | |
|
|
4ee649c7f1 | |
|
|
35a9c945db | |
|
|
fa8cd2fa7c | |
|
|
ea4fc496a1 | |
|
|
bab8d14798 | |
|
|
f57218f429 | |
|
|
ec8a481b42 | |
|
|
b9941da0a5 | |
|
|
ea8baaaa82 | |
|
|
dbe1cc9644 | |
|
|
a1ab88f641 | |
|
|
24b4a80853 | |
|
|
b160b4fffb | |
|
|
4b8861b9c5 | |
|
|
091117bfe3 | |
|
|
5da62ebd40 | |
|
|
6fd1c2ce3b | |
|
|
d8fa7efdae | |
|
|
6483c40f82 | |
|
|
18c735b098 | |
|
|
98898dd60e | |
|
|
85d5044622 | |
|
|
20376500b5 | |
|
|
65cfa7c0fc | |
|
|
8ab287ed73 | |
|
|
4b1fb8b1ed | |
|
|
fc624115b5 | |
|
|
06e0852ee5 | |
|
|
fb1d18ce6b | |
|
|
724b76709a | |
|
|
714853dc68 | |
|
|
b15a62cd4e | |
|
|
ebc9c2692c | |
|
|
280b8bc4ae | |
|
|
1906e9a110 | |
|
|
7627b39925 | |
|
|
4b21aa68e0 | |
|
|
29e23548f0 | |
|
|
de6e20c21c | |
|
|
1d0e33fdc1 | |
|
|
a0b7581c80 | |
|
|
a3a34d4afe | |
|
|
e7d89ecf30 | |
|
|
1c71ead045 | |
|
|
4a296825e3 | |
|
|
87a01bcd66 | |
|
|
047ae3ebb2 | |
|
|
1ee14dd01a | |
|
|
c7547405f8 | |
|
|
11d8af22bb | |
|
|
4f9ffa6a80 | |
|
|
683e93e75e | |
|
|
307444431a | |
|
|
10908623a4 | |
|
|
5144309ff4 | |
|
|
bcbd36a221 | |
|
|
18a0681f9f | |
|
|
8f09bdce5b | |
|
|
a027a75b1d | |
|
|
eb6750d92d | |
|
|
04d42c1ad8 | |
|
|
34f8413861 | |
|
|
128e9c6bb4 | |
|
|
fa9a976895 | |
|
|
06ec910cfe | |
|
|
96f40aed76 | |
|
|
34bf811453 | |
|
|
2567292580 | |
|
|
9dac3fdb56 | |
|
|
93b848c2d8 | |
|
|
2421a4bc03 | |
|
|
65125e04ca | |
|
|
6862bb0f65 | |
|
|
1f913071bc | |
|
|
e2a60eda07 | |
|
|
a89bc7f5d2 | |
|
|
f1f64aedb1 | |
|
|
849169e3c7 | |
|
|
bf83538a2d | |
|
|
9f924fee3c | |
|
|
eb3064f8aa | |
|
|
f9e3e644f1 | |
|
|
316cbdab83 | |
|
|
3a248df971 | |
|
|
37c5cab83f | |
|
|
c2fe4ffb98 | |
|
|
253d82a32c | |
|
|
098e828d0f | |
|
|
da8133bd8f | |
|
|
e3fb76cb54 | |
|
|
ba9a91eb1f | |
|
|
714dab3e8d | |
|
|
eae35db92d | |
|
|
95483b759f | |
|
|
dccd971d2e | |
|
|
940470dbc3 | |
|
|
f42fc31c03 | |
|
|
b574b5e0c6 | |
|
|
43aae66fb2 | |
|
|
9711a9a666 | |
|
|
c6d1e0b466 | |
|
|
2000dc0663 | |
|
|
09233022ac | |
|
|
2b229f0409 | |
|
|
4d797c48a1 | |
|
|
421e335315 | |
|
|
4db1c3b686 | |
|
|
6f27f40962 | |
|
|
cf4f5c89e0 | |
|
|
dcbf52a88b | |
|
|
1f862baccf | |
|
|
f6074d75d8 | |
|
|
5db2cdeca4 | |
|
|
49ab06180d | |
|
|
bb0de9570d | |
|
|
b1484f0a71 | |
|
|
69d4a01298 | |
|
|
fc7a685423 | |
|
|
7a5c731b25 | |
|
|
b9b62f1661 | |
|
|
c5e7b37420 | |
|
|
8b94c17d0e | |
|
|
86a7994d02 | |
|
|
30a3fce222 | |
|
|
d8f7582790 | |
|
|
ad7a02746b | |
|
|
c00d75b032 | |
|
|
6e51f57bff | |
|
|
c2a3cd3cc1 | |
|
|
29a4491a38 | |
|
|
9ab8cb276c | |
|
|
9a0c70517b | |
|
|
c99d8e2dd3 | |
|
|
4dbf9fa17c | |
|
|
f58be87187 | |
|
|
0aac1329e2 | |
|
|
8f7f7b4b68 | |
|
|
9315a3f01a | |
|
|
deadc2fd68 | |
|
|
95dea2c6f3 | |
|
|
cf47777115 | |
|
|
c07e799fdb | |
|
|
201bc94947 | |
|
|
cecd09b726 | |
|
|
03fab14ef3 | |
|
|
ad2f29fe01 | |
|
|
13b230a247 | |
|
|
2058631c50 | |
|
|
48dfb68f89 | |
|
|
d52755876f | |
|
|
6f39421c74 | |
|
|
e8d74a119c | |
|
|
1e00b9b44e | |
|
|
6d14054310 | |
|
|
7f6198299a | |
|
|
005e54f80b | |
|
|
dc7c7a0c33 | |
|
|
7d56d644ba | |
|
|
e1d0fe2760 | |
|
|
877ea031d1 | |
|
|
a452b2216c | |
|
|
6bd6958df1 | |
|
|
f98f34d5fe | |
|
|
36c25b7b49 | |
|
|
839081f076 | |
|
|
1c2e96b359 | |
|
|
a520def1c5 | |
|
|
aa9abd6019 | |
|
|
e97b19564c | |
|
|
e01d623e28 | |
|
|
a329167f05 | |
|
|
ef9f2d3441 | |
|
|
f43d6728f8 | |
|
|
d156d7f606 | |
|
|
823720f217 | |
|
|
416f615768 | |
|
|
209cb891c7 | |
|
|
ebf8e39b5c | |
|
|
1262b9fd60 | |
|
|
ba22761222 | |
|
|
ad1e784adb | |
|
|
1eaaf8d4bf | |
|
|
ee1dc427ce | |
|
|
3e953b1b4c | |
|
|
270f28be9e | |
|
|
67e7e8e8ed | |
|
|
a9f1a2a422 | |
|
|
a6f798c99a | |
|
|
a0c08cf601 | |
|
|
88892c7e9f | |
|
|
900ca24c40 | |
|
|
38213a68fd | |
|
|
3bc73afb88 | |
|
|
0841409e50 | |
|
|
185d3e0b16 | |
|
|
9dff16d26f | |
|
|
fa38b05cb9 | |
|
|
339d63f374 | |
|
|
57c3217768 | |
|
|
0fe8ac3330 | |
|
|
7ac66f9f0f | |
|
|
95a4eb4ec8 | |
|
|
a09e33a083 | |
|
|
8b3cb159ae | |
|
|
4de066e505 | |
|
|
48fc8152a4 | |
|
|
9c7014f853 | |
|
|
965d224a0e | |
|
|
2d805516ff | |
|
|
8393506f52 | |
|
|
e451e765f5 | |
|
|
4554d88c89 | |
|
|
df4e8fc61b | |
|
|
8f49337072 | |
|
|
cdd9b9df4f | |
|
|
84ef9d188b | |
|
|
4df1fe9ce1 | |
|
|
e3ec5b0434 | |
|
|
3c21550c3b | |
|
|
fdb6a35541 | |
|
|
10d932a88e | |
|
|
48a144744a | |
|
|
96a55d9894 | |
|
|
c572b0ac27 | |
|
|
ca933f6445 | |
|
|
adf5c7afe0 | |
|
|
01bf30b4ce | |
|
|
14a3851458 | |
|
|
c9577b2bb2 | |
|
|
7a490c4baf | |
|
|
9ebadb709f | |
|
|
efbd49ee76 | |
|
|
d42d23705b | |
|
|
2aa8cc351a | |
|
|
7ed6f576ca | |
|
|
5b7ba2f99d | |
|
|
9a49ab5baa | |
|
|
67d0a3858c | |
|
|
0ce953280a | |
|
|
73c48fb534 | |
|
|
6c865de3e0 | |
|
|
642a82f36a | |
|
|
cf00671123 | |
|
|
64fdf3028a | |
|
|
ce301fd145 | |
|
|
9da0b37aeb | |
|
|
695d95ecac | |
|
|
3b5b3608b1 | |
|
|
d68e8fc4f5 | |
|
|
42a958774c | |
|
|
510465c9a3 | |
|
|
a367f0a376 | |
|
|
7b664d8968 | |
|
|
a26715b932 | |
|
|
5073c4757d | |
|
|
0dee648c04 | |
|
|
8911c8ed65 | |
|
|
c8b49e9c36 | |
|
|
bc7c59068e | |
|
|
ec449479fa | |
|
|
168515f1bf | |
|
|
2ec522a366 | |
|
|
9476141a6c | |
|
|
d41ceaffc6 | |
|
|
01bd2c79e4 | |
|
|
3b0ac0c465 | |
|
|
8ca8c37763 | |
|
|
9b9460be71 | |
|
|
39c00d23d6 | |
|
|
2ebe700a9c | |
|
|
bdd44985fa | |
|
|
41f8480190 | |
|
|
2ba44ff145 | |
|
|
46c18610e6 | |
|
|
0d0b36d59c | |
|
|
16c5ee9c78 | |
|
|
cc69aa098e | |
|
|
b1ae94db1a | |
|
|
c595d8158e | |
|
|
16da5e8918 | |
|
|
f790ee996a | |
|
|
da8c11e83f | |
|
|
a15ba945fd | |
|
|
ce69b1204c | |
|
|
3357243f7d | |
|
|
20804ff389 | |
|
|
d569338f8f | |
|
|
8b8dd600d6 | |
|
|
0233d45874 | |
|
|
634dd07769 | |
|
|
cd05d269bd | |
|
|
9446de49d4 | |
|
|
1ccb6c8a6e | |
|
|
466b4e5092 | |
|
|
51a16da559 | |
|
|
7dcce46dc1 | |
|
|
a81c659851 | |
|
|
842dc7dda1 | |
|
|
27c966b128 | |
|
|
15b7cd8ece | |
|
|
cfc786ca9f | |
|
|
6982376dc4 | |
|
|
20d7be5c8f | |
|
|
9ef0b24be2 | |
|
|
0df6a04cd0 | |
|
|
4d9e8d2847 | |
|
|
77232d9e0a | |
|
|
981e7d2636 | |
|
|
b8f9f18363 | |
|
|
dd4de62f8d | |
|
|
484454caae | |
|
|
18e321dc55 | |
|
|
715f550acf | |
|
|
10543665ee | |
|
|
702a39ef3c | |
|
|
072ed30ed6 | |
|
|
28f4d70360 | |
|
|
2756f763ba | |
|
|
7266464d57 | |
|
|
3e34a28588 | |
|
|
3e74386345 | |
|
|
72bbff8cfc | |
|
|
46c6f4c286 | |
|
|
fffcad9eee | |
|
|
37546df1d3 | |
|
|
d72aeb489c | |
|
|
2ea0e4760b | |
|
|
745ed8c914 | |
|
|
8d29fd74e1 | |
|
|
ec7651c8a7 | |
|
|
a088d73b22 | |
|
|
f9ae6206e6 | |
|
|
b9681fd418 | |
|
|
9691d815cd | |
|
|
4758357bc8 | |
|
|
e7df37c157 | |
|
|
ddb5ba42fa | |
|
|
0294761079 | |
|
|
f4e4b4dd16 | |
|
|
c0bb24fb57 | |
|
|
5a658c2d5f | |
|
|
1aba7ff35a | |
|
|
70485aaaa3 | |
|
|
196f5fd009 | |
|
|
22d52a73e8 | |
|
|
988fa276b1 | |
|
|
ff21cc8746 | |
|
|
fbc472b054 | |
|
|
b6184bd355 | |
|
|
52ccb2c611 | |
|
|
2de825f064 | |
|
|
0f0995a567 | |
|
|
b6d2e6e150 | |
|
|
46e44ad49a | |
|
|
8a9eb794b7 | |
|
|
753cc8e4d9 | |
|
|
bc4e5607ee | |
|
|
98bde49131 | |
|
|
cb0375bc32 | |
|
|
cf652ba63a | |
|
|
ffa93a8427 | |
|
|
65c8981f61 | |
|
|
db27ff7d38 | |
|
|
57764a3aba | |
|
|
2b153ce09c | |
|
|
b0ccb5202e | |
|
|
88c23d3f8a | |
|
|
b65d04c384 | |
|
|
fd38e1ab4e | |
|
|
c6054e1e1c | |
|
|
563a22ea9c | |
|
|
c9fbb8e5dc | |
|
|
dc8cde7618 | |
|
|
bc406ed5e4 | |
|
|
897c94cce5 | |
|
|
35a1fd07fa | |
|
|
eac7a77ff7 | |
|
|
d5783eb99d | |
|
|
efe1ee5d7d | |
|
|
6e8e509108 | |
|
|
d9c375df83 | |
|
|
c6486b82bf | |
|
|
6a4e099a18 | |
|
|
16d8e0fffe | |
|
|
f00949b414 | |
|
|
3c071f1cc3 | |
|
|
f00814fad8 | |
|
|
8cb9db9971 | |
|
|
698e643996 | |
|
|
89f69cfdca | |
|
|
715e790bf6 | |
|
|
afecb2e369 | |
|
|
48360fbaec | |
|
|
fce2c68f4f | |
|
|
13f22abaa8 | |
|
|
314d69e82d | |
|
|
19a9e9aa8b | |
|
|
91da29088f | |
|
|
badea60021 | |
|
|
778e89e01f | |
|
|
70781c85f3 | |
|
|
42205d4d87 | |
|
|
dacfc1abd3 | |
|
|
e27d645485 | |
|
|
46f15568bf | |
|
|
8727f4224d | |
|
|
8c27f82cf4 | |
|
|
98620efdde | |
|
|
e8ec5820a0 | |
|
|
210f112845 | |
|
|
d0bbf92dd1 | |
|
|
2324a5d309 | |
|
|
b17eee5936 | |
|
|
bd12388d9a | |
|
|
30f1906cc7 | |
|
|
c30dbea2be | |
|
|
a510b3bf84 | |
|
|
55cd878e28 | |
|
|
4f5bedd22c | |
|
|
f3f888156b | |
|
|
138353c212 | |
|
|
a94c74a43f | |
|
|
2e80a14854 | |
|
|
14f3c89512 | |
|
|
237dc0e6aa | |
|
|
d4f1c44fc1 | |
|
|
d60871382f | |
|
|
628295e8ed | |
|
|
251873face | |
|
|
560bd05da6 | |
|
|
aaee08d4f3 | |
|
|
74b64698ee | |
|
|
c097c037f5 | |
|
|
a447b0ecfc | |
|
|
0e428c9922 | |
|
|
7e2268e9ce | |
|
|
77268fd218 | |
|
|
6ca148b515 | |
|
|
cd7d28c819 | |
|
|
951a271089 | |
|
|
447edb6e68 | |
|
|
e56e07e6d9 | |
|
|
85c020d6b4 | |
|
|
55e9387bd5 | |
|
|
c7804aebf1 | |
|
|
175d6d458e | |
|
|
21c294de59 | |
|
|
eff69dd44d | |
|
|
297967ebd7 | |
|
|
b82c9c4504 | |
|
|
d3e787fb2a | |
|
|
779b8e5c92 | |
|
|
f339da1227 | |
|
|
26b4c8e60e | |
|
|
e2ec56f2df | |
|
|
d76c7a15de | |
|
|
0e2874ae67 | |
|
|
37c7550a08 | |
|
|
f44783efdd | |
|
|
41e1ef7083 | |
|
|
7f18c6b056 | |
|
|
7ff7327ef8 | |
|
|
cd9525ac2b | |
|
|
5f1536f809 | |
|
|
3f4f411eb6 | |
|
|
3aee4f8f28 | |
|
|
eec6cc0988 | |
|
|
1b9e0011e1 | |
|
|
1318a55fc0 | |
|
|
408c6d447f | |
|
|
4d7712093a | |
|
|
d1be7947af | |
|
|
ceb2527f56 | |
|
|
65cb581d3b | |
|
|
b9f9856541 | |
|
|
f04e0b0c8c | |
|
|
f07465f372 | |
|
|
34b6887a79 | |
|
|
cc6da7127a | |
|
|
5c87e38022 | |
|
|
ce02ba8664 | |
|
|
de3869ca2c | |
|
|
f4ee0be3b7 | |
|
|
af4678cbed | |
|
|
afe8380280 | |
|
|
a1fd8c3d10 | |
|
|
cd762dcd15 | |
|
|
a6f9413fae | |
|
|
2eaa59a6d4 | |
|
|
368030eedc | |
|
|
7dcbadb75f | |
|
|
4f4757c946 | |
|
|
cbfb8f35c1 | |
|
|
81979ba4bb | |
|
|
fdd046e15f | |
|
|
9ad22b35ae | |
|
|
f80c8014dd | |
|
|
67facaec4a | |
|
|
a79b44a88c | |
|
|
8285781688 | |
|
|
220ab8ee1b | |
|
|
1b8a6dd01b | |
|
|
cf553009bf | |
|
|
063cbd27ee | |
|
|
1491e9026e | |
|
|
fb70455829 | |
|
|
ec0b203177 | |
|
|
575abf01e5 | |
|
|
19b2edcefa | |
|
|
4a702b46fd | |
|
|
ea7ed8c65e | |
|
|
c43b6cb1b9 | |
|
|
edcd297092 | |
|
|
a4eea05a84 | |
|
|
6b878cf119 | |
|
|
5e04f72d8e | |
|
|
458637b1de | |
|
|
79f6649602 | |
|
|
7ea80fa26f | |
|
|
80145a09da | |
|
|
ffd0469f09 | |
|
|
1bfdba6ca4 | |
|
|
d58330d8da | |
|
|
a8b181394c | |
|
|
cd843f300c | |
|
|
c23944607c | |
|
|
abf3c6f0f5 | |
|
|
a2fd9cb87a | |
|
|
de8324e87d | |
|
|
1652dabb53 | |
|
|
2d1c4bc507 | |
|
|
60543897d4 | |
|
|
345007f110 | |
|
|
9bdc4bb394 | |
|
|
3117c7ed3e | |
|
|
eb89ea0a43 | |
|
|
8760924e59 | |
|
|
493ac18650 | |
|
|
57b1bebf44 | |
|
|
e0f470fdcc | |
|
|
bbe6b50489 | |
|
|
b781902f7d | |
|
|
bca4356e43 | |
|
|
2173a8821d | |
|
|
222b9ea9c6 | |
|
|
fd4d21ae78 | |
|
|
5353b75c2e | |
|
|
1037ad3841 | |
|
|
c5f7711850 | |
|
|
d32cecaa03 | |
|
|
834d308647 | |
|
|
0aba92650c | |
|
|
de7b3121e2 | |
|
|
88f796faed | |
|
|
cb35f75dcc | |
|
|
510d157262 | |
|
|
61368ae20d | |
|
|
23300f22a2 | |
|
|
7083cf7477 | |
|
|
611420e9c4 | |
|
|
e2ae17755a | |
|
|
cdd78f1b94 | |
|
|
10632c35c0 | |
|
|
01736de147 | |
|
|
9ad5a97733 | |
|
|
116597cd67 | |
|
|
48635fe669 | |
|
|
526b11e0d1 | |
|
|
0f9c02f5f1 | |
|
|
bd0dc40a4c | |
|
|
8592894f7a | |
|
|
4f7c494ace | |
|
|
ce4dfa4261 | |
|
|
e95c7fe8e5 | |
|
|
17322eab1d | |
|
|
192948b8fe | |
|
|
9db218d518 | |
|
|
c6b11e64ad | |
|
|
d2f478395e | |
|
|
7d182e6153 | |
|
|
8b8aa08ac0 | |
|
|
88ebada41c | |
|
|
ece81a2c9b | |
|
|
d4aa3bef2b | |
|
|
1abacf0ec6 | |
|
|
920d648a2b | |
|
|
e449139b63 | |
|
|
8793c77033 | |
|
|
e8843bfd64 | |
|
|
55a53325dd | |
|
|
197313dfc9 | |
|
|
c6a5321601 | |
|
|
ad28d8d55d | |
|
|
01a096d6c3 | |
|
|
d30b5326bc | |
|
|
f20d011e40 | |
|
|
3252d2cbd2 | |
|
|
4c199661bf | |
|
|
ae9249532b | |
|
|
5d68fe322a | |
|
|
9d160bfd7c | |
|
|
b4bf6319fd | |
|
|
0a9078f94e | |
|
|
ea049068e0 | |
|
|
cc3576f70f | |
|
|
5939079a89 | |
|
|
9212804eae | |
|
|
782f329947 | |
|
|
bc63407bb7 | |
|
|
6ab4775f96 | |
|
|
61314002b2 | |
|
|
0528f09e27 | |
|
|
af897048ad | |
|
|
0ff71ff551 | |
|
|
1528de57a4 | |
|
|
4545b9b273 | |
|
|
d71ecdecc2 | |
|
|
021dc47d89 | |
|
|
2dafc8288a | |
|
|
1944832c96 | |
|
|
f8c88dc225 | |
|
|
8ad0e3ca14 | |
|
|
fd85736a32 | |
|
|
e2073b49b9 | |
|
|
a3c4b12b50 | |
|
|
2c6e3cac92 | |
|
|
f9cecdd0f0 | |
|
|
2ba3655191 | |
|
|
3deaa205d5 | |
|
|
f9aec0526d | |
|
|
7a4be8292f | |
|
|
7737f0977e | |
|
|
6652808f86 | |
|
|
87eb29da11 | |
|
|
cdadc8bff4 | |
|
|
a8e367041e | |
|
|
a4f7e28acc | |
|
|
397be9ab14 | |
|
|
94397136d3 | |
|
|
e458d65a12 | |
|
|
b8ba4eb7f9 | |
|
|
a9e346ffb3 | |
|
|
5214f36fc9 | |
|
|
9725667e2a | |
|
|
f9429f8712 | |
|
|
0690e30a32 | |
|
|
fb0c96e6b4 | |
|
|
0c0e22df8c | |
|
|
22bd49b16b | |
|
|
141736ad2f | |
|
|
92b2e13ee8 | |
|
|
481bc36133 | |
|
|
fc84d5454c | |
|
|
5d82f555c5 | |
|
|
166647d112 | |
|
|
94128e7115 | |
|
|
cfb8e27850 | |
|
|
309ebb4e5a | |
|
|
15d968dff5 | |
|
|
fe16d513be | |
|
|
ef153ad4b7 | |
|
|
4f35d5ce0f | |
|
|
0d564b1b83 | |
|
|
6f9d39ef16 | |
|
|
30aec92512 | |
|
|
5ce780f03b | |
|
|
abf34bcd5d | |
|
|
e46a4b01cd | |
|
|
0d8341c2d8 | |
|
|
2c51334966 | |
|
|
2e7e4dccf9 | |
|
|
4abc2f81ff | |
|
|
dd84a3ebf7 | |
|
|
5c246dc182 | |
|
|
b0ac61fbea | |
|
|
5479e27216 | |
|
|
e27a3130c1 | |
|
|
fea26d82f5 | |
|
|
2835941834 | |
|
|
f8c62631f6 | |
|
|
c7ca2ca974 | |
|
|
6bcfe3ada3 | |
|
|
56cfe11e19 | |
|
|
872bcd2582 | |
|
|
a14b58f2fe | |
|
|
b13ffe2d32 | |
|
|
71df46a6ca | |
|
|
a4a869535e | |
|
|
5701e888a8 | |
|
|
3a6e7f2072 | |
|
|
d46e8ed874 | |
|
|
e07bc21d2a | |
|
|
fc465a1b68 | |
|
|
10c3571cd8 | |
|
|
f8ee7b693d | |
|
|
90c167fb91 | |
|
|
9e4105a391 | |
|
|
adf0274b73 | |
|
|
399d010310 | |
|
|
557bdc42db | |
|
|
7bdf9ddd5e | |
|
|
40df9eed6f | |
|
|
a6c054635d | |
|
|
c9c384cbf0 | |
|
|
7f2db12071 | |
|
|
12d8310dc6 | |
|
|
a82181b63d | |
|
|
c4f691b6d0 | |
|
|
378af99e14 | |
|
|
584b4b347f | |
|
|
2e3f47e9b2 | |
|
|
5c14d283ab | |
|
|
bf59f4ac62 | |
|
|
97f0d58f2e | |
|
|
3d9bc9f541 | |
|
|
b3e2943599 | |
|
|
22ca511681 | |
|
|
dbf4ae777b | |
|
|
df4c0fba26 | |
|
|
72e3ed165b | |
|
|
19223e96e6 | |
|
|
2cc7a3646b | |
|
|
bc80fd1325 | |
|
|
349e9027a3 | |
|
|
2ad2531f6b | |
|
|
98d29965a0 | |
|
|
d61f5f28da | |
|
|
0a3d1016a1 | |
|
|
8c805f0378 | |
|
|
f6652fa180 | |
|
|
54cbfc69f0 | |
|
|
1d532cc305 | |
|
|
51977c7cc3 | |
|
|
681b27a4b4 | |
|
|
4c3c23606a | |
|
|
78c00604f3 | |
|
|
39a240551a | |
|
|
0cc2aca908 | |
|
|
18a92e4cc1 | |
|
|
8942ed4ccf | |
|
|
0cd19e6725 | |
|
|
0cebcb1e29 | |
|
|
04234eef27 | |
|
|
865e8201e0 | |
|
|
f225a85484 | |
|
|
9cc2ee4f4f | |
|
|
7f6b41d8b1 | |
|
|
95c534623e | |
|
|
04a7a9dea4 | |
|
|
534b4f0e6c | |
|
|
0aecf7345f | |
|
|
b8a190c889 | |
|
|
7e32ffcdf8 | |
|
|
fab38451cd | |
|
|
8c6d553823 | |
|
|
e446c3ff44 | |
|
|
1652aa4bd3 | |
|
|
1da6749d70 | |
|
|
d7ddff9bb7 | |
|
|
01aae26e80 | |
|
|
d62526d087 | |
|
|
dfa423a1a3 | |
|
|
1467b2b0e7 | |
|
|
eb8e330073 | |
|
|
0f8e607390 | |
|
|
2e81bafb01 | |
|
|
853d359a7e | |
|
|
7fc4376236 | |
|
|
ce6377377b | |
|
|
599d26f883 | |
|
|
48be48caf5 | |
|
|
8f36304c26 | |
|
|
c8179ccbcc | |
|
|
2e95682b10 | |
|
|
8900af5196 | |
|
|
5bd36e3731 | |
|
|
0f4be88677 | |
|
|
9e9c2819dd | |
|
|
13b58dbaa4 | |
|
|
a49729041d | |
|
|
641a553dcc | |
|
|
50e2090f25 | |
|
|
e451c4be3d | |
|
|
a9d92b2250 | |
|
|
3243abf837 | |
|
|
a7dfe55d3c | |
|
|
8638cdda92 | |
|
|
8138f11701 | |
|
|
5a0259aa54 | |
|
|
d93f64c2e5 | |
|
|
4d8b8a38b6 | |
|
|
86ea959972 | |
|
|
491bc8cda5 | |
|
|
2283317719 | |
|
|
1154a83dae | |
|
|
ba6a7af851 | |
|
|
01405618ae | |
|
|
7adfb3a6b9 | |
|
|
4e63b2e1d8 | |
|
|
ca246fc95e | |
|
|
35839c1b4d | |
|
|
e14484164f | |
|
|
5e7ba5bd8a | |
|
|
e40442af15 | |
|
|
c2f4cd0c56 | |
|
|
33b02c0f55 | |
|
|
d7e949885d | |
|
|
37417708b3 | |
|
|
0d49744a7a | |
|
|
88afc1c272 | |
|
|
1869ee021d | |
|
|
cb422a498f | |
|
|
b9dd872be0 | |
|
|
7fe1824085 | |
|
|
e3b6c7b894 | |
|
|
9dfb04613d | |
|
|
e22218b163 | |
|
|
5773ba6e57 | |
|
|
40c260b2ba | |
|
|
31e8d6a26c | |
|
|
48a54b812c | |
|
|
69c05a3e0a | |
|
|
14643531dc | |
|
|
1764a3e306 | |
|
|
d136401529 | |
|
|
48bd7ae2da | |
|
|
57550d292e | |
|
|
fcf4a0b566 | |
|
|
7a7d7c0829 | |
|
|
77abf33332 | |
|
|
40de0ef04f | |
|
|
c05c706455 | |
|
|
96ffaedb1a | |
|
|
fc38c9ec50 | |
|
|
6344e14f7d | |
|
|
4beac54df5 | |
|
|
427bcd6e56 | |
|
|
521eac693d | |
|
|
a5016efec5 | |
|
|
1fd2679cbf | |
|
|
3a95b22762 | |
|
|
0b8a792af7 | |
|
|
20e5650baa | |
|
|
a2b8f3062a | |
|
|
c5b8465012 | |
|
|
4d41e2278d | |
|
|
854d7caab9 | |
|
|
922cfc4540 | |
|
|
7ca4de12d7 | |
|
|
4ef76abcf9 | |
|
|
70f22f8601 | |
|
|
e2b98284ae | |
|
|
adecb8fc20 | |
|
|
718668b5d2 | |
|
|
8d28efde62 | |
|
|
e76ab54738 | |
|
|
00f69ecc01 | |
|
|
b20f79af3f | |
|
|
18be9f69a1 | |
|
|
712f1c90f3 | |
|
|
e558554324 | |
|
|
afa4ff3182 | |
|
|
0416ad01f1 | |
|
|
0fcdb708fc | |
|
|
fb24f3beae | |
|
|
d62655cbd2 | |
|
|
565544f357 | |
|
|
f7ec3df32d | |
|
|
190b43bd60 | |
|
|
89b48619a6 | |
|
|
5411a3bbf9 | |
|
|
ce1e735750 | |
|
|
4208391c44 | |
|
|
2ad519fc90 | |
|
|
a23703fb09 | |
|
|
def24616f3 | |
|
|
5ee54adc7c | |
|
|
a1774320ce | |
|
|
133cc2806a | |
|
|
0305369944 | |
|
|
1908d82012 | |
|
|
8d69a804e8 | |
|
|
39d72e83bb | |
|
|
76920f97c0 | |
|
|
7a8775cbf6 | |
|
|
474f147892 | |
|
|
15e1e757dd | |
|
|
3aadfaaedb | |
|
|
b48ea1cc59 | |
|
|
ff6f133620 | |
|
|
d6500449da | |
|
|
8c7c345859 | |
|
|
fc84b2657a | |
|
|
09483f219a | |
|
|
11a8ee55f0 | |
|
|
3707a3abd6 | |
|
|
48f85fecfa | |
|
|
153ed88a79 | |
|
|
37929de36e | |
|
|
03d71b0678 | |
|
|
f69aadbe20 | |
|
|
f82f64f2db | |
|
|
8e73c5bb80 | |
|
|
b07aedc9cc | |
|
|
0376b206cf | |
|
|
6a7e321142 | |
|
|
3388ec14db | |
|
|
69363e6fd6 | |
|
|
6314748225 | |
|
|
a5e9ca18b5 | |
|
|
3bc0b18968 | |
|
|
1d3548cdf9 | |
|
|
34dcc27641 | |
|
|
9afc3155ef | |
|
|
886df5d092 | |
|
|
6d5db83aea | |
|
|
dd8e375766 | |
|
|
d9f1becb9b | |
|
|
949ce8a513 | |
|
|
223988f421 | |
|
|
8e72a9833a | |
|
|
3adeef4dee | |
|
|
5049e3f813 | |
|
|
bcca86da8f | |
|
|
53f7f29c06 | |
|
|
54a437d6e1 | |
|
|
ebdde28f85 | |
|
|
4cb737761a | |
|
|
c1402e2777 | |
|
|
819e87079e | |
|
|
e3b4b2324b | |
|
|
b7cbb86e3b | |
|
|
32d32b3393 | |
|
|
d6d3ef4299 | |
|
|
7f0fd988ce | |
|
|
6f488d4692 | |
|
|
7432b50438 | |
|
|
bd02774db9 | |
|
|
6d514c3df2 | |
|
|
50c3731dff | |
|
|
5e754a7096 | |
|
|
b9a7bd6e09 | |
|
|
becf0a82b1 | |
|
|
143506afd5 | |
|
|
83b7009c51 | |
|
|
826f53ce84 | |
|
|
049a90445b | |
|
|
c329912527 | |
|
|
51429e8b5a | |
|
|
184bf2ba4d | |
|
|
c2772398a8 | |
|
|
1da8cfd4a1 | |
|
|
2a74d7ec9a | |
|
|
86b7327eca | |
|
|
4aa5842deb | |
|
|
086f555bbf | |
|
|
d3d2fbb210 | |
|
|
d4cdab8d6b | |
|
|
cd6bf55a1a | |
|
|
38a64a3dde | |
|
|
bec9388aae | |
|
|
5fad4953bc | |
|
|
021db62539 | |
|
|
efb4214e9a | |
|
|
e8cb399692 | |
|
|
7fbb215fca | |
|
|
c3626ebe22 | |
|
|
bb9beb9cab | |
|
|
1da8c73721 | |
|
|
9df947097f | |
|
|
fb9a7c01af | |
|
|
f41aced15f | |
|
|
0f4fb0816e | |
|
|
57314a9b1c | |
|
|
d7a6bdaaba | |
|
|
70f047dd3c | |
|
|
7fc646babe | |
|
|
99cd31ea78 | |
|
|
38109c8b61 | |
|
|
022fd60b3c | |
|
|
958bb9346e | |
|
|
1bcee2e60c | |
|
|
c27ed06455 | |
|
|
9e461c61dd | |
|
|
f7267d38c6 | |
|
|
61e93b7d1d | |
|
|
b0c8c88524 | |
|
|
9d8c46ca7c | |
|
|
76e3bb3284 | |
|
|
a84f344335 | |
|
|
68d165427c | |
|
|
806308ac01 | |
|
|
86d33c0f79 | |
|
|
8d026a3fdb | |
|
|
52524c774d | |
|
|
b686020b49 | |
|
|
d52f6b570a | |
|
|
fbc2e9498f | |
|
|
73a04d4d95 | |
|
|
1fe20d6c2b | |
|
|
2a0e733b84 | |
|
|
af1da5ead4 | |
|
|
f002864a08 | |
|
|
150c5da5b3 | |
|
|
b2fca8cc0b | |
|
|
95ec9ce66e | |
|
|
0c5dbe2c68 | |
|
|
8e88e7fe7e | |
|
|
8e21fb1fe7 | |
|
|
d3d9a2db49 | |
|
|
f086ff74c3 | |
|
|
023648a5be | |
|
|
27328a7c65 | |
|
|
ffa5fe1798 | |
|
|
93d11d6b3b | |
|
|
9dbcdb2436 | |
|
|
93e0be7bdd | |
|
|
bfa3b0b8c9 | |
|
|
7a2dd6ea0b | |
|
|
5073c2d4e7 | |
|
|
2b81276e1b | |
|
|
53f5c6d4df | |
|
|
515704898c | |
|
|
f0ece5f894 | |
|
|
993e12995c | |
|
|
a63f9085f4 | |
|
|
fa586d878d | |
|
|
813e8b2fbe | |
|
|
e7f8e2fed1 | |
|
|
25bda4de4d | |
|
|
0b6b2e1b86 | |
|
|
1ecb17d2a7 | |
|
|
d2d1b8facc | |
|
|
9a8aeced51 | |
|
|
801504be2b | |
|
|
7d5edc298d | |
|
|
58b8a29f51 | |
|
|
55007e9619 | |
|
|
e01634285a | |
|
|
29f3b52120 | |
|
|
c700f856e5 | |
|
|
325768e5e1 | |
|
|
538f7e75a1 | |
|
|
2d54b03a07 | |
|
|
70b3a2f5de | |
|
|
eba43cf228 | |
|
|
6ecf591520 | |
|
|
c3097d4436 | |
|
|
4bdf555409 | |
|
|
aa51114e8a | |
|
|
509cc56cdb | |
|
|
276442a9b4 | |
|
|
8f20da7567 | |
|
|
0c25d0e40b | |
|
|
830dd4595c | |
|
|
47def5113b | |
|
|
09432cea1c | |
|
|
5d5ea51a16 | |
|
|
4290d449ed | |
|
|
9abee035be | |
|
|
cb76a6e28f | |
|
|
38aa35765d | |
|
|
c0d78c9d26 | |
|
|
8e67d6d9b8 | |
|
|
aaa450f14e | |
|
|
3fdf835942 | |
|
|
5018be71dd | |
|
|
a5e4c2dfce | |
|
|
49dc6890fc | |
|
|
0aa2f215b6 | |
|
|
6c5c4731ed | |
|
|
c379c6dc44 | |
|
|
284e671b01 | |
|
|
0f9b1c3f07 | |
|
|
e4e65f8c04 | |
|
|
1dce984247 | |
|
|
1733c8689d | |
|
|
032d30c3f3 | |
|
|
a0feb09509 | |
|
|
de9856b5be | |
|
|
d3ca53672b | |
|
|
4a647b8bd1 | |
|
|
ae854d858f | |
|
|
5534ec0224 | |
|
|
23bf15eb50 | |
|
|
c1b8bf9ff7 | |
|
|
5c0178df8f | |
|
|
4b01097c97 | |
|
|
7e911bdb32 | |
|
|
3c16949615 | |
|
|
dd420527c0 | |
|
|
af662fa714 | |
|
|
10d4d99953 | |
|
|
077b5a700d | |
|
|
468b0c4998 | |
|
|
b3b3e46dc9 | |
|
|
4e57f50271 | |
|
|
5a61b3584c | |
|
|
f01532804d | |
|
|
56f0725006 | |
|
|
5d434e0020 | |
|
|
e18e6ed81f | |
|
|
2030b0fd00 | |
|
|
36db710b4b | |
|
|
efd5ffd4ed | |
|
|
074facfd30 | |
|
|
e97d2eec89 | |
|
|
2e4dfaa728 | |
|
|
a597671712 | |
|
|
3d2eeba638 | |
|
|
db34ac1611 | |
|
|
b107df2478 | |
|
|
3538e7b0ae | |
|
|
ac7f762a1d | |
|
|
30965c6351 | |
|
|
8bcef09ae4 | |
|
|
7e28b115a2 | |
|
|
5fd8722510 | |
|
|
c2543d064b | |
|
|
d5fd7b6384 | |
|
|
c57e7fd527 | |
|
|
0741119a5d | |
|
|
ad24f3d3b6 | |
|
|
5c8fb6b01e | |
|
|
3e27680ea9 | |
|
|
9bce6964bd | |
|
|
ac1cc0c828 | |
|
|
544ab4539e | |
|
|
004991119a | |
|
|
2ffd9bb7a7 | |
|
|
13a950e65f | |
|
|
8c75f41a3f | |
|
|
9722c6cbc6 | |
|
|
3976707b14 | |
|
|
b483dd537f | |
|
|
2260350fc4 | |
|
|
a4f465b6d1 | |
|
|
c802759e42 | |
|
|
5df4192356 | |
|
|
ba99f88048 | |
|
|
e29050b0db | |
|
|
50684890cb | |
|
|
386ed8144c | |
|
|
6d010a561b | |
|
|
0076f0205a | |
|
|
ff01b6df0e | |
|
|
900400f053 | |
|
|
766842f4e7 | |
|
|
dace5dd08a | |
|
|
3f2fd94c58 | |
|
|
3ee71634b3 | |
|
|
d07ac009bf | |
|
|
8ce313f5c7 | |
|
|
005ee8aabd | |
|
|
69bb4e469a | |
|
|
0878c5fd3f | |
|
|
9420cebad4 | |
|
|
e028a604cf | |
|
|
6e62db85eb | |
|
|
67696a72d7 | |
|
|
4eac4ccd7a | |
|
|
cf6f4046da | |
|
|
7fe542a1ff | |
|
|
6c25907a58 | |
|
|
c3f81a4d23 | |
|
|
e782d5f9bb | |
|
|
36b6699cde | |
|
|
8948f0498f | |
|
|
2bce35d604 | |
|
|
63ef63c20d | |
|
|
8566cc5bc9 | |
|
|
22ea6e89fd | |
|
|
a4bd28e168 | |
|
|
d2edfd22c5 | |
|
|
defdfa8ce9 | |
|
|
2558c03f3d | |
|
|
66e17c64d6 | |
|
|
090cfa17c0 | |
|
|
7560b340c7 | |
|
|
1252dbe178 | |
|
|
818596ae36 | |
|
|
6918eaf095 | |
|
|
fc69242578 | |
|
|
729974013a | |
|
|
db1f1d60d5 | |
|
|
04825d2659 | |
|
|
39d0731d74 | |
|
|
1874720ee8 | |
|
|
78ccf3b9f4 | |
|
|
29104ff09b | |
|
|
3b6d1febdb | |
|
|
6ac622853c | |
|
|
d7fcadcd0d | |
|
|
ec7c4e3e4d | |
|
|
e7b50ca4a8 | |
|
|
949bf6ec25 | |
|
|
0d075a9568 | |
|
|
9c17d9a024 | |
|
|
98734506df | |
|
|
90c8d05d00 | |
|
|
bf4044d92e | |
|
|
87c62b4db2 | |
|
|
3fa58715fc | |
|
|
d045c94f54 | |
|
|
dc343f10e3 | |
|
|
e6618da456 | |
|
|
5ba03a2755 | |
|
|
37d6c3e57c | |
|
|
f6101f3621 | |
|
|
7c95e526e4 | |
|
|
fea9d1e25a | |
|
|
dd98f3bf2e | |
|
|
6edb4b6012 | |
|
|
b4018e0124 | |
|
|
b2b9022f50 | |
|
|
c1927dd20a | |
|
|
efbecded54 | |
|
|
0b67ef5f52 | |
|
|
e62d9e126f | |
|
|
86a196e7c8 | |
|
|
c4981376ac | |
|
|
ee6493afd3 | |
|
|
d36999032f | |
|
|
fee62c225b | |
|
|
40f3b7d83e | |
|
|
03f5407727 | |
|
|
96fa38f611 | |
|
|
5300f62063 | |
|
|
795f0b5375 | |
|
|
aec3d106fa | |
|
|
da726a574b | |
|
|
eba1280708 | |
|
|
af355ec096 | |
|
|
557e19e5e7 | |
|
|
09b7f44a91 | |
|
|
fb95aa3d4d | |
|
|
87eaf3646d | |
|
|
c38fe715a5 | |
|
|
8908ef3081 | |
|
|
176f2b9e2f | |
|
|
d76899be54 | |
|
|
968722bf80 | |
|
|
c11cc5eb9e | |
|
|
6a806a05cb | |
|
|
aa36b2f215 | |
|
|
55ccf89e64 | |
|
|
c89d537904 | |
|
|
98110f68bc | |
|
|
0c58a0c1d3 | |
|
|
460783a5aa | |
|
|
cb3137ff80 | |
|
|
823da09ef3 | |
|
|
bf0e29952e | |
|
|
395fa21318 | |
|
|
a3b2a7d0aa | |
|
|
b1b8708195 | |
|
|
afa1d449ca | |
|
|
0f85888479 | |
|
|
b777fb5364 | |
|
|
dfc0ea596a | |
|
|
0fe883cd1e | |
|
|
05028cc45c | |
|
|
82b0272786 | |
|
|
dd579f8c32 | |
|
|
125f50872f | |
|
|
2027b90705 | |
|
|
e779d25955 | |
|
|
e143dc4e1f | |
|
|
a4b3ff4b03 | |
|
|
6fede36b04 | |
|
|
bade8884f3 | |
|
|
82dd27754c | |
|
|
80edd3f8f5 | |
|
|
82aa6bb244 | |
|
|
46cd9c4798 | |
|
|
35ec59ff97 | |
|
|
2d4ce4cf3c | |
|
|
45e8ab0480 | |
|
|
1262dbfcc6 | |
|
|
f76987c2e5 | |
|
|
609cdacec3 | |
|
|
1cd05ff7b4 | |
|
|
4345d898f7 | |
|
|
bd4b3380c2 | |
|
|
74b8c81a8a | |
|
|
2c594bf783 | |
|
|
131c2dc95b | |
|
|
472c86497d | |
|
|
6de0253c4c | |
|
|
b11c707155 | |
|
|
0a6cde40a5 | |
|
|
7c70a36d80 | |
|
|
03e8b1e036 | |
|
|
2171f06685 | |
|
|
4b52d97a64 | |
|
|
0beb386bea | |
|
|
91a8b4ab9c | |
|
|
f13d14b62d | |
|
|
e53af19dc6 | |
|
|
4b7e7c1c7f | |
|
|
f6d54a57f5 | |
|
|
35e07c3d7f | |
|
|
a9dc1c92b7 | |
|
|
ecc575c7d9 | |
|
|
2a2ad4a378 | |
|
|
1cec394698 | |
|
|
d280a53e48 | |
|
|
339c681900 | |
|
|
d999978f84 | |
|
|
af870d3439 | |
|
|
d8e712e85c | |
|
|
40d5e2bc17 | |
|
|
9e74df841f | |
|
|
a54e7cb0b4 | |
|
|
67f433040f | |
|
|
a1bd2d6941 | |
|
|
d4ab19d792 | |
|
|
c5033435f2 | |
|
|
d332932b27 | |
|
|
fbc6c0517c | |
|
|
cd37c85c68 | |
|
|
be26beae09 | |
|
|
55c1d2fb41 | |
|
|
efe3dea8e3 | |
|
|
db3ffafd38 | |
|
|
921c2ddd5e | |
|
|
3e11f7a5eb | |
|
|
bbcfd3336e | |
|
|
f389f07b52 | |
|
|
7f35bab8c7 | |
|
|
ef949590fe | |
|
|
2f5e7a71e6 | |
|
|
42d4e9723c | |
|
|
946313d56b | |
|
|
c7dd8fe095 | |
|
|
6b70483743 | |
|
|
393696a0f8 | |
|
|
3b71931e73 | |
|
|
f2ce59005a | |
|
|
832e716e8b | |
|
|
4f2f37f7a9 | |
|
|
4f897fc6aa | |
|
|
5d8ba22172 | |
|
|
ebe620a3b3 | |
|
|
1ad3f6a79f | |
|
|
405350c649 | |
|
|
745c448e6b | |
|
|
c40d7c5f62 | |
|
|
b49b44f724 | |
|
|
1137420175 | |
|
|
119b4fcb12 | |
|
|
0be7146e4f | |
|
|
d099ca039d | |
|
|
0691e079af | |
|
|
965ee2e0bc | |
|
|
3eca6aeee5 | |
|
|
56af10afb3 | |
|
|
dde84587b9 | |
|
|
4f5a39db18 | |
|
|
e50dc6e20d | |
|
|
b64aff9fdc | |
|
|
1bd1794318 | |
|
|
8480f582ad | |
|
|
f66cf79cf2 | |
|
|
9757712977 | |
|
|
caca4165fe | |
|
|
38881216fc | |
|
|
7edee8d494 | |
|
|
2f28d3a342 | |
|
|
cb7b48b4ec | |
|
|
da58ac6eab | |
|
|
b5f46329b3 | |
|
|
14bce171c8 | |
|
|
777d4a39cb | |
|
|
3af55a3c14 | |
|
|
8d3247e084 | |
|
|
1a91704532 | |
|
|
e794ccc7af | |
|
|
d76f54b40e | |
|
|
21f90d7352 | |
|
|
737367b016 | |
|
|
6fb07d8a31 | |
|
|
13c1c5311e | |
|
|
33cdb33f37 | |
|
|
0b64986766 | |
|
|
674d1de2d3 | |
|
|
7e2e5241bf | |
|
|
5a6049c935 | |
|
|
6a23477c4e | |
|
|
4cf7f20844 | |
|
|
4658f72f98 | |
|
|
749c58f377 | |
|
|
ce3bf635f0 |
|
|
@ -8,3 +8,7 @@ HTML
|
||||||
coverage
|
coverage
|
||||||
dump.rdb
|
dump.rdb
|
||||||
working.png
|
working.png
|
||||||
|
ruby/.rails5-gems
|
||||||
|
web/.rails5-gems
|
||||||
|
websocket-gateway/.rails5-gems
|
||||||
|
.pg_data/
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
2.4.1
|
||||||
|
|
@ -20,4 +20,7 @@ artifacts
|
||||||
*.iml
|
*.iml
|
||||||
.idea
|
.idea
|
||||||
BUILD_NUMBER
|
BUILD_NUMBER
|
||||||
Gemfile.lock
|
# Gemfile.lock
|
||||||
|
Gemfile.alt.lock
|
||||||
|
.byebug_history
|
||||||
|
.ruby-version
|
||||||
|
|
|
||||||
|
|
@ -1,7 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<Settings><!--This file was automatically generated by Ruby plugin.
|
|
||||||
You are allowed to:
|
|
||||||
1. Remove rake task
|
|
||||||
2. Add existing rake tasks
|
|
||||||
To add existing rake tasks automatically delete this file and reload the project.
|
|
||||||
--><RakeGroup description="" fullCmd="" taksId="rake" /></Settings>
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
2.4.1
|
||||||
134
admin/Gemfile
134
admin/Gemfile
|
|
@ -1,56 +1,88 @@
|
||||||
source 'http://rubygems.org'
|
source 'http://rubygems.org'
|
||||||
|
|
||||||
source 'https://jamjam:blueberryjam@int.jamkazam.com/gems/'
|
source 'https://jamjam:blueberryjam@int.jamkazam.com/gems/'
|
||||||
|
ruby_version = ENV["JAM_RUBY_VERSION"]
|
||||||
|
ruby_version = "2.3.1" if ruby_version.nil?
|
||||||
|
|
||||||
|
ruby ruby_version
|
||||||
|
|
||||||
devenv = ENV["BUILD_NUMBER"].nil?
|
devenv = ENV["BUILD_NUMBER"].nil?
|
||||||
|
|
||||||
if devenv
|
if devenv
|
||||||
gem 'jam_db', :path=> "../db/target/ruby_package"
|
#gem 'jam_db', :path=> "../db/target/ruby_package"
|
||||||
gem 'jampb', :path => "../pb/target/ruby/jampb"
|
gem 'jampb', :path => "../pb/target/ruby/jampb"
|
||||||
gem 'jam_ruby', :path => "../ruby"
|
gem 'jam_ruby', :path => "../ruby"
|
||||||
else
|
else
|
||||||
gem 'jam_db', "0.1.#{ENV["BUILD_NUMBER"]}"
|
source 'https://jamjam:blueberryjam@int.jamkazam.com/gems/' do
|
||||||
|
#gem 'jam_db', "0.1.#{ENV["BUILD_NUMBER"]}"
|
||||||
gem 'jampb', "0.1.#{ENV["BUILD_NUMBER"]}"
|
gem 'jampb', "0.1.#{ENV["BUILD_NUMBER"]}"
|
||||||
gem 'jam_ruby', "0.1.#{ENV["BUILD_NUMBER"]}"
|
gem 'jam_ruby', "0.1.#{ENV["BUILD_NUMBER"]}"
|
||||||
ENV['NOKOGIRI_USE_SYSTEM_LIBRARIES'] ||= "true"
|
ENV['NOKOGIRI_USE_SYSTEM_LIBRARIES'] ||= "true"
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
gem 'activeadmin_addons'
|
||||||
|
gem 'json', '1.8.6'
|
||||||
|
gem 'rails', '= 4.2.8'
|
||||||
|
gem 'protected_attributes'
|
||||||
|
gem 'rails-observers'
|
||||||
|
|
||||||
|
|
||||||
|
# PINNED TO SUPPORT BOTH 2.3.1 and 2.4.1 Ruby simultaneously
|
||||||
|
# This should be the same in ruby/admin/web/websocket-gateway
|
||||||
|
#######
|
||||||
|
gem 'nokogiri', '1.10.10' # added to pin before 1.11.0, which requires at leaost ruby 2.5. unpin we go above
|
||||||
|
gem 'sprockets', '3.6.3' # added to pin before 4.0.0, which requiurse at least ruby 2.5
|
||||||
|
gem 'fog-brightbox', '0.11.0' # pinned until we are on ruby 2.5; then remove
|
||||||
|
gem 'faraday', '0.9.2' # pinned untnil we are on ruby 2.5; then remove
|
||||||
|
gem 'ruby-prof', '0.15.9' # pinned until we are on ruby 2.5; then remove
|
||||||
|
gem 'rubyzip', '1.2.1' # pinned until we are on ruby 2.5; then remove
|
||||||
|
gem 'recurly', '2.18.16' # should upgrade to 3.x when we have time to validaate
|
||||||
|
gem 'icalendar', '2.4.0' # pinned until we are on ruby 2.5; then remove
|
||||||
|
gem 'email_validator', '1.6.0' # pinned until we are on ruby 2.5, then remove
|
||||||
|
gem 'redis', '3.3.3' # pinned until we are on 2.5; then remove
|
||||||
|
gem 'redis-namespace', '1.5.3' # pinned until we are on 2.5; then remove
|
||||||
|
gem 'oj', '3.1.3' # pinned until we are on 2.5; then remove
|
||||||
|
gem 'bcrypt', '3.1.15'
|
||||||
|
gem 'sass-rails', '5.0.7' # compiler mismatch issue between build and www
|
||||||
|
gem 'sass', '3.5.5 '# compiler mismatch issue between build and www
|
||||||
|
#######
|
||||||
|
|
||||||
gem 'rails', '~> 3.2.11'
|
|
||||||
gem 'bootstrap-sass', '2.0.4'
|
gem 'bootstrap-sass', '2.0.4'
|
||||||
gem 'bcrypt-ruby', '3.0.1'
|
|
||||||
|
|
||||||
# Gems used only for assets and not required
|
gem 'coffee-rails' #, '~> 3.2.1'
|
||||||
# in production environments by default.
|
|
||||||
group :assets do
|
|
||||||
gem 'sass-rails', '~> 3.2.3'
|
|
||||||
gem 'coffee-rails', '~> 3.2.1'
|
|
||||||
|
|
||||||
# See https://github.com/sstephenson/execjs#readme for more supported runtimes
|
# See https://github.com/sstephenson/execjs#readme for more supported runtimes
|
||||||
# gem 'therubyracer', :platforms => :ruby
|
# gem 'therubyracer', :platforms => :ruby
|
||||||
|
|
||||||
gem 'uglifier', '>= 1.0.3'
|
gem 'kickbox'
|
||||||
|
gem 'uglifier' #, '>= 1.0.3'
|
||||||
|
gem 'net-ssh'
|
||||||
|
gem 'sprockets-rails', '2.3.2'
|
||||||
|
|
||||||
# this version is pinned due to this: https://github.com/gregbell/active_admin/issues/1939
|
# this version is pinned due to this: https://github.com/gregbell/active_admin/issues/1939
|
||||||
gem 'coffee-script-source', '~> 1.4.0' # ADD THIS LINE, 1.5.0 doesn't compile ActiveAdmin JavaScript files
|
gem 'coffee-script-source' #, '~> 1.4.0' # ADD THIS LINE, 1.5.0 doesn't compile ActiveAdmin JavaScript files
|
||||||
end
|
gem 'devise' #, '3.3.0'
|
||||||
gem 'devise', '3.3.0'
|
gem 'will_paginate' #, '3.0.3'
|
||||||
gem 'will_paginate', '3.0.3'
|
|
||||||
gem 'bootstrap-will_paginate', '0.0.6'
|
gem 'bootstrap-will_paginate', '0.0.6'
|
||||||
gem 'carrierwave', '0.9.0'
|
gem 'carrierwave', '0.11.2' #, '0.9.0'
|
||||||
gem 'carrierwave_direct'
|
gem 'carrierwave_direct'
|
||||||
gem 'uuidtools', '2.1.2'
|
gem 'uuidtools', '2.1.2'
|
||||||
gem 'jquery-rails' # , '2.3.0' # pinned because jquery-ui-rails was split from jquery-rails, but activeadmin doesn't support this gem yet
|
gem 'jquery-ui-rails'# , '5.0.5' #, '4.2.1'
|
||||||
gem 'jquery-ui-rails', '4.2.1'
|
gem 'jquery-rails'# , '4.1.1' # both this and jquery-ui-rails are pinned; if you unpin, jquery/autocomplete is missing during precomplie
|
||||||
gem 'rails3-jquery-autocomplete'
|
gem 'rails-jquery-autocomplete' # This is the maintained version of rails3-jquery-autocomplete
|
||||||
gem 'activeadmin' #, github: 'activeadmin', branch: '0-6-stable'
|
gem 'activeadmin' #, '1.0.0.pre4'# github: 'activeadmin', branch: 'master'
|
||||||
|
gem 'activeadmin-searchable_select'
|
||||||
gem 'mime-types', '1.25'
|
gem 'mime-types', '1.25'
|
||||||
gem 'meta_search'
|
#gem 'meta_search'
|
||||||
gem 'fog', "~> 1.18.0"
|
gem 'fog'
|
||||||
|
gem 'xmlrpc'
|
||||||
gem 'unf', '0.1.3' #optional fog dependency
|
gem 'unf', '0.1.3' #optional fog dependency
|
||||||
gem 'country-select'
|
gem 'country-select'
|
||||||
gem 'aasm', '3.0.16'
|
gem 'aasm' #, '3.0.16'
|
||||||
gem 'postgres-copy', '0.6.0'
|
gem 'postgres-copy', '0.6.0'
|
||||||
gem 'aws-sdk', '~> 1'
|
gem 'aws-sdk', '~> 1'
|
||||||
gem 'bugsnag'
|
gem 'bugsnag', '5.3.2'
|
||||||
gem 'gon'
|
gem 'gon'
|
||||||
gem 'cocoon'
|
gem 'cocoon'
|
||||||
gem 'haml-rails'
|
gem 'haml-rails'
|
||||||
|
|
@ -58,27 +90,41 @@ gem 'resque'
|
||||||
gem 'resque-retry'
|
gem 'resque-retry'
|
||||||
gem 'resque-failed-job-mailer'
|
gem 'resque-failed-job-mailer'
|
||||||
gem 'resque-lonely_job', '~> 1.0.0'
|
gem 'resque-lonely_job', '~> 1.0.0'
|
||||||
gem 'eventmachine', '1.0.3'
|
gem 'eventmachine', '1.2.3'
|
||||||
gem 'amqp', '0.9.8'
|
gem 'amqp', '0.9.8'
|
||||||
gem 'logging-rails', :require => 'logging/rails'
|
#gem 'logging-rails', :require => 'logging/rails'
|
||||||
gem 'pg_migrate'
|
#gem 'pg_migrate', '0.1.14'
|
||||||
|
if ENV["MODERN_OS"] == "1"
|
||||||
|
gem 'pg', '0.21.0'
|
||||||
|
else
|
||||||
|
# on mac, bundle config build.pg --with-cflags="-Wno-error=implicit-function-declaration"
|
||||||
|
gem 'pg', '0.17.1', :platform => [:mri, :mswin, :mingw]
|
||||||
|
end
|
||||||
gem 'ruby-protocol-buffers', '1.2.2'
|
gem 'ruby-protocol-buffers', '1.2.2'
|
||||||
gem 'sendgrid', '1.2.0'
|
gem 'sendgrid', '1.2.0'
|
||||||
gem 'geokit-rails'
|
gem 'geokit-rails'
|
||||||
gem 'postgres_ext', '1.0.0'
|
gem 'postgres_ext' #, '1.0.0'
|
||||||
gem 'resque_mailer'
|
gem 'resque_mailer'
|
||||||
gem 'rest-client'
|
gem 'rest-client'
|
||||||
gem 'iso-639'
|
gem 'iso-639'
|
||||||
gem 'rubyzip'
|
|
||||||
gem 'sanitize'
|
gem 'sanitize'
|
||||||
gem 'slim'
|
gem 'slim'
|
||||||
gem 'influxdb', '0.1.8'
|
#gem 'influxdb', '0.1.8'
|
||||||
gem 'influxdb-rails', '0.1.10'
|
#gem 'influxdb-rails', '0.1.10'
|
||||||
gem 'recurly'
|
gem 'influxdb', '0.3.14'
|
||||||
|
gem 'influxdb-rails', '0.1.12'
|
||||||
|
gem 'sendgrid_toolkit', '>= 1.1.1'
|
||||||
|
gem 'stripe'
|
||||||
|
gem 'zip-codes'
|
||||||
|
gem 'best_in_place' #, github: 'bernat/best_in_place'
|
||||||
|
gem 'auto_strip_attributes', '2.6.0'
|
||||||
|
gem 'elasticsearch'
|
||||||
|
|
||||||
group :libv8 do
|
gem 'logging', '1.7.2'
|
||||||
gem 'libv8', "~> 3.11.8"
|
|
||||||
end
|
#group :libv8 do
|
||||||
|
# gem 'libv8', "~> 4.5.95"
|
||||||
|
#end
|
||||||
|
|
||||||
|
|
||||||
# To use Jbuilder templates for JSON
|
# To use Jbuilder templates for JSON
|
||||||
|
|
@ -99,25 +145,25 @@ end
|
||||||
#gem 'debugger' # not working with 2.1.2p95
|
#gem 'debugger' # not working with 2.1.2p95
|
||||||
|
|
||||||
group :development, :test do
|
group :development, :test do
|
||||||
gem 'capybara'
|
gem 'capybara', '2.13.0'
|
||||||
gem 'rspec-rails', '2.14.2'
|
gem 'rspec-rails' #, '2.14.2'
|
||||||
gem 'guard-rspec', '0.5.5'
|
|
||||||
gem 'jasmine', '1.3.1'
|
gem 'jasmine', '1.3.1'
|
||||||
gem 'execjs', '1.4.0'
|
gem 'execjs', '1.4.0'
|
||||||
gem 'therubyracer' #, '0.11.0beta8'
|
#gem 'therubyracer' #, '0.11.0beta8'
|
||||||
gem 'factory_girl_rails', '4.1.0'
|
gem 'factory_girl_rails' # , '4.1.0'
|
||||||
gem 'database_cleaner', '0.7.0'
|
gem 'database_cleaner' #, '0.7.0'
|
||||||
gem 'launchy'
|
gem 'launchy', '2.4.3' # can unpin when go to ruby 2.4+
|
||||||
gem 'faker', '1.3.0'
|
gem 'faker', '1.3.0'
|
||||||
gem 'puma'
|
gem 'puma'
|
||||||
|
gem 'test-unit'
|
||||||
end
|
end
|
||||||
|
|
||||||
group :test do
|
group :test do
|
||||||
gem 'simplecov', '~> 0.7.1'
|
gem 'simplecov', '~> 0.7.1'
|
||||||
gem 'simplecov-rcov'
|
gem 'simplecov-rcov'
|
||||||
gem 'capybara-webkit'
|
# gem 'capybara-webkit'
|
||||||
gem 'capybara-screenshot', '0.3.22' # 1.0.0 broke compat with rspec. maybe we need newer rspec
|
# gem 'capybara-screenshot', '0.3.22' # 1.0.0 broke compat with rspec. maybe we need newer rspec
|
||||||
gem 'poltergeist'
|
# gem 'poltergeist'
|
||||||
end
|
end
|
||||||
|
|
||||||
gem 'pry'
|
gem 'pry'
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,172 @@
|
||||||
|
source 'http://rubygems.org'
|
||||||
|
|
||||||
|
source 'https://jamjam:blueberryjam@int.jamkazam.com/gems/'
|
||||||
|
ruby_version = ENV["JAM_RUBY_VERSION"]
|
||||||
|
ruby_version = "2.3.1" if ruby_version.nil?
|
||||||
|
|
||||||
|
ruby ruby_version
|
||||||
|
|
||||||
|
devenv = ENV["BUILD_NUMBER"].nil?
|
||||||
|
|
||||||
|
if devenv
|
||||||
|
#gem 'jam_db', :path=> "../db/target/ruby_package"
|
||||||
|
gem 'jampb', :path => "../pb/target/ruby/jampb"
|
||||||
|
gem 'jam_ruby', :path => "../ruby"
|
||||||
|
else
|
||||||
|
source 'https://jamjam:blueberryjam@int.jamkazam.com/gems/' do
|
||||||
|
#gem 'jam_db', "0.1.#{ENV["BUILD_NUMBER"]}"
|
||||||
|
gem 'jampb', "0.1.#{ENV["BUILD_NUMBER"]}"
|
||||||
|
gem 'jam_ruby', "0.1.#{ENV["BUILD_NUMBER"]}"
|
||||||
|
ENV['NOKOGIRI_USE_SYSTEM_LIBRARIES'] ||= "true"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
gem 'activeadmin_addons'
|
||||||
|
gem 'json', '1.8.6'
|
||||||
|
gem 'rails', '= 4.2.8'
|
||||||
|
gem 'protected_attributes'
|
||||||
|
gem 'rails-observers'
|
||||||
|
|
||||||
|
|
||||||
|
# PINNED TO SUPPORT BOTH 2.3.1 and 2.4.1 Ruby simultaneously
|
||||||
|
# This should be the same in ruby/admin/web/websocket-gateway
|
||||||
|
#######
|
||||||
|
gem 'nokogiri', '1.10.10' # added to pin before 1.11.0, which requires at leaost ruby 2.5. unpin we go above
|
||||||
|
gem 'sprockets', '3.6.3' # added to pin before 4.0.0, which requiurse at least ruby 2.5
|
||||||
|
gem 'fog-brightbox', '0.11.0' # pinned until we are on ruby 2.5; then remove
|
||||||
|
gem 'faraday', '0.9.2' # pinned untnil we are on ruby 2.5; then remove
|
||||||
|
gem 'ruby-prof', '0.15.9' # pinned until we are on ruby 2.5; then remove
|
||||||
|
gem 'rubyzip', '1.2.1' # pinned until we are on ruby 2.5; then remove
|
||||||
|
gem 'recurly', '2.18.16' # should upgrade to 3.x when we have time to validaate
|
||||||
|
gem 'icalendar', '2.4.0' # pinned until we are on ruby 2.5; then remove
|
||||||
|
gem 'email_validator', '1.6.0' # pinned until we are on ruby 2.5, then remove
|
||||||
|
gem 'redis', '3.3.3' # pinned until we are on 2.5; then remove
|
||||||
|
gem 'redis-namespace', '1.5.3' # pinned until we are on 2.5; then remove
|
||||||
|
gem 'oj', '3.1.3' # pinned until we are on 2.5; then remove
|
||||||
|
gem 'bcrypt', '3.1.15'
|
||||||
|
gem 'sass-rails', '5.0.7' # compiler mismatch issue between build and www
|
||||||
|
gem 'sass', '3.5.5 '# compiler mismatch issue between build and www
|
||||||
|
#######
|
||||||
|
|
||||||
|
gem 'bootstrap-sass', '2.0.4'
|
||||||
|
|
||||||
|
gem 'coffee-rails' #, '~> 3.2.1'
|
||||||
|
|
||||||
|
# See https://github.com/sstephenson/execjs#readme for more supported runtimes
|
||||||
|
# gem 'therubyracer', :platforms => :ruby
|
||||||
|
|
||||||
|
gem 'kickbox'
|
||||||
|
gem 'uglifier' #, '>= 1.0.3'
|
||||||
|
gem 'net-ssh'
|
||||||
|
gem 'sprockets-rails', '2.3.2'
|
||||||
|
|
||||||
|
# this version is pinned due to this: https://github.com/gregbell/active_admin/issues/1939
|
||||||
|
gem 'coffee-script-source' #, '~> 1.4.0' # ADD THIS LINE, 1.5.0 doesn't compile ActiveAdmin JavaScript files
|
||||||
|
gem 'devise' #, '3.3.0'
|
||||||
|
gem 'will_paginate' #, '3.0.3'
|
||||||
|
gem 'bootstrap-will_paginate', '0.0.6'
|
||||||
|
gem 'carrierwave', '0.11.2' #, '0.9.0'
|
||||||
|
gem 'carrierwave_direct'
|
||||||
|
gem 'uuidtools', '2.1.2'
|
||||||
|
gem 'jquery-ui-rails'# , '5.0.5' #, '4.2.1'
|
||||||
|
gem 'jquery-rails'# , '4.1.1' # both this and jquery-ui-rails are pinned; if you unpin, jquery/autocomplete is missing during precomplie
|
||||||
|
gem 'rails-jquery-autocomplete' # This is the maintained version of rails3-jquery-autocomplete
|
||||||
|
gem 'activeadmin' #, '1.0.0.pre4'# github: 'activeadmin', branch: 'master'
|
||||||
|
gem 'activeadmin-searchable_select'
|
||||||
|
gem 'mime-types', '1.25'
|
||||||
|
#gem 'meta_search'
|
||||||
|
gem 'fog'
|
||||||
|
gem 'xmlrpc'
|
||||||
|
gem 'unf', '0.1.3' #optional fog dependency
|
||||||
|
gem 'country-select'
|
||||||
|
gem 'aasm' #, '3.0.16'
|
||||||
|
gem 'postgres-copy', '0.6.0'
|
||||||
|
gem 'aws-sdk', '~> 1'
|
||||||
|
gem 'bugsnag', '5.3.2'
|
||||||
|
gem 'gon'
|
||||||
|
gem 'cocoon'
|
||||||
|
gem 'haml-rails'
|
||||||
|
gem 'resque'
|
||||||
|
gem 'resque-retry'
|
||||||
|
gem 'resque-failed-job-mailer'
|
||||||
|
gem 'resque-lonely_job', '~> 1.0.0'
|
||||||
|
gem 'eventmachine', '1.2.3'
|
||||||
|
gem 'amqp', '0.9.8'
|
||||||
|
#gem 'logging-rails', :require => 'logging/rails'
|
||||||
|
#gem 'pg_migrate', '0.1.14'
|
||||||
|
if ENV["MODERN_OS"] == "1"
|
||||||
|
gem 'pg', '0.21.0'
|
||||||
|
else
|
||||||
|
# on mac, bundle config build.pg --with-cflags="-Wno-error=implicit-function-declaration"
|
||||||
|
gem 'pg', '0.17.1', :platform => [:mri, :mswin, :mingw]
|
||||||
|
end
|
||||||
|
gem 'ruby-protocol-buffers', '1.2.2'
|
||||||
|
gem 'sendgrid', '1.2.0'
|
||||||
|
gem 'geokit-rails'
|
||||||
|
gem 'postgres_ext' #, '1.0.0'
|
||||||
|
gem 'resque_mailer'
|
||||||
|
gem 'rest-client'
|
||||||
|
gem 'iso-639'
|
||||||
|
gem 'sanitize'
|
||||||
|
gem 'slim'
|
||||||
|
#gem 'influxdb', '0.1.8'
|
||||||
|
#gem 'influxdb-rails', '0.1.10'
|
||||||
|
gem 'influxdb', '0.3.14'
|
||||||
|
gem 'influxdb-rails', '0.1.12'
|
||||||
|
gem 'sendgrid_toolkit', '>= 1.1.1'
|
||||||
|
gem 'stripe'
|
||||||
|
gem 'zip-codes'
|
||||||
|
gem 'best_in_place' #, github: 'bernat/best_in_place'
|
||||||
|
gem 'auto_strip_attributes', '2.6.0'
|
||||||
|
gem 'elasticsearch'
|
||||||
|
|
||||||
|
gem 'logging', '1.7.2'
|
||||||
|
|
||||||
|
#group :libv8 do
|
||||||
|
# gem 'libv8', "~> 4.5.95"
|
||||||
|
#end
|
||||||
|
|
||||||
|
|
||||||
|
# To use Jbuilder templates for JSON
|
||||||
|
# gem 'jbuilder'
|
||||||
|
|
||||||
|
group :production do
|
||||||
|
gem 'unicorn'
|
||||||
|
end
|
||||||
|
|
||||||
|
group :package do
|
||||||
|
gem 'fpm'
|
||||||
|
end
|
||||||
|
|
||||||
|
# Deploy with Capistrano
|
||||||
|
# gem 'capistrano'
|
||||||
|
|
||||||
|
# To use debugger
|
||||||
|
#gem 'debugger' # not working with 2.1.2p95
|
||||||
|
|
||||||
|
group :development, :test do
|
||||||
|
gem 'capybara', '2.13.0'
|
||||||
|
gem 'rspec-rails' #, '2.14.2'
|
||||||
|
gem 'jasmine', '1.3.1'
|
||||||
|
gem 'execjs', '1.4.0'
|
||||||
|
#gem 'therubyracer' #, '0.11.0beta8'
|
||||||
|
gem 'factory_girl_rails' # , '4.1.0'
|
||||||
|
gem 'database_cleaner' #, '0.7.0'
|
||||||
|
gem 'launchy', '2.4.3' # can unpin when go to ruby 2.4+
|
||||||
|
gem 'faker', '1.3.0'
|
||||||
|
gem 'puma'
|
||||||
|
gem 'test-unit'
|
||||||
|
end
|
||||||
|
|
||||||
|
group :test do
|
||||||
|
gem 'simplecov', '~> 0.7.1'
|
||||||
|
gem 'simplecov-rcov'
|
||||||
|
# gem 'capybara-webkit'
|
||||||
|
# gem 'capybara-screenshot', '0.3.22' # 1.0.0 broke compat with rspec. maybe we need newer rspec
|
||||||
|
# gem 'poltergeist'
|
||||||
|
end
|
||||||
|
|
||||||
|
gem 'pry'
|
||||||
|
gem 'pry-remote'
|
||||||
|
gem 'pry-stack_explorer'
|
||||||
|
#gem 'pry-debugger'
|
||||||
|
|
@ -0,0 +1,799 @@
|
||||||
|
PATH
|
||||||
|
remote: ../pb/target/ruby/jampb
|
||||||
|
specs:
|
||||||
|
jampb (0.1.1)
|
||||||
|
|
||||||
|
PATH
|
||||||
|
remote: ../ruby
|
||||||
|
specs:
|
||||||
|
jam_ruby (0.1.1)
|
||||||
|
|
||||||
|
GEM
|
||||||
|
remote: http://rubygems.org/
|
||||||
|
remote: https://jamjam:blueberryjam@int.jamkazam.com/gems/
|
||||||
|
specs:
|
||||||
|
CFPropertyList (2.3.6)
|
||||||
|
aasm (5.1.1)
|
||||||
|
concurrent-ruby (~> 1.0)
|
||||||
|
actionmailer (4.2.8)
|
||||||
|
actionpack (= 4.2.8)
|
||||||
|
actionview (= 4.2.8)
|
||||||
|
activejob (= 4.2.8)
|
||||||
|
mail (~> 2.5, >= 2.5.4)
|
||||||
|
rails-dom-testing (~> 1.0, >= 1.0.5)
|
||||||
|
actionpack (4.2.8)
|
||||||
|
actionview (= 4.2.8)
|
||||||
|
activesupport (= 4.2.8)
|
||||||
|
rack (~> 1.6)
|
||||||
|
rack-test (~> 0.6.2)
|
||||||
|
rails-dom-testing (~> 1.0, >= 1.0.5)
|
||||||
|
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
||||||
|
actionview (4.2.8)
|
||||||
|
activesupport (= 4.2.8)
|
||||||
|
builder (~> 3.1)
|
||||||
|
erubis (~> 2.7.0)
|
||||||
|
rails-dom-testing (~> 1.0, >= 1.0.5)
|
||||||
|
rails-html-sanitizer (~> 1.0, >= 1.0.3)
|
||||||
|
active_material (1.4.2)
|
||||||
|
activeadmin (1.4.3)
|
||||||
|
arbre (>= 1.1.1)
|
||||||
|
coffee-rails
|
||||||
|
formtastic (~> 3.1)
|
||||||
|
formtastic_i18n
|
||||||
|
inherited_resources (>= 1.9.0)
|
||||||
|
jquery-rails (>= 4.2.0)
|
||||||
|
kaminari (>= 0.15)
|
||||||
|
railties (>= 4.2, < 5.3)
|
||||||
|
ransack (>= 1.8.7)
|
||||||
|
sass (~> 3.1)
|
||||||
|
sprockets (< 4.1)
|
||||||
|
activeadmin-searchable_select (1.4.0)
|
||||||
|
activeadmin (>= 1.x, < 3)
|
||||||
|
jquery-rails (>= 3.0, < 5)
|
||||||
|
select2-rails (~> 4.0)
|
||||||
|
activeadmin_addons (1.7.1)
|
||||||
|
active_material
|
||||||
|
railties
|
||||||
|
require_all (~> 1.5)
|
||||||
|
sass
|
||||||
|
select2-rails (~> 4.0)
|
||||||
|
xdan-datetimepicker-rails (~> 2.5.1)
|
||||||
|
activejob (4.2.8)
|
||||||
|
activesupport (= 4.2.8)
|
||||||
|
globalid (>= 0.3.0)
|
||||||
|
activemodel (4.2.8)
|
||||||
|
activesupport (= 4.2.8)
|
||||||
|
builder (~> 3.1)
|
||||||
|
activerecord (4.2.8)
|
||||||
|
activemodel (= 4.2.8)
|
||||||
|
activesupport (= 4.2.8)
|
||||||
|
arel (~> 6.0)
|
||||||
|
activesupport (4.2.8)
|
||||||
|
i18n (~> 0.7)
|
||||||
|
minitest (~> 5.1)
|
||||||
|
thread_safe (~> 0.3, >= 0.3.4)
|
||||||
|
tzinfo (~> 1.1)
|
||||||
|
addressable (2.7.0)
|
||||||
|
public_suffix (>= 2.0.2, < 5.0)
|
||||||
|
aliyun-sdk (0.8.0)
|
||||||
|
nokogiri (~> 1.6)
|
||||||
|
rest-client (~> 2.0)
|
||||||
|
amq-client (0.9.12)
|
||||||
|
amq-protocol (>= 1.2.0)
|
||||||
|
eventmachine
|
||||||
|
amq-protocol (2.3.2)
|
||||||
|
amqp (0.9.8)
|
||||||
|
amq-client (~> 0.9.5)
|
||||||
|
amq-protocol (>= 0.9.4)
|
||||||
|
eventmachine
|
||||||
|
arbre (1.2.1)
|
||||||
|
activesupport (>= 3.0.0)
|
||||||
|
arel (6.0.4)
|
||||||
|
arr-pm (0.0.10)
|
||||||
|
cabin (> 0)
|
||||||
|
auto_strip_attributes (2.6.0)
|
||||||
|
activerecord (>= 4.0)
|
||||||
|
aws-sdk (1.67.0)
|
||||||
|
aws-sdk-v1 (= 1.67.0)
|
||||||
|
aws-sdk-v1 (1.67.0)
|
||||||
|
json (~> 1.4)
|
||||||
|
nokogiri (~> 1)
|
||||||
|
backports (3.20.2)
|
||||||
|
bcrypt (3.1.15)
|
||||||
|
best_in_place (3.1.1)
|
||||||
|
actionpack (>= 3.2)
|
||||||
|
railties (>= 3.2)
|
||||||
|
binding_of_caller (0.8.0)
|
||||||
|
debug_inspector (>= 0.0.1)
|
||||||
|
bootstrap-sass (2.0.4.0)
|
||||||
|
bootstrap-will_paginate (0.0.6)
|
||||||
|
will_paginate
|
||||||
|
bugsnag (5.3.2)
|
||||||
|
builder (3.2.4)
|
||||||
|
cabin (0.9.0)
|
||||||
|
capybara (2.13.0)
|
||||||
|
addressable
|
||||||
|
mime-types (>= 1.16)
|
||||||
|
nokogiri (>= 1.3.3)
|
||||||
|
rack (>= 1.0.0)
|
||||||
|
rack-test (>= 0.5.4)
|
||||||
|
xpath (~> 2.0)
|
||||||
|
carrierwave (0.11.2)
|
||||||
|
activemodel (>= 3.2.0)
|
||||||
|
activesupport (>= 3.2.0)
|
||||||
|
json (>= 1.7)
|
||||||
|
mime-types (>= 1.16)
|
||||||
|
mimemagic (>= 0.3.0)
|
||||||
|
carrierwave_direct (1.0.0)
|
||||||
|
carrierwave (~> 0.11)
|
||||||
|
fog-aws
|
||||||
|
cause (0.1)
|
||||||
|
childprocess (0.9.0)
|
||||||
|
ffi (~> 1.0, >= 1.0.11)
|
||||||
|
clamp (1.0.1)
|
||||||
|
cocoon (1.2.15)
|
||||||
|
coderay (1.1.3)
|
||||||
|
coffee-rails (4.2.2)
|
||||||
|
coffee-script (>= 2.2.0)
|
||||||
|
railties (>= 4.0.0)
|
||||||
|
coffee-script (2.4.1)
|
||||||
|
coffee-script-source
|
||||||
|
execjs
|
||||||
|
coffee-script-source (1.12.2)
|
||||||
|
concurrent-ruby (1.1.8)
|
||||||
|
country-select (1.2.1)
|
||||||
|
crass (1.0.6)
|
||||||
|
database_cleaner (1.99.0)
|
||||||
|
debug_inspector (1.0.0)
|
||||||
|
devise (4.7.3)
|
||||||
|
bcrypt (~> 3.0)
|
||||||
|
orm_adapter (~> 0.1)
|
||||||
|
railties (>= 4.1.0)
|
||||||
|
responders
|
||||||
|
warden (~> 1.2.3)
|
||||||
|
diff-lcs (1.4.4)
|
||||||
|
domain_name (0.5.20190701)
|
||||||
|
unf (>= 0.0.5, < 1.0.0)
|
||||||
|
dotenv (2.7.6)
|
||||||
|
elasticsearch (7.4.0)
|
||||||
|
elasticsearch-api (= 7.4.0)
|
||||||
|
elasticsearch-transport (= 7.4.0)
|
||||||
|
elasticsearch-api (7.4.0)
|
||||||
|
multi_json
|
||||||
|
elasticsearch-transport (7.4.0)
|
||||||
|
faraday
|
||||||
|
multi_json
|
||||||
|
email_validator (1.6.0)
|
||||||
|
activemodel
|
||||||
|
erubis (2.7.0)
|
||||||
|
et-orbi (1.2.4)
|
||||||
|
tzinfo
|
||||||
|
eventmachine (1.2.3)
|
||||||
|
excon (0.79.0)
|
||||||
|
execjs (1.4.0)
|
||||||
|
multi_json (~> 1.0)
|
||||||
|
factory_girl (4.9.0)
|
||||||
|
activesupport (>= 3.0.0)
|
||||||
|
factory_girl_rails (4.9.0)
|
||||||
|
factory_girl (~> 4.9.0)
|
||||||
|
railties (>= 3.0.0)
|
||||||
|
faker (1.3.0)
|
||||||
|
i18n (~> 0.5)
|
||||||
|
faraday (0.9.2)
|
||||||
|
multipart-post (>= 1.2, < 3)
|
||||||
|
ffi (1.12.2)
|
||||||
|
fission (0.5.0)
|
||||||
|
CFPropertyList (~> 2.2)
|
||||||
|
fog (1.41.0)
|
||||||
|
fog-aliyun (>= 0.1.0)
|
||||||
|
fog-atmos
|
||||||
|
fog-aws (>= 0.6.0)
|
||||||
|
fog-brightbox (~> 0.4)
|
||||||
|
fog-cloudatcost (~> 0.1.0)
|
||||||
|
fog-core (~> 1.45)
|
||||||
|
fog-digitalocean (>= 0.3.0)
|
||||||
|
fog-dnsimple (~> 1.0)
|
||||||
|
fog-dynect (~> 0.0.2)
|
||||||
|
fog-ecloud (~> 0.1)
|
||||||
|
fog-google (<= 0.1.0)
|
||||||
|
fog-internet-archive
|
||||||
|
fog-joyent
|
||||||
|
fog-json
|
||||||
|
fog-local
|
||||||
|
fog-openstack
|
||||||
|
fog-powerdns (>= 0.1.1)
|
||||||
|
fog-profitbricks
|
||||||
|
fog-rackspace
|
||||||
|
fog-radosgw (>= 0.0.2)
|
||||||
|
fog-riakcs
|
||||||
|
fog-sakuracloud (>= 0.0.4)
|
||||||
|
fog-serverlove
|
||||||
|
fog-softlayer
|
||||||
|
fog-storm_on_demand
|
||||||
|
fog-terremark
|
||||||
|
fog-vmfusion
|
||||||
|
fog-voxel
|
||||||
|
fog-vsphere (>= 0.4.0)
|
||||||
|
fog-xenserver
|
||||||
|
fog-xml (~> 0.1.1)
|
||||||
|
ipaddress (~> 0.5)
|
||||||
|
json (>= 1.8, < 2.0)
|
||||||
|
fog-aliyun (0.3.19)
|
||||||
|
aliyun-sdk (~> 0.8.0)
|
||||||
|
fog-core
|
||||||
|
fog-json
|
||||||
|
ipaddress (~> 0.8)
|
||||||
|
xml-simple (~> 1.1)
|
||||||
|
fog-atmos (0.1.0)
|
||||||
|
fog-core
|
||||||
|
fog-xml
|
||||||
|
fog-aws (2.0.1)
|
||||||
|
fog-core (~> 1.38)
|
||||||
|
fog-json (~> 1.0)
|
||||||
|
fog-xml (~> 0.1)
|
||||||
|
ipaddress (~> 0.8)
|
||||||
|
fog-brightbox (0.11.0)
|
||||||
|
fog-core (~> 1.22)
|
||||||
|
fog-json
|
||||||
|
inflecto (~> 0.0.2)
|
||||||
|
fog-cloudatcost (0.1.2)
|
||||||
|
fog-core (~> 1.36)
|
||||||
|
fog-json (~> 1.0)
|
||||||
|
fog-xml (~> 0.1)
|
||||||
|
ipaddress (~> 0.8)
|
||||||
|
fog-core (1.45.0)
|
||||||
|
builder
|
||||||
|
excon (~> 0.58)
|
||||||
|
formatador (~> 0.2)
|
||||||
|
fog-digitalocean (0.4.0)
|
||||||
|
fog-core
|
||||||
|
fog-json
|
||||||
|
fog-xml
|
||||||
|
ipaddress (>= 0.5)
|
||||||
|
fog-dnsimple (1.0.0)
|
||||||
|
fog-core (~> 1.38)
|
||||||
|
fog-json (~> 1.0)
|
||||||
|
fog-dynect (0.0.3)
|
||||||
|
fog-core
|
||||||
|
fog-json
|
||||||
|
fog-xml
|
||||||
|
fog-ecloud (0.3.0)
|
||||||
|
fog-core
|
||||||
|
fog-xml
|
||||||
|
fog-google (0.1.0)
|
||||||
|
fog-core
|
||||||
|
fog-json
|
||||||
|
fog-xml
|
||||||
|
fog-internet-archive (0.0.2)
|
||||||
|
fog-core
|
||||||
|
fog-json
|
||||||
|
fog-xml
|
||||||
|
fog-joyent (0.0.1)
|
||||||
|
fog-core (~> 1.42)
|
||||||
|
fog-json (>= 1.0)
|
||||||
|
fog-json (1.2.0)
|
||||||
|
fog-core
|
||||||
|
multi_json (~> 1.10)
|
||||||
|
fog-local (0.6.0)
|
||||||
|
fog-core (>= 1.27, < 3.0)
|
||||||
|
fog-openstack (0.3.10)
|
||||||
|
fog-core (>= 1.45, <= 2.1.0)
|
||||||
|
fog-json (>= 1.0)
|
||||||
|
ipaddress (>= 0.8)
|
||||||
|
fog-powerdns (0.2.0)
|
||||||
|
fog-core
|
||||||
|
fog-json
|
||||||
|
fog-xml
|
||||||
|
fog-profitbricks (4.1.1)
|
||||||
|
fog-core (~> 1.42)
|
||||||
|
fog-json (~> 1.0)
|
||||||
|
fog-rackspace (0.1.6)
|
||||||
|
fog-core (>= 1.35)
|
||||||
|
fog-json (>= 1.0)
|
||||||
|
fog-xml (>= 0.1)
|
||||||
|
ipaddress (>= 0.8)
|
||||||
|
fog-radosgw (0.0.5)
|
||||||
|
fog-core (>= 1.21.0)
|
||||||
|
fog-json
|
||||||
|
fog-xml (>= 0.0.1)
|
||||||
|
fog-riakcs (0.1.0)
|
||||||
|
fog-core
|
||||||
|
fog-json
|
||||||
|
fog-xml
|
||||||
|
fog-sakuracloud (1.7.5)
|
||||||
|
fog-core
|
||||||
|
fog-json
|
||||||
|
fog-serverlove (0.1.2)
|
||||||
|
fog-core
|
||||||
|
fog-json
|
||||||
|
fog-softlayer (1.1.4)
|
||||||
|
fog-core
|
||||||
|
fog-json
|
||||||
|
fog-storm_on_demand (0.1.1)
|
||||||
|
fog-core
|
||||||
|
fog-json
|
||||||
|
fog-terremark (0.1.0)
|
||||||
|
fog-core
|
||||||
|
fog-xml
|
||||||
|
fog-vmfusion (0.1.0)
|
||||||
|
fission
|
||||||
|
fog-core
|
||||||
|
fog-voxel (0.1.0)
|
||||||
|
fog-core
|
||||||
|
fog-xml
|
||||||
|
fog-vsphere (3.5.0)
|
||||||
|
fog-core
|
||||||
|
rbvmomi (>= 1.9, < 3)
|
||||||
|
fog-xenserver (1.0.0)
|
||||||
|
fog-core
|
||||||
|
fog-xml
|
||||||
|
xmlrpc
|
||||||
|
fog-xml (0.1.3)
|
||||||
|
fog-core
|
||||||
|
nokogiri (>= 1.5.11, < 2.0.0)
|
||||||
|
formatador (0.2.5)
|
||||||
|
formtastic (3.1.5)
|
||||||
|
actionpack (>= 3.2.13)
|
||||||
|
formtastic_i18n (0.6.0)
|
||||||
|
fpm (1.12.0)
|
||||||
|
arr-pm (~> 0.0.10)
|
||||||
|
backports (>= 2.6.2)
|
||||||
|
cabin (>= 0.6.0)
|
||||||
|
childprocess (< 1.0.0)
|
||||||
|
clamp (~> 1.0.0)
|
||||||
|
ffi (~> 1.12.0)
|
||||||
|
git (>= 1.3.0, < 2.0)
|
||||||
|
json (>= 1.7.7, < 3.0)
|
||||||
|
pleaserun (~> 0.0.29)
|
||||||
|
ruby-xz (~> 0.2.3)
|
||||||
|
stud
|
||||||
|
fugit (1.4.2)
|
||||||
|
et-orbi (~> 1.1, >= 1.1.8)
|
||||||
|
raabro (~> 1.4)
|
||||||
|
geokit (1.13.1)
|
||||||
|
geokit-rails (2.3.2)
|
||||||
|
geokit (~> 1.5)
|
||||||
|
rails (>= 3.0)
|
||||||
|
git (1.8.1)
|
||||||
|
rchardet (~> 1.8)
|
||||||
|
globalid (0.4.2)
|
||||||
|
activesupport (>= 4.2.0)
|
||||||
|
gon (6.4.0)
|
||||||
|
actionpack (>= 3.0.20)
|
||||||
|
i18n (>= 0.7)
|
||||||
|
multi_json
|
||||||
|
request_store (>= 1.0)
|
||||||
|
haml (5.2.1)
|
||||||
|
temple (>= 0.8.0)
|
||||||
|
tilt
|
||||||
|
haml-rails (1.0.0)
|
||||||
|
actionpack (>= 4.0.1)
|
||||||
|
activesupport (>= 4.0.1)
|
||||||
|
haml (>= 4.0.6, < 6.0)
|
||||||
|
html2haml (>= 1.0.1)
|
||||||
|
railties (>= 4.0.1)
|
||||||
|
has_scope (0.7.2)
|
||||||
|
actionpack (>= 4.1)
|
||||||
|
activesupport (>= 4.1)
|
||||||
|
html2haml (2.2.0)
|
||||||
|
erubis (~> 2.7.0)
|
||||||
|
haml (>= 4.0, < 6)
|
||||||
|
nokogiri (>= 1.6.0)
|
||||||
|
ruby_parser (~> 3.5)
|
||||||
|
http-accept (1.7.0)
|
||||||
|
http-cookie (1.0.3)
|
||||||
|
domain_name (~> 0.5)
|
||||||
|
httparty (0.16.2)
|
||||||
|
multi_xml (>= 0.5.2)
|
||||||
|
i18n (0.9.5)
|
||||||
|
concurrent-ruby (~> 1.0)
|
||||||
|
icalendar (2.4.0)
|
||||||
|
inflecto (0.0.2)
|
||||||
|
influxdb (0.3.14)
|
||||||
|
cause
|
||||||
|
json
|
||||||
|
influxdb-rails (0.1.12)
|
||||||
|
influxdb (~> 0.3.0)
|
||||||
|
railties
|
||||||
|
inherited_resources (1.9.0)
|
||||||
|
actionpack (>= 4.2, < 5.3)
|
||||||
|
has_scope (~> 0.6)
|
||||||
|
railties (>= 4.2, < 5.3)
|
||||||
|
responders
|
||||||
|
insist (1.0.0)
|
||||||
|
io-like (0.3.1)
|
||||||
|
ipaddress (0.8.3)
|
||||||
|
iso-639 (0.3.5)
|
||||||
|
jasmine (1.3.1)
|
||||||
|
jasmine-core (~> 1.3.1)
|
||||||
|
rack (~> 1.0)
|
||||||
|
rspec (>= 1.3.1)
|
||||||
|
selenium-webdriver (>= 0.1.3)
|
||||||
|
jasmine-core (1.3.1)
|
||||||
|
jquery-rails (4.4.0)
|
||||||
|
rails-dom-testing (>= 1, < 3)
|
||||||
|
railties (>= 4.2.0)
|
||||||
|
thor (>= 0.14, < 2.0)
|
||||||
|
jquery-ui-rails (6.0.1)
|
||||||
|
railties (>= 3.2.16)
|
||||||
|
json (1.8.6)
|
||||||
|
kaminari (1.2.1)
|
||||||
|
activesupport (>= 4.1.0)
|
||||||
|
kaminari-actionview (= 1.2.1)
|
||||||
|
kaminari-activerecord (= 1.2.1)
|
||||||
|
kaminari-core (= 1.2.1)
|
||||||
|
kaminari-actionview (1.2.1)
|
||||||
|
actionview
|
||||||
|
kaminari-core (= 1.2.1)
|
||||||
|
kaminari-activerecord (1.2.1)
|
||||||
|
activerecord
|
||||||
|
kaminari-core (= 1.2.1)
|
||||||
|
kaminari-core (1.2.1)
|
||||||
|
kgio (2.11.3)
|
||||||
|
kickbox (2.0.4)
|
||||||
|
faraday (~> 0.9)
|
||||||
|
json (>= 1.8)
|
||||||
|
launchy (2.4.3)
|
||||||
|
addressable (~> 2.3)
|
||||||
|
little-plugger (1.1.4)
|
||||||
|
logging (1.7.2)
|
||||||
|
little-plugger (>= 1.1.3)
|
||||||
|
loofah (2.9.0)
|
||||||
|
crass (~> 1.0.2)
|
||||||
|
nokogiri (>= 1.5.9)
|
||||||
|
mail (2.7.1)
|
||||||
|
mini_mime (>= 0.1.1)
|
||||||
|
method_source (1.0.0)
|
||||||
|
mime-types (1.25)
|
||||||
|
mimemagic (0.3.5)
|
||||||
|
mini_mime (1.0.2)
|
||||||
|
mini_portile2 (2.4.0)
|
||||||
|
minitest (5.14.3)
|
||||||
|
mono_logger (1.1.0)
|
||||||
|
multi_json (1.15.0)
|
||||||
|
multi_xml (0.6.0)
|
||||||
|
multipart-post (2.1.1)
|
||||||
|
mustache (0.99.8)
|
||||||
|
net-ssh (6.1.0)
|
||||||
|
netrc (0.11.0)
|
||||||
|
nio4r (2.5.2)
|
||||||
|
nokogiri (1.10.10)
|
||||||
|
mini_portile2 (~> 2.4.0)
|
||||||
|
nokogumbo (2.0.4)
|
||||||
|
nokogiri (~> 1.8, >= 1.8.4)
|
||||||
|
oj (3.1.3)
|
||||||
|
optimist (3.0.1)
|
||||||
|
orm_adapter (0.5.0)
|
||||||
|
pg (0.17.1)
|
||||||
|
pg_array_parser (0.0.9)
|
||||||
|
pleaserun (0.0.31)
|
||||||
|
cabin (> 0)
|
||||||
|
clamp
|
||||||
|
dotenv
|
||||||
|
insist
|
||||||
|
mustache (= 0.99.8)
|
||||||
|
stud
|
||||||
|
postgres-copy (0.6.0)
|
||||||
|
activerecord (>= 3.0.0)
|
||||||
|
pg
|
||||||
|
rails (>= 3.0.0)
|
||||||
|
responders
|
||||||
|
postgres_ext (3.0.1)
|
||||||
|
activerecord (~> 4.0)
|
||||||
|
arel (>= 4.0.1)
|
||||||
|
pg_array_parser (~> 0.0.9)
|
||||||
|
power_assert (2.0.0)
|
||||||
|
protected_attributes (1.1.4)
|
||||||
|
activemodel (>= 4.0.1, < 5.0)
|
||||||
|
pry (0.14.0)
|
||||||
|
coderay (~> 1.1)
|
||||||
|
method_source (~> 1.0)
|
||||||
|
pry-remote (0.1.8)
|
||||||
|
pry (~> 0.9)
|
||||||
|
slop (~> 3.0)
|
||||||
|
pry-stack_explorer (0.4.12)
|
||||||
|
binding_of_caller (~> 0.7)
|
||||||
|
pry (~> 0.13)
|
||||||
|
public_suffix (4.0.6)
|
||||||
|
puma (5.2.1)
|
||||||
|
nio4r (~> 2.0)
|
||||||
|
raabro (1.4.0)
|
||||||
|
rack (1.6.13)
|
||||||
|
rack-protection (1.5.5)
|
||||||
|
rack
|
||||||
|
rack-test (0.6.3)
|
||||||
|
rack (>= 1.0)
|
||||||
|
rails (4.2.8)
|
||||||
|
actionmailer (= 4.2.8)
|
||||||
|
actionpack (= 4.2.8)
|
||||||
|
actionview (= 4.2.8)
|
||||||
|
activejob (= 4.2.8)
|
||||||
|
activemodel (= 4.2.8)
|
||||||
|
activerecord (= 4.2.8)
|
||||||
|
activesupport (= 4.2.8)
|
||||||
|
bundler (>= 1.3.0, < 2.0)
|
||||||
|
railties (= 4.2.8)
|
||||||
|
sprockets-rails
|
||||||
|
rails-deprecated_sanitizer (1.0.3)
|
||||||
|
activesupport (>= 4.2.0.alpha)
|
||||||
|
rails-dom-testing (1.0.9)
|
||||||
|
activesupport (>= 4.2.0, < 5.0)
|
||||||
|
nokogiri (~> 1.6)
|
||||||
|
rails-deprecated_sanitizer (>= 1.0.1)
|
||||||
|
rails-html-sanitizer (1.3.0)
|
||||||
|
loofah (~> 2.3)
|
||||||
|
rails-jquery-autocomplete (1.0.5)
|
||||||
|
rails (>= 3.2)
|
||||||
|
rails-observers (0.1.5)
|
||||||
|
activemodel (>= 4.0)
|
||||||
|
railties (4.2.8)
|
||||||
|
actionpack (= 4.2.8)
|
||||||
|
activesupport (= 4.2.8)
|
||||||
|
rake (>= 0.8.7)
|
||||||
|
thor (>= 0.18.1, < 2.0)
|
||||||
|
raindrops (0.19.1)
|
||||||
|
rake (13.0.3)
|
||||||
|
ransack (1.8.10)
|
||||||
|
actionpack (>= 3.0, < 5.2)
|
||||||
|
activerecord (>= 3.0, < 5.2)
|
||||||
|
activesupport (>= 3.0, < 5.2)
|
||||||
|
i18n
|
||||||
|
rb-fsevent (0.10.4)
|
||||||
|
rb-inotify (0.10.1)
|
||||||
|
ffi (~> 1.0)
|
||||||
|
rbvmomi (2.4.1)
|
||||||
|
builder (~> 3.0)
|
||||||
|
json (>= 1.8)
|
||||||
|
nokogiri (~> 1.5)
|
||||||
|
optimist (~> 3.0)
|
||||||
|
rchardet (1.8.0)
|
||||||
|
recurly (2.18.16)
|
||||||
|
redis (3.3.3)
|
||||||
|
redis-namespace (1.5.3)
|
||||||
|
redis (~> 3.0, >= 3.0.4)
|
||||||
|
request_store (1.5.0)
|
||||||
|
rack (>= 1.4)
|
||||||
|
require_all (1.5.0)
|
||||||
|
responders (2.4.1)
|
||||||
|
actionpack (>= 4.2.0, < 6.0)
|
||||||
|
railties (>= 4.2.0, < 6.0)
|
||||||
|
resque (1.27.4)
|
||||||
|
mono_logger (~> 1.0)
|
||||||
|
multi_json (~> 1.0)
|
||||||
|
redis-namespace (~> 1.3)
|
||||||
|
sinatra (>= 0.9.2)
|
||||||
|
vegas (~> 0.1.2)
|
||||||
|
resque-failed-job-mailer (0.0.3)
|
||||||
|
resque-lonely_job (1.0.2)
|
||||||
|
resque (>= 1.2)
|
||||||
|
resque-retry (1.7.4)
|
||||||
|
resque (>= 1.25, < 3.0)
|
||||||
|
resque-scheduler (~> 4.0)
|
||||||
|
resque-scheduler (4.4.0)
|
||||||
|
mono_logger (~> 1.0)
|
||||||
|
redis (>= 3.3)
|
||||||
|
resque (>= 1.26)
|
||||||
|
rufus-scheduler (~> 3.2)
|
||||||
|
resque_mailer (2.4.3)
|
||||||
|
actionmailer (>= 3.0)
|
||||||
|
activesupport (>= 3.0)
|
||||||
|
rest-client (2.1.0)
|
||||||
|
http-accept (>= 1.7.0, < 2.0)
|
||||||
|
http-cookie (>= 1.0.2, < 2.0)
|
||||||
|
mime-types (>= 1.16, < 4.0)
|
||||||
|
netrc (~> 0.8)
|
||||||
|
rspec (3.10.0)
|
||||||
|
rspec-core (~> 3.10.0)
|
||||||
|
rspec-expectations (~> 3.10.0)
|
||||||
|
rspec-mocks (~> 3.10.0)
|
||||||
|
rspec-core (3.10.1)
|
||||||
|
rspec-support (~> 3.10.0)
|
||||||
|
rspec-expectations (3.10.1)
|
||||||
|
diff-lcs (>= 1.2.0, < 2.0)
|
||||||
|
rspec-support (~> 3.10.0)
|
||||||
|
rspec-mocks (3.10.2)
|
||||||
|
diff-lcs (>= 1.2.0, < 2.0)
|
||||||
|
rspec-support (~> 3.10.0)
|
||||||
|
rspec-rails (4.0.2)
|
||||||
|
actionpack (>= 4.2)
|
||||||
|
activesupport (>= 4.2)
|
||||||
|
railties (>= 4.2)
|
||||||
|
rspec-core (~> 3.10)
|
||||||
|
rspec-expectations (~> 3.10)
|
||||||
|
rspec-mocks (~> 3.10)
|
||||||
|
rspec-support (~> 3.10)
|
||||||
|
rspec-support (3.10.2)
|
||||||
|
ruby-prof (0.15.9)
|
||||||
|
ruby-protocol-buffers (1.2.2)
|
||||||
|
ruby-xz (0.2.3)
|
||||||
|
ffi (~> 1.9)
|
||||||
|
io-like (~> 0.3)
|
||||||
|
ruby_parser (3.15.1)
|
||||||
|
sexp_processor (~> 4.9)
|
||||||
|
rubyzip (1.2.1)
|
||||||
|
rufus-scheduler (3.7.0)
|
||||||
|
fugit (~> 1.1, >= 1.1.6)
|
||||||
|
sanitize (5.2.3)
|
||||||
|
crass (~> 1.0.2)
|
||||||
|
nokogiri (>= 1.8.0)
|
||||||
|
nokogumbo (~> 2.0)
|
||||||
|
sass (3.5.5)
|
||||||
|
sass-listen (~> 4.0.0)
|
||||||
|
sass-listen (4.0.0)
|
||||||
|
rb-fsevent (~> 0.9, >= 0.9.4)
|
||||||
|
rb-inotify (~> 0.9, >= 0.9.7)
|
||||||
|
sass-rails (5.0.7)
|
||||||
|
railties (>= 4.0.0, < 6)
|
||||||
|
sass (~> 3.1)
|
||||||
|
sprockets (>= 2.8, < 4.0)
|
||||||
|
sprockets-rails (>= 2.0, < 4.0)
|
||||||
|
tilt (>= 1.1, < 3)
|
||||||
|
select2-rails (4.0.13)
|
||||||
|
selenium-webdriver (3.14.0)
|
||||||
|
childprocess (~> 0.5)
|
||||||
|
rubyzip (~> 1.2)
|
||||||
|
sendgrid (1.2.0)
|
||||||
|
json
|
||||||
|
sendgrid_toolkit (1.4.0)
|
||||||
|
httparty (>= 0.7.6)
|
||||||
|
sexp_processor (4.15.2)
|
||||||
|
simplecov (0.7.1)
|
||||||
|
multi_json (~> 1.0)
|
||||||
|
simplecov-html (~> 0.7.1)
|
||||||
|
simplecov-html (0.7.1)
|
||||||
|
simplecov-rcov (0.2.3)
|
||||||
|
simplecov (>= 0.4.1)
|
||||||
|
sinatra (1.4.8)
|
||||||
|
rack (~> 1.5)
|
||||||
|
rack-protection (~> 1.4)
|
||||||
|
tilt (>= 1.3, < 3)
|
||||||
|
slim (4.1.0)
|
||||||
|
temple (>= 0.7.6, < 0.9)
|
||||||
|
tilt (>= 2.0.6, < 2.1)
|
||||||
|
slop (3.6.0)
|
||||||
|
sprockets (3.6.3)
|
||||||
|
concurrent-ruby (~> 1.0)
|
||||||
|
rack (> 1, < 3)
|
||||||
|
sprockets-rails (2.3.2)
|
||||||
|
actionpack (>= 3.0)
|
||||||
|
activesupport (>= 3.0)
|
||||||
|
sprockets (>= 2.8, < 4.0)
|
||||||
|
stripe (5.29.1)
|
||||||
|
stud (0.0.23)
|
||||||
|
temple (0.8.2)
|
||||||
|
test-unit (3.4.0)
|
||||||
|
power_assert
|
||||||
|
thor (1.1.0)
|
||||||
|
thread_safe (0.3.6)
|
||||||
|
tilt (2.0.10)
|
||||||
|
tzinfo (1.2.9)
|
||||||
|
thread_safe (~> 0.1)
|
||||||
|
uglifier (4.2.0)
|
||||||
|
execjs (>= 0.3.0, < 3)
|
||||||
|
unf (0.1.3)
|
||||||
|
unf_ext
|
||||||
|
unf_ext (0.0.7.7)
|
||||||
|
unicorn (5.8.0)
|
||||||
|
kgio (~> 2.6)
|
||||||
|
raindrops (~> 0.7)
|
||||||
|
uuidtools (2.1.2)
|
||||||
|
vegas (0.1.11)
|
||||||
|
rack (>= 1.0.0)
|
||||||
|
warden (1.2.7)
|
||||||
|
rack (>= 1.0)
|
||||||
|
webrick (1.7.0)
|
||||||
|
will_paginate (3.3.0)
|
||||||
|
xdan-datetimepicker-rails (2.5.4)
|
||||||
|
jquery-rails
|
||||||
|
rails (>= 3.2.16)
|
||||||
|
xml-simple (1.1.8)
|
||||||
|
xmlrpc (0.3.2)
|
||||||
|
webrick
|
||||||
|
xpath (2.1.0)
|
||||||
|
nokogiri (~> 1.3)
|
||||||
|
zip-codes (0.2.1)
|
||||||
|
|
||||||
|
PLATFORMS
|
||||||
|
ruby
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
aasm
|
||||||
|
activeadmin
|
||||||
|
activeadmin-searchable_select
|
||||||
|
activeadmin_addons
|
||||||
|
amqp (= 0.9.8)
|
||||||
|
auto_strip_attributes (= 2.6.0)
|
||||||
|
aws-sdk (~> 1)
|
||||||
|
bcrypt (= 3.1.15)
|
||||||
|
best_in_place
|
||||||
|
bootstrap-sass (= 2.0.4)
|
||||||
|
bootstrap-will_paginate (= 0.0.6)
|
||||||
|
bugsnag (= 5.3.2)
|
||||||
|
capybara (= 2.13.0)
|
||||||
|
carrierwave (= 0.11.2)
|
||||||
|
carrierwave_direct
|
||||||
|
cocoon
|
||||||
|
coffee-rails
|
||||||
|
coffee-script-source
|
||||||
|
country-select
|
||||||
|
database_cleaner
|
||||||
|
devise
|
||||||
|
elasticsearch
|
||||||
|
email_validator (= 1.6.0)
|
||||||
|
eventmachine (= 1.2.3)
|
||||||
|
execjs (= 1.4.0)
|
||||||
|
factory_girl_rails
|
||||||
|
faker (= 1.3.0)
|
||||||
|
faraday (= 0.9.2)
|
||||||
|
fog
|
||||||
|
fog-brightbox (= 0.11.0)
|
||||||
|
fpm
|
||||||
|
geokit-rails
|
||||||
|
gon
|
||||||
|
haml-rails
|
||||||
|
icalendar (= 2.4.0)
|
||||||
|
influxdb (= 0.3.14)
|
||||||
|
influxdb-rails (= 0.1.12)
|
||||||
|
iso-639
|
||||||
|
jam_ruby!
|
||||||
|
jampb!
|
||||||
|
jasmine (= 1.3.1)
|
||||||
|
jquery-rails
|
||||||
|
jquery-ui-rails
|
||||||
|
json (= 1.8.6)
|
||||||
|
kickbox
|
||||||
|
launchy (= 2.4.3)
|
||||||
|
logging (= 1.7.2)
|
||||||
|
mime-types (= 1.25)
|
||||||
|
net-ssh
|
||||||
|
nokogiri (= 1.10.10)
|
||||||
|
oj (= 3.1.3)
|
||||||
|
pg (= 0.17.1)
|
||||||
|
postgres-copy (= 0.6.0)
|
||||||
|
postgres_ext
|
||||||
|
protected_attributes
|
||||||
|
pry
|
||||||
|
pry-remote
|
||||||
|
pry-stack_explorer
|
||||||
|
puma
|
||||||
|
rails (= 4.2.8)
|
||||||
|
rails-jquery-autocomplete
|
||||||
|
rails-observers
|
||||||
|
recurly (= 2.18.16)
|
||||||
|
redis (= 3.3.3)
|
||||||
|
redis-namespace (= 1.5.3)
|
||||||
|
resque
|
||||||
|
resque-failed-job-mailer
|
||||||
|
resque-lonely_job (~> 1.0.0)
|
||||||
|
resque-retry
|
||||||
|
resque_mailer
|
||||||
|
rest-client
|
||||||
|
rspec-rails
|
||||||
|
ruby-prof (= 0.15.9)
|
||||||
|
ruby-protocol-buffers (= 1.2.2)
|
||||||
|
rubyzip (= 1.2.1)
|
||||||
|
sanitize
|
||||||
|
sass (= 3.5.5)
|
||||||
|
sass-rails (= 5.0.7)
|
||||||
|
sendgrid (= 1.2.0)
|
||||||
|
sendgrid_toolkit (>= 1.1.1)
|
||||||
|
simplecov (~> 0.7.1)
|
||||||
|
simplecov-rcov
|
||||||
|
slim
|
||||||
|
sprockets (= 3.6.3)
|
||||||
|
sprockets-rails (= 2.3.2)
|
||||||
|
stripe
|
||||||
|
test-unit
|
||||||
|
uglifier
|
||||||
|
unf (= 0.1.3)
|
||||||
|
unicorn
|
||||||
|
uuidtools (= 2.1.2)
|
||||||
|
will_paginate
|
||||||
|
xmlrpc
|
||||||
|
zip-codes
|
||||||
|
|
||||||
|
RUBY VERSION
|
||||||
|
ruby 2.4.1p111
|
||||||
|
|
||||||
|
BUNDLED WITH
|
||||||
|
1.17.3
|
||||||
|
|
@ -8,3 +8,12 @@ Immediately the focus is on using active_scaffolding that provides visibility in
|
||||||
Overtime we can add more administrative functions and views, but initially this is one of the easiest ways to give 'powertools' behind the scenes with an entirely separate authentication model.
|
Overtime we can add more administrative functions and views, but initially this is one of the easiest ways to give 'powertools' behind the scenes with an entirely separate authentication model.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Examples of:
|
||||||
|
|
||||||
|
* Button on Show Page of Item: 'Send Client Update Notice' in jam_ruby_artifact_updates.rb
|
||||||
|
* Batch Updates in View page: onboarding.rb (CurrentlyOnboarding)
|
||||||
|
|
||||||
|
|
||||||
|
Stuff that is probably breaky:
|
||||||
|
activeadmin_addons https://github.com/platanus/activeadmin_addons
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
|
||||||
#!/usr/bin/env rake
|
#!/usr/bin/env rake
|
||||||
# Add your own tasks in files placed in lib/tasks ending in .rake,
|
# Add your own tasks in files placed in lib/tasks ending in .rake,
|
||||||
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
|
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
|
||||||
|
|
@ -5,3 +6,9 @@
|
||||||
require File.expand_path('../config/application', __FILE__)
|
require File.expand_path('../config/application', __FILE__)
|
||||||
|
|
||||||
JamAdmin::Application.load_tasks
|
JamAdmin::Application.load_tasks
|
||||||
|
|
||||||
|
require 'jam_ruby'
|
||||||
|
|
||||||
|
spec = Gem::Specification.find_by_name 'jam_ruby'
|
||||||
|
rakefile = "#{spec.gem_dir}/Rakefile"
|
||||||
|
load rakefile
|
||||||
|
|
@ -0,0 +1,161 @@
|
||||||
|
module AdCampaignsHelper
|
||||||
|
def self.spacer(val, total)
|
||||||
|
percentage = ((val * 100) / total.to_f).round(1).to_s
|
||||||
|
('%-5.5s' % percentage).gsub(' ', ' ') + '% - ' + val.to_s
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.cac(campaign)
|
||||||
|
if campaign.subscribed && campaign.subscribed > 0
|
||||||
|
(campaign.spend/campaign.subscribed.to_f).round(2)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.cac_divide_by_ltv(campaign)
|
||||||
|
customer_ltv = GenericState.singleton.customer_ltv
|
||||||
|
if cac(campaign) && customer_ltv && customer_ltv > 0
|
||||||
|
return (cac(campaign)/customer_ltv.to_f).round(2)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.format_number(num)
|
||||||
|
if num
|
||||||
|
num.to_s.reverse.scan(/\d{3}|.+/).join(",").reverse
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
ActiveAdmin.register JamRuby::AdCampaign, as: 'AdCampaign' do
|
||||||
|
menu :label => 'Ad Campaigns', :parent => 'Reports'
|
||||||
|
before_filter :skip_sidebar!, :only => :index
|
||||||
|
config.batch_actions = false
|
||||||
|
config.clear_action_items!
|
||||||
|
config.sort_order = "users.origin_utm_campaign DESC"
|
||||||
|
config.per_page = 100
|
||||||
|
config.paginate = true
|
||||||
|
|
||||||
|
|
||||||
|
index do
|
||||||
|
div do
|
||||||
|
render 'customer_ltv'
|
||||||
|
end
|
||||||
|
|
||||||
|
column "Campaign" do |campaign|
|
||||||
|
campaign.origin_utm_campaign
|
||||||
|
end
|
||||||
|
column "Medium" do |campaign|
|
||||||
|
campaign.origin_utm_medium
|
||||||
|
end
|
||||||
|
column "End Date" do |campaign|
|
||||||
|
best_in_place campaign, :end_date, as: :date, url: inplace_update_admin_ad_campaigns_path(campaign: campaign.origin_utm_campaign, medium: campaign.origin_utm_medium), param: 'ad_campaign', classes: 'ac_bip'
|
||||||
|
end
|
||||||
|
column "Hard Date" do |campaign|
|
||||||
|
(campaign.end_date + 45.days).strftime('%Y-%m-%d') if campaign.end_date.present?
|
||||||
|
end
|
||||||
|
column "Subscribed" do |campaign|
|
||||||
|
raw(AdCampaignsHelper.spacer(campaign.subscribed, campaign.joined))
|
||||||
|
end
|
||||||
|
column "Spend" do |campaign|
|
||||||
|
best_in_place campaign, :spend, as: :input, url: inplace_update_admin_ad_campaigns_path(campaign: campaign.origin_utm_campaign, medium: campaign.origin_utm_medium), param: 'ad_campaign', display_with: Proc.new{|spend| number_to_currency(spend) }, classes: 'ac_bip'
|
||||||
|
end
|
||||||
|
column "CAC" do |campaign|
|
||||||
|
number_to_currency(AdCampaignsHelper.cac(campaign)) if AdCampaignsHelper.cac(campaign) && AdCampaignsHelper.cac(campaign) > 0
|
||||||
|
end
|
||||||
|
column "LTV/CAC" do |campaign|
|
||||||
|
AdCampaignsHelper.cac_divide_by_ltv(campaign)
|
||||||
|
end
|
||||||
|
column "Referred" do |campaign|
|
||||||
|
best_in_place campaign, :referred, as: :input, url: inplace_update_admin_ad_campaigns_path(campaign: campaign.origin_utm_campaign, medium: campaign.origin_utm_medium), param: 'ad_campaign', display_with: Proc.new{|referred| AdCampaignsHelper.format_number(referred) }, classes: 'ac_bip'
|
||||||
|
end
|
||||||
|
column "Signed Up" do |campaign|
|
||||||
|
if campaign.referred && campaign.referred > 0
|
||||||
|
raw(AdCampaignsHelper.spacer(campaign.joined, campaign.referred))
|
||||||
|
else
|
||||||
|
raw("? - #{campaign.joined}")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
column "Downloaded" do |campaign|
|
||||||
|
raw(AdCampaignsHelper.spacer(campaign.downloaded, campaign.joined))
|
||||||
|
end
|
||||||
|
column "Ran Client" do |campaign|
|
||||||
|
raw(AdCampaignsHelper.spacer(campaign.ran_client, campaign.joined))
|
||||||
|
end
|
||||||
|
column "FTUE" do |campaign|
|
||||||
|
raw(AdCampaignsHelper.spacer(campaign.ftue, campaign.joined))
|
||||||
|
end
|
||||||
|
column "Any Session" do |campaign|
|
||||||
|
raw(AdCampaignsHelper.spacer(campaign.any_session, campaign.joined))
|
||||||
|
end
|
||||||
|
column "2+ Session" do |campaign|
|
||||||
|
raw(AdCampaignsHelper.spacer(campaign.real_session, campaign.joined))
|
||||||
|
end
|
||||||
|
column "Good Session" do |campaign|
|
||||||
|
raw(AdCampaignsHelper.spacer(campaign.good_session, campaign.joined))
|
||||||
|
end
|
||||||
|
column "Invited" do |campaign|
|
||||||
|
raw(AdCampaignsHelper.spacer(campaign.invited, campaign.joined))
|
||||||
|
end
|
||||||
|
column "Friended" do |campaign|
|
||||||
|
raw(AdCampaignsHelper.spacer(campaign.friended, campaign.joined))
|
||||||
|
end
|
||||||
|
column "Platinum" do |campaign|
|
||||||
|
campaign.platinum
|
||||||
|
end
|
||||||
|
column "Gold" do |campaign|
|
||||||
|
campaign.gold
|
||||||
|
end
|
||||||
|
column "Silver" do |campaign|
|
||||||
|
campaign.silver
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
controller do
|
||||||
|
def scoped_collection
|
||||||
|
User.select("users.origin_utm_campaign,
|
||||||
|
users.origin_utm_medium, COUNT(users.id) AS joined,
|
||||||
|
COUNT(users.first_downloaded_client_at) AS downloaded,
|
||||||
|
COUNT(users.first_subscribed_at) AS subscribed,
|
||||||
|
COUNT(users.first_ran_client_at) AS ran_client,
|
||||||
|
COUNT(users.first_certified_gear_at) AS ftue,
|
||||||
|
COUNT(users.first_music_session_at) AS any_session,
|
||||||
|
COUNT(users.first_real_music_session_at) AS real_session,
|
||||||
|
COUNT(users.first_good_music_session_at) AS good_session,
|
||||||
|
COUNT(users.first_invited_at) AS invited,
|
||||||
|
COUNT(users.first_friended_at) AS friended,
|
||||||
|
COUNT(CASE WHEN users.first_subscribed_plan_code = 'jamsubplatinum' OR users.first_subscribed_plan_code = 'jamsubplatinumyearly' THEN users.first_subscribed_plan_code END) AS platinum,
|
||||||
|
COUNT(CASE WHEN users.first_subscribed_plan_code = 'jamsubgold' OR users.first_subscribed_plan_code = 'jamsubgoldyearly' THEN users.first_subscribed_plan_code END) AS gold,
|
||||||
|
COUNT(CASE WHEN users.first_subscribed_plan_code = 'jamsubsilver' OR users.first_subscribed_plan_code = 'jamsubsilveryearly' THEN users.first_subscribed_plan_code END) AS silver,
|
||||||
|
ad_campaigns.id,
|
||||||
|
COALESCE(MAX(ad_campaigns.referred), NULL) as referred,
|
||||||
|
COALESCE(MAX(ad_campaigns.end_date), NULL) AS end_date,
|
||||||
|
COALESCE(MAX(ad_campaigns.spend), 0) AS spend").joins("
|
||||||
|
LEFT JOIN ad_campaigns ON users.origin_utm_campaign = ad_campaigns.campaign
|
||||||
|
AND users.origin_utm_medium = ad_campaigns.medium").where("
|
||||||
|
users.origin_utm_campaign IS NOT NULL AND users.origin_utm_medium IS NOT NULL AND users.origin_utm_source = 'paid'").group("
|
||||||
|
ad_campaigns.id, users.origin_utm_campaign, users.origin_utm_medium").order("
|
||||||
|
users.origin_utm_campaign DESC")
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
def permitted_params
|
||||||
|
params.permit :campaign, :medium, :_method, ad_campaign: [:spend, :referred, :end_date]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
collection_action :inplace_update, method: :put do
|
||||||
|
campaign = permitted_params[:campaign]
|
||||||
|
medium = permitted_params[:medium]
|
||||||
|
@ad_campaign = JamRuby::AdCampaign.where(campaign: campaign, medium: medium).first_or_create
|
||||||
|
respond_to do |format|
|
||||||
|
if @ad_campaign.update_attributes(permitted_params[:ad_campaign])
|
||||||
|
format.json { head :ok }
|
||||||
|
else
|
||||||
|
format.json{ render :json => @ad_campaign.errors.full_messages, :status => :unprocessable_entity }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,43 @@
|
||||||
|
# module AdCampaignsHelper
|
||||||
|
# def campaign_brought_in_users(campaign, medium)
|
||||||
|
# User.where(origin_utm_campaign: campaign, origin_utm_medium: medium)
|
||||||
|
# end
|
||||||
|
# end
|
||||||
|
|
||||||
|
# ActiveAdmin.register JamRuby::AdCampaign do
|
||||||
|
# permit_params :campaign, :medium, :spend
|
||||||
|
# end
|
||||||
|
|
||||||
|
# ActiveAdmin.register_page "Ad campaigns" do
|
||||||
|
# menu parent: 'Reports'
|
||||||
|
# content :title => "Paid Advertising Report" do
|
||||||
|
# table_for User.select("users.origin_utm_campaign, users.origin_utm_medium, COALESCE(MAX(ad_campaigns.end_date), NULL) AS end_date, COALESCE(MAX(ad_campaigns.spend), NULL) AS spend").joins("LEFT JOIN ad_campaigns ON users.origin_utm_campaign = ad_campaigns.campaign AND users.origin_utm_medium = ad_campaigns.medium").group("ad_campaigns.id, users.origin_utm_campaign, users.origin_utm_medium") do
|
||||||
|
# column "Campaign" do |campaign|
|
||||||
|
# campaign.origin_utm_campaign
|
||||||
|
# end
|
||||||
|
# column "Medium" do |campaign|
|
||||||
|
# campaign.origin_utm_medium
|
||||||
|
# end
|
||||||
|
# column "End Date" do |campaign|
|
||||||
|
# campaign.end_date
|
||||||
|
# end
|
||||||
|
# column "Hard Date" do |campaign|
|
||||||
|
# campaign.end_date + 45.days if campaign.end_date.present?
|
||||||
|
# end
|
||||||
|
# column "Subscribed" do |campaign|
|
||||||
|
# end
|
||||||
|
# column "Spend" do |campaign|
|
||||||
|
# best_in_place campaign, :spend, as: :input, url: admin_ad_campaigns_update_path(campaign: campaign.origin_utm_campaign, medium: campaign.origin_utm_medium), param: 'ad_campaign'
|
||||||
|
# end
|
||||||
|
# end
|
||||||
|
# end
|
||||||
|
|
||||||
|
# page_action :update, method: :put do
|
||||||
|
# campaign = params[:campaign]
|
||||||
|
# medium = params[:medium]
|
||||||
|
# ad_campaign = AdCampaign.where(campaign: campaign, medium: medium).first_or_initialize
|
||||||
|
# ad_campaign.attributes = params["ad_campaign"]
|
||||||
|
# ad_campaign.save!
|
||||||
|
# respond_with_bip(ad_campaign)
|
||||||
|
# end
|
||||||
|
# end
|
||||||
|
|
@ -0,0 +1,108 @@
|
||||||
|
class AffiliateCohortsHelper
|
||||||
|
def self.percentage(opTop, opBottom)
|
||||||
|
"#{(opTop/opBottom * 100).round(1)}%"
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.quarter(date)
|
||||||
|
case date.month
|
||||||
|
when 1, 2, 3 then 0
|
||||||
|
when 4, 5, 6 then 1
|
||||||
|
when 7, 8, 9 then 2
|
||||||
|
when 10, 11, 12 then 3
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.payments_for_months(affiliate_partner, year, start_month, end_month)
|
||||||
|
JamRuby::AffiliateMonthlyPayment.where(
|
||||||
|
"affiliate_partner_id = ? AND month >= ? AND month <= ? AND year = ?",
|
||||||
|
affiliate_partner.id,
|
||||||
|
start_month,
|
||||||
|
end_month,
|
||||||
|
year
|
||||||
|
).order('month DESC')
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.payments_for_quarter(affiliate_partner, year, quarter)
|
||||||
|
JamRuby::AffiliateQuarterlyPayment.where(
|
||||||
|
"affiliate_partner_id = ? AND quarter = ? AND year = ?",
|
||||||
|
affiliate_partner.id,
|
||||||
|
quarter,
|
||||||
|
year
|
||||||
|
).order('quarter DESC')
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.all_time_payments(affiliate_partner)
|
||||||
|
JamRuby::AffiliateQuarterlyPayment.where(
|
||||||
|
"affiliate_partner_id = ?", affiliate_partner.id
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.current_quarter_payments(affiliate_partner)
|
||||||
|
AffiliateCohortsHelper.payments_for_quarter(affiliate_partner,
|
||||||
|
Date.today.year,
|
||||||
|
AffiliateCohortsHelper.quarter(Date.today)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.current_quarter_monthly_payments(affiliate_partner)
|
||||||
|
AffiliateCohortsHelper.payments_for_months(affiliate_partner,
|
||||||
|
Date.today.beginning_of_quarter.year,
|
||||||
|
Date.today.beginning_of_quarter.month,
|
||||||
|
Date.today.end_of_quarter.month
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.prior_quarter_payments(affiliate_partner)
|
||||||
|
prev_quarter_start = (Date.today.beginning_of_quarter - 1.day).beginning_of_quarter
|
||||||
|
prev_quarter = AffiliateCohortsHelper.quarter(prev_quarter_start)
|
||||||
|
AffiliateCohortsHelper.payments_for_quarter(affiliate_partner,
|
||||||
|
prev_quarter_start.year,
|
||||||
|
prev_quarter
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.prior_quarter_payable_amount(affiliate_partner)
|
||||||
|
total = AffiliateCohortsHelper.prior_quarter_payments(affiliate_partner).inject(0.0){ | sum, payment |
|
||||||
|
sum += payment.due_amount_in_cents }
|
||||||
|
paid = AffiliateCohortsHelper.prior_quarter_payments(affiliate_partner).where(paid: false).inject(0.0){ | sum, payment |
|
||||||
|
sum += payment.due_amount_in_cents }
|
||||||
|
(total - paid) / 100.0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
ActiveAdmin.register_page "Affiliate Cohorts" do
|
||||||
|
menu parent: 'Reports'
|
||||||
|
|
||||||
|
content :title => "Affiliate Cohorts" do
|
||||||
|
table_for AffiliatePartner.includes(:partner_user).all do
|
||||||
|
column 'Affiliate Name' do |partner|
|
||||||
|
link_to partner.partner_name, admin_affiliate_path(partner)
|
||||||
|
end
|
||||||
|
column 'Affiliate ID', :id
|
||||||
|
column 'Affiliate Email', Proc.new{ | partner | partner&.partner_user&.email}
|
||||||
|
column 'Affiliate Paypal', Proc.new{| partner | partner.paypal_id }
|
||||||
|
column 'All Time Users', :referral_user_count
|
||||||
|
column 'All Time Subscribers', Proc.new{ | partner | partner.subscribed_user_referrals.size }
|
||||||
|
column 'All Time Subscriber Conversion Rate', Proc.new{ | partner |
|
||||||
|
AffiliateCohortsHelper.percentage(partner.subscribed_user_referrals.size.to_f, partner.referral_user_count.to_f) }
|
||||||
|
column 'All Time Revenues', Proc.new{ | partner |
|
||||||
|
number_to_currency(AffiliateCohortsHelper.all_time_payments(partner).inject(0.0){ | sum, payment | sum += payment.due_amount_in_cents } / 100.0)
|
||||||
|
}
|
||||||
|
column 'Current Quarter Revenues', Proc.new{ | partner |
|
||||||
|
number_to_currency(AffiliateCohortsHelper.current_quarter_payments(partner).inject(0.0){ | sum, payment | sum += payment.due_amount_in_cents } / 100.0 )
|
||||||
|
}
|
||||||
|
column 'Current Quarter Revenues by Month', Proc.new{ | partner |
|
||||||
|
AffiliateCohortsHelper.current_quarter_monthly_payments(partner).each do |monthly_payment|
|
||||||
|
li "#{Date::MONTHNAMES[monthly_payment.month]} #{monthly_payment.year} - #{number_to_currency(monthly_payment.due_amount_in_cents.to_f / 100.0)}"
|
||||||
|
end
|
||||||
|
''.html_safe
|
||||||
|
}
|
||||||
|
column 'Prior Quarter Revenues', Proc.new{ | partner |
|
||||||
|
number_to_currency(AffiliateCohortsHelper.prior_quarter_payments(partner).inject(0.0){ | sum, payment | sum += payment.due_amount_in_cents } / 100.0)
|
||||||
|
}
|
||||||
|
column 'Prior Quarter Payable', Proc.new{ | partner |
|
||||||
|
number_to_currency(AffiliateCohortsHelper.prior_quarter_payable_amount(partner))
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
ActiveAdmin.register JamRuby::AffiliateLink, :as => 'Affiliate Links' do
|
||||||
|
|
||||||
|
menu :label => 'Links', :parent => 'Affiliates'
|
||||||
|
|
||||||
|
config.sort_order = 'created_at ASC'
|
||||||
|
config.batch_actions = false
|
||||||
|
# config.clear_action_items!
|
||||||
|
config.filters = false
|
||||||
|
config.per_page = 50
|
||||||
|
config.paginate = true
|
||||||
|
|
||||||
|
#form :partial => 'form'
|
||||||
|
|
||||||
|
|
||||||
|
form do |f|
|
||||||
|
f.inputs 'Fields' do
|
||||||
|
f.input(:name, :input_html => { :maxlength => 255 })
|
||||||
|
f.input(:link, :input_html => { :maxlength => 255 })
|
||||||
|
end
|
||||||
|
f.actions
|
||||||
|
end
|
||||||
|
|
||||||
|
index do
|
||||||
|
|
||||||
|
column 'Name' do |oo|
|
||||||
|
oo.name
|
||||||
|
end
|
||||||
|
column 'Link' do |oo|
|
||||||
|
oo.link
|
||||||
|
end
|
||||||
|
actions
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,51 @@
|
||||||
|
ActiveAdmin.register JamRuby::AffiliateQuarterlyPayment, :as => 'Affiliate Quarterly Payments' do
|
||||||
|
|
||||||
|
menu :label => 'Quarterly Reports', :parent => 'Affiliates'
|
||||||
|
|
||||||
|
config.sort_order = 'year desc, quarter desc, due_amount_in_cents desc'
|
||||||
|
config.batch_actions = false
|
||||||
|
config.clear_action_items!
|
||||||
|
config.filters = true
|
||||||
|
config.per_page = 50
|
||||||
|
config.paginate = true
|
||||||
|
|
||||||
|
filter :affiliate_partner
|
||||||
|
filter :year
|
||||||
|
filter :quarter
|
||||||
|
filter :closed
|
||||||
|
filter :paid
|
||||||
|
filter :jamtracks_sold
|
||||||
|
filter :subscriptions_count
|
||||||
|
filter :due_amount_in_cents
|
||||||
|
|
||||||
|
form :partial => 'form'
|
||||||
|
|
||||||
|
scope("Sorted By Due Amount", default: true) { |scope| scope.order('year desc, quarter desc, due_amount_in_cents desc') }
|
||||||
|
scope("Sorted By Jamtracks Sold", default: false) { |scope| scope.order('year desc, quarter desc, jamtracks_sold desc') }
|
||||||
|
scope("Sorted By Subs", default: false) { |scope| scope.order('year desc, quarter desc, subscriptions_count desc') }
|
||||||
|
scope("Sorted By Newest First") { |scope| scope.order('year desc, quarter desc, id desc') }
|
||||||
|
scope("Any") { |scope| scope.order('year desc, quarter desc, due_amount_in_cents desc') }
|
||||||
|
|
||||||
|
|
||||||
|
index do
|
||||||
|
|
||||||
|
# default_actions # use this for all view/edit/delete links
|
||||||
|
|
||||||
|
column 'Year' do |oo| oo.year end
|
||||||
|
column 'Quarter' do |oo| oo.quarter end
|
||||||
|
column 'Partner Id' do |oo| oo.affiliate_partner.id end
|
||||||
|
column 'Partner' do |oo| link_to(oo.affiliate_partner.display_name, oo.affiliate_partner.admin_url, {:title => oo.affiliate_partner.display_name}) end
|
||||||
|
column "Tot ($)" do |oo| sprintf("$%.2f", oo.due_amount_in_cents.to_f / 100.to_f) end
|
||||||
|
column "Sub ($)" do |oo| sprintf("$%.2f", oo.subscription_due_amount_in_cents.to_f / 100.to_f) end
|
||||||
|
column "Jam ($)" do |oo| sprintf("$%.2f", oo.jamtrack_due_amount_in_cents.to_f / 100.to_f) end
|
||||||
|
column 'JamTracks' do |oo| oo.jamtracks_sold end
|
||||||
|
column 'Subscriptions' do |oo| oo.subscriptions_count end
|
||||||
|
column 'Paid' do |oo| oo.paid end
|
||||||
|
column 'Closed' do |oo| oo.paid end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
controller do
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,48 @@
|
||||||
|
ActiveAdmin.register JamRuby::AffiliateTrafficTotal, :as => 'Affiliate Daily Stats' do
|
||||||
|
|
||||||
|
menu :label => 'Daily Stats', :parent => 'Affiliates'
|
||||||
|
|
||||||
|
config.sort_order = 'referral_user_count DESC'
|
||||||
|
config.batch_actions = false
|
||||||
|
config.clear_action_items!
|
||||||
|
config.filters = true
|
||||||
|
config.per_page = 50
|
||||||
|
config.paginate = true
|
||||||
|
|
||||||
|
filter :affiliate_partner
|
||||||
|
filter :day
|
||||||
|
filter :signups
|
||||||
|
filter :visits
|
||||||
|
|
||||||
|
form :partial => 'form'
|
||||||
|
|
||||||
|
scope("Active", default: true) { |scope| scope.where('visits != 0 or signups != 0').order('day desc') }
|
||||||
|
|
||||||
|
index do
|
||||||
|
|
||||||
|
# default_actions # use this for all view/edit/delete links
|
||||||
|
|
||||||
|
column 'Day' do |oo| oo.day end
|
||||||
|
column 'Partner ID' do |oo| oo.affiliate_partner.id end
|
||||||
|
column 'Partner Name' do |oo| oo.affiliate_partner.display_name end
|
||||||
|
column 'Partner User' do |oo| link_to(oo.affiliate_partner.partner_user.name, admin_user_path(oo.affiliate_partner.partner_user.id), { :title => oo.affiliate_partner.partner_user.name }) end
|
||||||
|
column 'Signups' do |oo| oo.signups end
|
||||||
|
column 'Visits' do |oo| oo.visits end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
controller do
|
||||||
|
def scoped_collection
|
||||||
|
rel = end_of_association_chain
|
||||||
|
.includes([:affiliate_partner])
|
||||||
|
.order('day DESC')
|
||||||
|
if (ref_id = params[AffiliatePartner::PARAM_REFERRAL]).present?
|
||||||
|
qq = ['affiliate_partner_id = ?', ref_id]
|
||||||
|
else
|
||||||
|
qq = ['affiliate_partner_id IS NOT NULL']
|
||||||
|
end
|
||||||
|
@users ||= rel.where(qq)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -2,15 +2,23 @@ ActiveAdmin.register JamRuby::User, :as => 'Referrals' do
|
||||||
|
|
||||||
menu :label => 'Referrals', :parent => 'Affiliates'
|
menu :label => 'Referrals', :parent => 'Affiliates'
|
||||||
|
|
||||||
|
config.sort_order = 'created_at DESC'
|
||||||
config.batch_actions = false
|
config.batch_actions = false
|
||||||
config.clear_action_items!
|
config.clear_action_items!
|
||||||
config.filters = false
|
config.filters = true
|
||||||
|
|
||||||
|
filter :affiliate_referral
|
||||||
|
filter :email
|
||||||
|
|
||||||
|
## scope("Has Signups", default: true) { |scope| scope.where('visits != 0 or signups != 0').order('day desc') }
|
||||||
|
|
||||||
index do
|
index do
|
||||||
column 'User' do |oo| link_to(oo.name, "http://www.jamkazam.com/client#/profile/#{oo.id}", {:title => oo.name}) end
|
column 'User' do |oo| link_to(oo.name, oo.admin_url, {:title => oo.name}) end
|
||||||
column 'Email' do |oo| oo.email end
|
column 'User Email' do |oo| oo.email end
|
||||||
column 'Created' do |oo| oo.created_at end
|
column 'Created' do |oo| oo.created_at end
|
||||||
column 'Partner' do |oo| oo.affiliate_referral.partner_name end
|
column 'Partner ID' do |oo| oo.affiliate_referral.id end
|
||||||
|
column 'Partner Name' do |oo| oo.affiliate_referral.display_name end
|
||||||
|
column 'Partner User' do |oo| link_to(oo.affiliate_referral.partner_user.name, admin_user_path(oo.affiliate_referral.partner_user.id), { :title => oo.affiliate_referral.partner_user.name }) end
|
||||||
end
|
end
|
||||||
|
|
||||||
controller do
|
controller do
|
||||||
|
|
|
||||||
|
|
@ -5,31 +5,136 @@ ActiveAdmin.register JamRuby::AffiliatePartner, :as => 'Affiliates' do
|
||||||
config.sort_order = 'referral_user_count DESC'
|
config.sort_order = 'referral_user_count DESC'
|
||||||
config.batch_actions = false
|
config.batch_actions = false
|
||||||
# config.clear_action_items!
|
# config.clear_action_items!
|
||||||
config.filters = false
|
config.filters = true
|
||||||
|
config.per_page = 100
|
||||||
|
config.paginate = true
|
||||||
|
|
||||||
form :partial => 'form'
|
#form :partial => 'form'
|
||||||
|
|
||||||
scope("Active", default: true) { |scope| scope.where('partner_user_id IS NOT NULL') }
|
|
||||||
|
#filter :partner_user
|
||||||
|
filter :partner_name
|
||||||
|
filter :id
|
||||||
|
filter :current_quarter_in_cents
|
||||||
|
filter :cumulative_earnings_in_cents
|
||||||
|
filter :jamtracks_sold
|
||||||
|
filter :subscriptions_count
|
||||||
|
filter :referral_user_count
|
||||||
|
|
||||||
|
scope("Sorted By Current Quarter", default: true) { |scope| scope.where('partner_user_id IS NOT NULL').order('current_quarter_in_cents desc') }
|
||||||
|
scope("Sorted By Jamtracks Sold", default: false) { |scope| scope.where('partner_user_id IS NOT NULL').order('jamtracks_sold desc') }
|
||||||
|
scope("Sorted By Subs", default: false) { |scope| scope.where('partner_user_id IS NOT NULL').order('subscriptions_count desc') }
|
||||||
|
scope("Sorted By Signups", default: false) { |scope| scope.where('partner_user_id IS NOT NULL').order('referral_user_count desc') }
|
||||||
|
scope("Sorted By Newest First") { |scope| scope.where('partner_user_id IS NOT NULL').order('id desc') }
|
||||||
|
scope("Any") { |scope| scope.where('partner_user_id IS NOT NULL').order('referral_user_count desc') }
|
||||||
scope("Unpaid") { |partner| partner.unpaid }
|
scope("Unpaid") { |partner| partner.unpaid }
|
||||||
|
|
||||||
|
controller do
|
||||||
|
helper 'active_admin/subscription'
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
form do |f|
|
||||||
|
f.inputs 'Fields' do
|
||||||
|
f.input(:partner_name, :input_html => { :maxlength => 128 })
|
||||||
|
f.input(:partner_user, as: :searchable_select, hint: 'This person is the owner of the affiliate. Has access to reporting info in account section of www.jamkazam.com')
|
||||||
|
f.input(:entity_type, :as => :select, :collection => AffiliatePartner::ENTITY_TYPES)
|
||||||
|
f.input(:rate)
|
||||||
|
f.input(:paypal_id)
|
||||||
|
end
|
||||||
|
f.actions
|
||||||
|
end
|
||||||
|
|
||||||
index do
|
index do
|
||||||
|
|
||||||
# default_actions # use this for all view/edit/delete links
|
# actions # use this for all view/edit/delete links
|
||||||
|
|
||||||
column 'User' do |oo| link_to(oo.partner_user.name, admin_user_path(oo.partner_user.id), {:title => oo.partner_user.name}) end
|
column 'User' do |oo|
|
||||||
column 'Name' do |oo| oo.partner_name end
|
link_to(oo.partner_user.name, admin_user_path(oo.partner_user.id), { :title => oo.partner_user.name })
|
||||||
column 'Type' do |oo| oo.entity_type end
|
end
|
||||||
column 'Code' do |oo| oo.id end
|
column 'Name' do |oo|
|
||||||
column 'Referral Count' do |oo| oo.referral_user_count end
|
oo.partner_name
|
||||||
column 'Earnings' do |oo| sprintf("$%.2f", oo.cumulative_earnings_in_dollars) end
|
end
|
||||||
column 'Amount Owed' do |oo| sprintf("$%.2f", oo.due_amount_in_cents.to_f / 100.to_f) end
|
column 'Type' do |oo|
|
||||||
|
oo.entity_type
|
||||||
|
end
|
||||||
|
column 'Code' do |oo|
|
||||||
|
oo.id
|
||||||
|
end
|
||||||
|
column 'Signups' do |oo|
|
||||||
|
oo.referral_user_count
|
||||||
|
end
|
||||||
|
column 'JamTracks' do |oo|
|
||||||
|
oo.jamtracks_sold
|
||||||
|
end
|
||||||
|
column 'Subs' do |oo|
|
||||||
|
oo.subscriptions_count
|
||||||
|
end
|
||||||
|
column 'Cum Earnings' do |oo|
|
||||||
|
div do
|
||||||
|
sprintf("Tot $%.2f", oo.cumulative_earnings_in_dollars)
|
||||||
|
end
|
||||||
|
div do
|
||||||
|
sprintf("Jam $%.2f", oo.jamtrack_cumulative_earnings_in_dollars)
|
||||||
|
end
|
||||||
|
div do
|
||||||
|
sprintf("Sub $%.2f", oo.subscriptions_cumulative_earnings_in_dollars)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
column 'Current Quarter' do |oo|
|
||||||
|
div do
|
||||||
|
sprintf("Tot $%.2f", oo.current_quarter_in_dollars)
|
||||||
|
end
|
||||||
|
div do
|
||||||
|
sprintf("Jam $%.2f", oo.jamtrack_current_quarter_in_dollars)
|
||||||
|
end
|
||||||
|
div do
|
||||||
|
sprintf("Sub $%.2f", oo.subscriptions_current_quarter_in_dollars)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
column 'Amount Owed' do |oo|
|
||||||
|
div do
|
||||||
|
sprintf("Tot $%.2f", oo.due_amount_in_cents.to_f / 100.to_f)
|
||||||
|
end
|
||||||
|
div do
|
||||||
|
sprintf("Jam $%.2f", oo.jamtrack_due_amount_in_cents.to_f / 100.to_f)
|
||||||
|
end
|
||||||
|
div do
|
||||||
|
sprintf("Sub $%.2f", oo.subscription_due_amount_in_cents.to_f / 100.to_f)
|
||||||
|
end
|
||||||
|
end
|
||||||
column 'Pay Actions' do |oo|
|
column 'Pay Actions' do |oo|
|
||||||
link_to('Mark Paid', mark_paid_admin_affiliate_path(oo.id), :confirm => "Mark this affiliate as PAID?") if oo.unpaid
|
link_to('Mark Paid', mark_paid_admin_affiliate_path(oo.id), :confirm => "Mark this affiliate as PAID?") if oo.unpaid
|
||||||
end
|
end
|
||||||
|
|
||||||
default_actions
|
actions
|
||||||
end
|
end
|
||||||
|
|
||||||
|
show do |affiliate_partner|
|
||||||
|
|
||||||
|
attributes_table do
|
||||||
|
row :id
|
||||||
|
row :partner_name
|
||||||
|
row :entity_type
|
||||||
|
row :rate
|
||||||
|
row :address
|
||||||
|
row :tax_identifier
|
||||||
|
row :paypal_id
|
||||||
|
row :venmo_user_id
|
||||||
|
row :jamtracks_sold
|
||||||
|
row :subscriptions_count
|
||||||
|
row :cumulative_earnings_in_dollars
|
||||||
|
row :jamtrack_cumulative_earnings_in_dollars
|
||||||
|
row :subscriptions_cumulative_earnings_in_dollars
|
||||||
|
row :current_quarter_in_dollars
|
||||||
|
row :jamtrack_current_quarter_in_dollars
|
||||||
|
row :subscriptions_current_quarter_in_dollars
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
render 'earnings', { affiliate_partner: affiliate_partner }
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
action_item :only => [:show] do
|
action_item :only => [:show] do
|
||||||
link_to("Mark Paid",
|
link_to("Mark Paid",
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
ActiveAdmin.register JamRuby::AppFeature, as: 'App Features' do
|
||||||
|
|
||||||
|
menu parent: 'Misc', label: 'App Features'
|
||||||
|
|
||||||
|
config.sort_order = 'created_at ASC'
|
||||||
|
config.batch_actions = false
|
||||||
|
config.filters = false
|
||||||
|
config.per_page = 50
|
||||||
|
config.paginate = true
|
||||||
|
|
||||||
|
form do |f|
|
||||||
|
f.inputs 'Fields' do
|
||||||
|
f.input(:feature_type, as: :select, collection: JamRuby::AppFeature::FEATURE_TYPES)
|
||||||
|
f.input(:handle, :input_html => { :maxlength => 1025 })
|
||||||
|
f.input(:is_enabled, as: :boolean)
|
||||||
|
f.input(:env, as: :select, collection: %w(production staging development))
|
||||||
|
end
|
||||||
|
f.actions
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,30 @@
|
||||||
|
ActiveAdmin.register JamRuby::Ars, :as => 'Ars' do
|
||||||
|
|
||||||
|
menu :label => 'NAS', :parent => 'Operations'
|
||||||
|
|
||||||
|
|
||||||
|
form do |f|
|
||||||
|
f.inputs 'Controls' do
|
||||||
|
f.input :active
|
||||||
|
f.input :beta
|
||||||
|
end
|
||||||
|
f.inputs 'Meta' do
|
||||||
|
f.input :name
|
||||||
|
f.input :provider
|
||||||
|
f.input :id_int
|
||||||
|
f.input :ip
|
||||||
|
f.input :username
|
||||||
|
f.input :password, as: :string
|
||||||
|
f.input :port
|
||||||
|
f.input :continent
|
||||||
|
f.input :country, as: :string
|
||||||
|
f.input :city
|
||||||
|
f.input :subdivision
|
||||||
|
f.input :latitude
|
||||||
|
f.input :longitude
|
||||||
|
end
|
||||||
|
f.actions
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
end
|
||||||
|
|
@ -1,4 +1,6 @@
|
||||||
ActiveAdmin.register JamRuby::Band, :as => 'Band' do
|
ActiveAdmin.register JamRuby::Band, :as => 'Band' do
|
||||||
|
menu :label => 'Bands', :parent => 'Misc'
|
||||||
|
|
||||||
collection_action :autocomplete_band_name, :method => :get
|
collection_action :autocomplete_band_name, :method => :get
|
||||||
|
|
||||||
controller do
|
controller do
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,87 @@
|
||||||
|
ActiveAdmin.register_page "CampaignSpend" do
|
||||||
|
menu :parent => 'JamClass'
|
||||||
|
|
||||||
|
page_action :create_spend, :method => :post do
|
||||||
|
|
||||||
|
campaign = params[:jam_ruby_campaign_spend][:campaign]
|
||||||
|
year = params[:jam_ruby_campaign_spend][:year]
|
||||||
|
month = params[:jam_ruby_campaign_spend][:month]
|
||||||
|
spend = params[:jam_ruby_campaign_spend][:spend]
|
||||||
|
|
||||||
|
if campaign.blank?
|
||||||
|
redirect_to admin_campaignspend_path, :notice => "No campaign defined! Nothing done."
|
||||||
|
return
|
||||||
|
elsif spend.blank?
|
||||||
|
redirect_to admin_campaignspend_path, :notice => "No spend defined! Nothing done."
|
||||||
|
return
|
||||||
|
elsif year.blank? || month.blank?
|
||||||
|
spend = spend.to_f
|
||||||
|
# get all cohorts for a given campaign
|
||||||
|
campaign_cohorts = JamClassReport.where(campaign: campaign).where("cohort IS NOT NULL")
|
||||||
|
year_months = []
|
||||||
|
campaign_cohorts.each do |cohort|
|
||||||
|
year_month = {year: cohort.cohort.year, month: cohort.cohort.month}
|
||||||
|
year_months << year_month
|
||||||
|
end
|
||||||
|
|
||||||
|
if campaign_cohorts.length > 0
|
||||||
|
per_month = spend / campaign_cohorts.length
|
||||||
|
year_months.each do |year_month|
|
||||||
|
campaign_spend = CampaignSpend.where(campaign: campaign).where(year: year_month[:year]).where(month: year_month[:month]).first
|
||||||
|
|
||||||
|
if campaign_spend.nil?
|
||||||
|
campaign_spend = CampaignSpend.new
|
||||||
|
end
|
||||||
|
campaign_spend.campaign = campaign
|
||||||
|
campaign_spend.month = year_month[:month]
|
||||||
|
campaign_spend.year = year_month[:year]
|
||||||
|
campaign_spend.spend = per_month
|
||||||
|
|
||||||
|
campaign_spend.save!
|
||||||
|
|
||||||
|
end
|
||||||
|
else
|
||||||
|
redirect_to admin_campaignspend_path, :notice => "No data found for campaign: #{campaign}"
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
redirect_to admin_campaignspend_path, :notice => "Campaign #{campaign} updated with a per month value of $#{per_month} (#{year_months.length} months worth of data found)"
|
||||||
|
else
|
||||||
|
campaign_spend = CampaignSpend.where(campaign: campaign).where(year: year).where(month: month).first
|
||||||
|
|
||||||
|
if campaign_spend.nil?
|
||||||
|
campaign_spend = CampaignSpend.new
|
||||||
|
end
|
||||||
|
campaign_spend.campaign = campaign
|
||||||
|
campaign_spend.month = month
|
||||||
|
campaign_spend.year = year
|
||||||
|
campaign_spend.spend = spend
|
||||||
|
|
||||||
|
campaign_spend.save!
|
||||||
|
|
||||||
|
redirect_to admin_campaignspend_path, :notice => "Campaign spend updated: #{campaign}:#{year}-#{month} = $#{spend}"
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
content do
|
||||||
|
|
||||||
|
para do
|
||||||
|
link_to "JamClass Report", admin_jamclassreports_path
|
||||||
|
end
|
||||||
|
para do
|
||||||
|
semantic_form_for CampaignSpend.new, :url => admin_campaignspend_create_spend_path, :builder => ActiveAdmin::FormBuilder do |f|
|
||||||
|
f.inputs "Campaign Spend" do
|
||||||
|
f.input :spend, :required => true, hint: "If you leave year or month blank, the system will divide up the specified spend amount here across all months seen for this campaign."
|
||||||
|
f.input :campaign, :as => :select, hint: "If this appears empty or incomplete, visit the JamClass Report page (link above) and come back.", :required => true, :collection => JamClassReport.select('campaign').group('campaign').map(&:campaign)
|
||||||
|
f.input :year, :as => :select, :hint => "Year of campaign spend (optional)", :collection => [Date.today.year, Date.today.year - 1]
|
||||||
|
f.input :month, :as => :select, :hint => "Month of campaign (optional)", :collection => (1..12).map { |m| [Date::MONTHNAMES[m], m] }
|
||||||
|
end
|
||||||
|
f.actions
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,63 @@
|
||||||
|
ActiveAdmin.register JamRuby::Charge, :as => 'Charges' do
|
||||||
|
|
||||||
|
menu :label => 'Charge', :parent => 'JamClass'
|
||||||
|
|
||||||
|
config.sort_order = 'created_at desc'
|
||||||
|
config.batch_actions = false
|
||||||
|
config.per_page = 100
|
||||||
|
config.paginate = true
|
||||||
|
config.filters = true
|
||||||
|
|
||||||
|
controller do
|
||||||
|
active_admin_config.includes.push :user
|
||||||
|
end
|
||||||
|
|
||||||
|
filter :user_email_cont, label: 'Name', as: :string
|
||||||
|
|
||||||
|
index do
|
||||||
|
column "Actions" do |charge|
|
||||||
|
links = ''.html_safe
|
||||||
|
links << link_to("View", resource_path(charge), :class => "member_link view_link")
|
||||||
|
links << link_to("Edit", edit_resource_path(charge), :class => "member_link edit_link")
|
||||||
|
links
|
||||||
|
end
|
||||||
|
column "User" do |charge|
|
||||||
|
link_to charge.user.name, charge.user.admin_url
|
||||||
|
end
|
||||||
|
column :billed
|
||||||
|
column :billing_error_reason
|
||||||
|
column :billing_attempts
|
||||||
|
column :amount_in_cents
|
||||||
|
column :fee_in_cents
|
||||||
|
column :created_at
|
||||||
|
column :updated_at
|
||||||
|
column "Stripe" do |charge|
|
||||||
|
link_to "Link", "https://dashboard.stripe.com/payments/#{charge.stripe_charge_id}" if charge.stripe_charge_id
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
show do
|
||||||
|
attributes_table do
|
||||||
|
row "User" do |charge|
|
||||||
|
link_to charge.user.name, charge.user.admin_url
|
||||||
|
end
|
||||||
|
row :amount_in_cents
|
||||||
|
row :fee_in_cents
|
||||||
|
row :billed
|
||||||
|
row :billed_at
|
||||||
|
row :post_processed
|
||||||
|
row :post_processed_at
|
||||||
|
row :billing_error_reason
|
||||||
|
row :billing_error_detail
|
||||||
|
row :billing_should_retry
|
||||||
|
row :billing_attempts
|
||||||
|
row :stripe_charge_id
|
||||||
|
row :created_at
|
||||||
|
row :updated_at
|
||||||
|
row "Stripe" do |charge|
|
||||||
|
link_to "Link", "https://dashboard.stripe.com/payments/#{charge.stripe_charge_id}" if charge.stripe_charge_id
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,29 @@
|
||||||
|
ActiveAdmin.register JamRuby::ChatMessage, :as => 'ChatMessage' do
|
||||||
|
# Note: a lame thing is it's not obvious how to make it search on email instead of user_id.
|
||||||
|
filter :music_session_id
|
||||||
|
filter :user_id
|
||||||
|
|
||||||
|
menu :parent => 'Misc'
|
||||||
|
|
||||||
|
config.per_page = 200
|
||||||
|
|
||||||
|
config.sort_order = 'created_at DESC'
|
||||||
|
|
||||||
|
scope("Global", default:true) { |scope|
|
||||||
|
scope.where("channel = 'global'")
|
||||||
|
}
|
||||||
|
scope("Session", ) { |scope|
|
||||||
|
scope.where("channel = 'session'")
|
||||||
|
}
|
||||||
|
index do
|
||||||
|
column 'User' do |oo| link_to(oo.user.email, oo.user.admin_url, {:title => oo.user.email}) end
|
||||||
|
column "Timestamp" do |post|
|
||||||
|
(post.created_at).strftime('%b %d %Y, %H:%M')
|
||||||
|
end
|
||||||
|
column "Message" do |post|
|
||||||
|
post.message
|
||||||
|
end
|
||||||
|
actions
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -56,7 +56,7 @@ ActiveAdmin.register JamRuby::Connection, :as => 'Connection' do
|
||||||
end
|
end
|
||||||
|
|
||||||
index do
|
index do
|
||||||
default_actions
|
actions
|
||||||
column :user_id do |c|
|
column :user_id do |c|
|
||||||
c.user ? c.user.name : ''
|
c.user ? c.user.name : ''
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -1,28 +1,29 @@
|
||||||
ActiveAdmin.register JamRuby::CrashDump, :as => 'Crash Dump' do
|
ActiveAdmin.register JamRuby::CrashDump, :as => 'Crash Dump' do
|
||||||
# Note: a lame thing is it's not obvious how to make it search on email instead of user_id.
|
# Note: a lame thing is it's not obvious how to make it search on email instead of user_id.
|
||||||
filter :timestamp
|
filter :timestamp
|
||||||
filter :user_email, :as => :string
|
|
||||||
filter :client_id
|
filter :client_id
|
||||||
|
filter :user_id
|
||||||
|
|
||||||
menu :parent => 'Misc'
|
menu :parent => 'Misc'
|
||||||
|
|
||||||
|
config.sort_order = 'created_at DESC'
|
||||||
|
|
||||||
index do
|
index do
|
||||||
|
column 'User' do |oo| oo.user ? link_to(oo.user.email, oo.user.admin_url, {:title => oo.user.email}) : '' end
|
||||||
|
column "Client Version", :client_version
|
||||||
|
column "Client Type", :client_type
|
||||||
|
column "Crash Context", :crash_context
|
||||||
|
column "File Size", :fsize
|
||||||
|
column "Download" do |post|
|
||||||
|
link_to 'Link', post.sign_url
|
||||||
|
end
|
||||||
column "Timestamp" do |post|
|
column "Timestamp" do |post|
|
||||||
(post.timestamp || post.created_at).strftime('%b %d %Y, %H:%M')
|
(post.timestamp || post.created_at).strftime('%b %d %Y, %H:%M')
|
||||||
end
|
end
|
||||||
column "Client Type", :client_type
|
column "Description" do |post|
|
||||||
column "Dump URL" do |post|
|
post.description
|
||||||
link_to post.uri, post.uri
|
|
||||||
end
|
end
|
||||||
|
|
||||||
column "User ID", :user_id
|
|
||||||
|
|
||||||
# FIXME (?): This isn't performant (though it likely doesn't matter). Could probably do a join.
|
|
||||||
column "User Email" do |post|
|
|
||||||
unless post.user_id.nil?
|
|
||||||
post.user_email
|
|
||||||
end
|
|
||||||
end
|
|
||||||
column "Client ID", :client_id
|
|
||||||
actions
|
actions
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
ActiveAdmin.register_page "CSVs" do
|
||||||
|
menu :parent => 'Misc'
|
||||||
|
|
||||||
|
content do
|
||||||
|
link_to('Released JamTracks', released_jamtracks_csv_path)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -5,11 +5,13 @@ ActiveAdmin.register_page "Dashboard" do
|
||||||
content :title => proc{ I18n.t("active_admin.dashboard") } do
|
content :title => proc{ I18n.t("active_admin.dashboard") } do
|
||||||
div :class => "blank_slate_container", :id => "dashboard_default_message" do
|
div :class => "blank_slate_container", :id => "dashboard_default_message" do
|
||||||
span :class => "blank_slate" do
|
span :class => "blank_slate" do
|
||||||
span "JamKazam Data Administration Portal"
|
span "JamKazam Administration Portal"
|
||||||
small ul do
|
small ul do
|
||||||
li "Admin users are users with the admin boolean set to true"
|
li link_to "Users", admin_users_path
|
||||||
li "Invite JamKazam users using the 'Users > Invite' menu in header"
|
li link_to "K12 Users", admin_users_path("q[import_source_equals]": "K12")
|
||||||
li "Admin users are created/deleted when toggling the 'admin' flag for JamKazam users"
|
li link_to "Teachers", admin_teachers_path
|
||||||
|
li link_to "Upload School Users", admin_schooluseruploads_path
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,35 @@
|
||||||
|
ActiveAdmin.register JamRuby::DownloadTracker, :as => 'DownloadTrackers' do
|
||||||
|
|
||||||
|
menu :label => 'Download Trackers', :parent => 'JamTracks'
|
||||||
|
|
||||||
|
config.batch_actions = false
|
||||||
|
config.filters = true
|
||||||
|
config.per_page = 50
|
||||||
|
|
||||||
|
filter :remote_ip
|
||||||
|
|
||||||
|
index do
|
||||||
|
column 'User' do |oo| oo.user ? link_to(oo.user.email, oo.user.admin_url, {:title => oo.user.email}) : '' end
|
||||||
|
column 'Created' do |oo| oo.created_at end
|
||||||
|
column 'JamTrack' do |oo| oo.jam_track end
|
||||||
|
column 'Paid' do |oo| oo.paid end
|
||||||
|
column 'Blacklisted?' do |oo| IpBlacklist.listed(oo.remote_ip) ? 'Yes' : 'No' end
|
||||||
|
column 'Remote IP' do |oo| oo.remote_ip end
|
||||||
|
column "" do |oo|
|
||||||
|
link_to 'Blacklist This IP', "download_trackers/#{oo.id}/blacklist_by_ip"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
member_action :blacklist_by_ip, :method => :get do
|
||||||
|
tracker = DownloadTracker.find(params[:id])
|
||||||
|
|
||||||
|
if !IpBlacklist.listed(tracker.remote_ip)
|
||||||
|
ip = IpBlacklist.new
|
||||||
|
ip.remote_ip = tracker.remote_ip
|
||||||
|
ip.save!
|
||||||
|
end
|
||||||
|
|
||||||
|
redirect_to admin_download_trackers_path, :notice => "IP address #{tracker.remote_ip} blacklisted."
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
@ -57,7 +57,7 @@ ActiveAdmin.register JamRuby::EmailBatch, :as => 'Batch Emails' do
|
||||||
link_to("Clone", batch_clone_admin_batch_email_path(bb.id))
|
link_to("Clone", batch_clone_admin_batch_email_path(bb.id))
|
||||||
end
|
end
|
||||||
|
|
||||||
default_actions
|
actions
|
||||||
end
|
end
|
||||||
|
|
||||||
show :title => 'Batch Email' do |obj|
|
show :title => 'Batch Email' do |obj|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
ActiveAdmin.register JamRuby::EmailBlacklist, :as => 'Email Blacklist' do
|
||||||
|
|
||||||
|
menu :label => 'Email Blacklist', :parent => 'Operations'
|
||||||
|
|
||||||
|
config.sort_order = 'created_at desc'
|
||||||
|
config.batch_actions = false
|
||||||
|
|
||||||
|
index do
|
||||||
|
column :email
|
||||||
|
column :source
|
||||||
|
column :notes
|
||||||
|
column :created_at
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
ActiveAdmin.register JamRuby::EventBriteOrder, :as => 'EventBriteOrder' do
|
||||||
|
menu :parent => 'Misc'
|
||||||
|
|
||||||
|
config.sort_order = 'created_at DESC'
|
||||||
|
|
||||||
|
filter :live_stream
|
||||||
|
filter :email
|
||||||
|
filter :order_id
|
||||||
|
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,51 @@
|
||||||
|
ActiveAdmin.register_page "EventBriteOrderUploads" do
|
||||||
|
|
||||||
|
menu :label => 'Event Brite Order Upload', :parent => 'Misc'
|
||||||
|
|
||||||
|
page_action :upload_eventbriteorders, :method => :post do
|
||||||
|
EventBriteOrder.transaction do
|
||||||
|
|
||||||
|
puts params
|
||||||
|
|
||||||
|
|
||||||
|
live_stream = LiveStream.find_by_id!(params[:jam_ruby_event_brite_order][:live_stream_id])
|
||||||
|
|
||||||
|
file = params[:jam_ruby_event_brite_order][:csv]
|
||||||
|
|
||||||
|
upload = EventBriteOrderUpload.new
|
||||||
|
upload.upload_file_name = file.original_filename
|
||||||
|
upload.save!
|
||||||
|
|
||||||
|
array_of_arrays = CSV.read(file.tempfile.path, headers:true)
|
||||||
|
array_of_arrays.each do |row|
|
||||||
|
order_id = row['Order ID']
|
||||||
|
|
||||||
|
event_brite_order = EventBriteOrder.find_by_order_id(order_id)
|
||||||
|
if event_brite_order.nil?
|
||||||
|
event_brite_order = EventBriteOrder.new
|
||||||
|
end
|
||||||
|
event_brite_order.event_brite_order_upload = upload
|
||||||
|
event_brite_order.live_stream = live_stream
|
||||||
|
event_brite_order.event_name = row['Event Name']
|
||||||
|
event_brite_order.order_id = order_id
|
||||||
|
event_brite_order.ticket_count = row['Tickets']
|
||||||
|
event_brite_order.ticket_type = row['Type']
|
||||||
|
event_brite_order.first_name = row['First Name']
|
||||||
|
event_brite_order.last_name = row['Last Name']
|
||||||
|
event_brite_order.email = row['Email Address']
|
||||||
|
event_brite_order.save!
|
||||||
|
end
|
||||||
|
|
||||||
|
redirect_to admin_eventbriteorderuploads_path, :notice => "Created #{array_of_arrays.length} event brite orders!"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
content do
|
||||||
|
active_admin_form_for EventBriteOrder.new, :url => admin_eventbriteorderuploads_upload_eventbriteorders_path, :builder => ActiveAdmin::FormBuilder do |f|
|
||||||
|
f.inputs "Upload Event Brite Orders" do
|
||||||
|
f.input :csv, as: :file, required: true, :label => "An event brite order CSV exactly as exported from Eventbrite"
|
||||||
|
f.input :live_stream, required:true, as: :select, :collection => LiveStream.upcoming
|
||||||
|
end
|
||||||
|
f.actions
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -27,11 +27,12 @@ ActiveAdmin.register_page "Fake Purchaser" do
|
||||||
count = 0
|
count = 0
|
||||||
JamTrack.all.each do |jam_track|
|
JamTrack.all.each do |jam_track|
|
||||||
unless jam_track.right_for_user(user)
|
unless jam_track.right_for_user(user)
|
||||||
|
|
||||||
jam_track_right=JamTrackRight.new
|
jam_track_right=JamTrackRight.new
|
||||||
jam_track_right.user = user
|
jam_track_right.user = user
|
||||||
jam_track_right.jam_track = jam_track
|
jam_track_right.jam_track = jam_track
|
||||||
jam_track_right.is_test_purchase = true
|
jam_track_right.is_test_purchase = true
|
||||||
|
jam_track_right.version = jam_track.version
|
||||||
|
jam_track_right.can_download = true
|
||||||
jam_track_right.save!
|
jam_track_right.save!
|
||||||
count = count + 1
|
count = count + 1
|
||||||
end
|
end
|
||||||
|
|
@ -41,12 +42,11 @@ ActiveAdmin.register_page "Fake Purchaser" do
|
||||||
end
|
end
|
||||||
|
|
||||||
content do
|
content do
|
||||||
|
active_admin_form_for JamTrackRight.new, :url => admin_fake_purchaser_bulk_jamtrack_purchase_path, :builder => ActiveAdmin::FormBuilder do |f|
|
||||||
semantic_form_for JamTrackRight.new, :url => admin_fake_purchaser_bulk_jamtrack_purchase_path, :builder => ActiveAdmin::FormBuilder do |f|
|
inputs "Admin User to Fake JamTrack Purchases" do
|
||||||
f.inputs "Admin User to Fake JamTrack Purchases" do
|
input :user, :as => :autocomplete, :url => autocomplete_user_email_admin_users_path, :input_html => { :id_element => "#jam_trak_right_user_id" }, hint: 'All JamTracks in the system will be \'bought\' for this user. No Recurly interaction occurs with this feature.'
|
||||||
f.input :user, :as => :autocomplete, :url => autocomplete_user_email_admin_users_path, :input_html => { :id_element => "#jam_trak_right_user_id" }, hint: 'All JamTracks in the system will be \'bought\' for this user. No Recurly interaction occurs with this feature.'
|
|
||||||
end
|
end
|
||||||
f.actions
|
actions
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ ActiveAdmin.register JamRuby::FraudAlert, :as => 'Fraud Alerts' do
|
||||||
scope.joins('INNER JOIN "machine_fingerprints" ON "machine_fingerprints"."id" = "fraud_alerts"."machine_fingerprint_id" LEFT OUTER JOIN "fingerprint_whitelists" ON "fingerprint_whitelists"."fingerprint" = "machine_fingerprints"."fingerprint"').where('fingerprint_whitelists IS NULL')}
|
scope.joins('INNER JOIN "machine_fingerprints" ON "machine_fingerprints"."id" = "fraud_alerts"."machine_fingerprint_id" LEFT OUTER JOIN "fingerprint_whitelists" ON "fingerprint_whitelists"."fingerprint" = "machine_fingerprints"."fingerprint"').where('fingerprint_whitelists IS NULL')}
|
||||||
|
|
||||||
index do
|
index do
|
||||||
default_actions
|
actions
|
||||||
|
|
||||||
column :machine_fingerprint
|
column :machine_fingerprint
|
||||||
column :user
|
column :user
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
ActiveAdmin.register JamRuby::GenericState, :as => 'GenericState' do
|
||||||
|
menu :parent => 'Operations'
|
||||||
|
|
||||||
|
config.clear_action_items!
|
||||||
|
filter :env
|
||||||
|
permit_params :top_message, :event_page_top_logo_url, :customer_ltv, :connection_policy
|
||||||
|
|
||||||
|
actions :all, :except => [:destroy]
|
||||||
|
|
||||||
|
index do
|
||||||
|
selectable_column
|
||||||
|
column :env
|
||||||
|
actions
|
||||||
|
end
|
||||||
|
|
||||||
|
form :partial => 'form'
|
||||||
|
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,41 @@
|
||||||
|
ActiveAdmin.register_page "Giftcarduploads" do
|
||||||
|
|
||||||
|
menu :label => 'Gift Cards Upload', :parent => 'JamTracks'
|
||||||
|
|
||||||
|
page_action :upload_giftcards, :method => :post do
|
||||||
|
GiftCard.transaction do
|
||||||
|
|
||||||
|
puts params
|
||||||
|
|
||||||
|
file = params[:jam_ruby_gift_card][:csv]
|
||||||
|
array_of_arrays = CSV.read(file.tempfile.path)
|
||||||
|
array_of_arrays.each do |row|
|
||||||
|
if row.length != 1
|
||||||
|
raise "UKNONWN CSV FORMAT! Must be 1 column"
|
||||||
|
end
|
||||||
|
|
||||||
|
code = row[0]
|
||||||
|
|
||||||
|
gift_card = GiftCard.new
|
||||||
|
gift_card.code = code
|
||||||
|
gift_card.card_type = params[:jam_ruby_gift_card][:card_type]
|
||||||
|
gift_card.origin = file .original_filename
|
||||||
|
gift_card.save!
|
||||||
|
end
|
||||||
|
|
||||||
|
redirect_to admin_giftcarduploads_path, :notice => "Created #{array_of_arrays.length} gift cards!"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
content do
|
||||||
|
active_admin_form_for GiftCard.new, :url => admin_giftcarduploads_upload_giftcards_path, :builder => ActiveAdmin::FormBuilder do |f|
|
||||||
|
f.inputs "Upload Gift Cards" do
|
||||||
|
f.input :csv, as: :file, required: true, :label => "A single column CSV that contains ONE type of gift card (5 JamTrack, 10 JamTrack, etc)"
|
||||||
|
f.input :card_type, required:true, as: :select, :collection => JamRuby::GiftCard::CARD_TYPES
|
||||||
|
end
|
||||||
|
f.actions
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
ActiveAdmin.register JamRuby::GiftCard, :as => 'GiftCards' do
|
||||||
|
|
||||||
|
menu :label => 'Gift Cards', :parent => 'JamTracks'
|
||||||
|
|
||||||
|
config.batch_actions = false
|
||||||
|
config.filters = true
|
||||||
|
config.per_page = 50
|
||||||
|
|
||||||
|
scope("Redeemed Most Recently", default: true) { |scope| scope.where('user_id IS NOT NULL').order('updated_at DESC') }
|
||||||
|
scope("Available") { |scope| scope.where('user_id is NULL') }
|
||||||
|
|
||||||
|
filter :card_type
|
||||||
|
filter :origin
|
||||||
|
filter :code
|
||||||
|
|
||||||
|
index do
|
||||||
|
column 'User' do |oo| oo.user ? link_to(oo.user.email, oo.user.admin_url, {:title => oo.user.email}) : '' end
|
||||||
|
column 'Code' do |oo| oo.code end
|
||||||
|
column 'Card Type' do |oo| oo.card_type end
|
||||||
|
column 'Origin' do |oo| oo.origin end
|
||||||
|
column 'Created' do |oo| oo.created_at end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
@ -220,7 +220,7 @@ ActiveAdmin.register_page "Bootstrap" do
|
||||||
para "You need to create at least one server template, and one mount template. Click one of the top-left buttons based on your platform"
|
para "You need to create at least one server template, and one mount template. Click one of the top-left buttons based on your platform"
|
||||||
|
|
||||||
elsif IcecastMountTemplate.count == 0
|
elsif IcecastMountTemplate.count == 0
|
||||||
semantic_form_for IcecastMountTemplate.new, :url => admin_bootstrap_create_mount_template_path, :builder => ActiveAdmin::FormBuilder do |f|
|
active_admin_form_for IcecastMountTemplate.new, :url => admin_bootstrap_create_mount_template_path, :builder => ActiveAdmin::FormBuilder do |f|
|
||||||
f.inputs "New Mount Template" do
|
f.inputs "New Mount Template" do
|
||||||
f.input :hostname, :label => "jam-web public hostname:port (such that icecast can reach it)"
|
f.input :hostname, :label => "jam-web public hostname:port (such that icecast can reach it)"
|
||||||
f.input :default_mime_type, :as => :select, :collection => ["ogg", "mp3"]
|
f.input :default_mime_type, :as => :select, :collection => ["ogg", "mp3"]
|
||||||
|
|
@ -228,7 +228,7 @@ ActiveAdmin.register_page "Bootstrap" do
|
||||||
f.actions
|
f.actions
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
semantic_form_for IcecastServer.new, :url => admin_bootstrap_create_server_path, :builder => ActiveAdmin::FormBuilder do |f|
|
active_admin_form_for IcecastServer.new, :url => admin_bootstrap_create_server_path, :builder => ActiveAdmin::FormBuilder do |f|
|
||||||
f.inputs "New Icecast Server" do
|
f.inputs "New Icecast Server" do
|
||||||
f.input :hostname, :hint => "Just the icecast hostname; no port"
|
f.input :hostname, :hint => "Just the icecast hostname; no port"
|
||||||
f.input :template, :hint => "This is the template associated with the server. Not as useful for the 1st server, but subsequent servers can use this same template, and share config"
|
f.input :template, :hint => "This is the template associated with the server. Not as useful for the 1st server, but subsequent servers can use this same template, and share config"
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,40 @@
|
||||||
|
ActiveAdmin.register JamRuby::User, :as => 'InactiveJamClassUsers' do
|
||||||
|
|
||||||
|
menu :label => 'Inactive JamClass Users w/o Credits', :parent => 'JamClass'
|
||||||
|
|
||||||
|
config.sort_order = 'created_at'
|
||||||
|
config.batch_actions = false
|
||||||
|
config.per_page = 100
|
||||||
|
config.paginate = true
|
||||||
|
config.filters = false
|
||||||
|
|
||||||
|
scope("All", default: true) { |scope| scope.includes(:taken_lessons => :music_session).select("distinct(users.id), users.email, users.first_name, users.last_name").joins("inner join posa_cards on posa_cards.user_id = users.id inner join lesson_sessions on lesson_sessions.user_id = users.id left outer join music_sessions on music_sessions.lesson_session_id = music_sessions.id ").where("jamclass_credits = 0") }
|
||||||
|
|
||||||
|
index do
|
||||||
|
column "Name" do |user|
|
||||||
|
span do
|
||||||
|
link_to "#{user.name} (#{user.email})", "#{Rails.application.config.external_root_url}/client#/profile/#{user.id}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
column "POSA" do |user|
|
||||||
|
span do
|
||||||
|
posa = user.posa_cards[0]
|
||||||
|
if posa.lesson_package_type
|
||||||
|
posa.lesson_package_type.id
|
||||||
|
else
|
||||||
|
posa.card_type
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
column "Last Session" do |user|
|
||||||
|
span do
|
||||||
|
if user.taken_lessons.length == 0
|
||||||
|
"none yet"
|
||||||
|
else
|
||||||
|
most_recent_lesson = user.taken_lessons.order('created_at desc')[0]
|
||||||
|
link_to most_recent_lesson.scheduled_start, admin_lesson_session_path(most_recent_lesson)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,45 @@
|
||||||
|
ActiveAdmin.register JamRuby::User, :as => 'InactiveJamClassPOSAUsers' do
|
||||||
|
|
||||||
|
menu :label => 'Inactive JamClass Users w/ Credits', :parent => 'JamClass'
|
||||||
|
|
||||||
|
config.sort_order = 'created_at'
|
||||||
|
config.batch_actions = false
|
||||||
|
config.per_page = 100
|
||||||
|
config.paginate = true
|
||||||
|
config.filters = false
|
||||||
|
|
||||||
|
scope("All", default: true) { |scope| scope.includes(:taken_lessons => :music_session).select("distinct(users.id), users.email, users.first_name, users.last_name, users.jamclass_credits").joins("inner join posa_cards on posa_cards.user_id = users.id left outer join lesson_sessions on lesson_sessions.user_id = users.id left outer join music_sessions on music_sessions.lesson_session_id = music_sessions.id ").where("jamclass_credits > 0 AND music_sessions.id IS NULL OR music_sessions.scheduled_start < ?", Time.now - 7.days) }
|
||||||
|
|
||||||
|
index do
|
||||||
|
column "Name" do |user|
|
||||||
|
span do
|
||||||
|
link_to "#{user.name} (#{user.email})", "#{Rails.application.config.external_root_url}/client#/profile/#{user.id}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
column "POSA" do |user|
|
||||||
|
span do
|
||||||
|
posa = user.posa_cards[0]
|
||||||
|
if posa.lesson_package_type
|
||||||
|
posa.lesson_package_type.id
|
||||||
|
else
|
||||||
|
posa.card_type
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
column "Credits" do |user|
|
||||||
|
span do
|
||||||
|
user.jamclass_credits
|
||||||
|
end
|
||||||
|
end
|
||||||
|
column "Last Session" do |user|
|
||||||
|
span do
|
||||||
|
if user.taken_lessons.length == 0
|
||||||
|
"none yet"
|
||||||
|
else
|
||||||
|
most_recent_lesson = user.taken_lessons.order('created_at desc')[0]
|
||||||
|
link_to most_recent_lesson.scheduled_start, admin_lesson_session_path(most_recent_lesson)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
ActiveAdmin.register JamRuby::User, :as => 'EducationInterest' do
|
||||||
|
|
||||||
|
menu :label => 'Interested in Education', :parent => 'JamClass'
|
||||||
|
|
||||||
|
config.sort_order = 'created_at desc'
|
||||||
|
config.batch_actions = false
|
||||||
|
config.per_page = 100
|
||||||
|
config.paginate = true
|
||||||
|
config.filters = false
|
||||||
|
|
||||||
|
scope("All", default: true) { |scope| scope.where(education_interest: true) }
|
||||||
|
|
||||||
|
index do
|
||||||
|
column "Name" do |user|
|
||||||
|
span do
|
||||||
|
link_to "#{user.name} (#{user.email})", "#{Rails.application.config.external_root_url}/client#/profile/#{user.id}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
ActiveAdmin.register JamRuby::User, :as => 'RetailerInterest' do
|
||||||
|
|
||||||
|
menu :label => 'Interested in Retailers', :parent => 'JamClass'
|
||||||
|
|
||||||
|
config.sort_order = 'created_at desc'
|
||||||
|
config.batch_actions = false
|
||||||
|
config.per_page = 100
|
||||||
|
config.paginate = true
|
||||||
|
config.filters = false
|
||||||
|
|
||||||
|
scope("All", default: true) { |scope| scope.where(retailer_interest: true) }
|
||||||
|
|
||||||
|
index do
|
||||||
|
column "Name" do |user|
|
||||||
|
span do
|
||||||
|
link_to "#{user.name} (#{user.email})", "#{Rails.application.config.external_root_url}/client#/profile/#{user.id}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
ActiveAdmin.register JamRuby::User, :as => 'SchoolInterest' do
|
||||||
|
|
||||||
|
menu :label => 'Interested in Schools', :parent => 'JamClass'
|
||||||
|
|
||||||
|
config.sort_order = 'created_at desc'
|
||||||
|
config.batch_actions = false
|
||||||
|
config.per_page = 100
|
||||||
|
config.paginate = true
|
||||||
|
config.filters = false
|
||||||
|
|
||||||
|
scope("All", default: true) { |scope| scope.where(school_interest: true) }
|
||||||
|
|
||||||
|
index do
|
||||||
|
column "Name" do |user|
|
||||||
|
span do
|
||||||
|
link_to "#{user.name} (#{user.email})", "#{Rails.application.config.external_root_url}/client#/profile/#{user.id}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
ActiveAdmin.register JamRuby::IpBlacklist, :as => 'IP Blacklist' do
|
||||||
|
|
||||||
|
menu :label => 'IP Blacklist', :parent => 'Operations'
|
||||||
|
|
||||||
|
config.sort_order = 'created_at desc'
|
||||||
|
config.batch_actions = false
|
||||||
|
|
||||||
|
index do
|
||||||
|
column :remote_ip
|
||||||
|
column :notes
|
||||||
|
column :created_at
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
ActiveAdmin.register JamRuby::IpWhitelist, :as => 'IP Whitelist' do
|
||||||
|
|
||||||
|
menu :label => 'IP Whitelist', :parent => 'Operations'
|
||||||
|
|
||||||
|
config.sort_order = 'created_at desc'
|
||||||
|
config.batch_actions = false
|
||||||
|
|
||||||
|
index do
|
||||||
|
column :remote_ip
|
||||||
|
column :notes
|
||||||
|
column :created_at
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
ActiveAdmin.register_page "Jam Class Knobs" do
|
||||||
|
menu :parent => 'JamClass'
|
||||||
|
|
||||||
|
page_action :force_hourly, :method => :post do
|
||||||
|
|
||||||
|
Resque.enqueue(HourlyJob)
|
||||||
|
redirect_to admin_jam_class_knobs_path, :notice => "Re-running the Hourly Job. Lessons will be analysed; any payments will be attempted that should be, etc"
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
action_item do
|
||||||
|
link_to "Force Hourly Background Job", admin_jam_class_knobs_force_hourly_path, :method => :post
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
ActiveAdmin.register_page "Monthly Roll Forward", as: "JamClass Monthly Roll Forward" do
|
||||||
|
menu :parent => 'JamClass'
|
||||||
|
|
||||||
|
content :title => "JamClass Monthly Roll Forwards" do
|
||||||
|
para do
|
||||||
|
table_for JamClassReport.roll_forward_bookings do
|
||||||
|
|
||||||
|
column "Student" do |r|
|
||||||
|
r.student.admin_name
|
||||||
|
end
|
||||||
|
column "Teacher" do |r|
|
||||||
|
r.teacher.admin_name
|
||||||
|
end
|
||||||
|
column "Booking Active?" do |r|
|
||||||
|
r.active ? 'Y' : 'N'
|
||||||
|
end
|
||||||
|
column "Booking Status" do |r|
|
||||||
|
link_to r.status, admin_lesson_booking_path(r.id)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,66 @@
|
||||||
|
ActiveAdmin.register_page "JamClassReports", as: "JamClass Cohort Report" do
|
||||||
|
menu :parent => 'JamClass'
|
||||||
|
|
||||||
|
content :title => "JamClass Report" do
|
||||||
|
para do
|
||||||
|
link_to "Campaign Spend", admin_campaignspend_path
|
||||||
|
end
|
||||||
|
para do
|
||||||
|
table_for JamClassReport.analyse do
|
||||||
|
|
||||||
|
column "Campaign" do |r|
|
||||||
|
if r.campaign.nil?
|
||||||
|
"N/A"
|
||||||
|
else
|
||||||
|
r.campaign
|
||||||
|
end
|
||||||
|
end
|
||||||
|
column "Cohort" do |r|
|
||||||
|
if r.cohort.nil?
|
||||||
|
"Total"
|
||||||
|
else
|
||||||
|
"#{Date::ABBR_MONTHNAMES[r.cohort.month]} #{r.cohort.year}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
column "Spend" do |r|
|
||||||
|
if r.spend.nil?
|
||||||
|
"N/A"
|
||||||
|
else
|
||||||
|
r.spend
|
||||||
|
end
|
||||||
|
end
|
||||||
|
column "Registrations", :registrations
|
||||||
|
column "TD Customers", :td_customers
|
||||||
|
column "JamClass Revenues", :jamclass_rev
|
||||||
|
column "TD4", :td4
|
||||||
|
column "TD2", :td2
|
||||||
|
column "TD1", :td1
|
||||||
|
column "Spend/TD" do |r|
|
||||||
|
if r.spend_td.nil?
|
||||||
|
"N/A"
|
||||||
|
else
|
||||||
|
r.spend_td
|
||||||
|
end
|
||||||
|
end
|
||||||
|
column "% 0 BC" do |r|
|
||||||
|
(r.purchases0 * 100).round
|
||||||
|
end
|
||||||
|
column "% 1 BC" do |r|
|
||||||
|
(r.purchases1 * 100).round
|
||||||
|
end
|
||||||
|
column "% 2 BC" do |r|
|
||||||
|
(r.purchases2 * 100).round
|
||||||
|
end
|
||||||
|
column "% 3 BC" do |r|
|
||||||
|
(r.purchases3 * 100).round
|
||||||
|
end
|
||||||
|
column "% 4+ BC" do |r|
|
||||||
|
(r.purchases_rest * 100).round
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -17,11 +17,9 @@ ActiveAdmin.register JamRuby::ArtifactUpdate, :as => 'Artifacts' do
|
||||||
f.input :uri, :as => :file, :hint => "Upload the artifact from Jenkins"
|
f.input :uri, :as => :file, :hint => "Upload the artifact from Jenkins"
|
||||||
end
|
end
|
||||||
|
|
||||||
f.buttons
|
f.actions
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
action_item :only => [:show] do
|
action_item :only => [:show] do
|
||||||
link_to('Send Client Update Notice', send_client_update_notice_admin_artifact_path(resource.id))
|
link_to('Send Client Update Notice', send_client_update_notice_admin_artifact_path(resource.id))
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -1,22 +1,260 @@
|
||||||
ActiveAdmin.register JamRuby::User, :as => 'Users' do
|
ActiveAdmin.register JamRuby::User, :as => 'Users' do
|
||||||
|
|
||||||
|
searchable_select_options(scope: User.all,
|
||||||
|
text_attribute: :username,
|
||||||
|
filter: lambda do |term, scope|
|
||||||
|
scope.ransack(full_name_or_email_cont: term).result
|
||||||
|
end)
|
||||||
|
|
||||||
collection_action :autocomplete_user_email, :method => :get
|
collection_action :autocomplete_user_email, :method => :get
|
||||||
|
|
||||||
|
actions :all, :except => [:destroy]
|
||||||
|
|
||||||
menu :label => 'Users', :parent => 'Users'
|
menu :label => 'Users', :parent => 'Users'
|
||||||
|
|
||||||
config.sort_order = 'created_at DESC'
|
config.sort_order = 'created_at DESC'
|
||||||
|
|
||||||
filter :email
|
filter :jamuser_full_name_or_email_cont, label: 'Name Or Email', as: :string
|
||||||
filter :first_name
|
|
||||||
filter :last_name
|
|
||||||
filter :created_at
|
filter :created_at
|
||||||
filter :updated_at
|
filter :updated_at
|
||||||
|
filter :import_source
|
||||||
|
|
||||||
|
includes :purchased_jam_tracks, :jam_track_rights => :jam_track, :taken_lessons => :music_session, :taught_lessons => :music_session
|
||||||
|
|
||||||
form :partial => "form"
|
form :partial => "form"
|
||||||
|
|
||||||
|
action_item :school_user, only: :index do
|
||||||
|
link_to "Quick Add School User", add_school_user_admin_users_path
|
||||||
|
end
|
||||||
|
|
||||||
|
action_item :latency, only: :show do
|
||||||
|
link_to 'Show Latency', latency_admin_user_path(resource)
|
||||||
|
end
|
||||||
|
|
||||||
|
collection_action :add_school_user, method: [:get, :post] do
|
||||||
|
if request.post?
|
||||||
|
@client = RecurlyClient.new
|
||||||
|
errors = []
|
||||||
|
user_params = params[:jam_ruby_user]
|
||||||
|
|
||||||
|
user_type = user_params[:user_type].strip
|
||||||
|
school_id = user_params[:school_id].strip
|
||||||
|
|
||||||
|
return (render text: "Please select school") if school_id.blank?
|
||||||
|
|
||||||
|
first_name = user_params[:first_name].strip
|
||||||
|
last_name = user_params[:last_name].strip
|
||||||
|
email = user_params[:email].strip.downcase
|
||||||
|
license_start = user_params[:license_start].strip
|
||||||
|
license_end = user_params[:license_end].strip
|
||||||
|
import_source = user_params[:import_source].strip
|
||||||
|
password = SecureRandom.uuid
|
||||||
|
|
||||||
|
options = {
|
||||||
|
first_name: first_name,
|
||||||
|
last_name: last_name,
|
||||||
|
email: email,
|
||||||
|
license_start: license_start,
|
||||||
|
license_end: license_end,
|
||||||
|
import_source: import_source,
|
||||||
|
terms_of_service: true,
|
||||||
|
musician: true,
|
||||||
|
skip_recaptcha: true,
|
||||||
|
password: password,
|
||||||
|
password_confirmation: password
|
||||||
|
}
|
||||||
|
options.merge!({ school_id: school_id }) if school_id.present?
|
||||||
|
|
||||||
|
instrument = Instrument.find('electric guitar')
|
||||||
|
instruments = [{instrument_id: instrument.id, proficiency_level: 3, priority: 1}]
|
||||||
|
options[:instruments] = instruments
|
||||||
|
|
||||||
|
parse_user_type(user_type, options)
|
||||||
|
|
||||||
|
@user = User.find_by_email(options[:email])
|
||||||
|
|
||||||
|
unless @user.nil?
|
||||||
|
@user.user_type = user_type
|
||||||
|
#if @user.import_source.nil?
|
||||||
|
#TODO: do we need to have following 3 lines for an existing user?
|
||||||
|
@user.import_source = options[:import_source]
|
||||||
|
@user.license_start = options[:license_start]
|
||||||
|
@user.license_end = options[:license_end]
|
||||||
|
|
||||||
|
if options[:student]
|
||||||
|
@user.school_id = options[:school_id]
|
||||||
|
@user.is_a_student = true
|
||||||
|
elsif options[:teacher]
|
||||||
|
@user.school = school
|
||||||
|
if @user.teacher.nil?
|
||||||
|
@user.teacher = Teacher.build_teacher(@user, validate_introduction: true, biography: "Empty biography", school_id: school.id)
|
||||||
|
end
|
||||||
|
elsif options[:platform_instructor]
|
||||||
|
@user.is_platform_instructor = true
|
||||||
|
end
|
||||||
|
|
||||||
|
if @user.save
|
||||||
|
@client.sync_subscription(@user)
|
||||||
|
if options[:student]
|
||||||
|
UserMailer.school_welcome_message(@user, nil).deliver_now
|
||||||
|
elsif options[:teacher]
|
||||||
|
UserMailer.school_welcome_message(@user, nil).deliver_now
|
||||||
|
elsif options[:platform_instructor]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if @user.errors.any?
|
||||||
|
flash[:error] = "Error updating User #{@user.name} #{@user.email}"
|
||||||
|
render :add_school_user
|
||||||
|
else
|
||||||
|
flash[:notice] = "User #{@user.name} #{@user.email} updated successfully"
|
||||||
|
redirect_to admin_users_path
|
||||||
|
end
|
||||||
|
#end
|
||||||
|
else
|
||||||
|
@user = User.signup(options)
|
||||||
|
|
||||||
|
if @user.errors.none?
|
||||||
|
@client.sync_subscription(@user)
|
||||||
|
puts "User #{@user.email} created"
|
||||||
|
flash[:notice] = "User #{@user.name} #{@user.email} added successfully"
|
||||||
|
redirect_to admin_users_path
|
||||||
|
else
|
||||||
|
flash[:error] = "Error adding school user"
|
||||||
|
render :add_school_user
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
@user = User.new
|
||||||
|
@user.import_source = 'Manual'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
member_action :update_school_user, method: [:get, :put] do
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
member_action :delete_forever, :method => :get do
|
||||||
|
resource.permanently_delete
|
||||||
|
redirect_to :back, {notice: 'User email and login credentials have been permanently changed'}
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
#Notification.send_reload(connection.client_id)
|
||||||
|
|
||||||
|
member_action :give_free_plan, :method => :get do
|
||||||
|
@client = RecurlyClient.new
|
||||||
|
plan_code = params[:plan_code]
|
||||||
|
if params[:plan_code] == ''
|
||||||
|
plan_code = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
resource.update_admin_override_plan_code(plan_code)
|
||||||
|
redirect_to :back, {notice: "User got a free plan via adminstrative override to #{params[:plan_code]}"}
|
||||||
|
end
|
||||||
|
|
||||||
|
member_action :revoke_free_plan, :method => :get do
|
||||||
|
resource.update_admin_override_plan_code(nil)
|
||||||
|
redirect_to :back, {notice: "User has administrative free plan removed"}
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
member_action :resend_welcome_email, :method => :get do
|
||||||
|
user = resource
|
||||||
|
if user.is_a_student
|
||||||
|
if user.import_source
|
||||||
|
reset_url = resource.create_tokened_reset_url
|
||||||
|
UserMailer.school_welcome_message(user, reset_url).deliver_now
|
||||||
|
else
|
||||||
|
UserMailer.student_welcome_message(user).deliver_now
|
||||||
|
end
|
||||||
|
elsif user.is_a_teacher
|
||||||
|
if user.import_source
|
||||||
|
reset_url = resource.create_tokened_reset_url
|
||||||
|
UserMailer.school_welcome_message(user, reset_url).deliver_now
|
||||||
|
else
|
||||||
|
UserMailer.teacher_welcome_message(user).deliver_now
|
||||||
|
end
|
||||||
|
elsif user.is_platform_instructor
|
||||||
|
reset_url = resource.create_tokened_reset_url
|
||||||
|
UserMailer.welcome_message(user, reset_url).deliver_now
|
||||||
|
else
|
||||||
|
UserMailer.welcome_message(user).deliver_now
|
||||||
|
end
|
||||||
|
|
||||||
|
redirect_to :back, {notice: "Resent Welcome Email"}
|
||||||
|
end
|
||||||
|
|
||||||
|
member_action :sync_subscription, :method => :get do
|
||||||
|
@client = RecurlyClient.new
|
||||||
|
@client.sync_subscription(resource)
|
||||||
|
redirect_to :back, {notice: "Check the Subscription Plan Code, Subscription Sync Code, Subscription Sync Msg"}
|
||||||
|
end
|
||||||
|
|
||||||
|
member_action :reset_monthly_play, :method => :get do
|
||||||
|
resource.used_month_play_time = 0
|
||||||
|
resource.save!
|
||||||
|
redirect_to :back, {notice: "Reset user's monthly play time to 0"}
|
||||||
|
end
|
||||||
|
|
||||||
|
member_action :change_to_plan, :method => :get do
|
||||||
|
@client = RecurlyClient.new
|
||||||
|
plan_code = params[:plan_code]
|
||||||
|
if params[:plan_code] == ''
|
||||||
|
plan_code = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
result, subscription, account = @client.update_desired_subscription(resource, plan_code)
|
||||||
|
redirect_to :back, {notice: "Set user's desired plan. "}
|
||||||
|
end
|
||||||
|
member_action :quick_reset, :method => :get do
|
||||||
|
resetting_to = 'jellyandjam123'
|
||||||
|
resource.change_password(resetting_to, resetting_to)
|
||||||
|
resource.save
|
||||||
|
redirect_to :back, {notice: "Reset password to #{resetting_to }"}
|
||||||
|
end
|
||||||
|
|
||||||
|
member_action :create_reset, :method => :get do
|
||||||
|
reset_url = resource.create_tokened_reset_url
|
||||||
|
redirect_to :back, {notice: "Reset password url created: #{reset_url}"}
|
||||||
|
end
|
||||||
|
|
||||||
|
member_action :end_trial, :method => :get do
|
||||||
|
if Time.now - 2.days < resource.subscription_trial_ends_at
|
||||||
|
resource.subscription_trial_ends_at = 3.days.ago
|
||||||
|
resource.save!
|
||||||
|
redirect_to :back, {notice: "User's trial ended"}
|
||||||
|
else
|
||||||
|
redirect_to :back, {notice: "Users trial already ended > 2 days ago. Left alone user account"}
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
member_action :latency, method: :get do
|
||||||
|
@user = resource
|
||||||
|
latency_url = "#{Rails.application.config.latency_data_host}/user/#{@user.id}"
|
||||||
|
uri = URI(latency_url)
|
||||||
|
begin
|
||||||
|
http = Net::HTTP.new(uri.host, uri.port)
|
||||||
|
http.use_ssl = true if Rails.application.config.latency_data_host.start_with?("https://")
|
||||||
|
req = Net::HTTP::Get.new(uri.request_uri)
|
||||||
|
req["Authorization"] = "Basic #{Rails.application.config.latency_data_host_auth_code}"
|
||||||
|
req["Content-Type"] = "application/json"
|
||||||
|
|
||||||
|
response = http.request(req)
|
||||||
|
|
||||||
|
render text: "404 Not Found", status: 404 if response.is_a?(Net::HTTPNotFound)
|
||||||
|
#render json: response.body, status: 200 if response.is_a?(Net::HTTPOK) || response.is_a?(Net::HTTPSuccess)
|
||||||
|
@user_latency = response.body
|
||||||
|
rescue => e
|
||||||
|
render text: e.message
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
show do |user|
|
show do |user|
|
||||||
|
panel "Common" do
|
||||||
attributes_table do
|
attributes_table do
|
||||||
row :id
|
row :id
|
||||||
row :email
|
row :email
|
||||||
|
|
@ -33,52 +271,381 @@ ActiveAdmin.register JamRuby::User, :as => 'Users' do
|
||||||
row :gender
|
row :gender
|
||||||
row :email_confirmed
|
row :email_confirmed
|
||||||
row :remember_token
|
row :remember_token
|
||||||
row :image do user.photo_url ? image_tag(user.photo_url) : '' end
|
=begin
|
||||||
|
row "Session Ready" do |user|
|
||||||
|
div do
|
||||||
|
if user.ready_for_session_at
|
||||||
|
span do
|
||||||
|
'YES'
|
||||||
end
|
end
|
||||||
|
span do
|
||||||
|
br
|
||||||
|
end
|
||||||
|
span do
|
||||||
|
link_to("mark as not checked", mark_session_not_ready_admin_student_path(user.id), {confirm: "Mark as not ready for session?"})
|
||||||
|
end
|
||||||
|
else
|
||||||
|
span do
|
||||||
|
'NO'
|
||||||
|
end
|
||||||
|
span do
|
||||||
|
br
|
||||||
|
end
|
||||||
|
span do
|
||||||
|
link_to("mark as checked", mark_session_ready_admin_student_path(user.id), {confirm: "Mark as ready for session?"})
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
=end
|
||||||
|
row "Delete Forever" do |user|
|
||||||
|
span do
|
||||||
|
link_to("delete forever", delete_forever_admin_user_path(user.id), :data => {:confirm => 'Are you sure?'})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
row "Quick Password Reset" do |user|
|
||||||
|
span do
|
||||||
|
link_to("reset password to jellyandjam123", quick_reset_admin_user_path(user.id), :data => {:confirm => 'Reset password to jellyandjam123 ?'})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
row "Send Password Reset Email" do |user|
|
||||||
|
span do
|
||||||
|
Rails.application.config.external_root_url + "/request_reset_password"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
row "Password Reset URL" do |user|
|
||||||
|
span do
|
||||||
|
link_to("create reset URL", create_reset_admin_user_path(user.id), :data => {:confirm => 'Are you sure?'})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
row "Resend Welcome Email" do |user|
|
||||||
|
span do
|
||||||
|
link_to("resend welcome email", resend_welcome_email_admin_user_path(user.id), :data => {:confirm => 'Are you sure?'})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
row "Subscription" do |user|
|
||||||
|
div do
|
||||||
|
attributes_table do
|
||||||
|
row :subscription_plan_code
|
||||||
|
row :desired_plan_code
|
||||||
|
row :admin_override_plan_code
|
||||||
|
row :admin_override_ends_at
|
||||||
|
row :recurly_subscription_state
|
||||||
|
row :recurly_subscription_id
|
||||||
|
row :desired_plan_code_set_at
|
||||||
|
row :subscription_plan_code_set_at
|
||||||
|
row :subscription_last_checked_at
|
||||||
|
row :subscription_trial_ends_at
|
||||||
|
row :subscription_sync_code
|
||||||
|
row :subscription_sync_msg
|
||||||
|
row :is_past_due
|
||||||
|
row :stored_credit_card
|
||||||
|
row "Monthly Time Used" do |user|
|
||||||
|
div do
|
||||||
|
remaining_month_play_time = user.subscription_rules[:remaining_month_play_time]
|
||||||
|
if remaining_month_play_time.nil?
|
||||||
|
span do
|
||||||
|
"No limit"
|
||||||
|
end
|
||||||
|
elsif user.played_this_month?
|
||||||
|
span do
|
||||||
|
"Used: #{user.used_month_play_time / 60} min | Remaining #{remaining_month_play_time / 60} min"
|
||||||
|
end
|
||||||
|
else
|
||||||
|
span do
|
||||||
|
"Did not play this month. Last played #{user.used_current_month}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
div do
|
||||||
|
'DESIRED PLAN CODE = What plan the user has selected in the UI'
|
||||||
|
end
|
||||||
|
div do
|
||||||
|
'SUBSCRIPTION PLAN CODE = What plan the user actually has'
|
||||||
|
end
|
||||||
|
div do
|
||||||
|
div do
|
||||||
|
user.recurly_code ? link_to('Recurly Account', user.recurly_link_to_account, target: "_blank", ) : span do 'No Recurly Account' end
|
||||||
|
end
|
||||||
|
div do
|
||||||
|
user.recurly_subscription_id ? link_to('Recurly Subscription', user.recurly_link_to_subscription, target: "_blank", ) : span do 'No Recurly Subscription' end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
div do
|
||||||
|
h3 do
|
||||||
|
'Give Free Plan Actions'
|
||||||
|
end
|
||||||
|
h4 do
|
||||||
|
'sets secret override to give user a free plan (link goes to another page)'
|
||||||
|
end
|
||||||
|
div do
|
||||||
|
link_to("give no-payment plan", edit_admin_user_override_path(user.id))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
div do
|
||||||
|
h3 do
|
||||||
|
'Reset Monthly Play Time'
|
||||||
|
end
|
||||||
|
h4 do
|
||||||
|
'sets the user\'s monthly play time to 0'
|
||||||
|
end
|
||||||
|
div do
|
||||||
|
link_to("reset monthly play time", reset_monthly_play_admin_user_path(user.id), :data => {:confirm => 'Are you sure?'})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
div do
|
||||||
|
h3 do
|
||||||
|
'Change Plan Actions'
|
||||||
|
end
|
||||||
|
h4 do
|
||||||
|
'Change desired plan exactly as if the user did it on /client#/accounts/subscription'
|
||||||
|
end
|
||||||
|
div do
|
||||||
|
link_to("change plan to silver monthly", change_to_plan_admin_user_path(user.id, plan_code: 'jamsubsilver'), :data => {:confirm => 'Are you sure?'})
|
||||||
|
end
|
||||||
|
div do
|
||||||
|
link_to("change plan to gold monthly", change_to_plan_admin_user_path(user.id, plan_code: 'jamsubgold'), :data => {:confirm => 'Are you sure?'})
|
||||||
|
end
|
||||||
|
div do
|
||||||
|
link_to("change plan to platinum monthly", change_to_plan_admin_user_path(user.id, plan_code: 'jamsubplatinum'), :data => {:confirm => 'Are you sure?'})
|
||||||
|
end
|
||||||
|
div do
|
||||||
|
link_to("change plan to silver yearly", change_to_plan_admin_user_path(user.id, plan_code: 'jamsubsilveryearly'), :data => {:confirm => 'Are you sure?'})
|
||||||
|
end
|
||||||
|
div do
|
||||||
|
link_to("change plan to gold yearly", change_to_plan_admin_user_path(user.id, plan_code: 'jamsubgoldyearly'), :data => {:confirm => 'Are you sure?'})
|
||||||
|
end
|
||||||
|
div do
|
||||||
|
link_to("change plan to platinum yearly", change_to_plan_admin_user_path(user.id, plan_code: 'jamsubplatinumyearly'), :data => {:confirm => 'Are you sure?'})
|
||||||
|
end
|
||||||
|
div do
|
||||||
|
link_to("change plan to free", change_to_plan_admin_user_path(user.id, plan_code: ''), :data => {:confirm => 'Are you sure?'})
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
div do
|
||||||
|
h3 do
|
||||||
|
'Force Sync'
|
||||||
|
end
|
||||||
|
h4 do
|
||||||
|
'exactly same as background job that checks accounts'
|
||||||
|
end
|
||||||
|
div do
|
||||||
|
link_to("force sync", sync_subscription_admin_user_path(user.id), :data => {:confirm => 'Are you sure?'})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
div do
|
||||||
|
h3 do
|
||||||
|
'End Trial'
|
||||||
|
end
|
||||||
|
h4 do
|
||||||
|
'ends the trial as of 3 days ago'
|
||||||
|
end
|
||||||
|
div do
|
||||||
|
link_to("end trial", end_trial_admin_user_path(user.id), :data => {:confirm => 'Are you sure?'})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
row :jamclass_credits
|
||||||
|
row :via_amazon
|
||||||
|
row "Web Profile" do
|
||||||
|
link_to "Link", "#{Rails.application.config.external_root_url}/client#/profile/#{user.id}"
|
||||||
|
end
|
||||||
|
row :image do
|
||||||
|
user.photo_url ? image_tag(user.photo_url) : ''
|
||||||
|
end
|
||||||
|
row "Instruments" do
|
||||||
|
table_for user.musician_instruments.order('proficiency_level desc') do
|
||||||
|
column :instrument_id
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
panel "School" do
|
||||||
|
div do
|
||||||
|
attributes_table do
|
||||||
|
row "School" do |user|
|
||||||
|
span do
|
||||||
|
if user.school
|
||||||
|
link_to user.school.name, admin_school_path(user.school), target: '_blank'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if user.school
|
||||||
|
row :license_start
|
||||||
|
row :license_end
|
||||||
|
row :is_platform_instructor
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# panel "Onboarding" do
|
||||||
|
# attributes_table do
|
||||||
|
# row :onboarding_status
|
||||||
|
# row "Support Consultant" do |user|
|
||||||
|
# if user.onboarder
|
||||||
|
# link_to "#{user.onboarder.name} (#{user.onboarder.onboarding_users.count})", user.onboarder.admin_url
|
||||||
|
# else
|
||||||
|
# end
|
||||||
|
# end
|
||||||
|
# row "Signup" do
|
||||||
|
# user.created_at.to_date
|
||||||
|
# end
|
||||||
|
# row "Assigned", :onboarder_assigned_at
|
||||||
|
# row "Email 1", :onboarding_email_1_sent_at
|
||||||
|
# row "Email 2", :onboarding_email_2_sent_at
|
||||||
|
# row "Email 3", :onboarding_email_3_sent_at
|
||||||
|
# row "Email 4", :onboarding_email_4_sent_at
|
||||||
|
# row "Email 5", :onboarding_email_5_sent_at
|
||||||
|
# row "Test Session Scheduled Time", :onboarding_test_session_at
|
||||||
|
# row "When Test Session Was Requested", :onboarding_test_session_at
|
||||||
|
# row "Test Session Outcome", :onboarding_test_session_outcome
|
||||||
|
# row "Notes", :onboarding_onboarder_notes
|
||||||
|
# row "Lost Reason", :onboarding_lost_reason
|
||||||
|
# row "Lost At", :onboarding_lost_at
|
||||||
|
# row "Escalated Reason", :onboarding_escalation_reason
|
||||||
|
# row "Escalated At", :onboarding_escalated_at
|
||||||
|
|
||||||
|
# end
|
||||||
|
# end
|
||||||
|
=begin
|
||||||
|
|
||||||
|
panel "Teacher Setting" do
|
||||||
|
attributes_table do
|
||||||
|
row :is_searchable
|
||||||
|
end
|
||||||
|
end if user.teacher
|
||||||
|
|
||||||
|
|
||||||
|
panel "Lessons" do
|
||||||
|
attributes_table do
|
||||||
|
row "Taken Lessons" do
|
||||||
|
table_for user.taken_lessons.order('created_at desc') do
|
||||||
|
column "View" do |lesson_session|
|
||||||
|
link_to("View", lesson_session.admin_url)
|
||||||
|
end
|
||||||
|
column :created_at
|
||||||
|
column :status
|
||||||
|
column "Teacher" do |lesson_session|
|
||||||
|
teacher = lesson_session.teacher
|
||||||
|
span do
|
||||||
|
link_to teacher.admin_name, teacher.admin_url
|
||||||
|
end
|
||||||
|
end
|
||||||
|
column "Start Time" do |lesson_session|
|
||||||
|
span do
|
||||||
|
lesson_session.music_session.pretty_scheduled_start(true)
|
||||||
|
end
|
||||||
|
br
|
||||||
|
span do
|
||||||
|
lesson_session.music_session.scheduled_start
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
row "Taught Lessons" do
|
||||||
|
table_for user.taught_lessons.order('created_at desc') do
|
||||||
|
column "View" do |lesson_session|
|
||||||
|
link_to("View", lesson_session.admin_url)
|
||||||
|
end
|
||||||
|
column :created_at
|
||||||
|
column :status
|
||||||
|
column "Student" do |lesson_session|
|
||||||
|
student = lesson_session.student
|
||||||
|
span do
|
||||||
|
link_to student.admin_name, student.admin_name
|
||||||
|
end
|
||||||
|
end
|
||||||
|
column "Start Time" do |lesson_session|
|
||||||
|
span do
|
||||||
|
lesson_session.music_session.pretty_scheduled_start(true)
|
||||||
|
end
|
||||||
|
br
|
||||||
|
span do
|
||||||
|
lesson_session.music_session.scheduled_start
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
end
|
||||||
|
=end
|
||||||
|
|
||||||
|
panel "JamTracks" do
|
||||||
|
div do
|
||||||
|
link_to "Give JamTrack", "../jam_track_rights/new"
|
||||||
|
end
|
||||||
|
|
||||||
|
attributes_table do
|
||||||
|
row "Purchased JamTracks" do
|
||||||
|
table_for user.purchased_jam_tracks.unscope(:order).order('original_artist asc', 'name asc') do
|
||||||
|
column "Artist", :original_artist
|
||||||
|
column "Name", :name
|
||||||
|
column "Can Download", :can_download
|
||||||
|
column "Version", :version
|
||||||
|
column "ID", :id
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
active_admin_comments
|
active_admin_comments
|
||||||
end
|
end
|
||||||
index do
|
|
||||||
column "ID" do |user|
|
|
||||||
link_to(truncate(user.id, {:length => 12}),
|
|
||||||
resource_path(user),
|
|
||||||
{:title => user.id})
|
|
||||||
end
|
|
||||||
column "Email" do |user|
|
|
||||||
link_to user.email, resource_path(user)
|
|
||||||
end
|
|
||||||
column :admin
|
|
||||||
column :updated_at
|
|
||||||
column :created_at
|
|
||||||
column :musician do |user| user.musician? ? true : false end
|
|
||||||
column :city
|
|
||||||
column :state
|
|
||||||
column :country
|
|
||||||
column :first_name
|
|
||||||
column :last_name
|
|
||||||
column :birth_date
|
|
||||||
column :gender
|
|
||||||
column :email_confirmed
|
|
||||||
column :photo_url
|
|
||||||
column :session_settings
|
|
||||||
column :can_invite
|
|
||||||
|
|
||||||
# default_actions # use this for all view/edit/delete links
|
index do
|
||||||
|
# actions # use this for all view/edit/delete links
|
||||||
column "Actions" do |user|
|
column "Actions" do |user|
|
||||||
links = ''.html_safe
|
links = ''.html_safe
|
||||||
links << link_to("View", resource_path(user), :class => "member_link view_link")
|
links << link_to("View", resource_path(user), :class => "member_link view_link")
|
||||||
links << link_to("Edit", edit_resource_path(user), :class => "member_link edit_link")
|
links << link_to("Edit", edit_resource_path(user), :class => "member_link edit_link")
|
||||||
links
|
links
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
|
column "Email" do |user|
|
||||||
|
link_to user.email, resource_path(user)
|
||||||
|
end
|
||||||
|
column :subscription_plan_code
|
||||||
|
column :desired_plan_code
|
||||||
|
column :created_at
|
||||||
|
column :first_name
|
||||||
|
column :last_name
|
||||||
|
column :city
|
||||||
|
column :state
|
||||||
|
end
|
||||||
|
|
||||||
controller do
|
controller do
|
||||||
|
|
||||||
# this actually searches on first name, last name, and email, because of get_autocomplete_items defined below
|
# this actually searches on first name, last name, and email, because of get_autocomplete_items defined below
|
||||||
autocomplete :user, :email, :full => true, :display_value => :autocomplete_display_name
|
autocomplete :user, :email, :full => true, :display_value => :autocomplete_display_name, extra_data: [:last_jam_addr]
|
||||||
|
|
||||||
def get_autocomplete_items(parameters)
|
def get_autocomplete_items(parameters)
|
||||||
User.select("email, first_name, last_name, id").where(["email ILIKE ? OR first_name ILIKE ? OR last_name ILIKE ?", "%#{parameters[:term]}%", "%#{parameters[:term]}%", "%#{parameters[:term]}%"])
|
term = parameters[:term]
|
||||||
|
if term.include?('@')
|
||||||
|
User.select("email, first_name, last_name, id, last_jam_addr").where(["email = ?", term]).limit(5)
|
||||||
|
else
|
||||||
|
User.select("email, first_name, last_name, id, last_jam_addr").where(["email ILIKE ? OR first_name ILIKE ? OR last_name ILIKE ?", "%#{term}%", "%#{term}%", "%#{term}%"]).limit(40)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -100,11 +667,14 @@ ActiveAdmin.register JamRuby::User, :as => 'Users' do
|
||||||
@user = resource
|
@user = resource
|
||||||
@user.email = params[:jam_ruby_user][:email]
|
@user.email = params[:jam_ruby_user][:email]
|
||||||
@user.admin = params[:jam_ruby_user][:admin]
|
@user.admin = params[:jam_ruby_user][:admin]
|
||||||
|
@user.subscribe_email = params[:jam_ruby_user][:subscribe_email]
|
||||||
@user.musician = params[:jam_ruby_user][:musician]
|
@user.musician = params[:jam_ruby_user][:musician]
|
||||||
@user.first_name = params[:jam_ruby_user][:first_name]
|
@user.first_name = params[:jam_ruby_user][:first_name]
|
||||||
@user.last_name = params[:jam_ruby_user][:last_name]
|
@user.last_name = params[:jam_ruby_user][:last_name]
|
||||||
@user.state = params[:jam_ruby_user][:state]
|
@user.state = params[:jam_ruby_user][:state]
|
||||||
@user.city = params[:jam_ruby_user][:city]
|
@user.city = params[:jam_ruby_user][:city]
|
||||||
|
@user.is_platform_instructor = params[:jam_ruby_user][:is_platform_instructor]
|
||||||
|
@user.gifted_jamtracks = params[:jam_ruby_user][:gifted_jamtracks]
|
||||||
|
|
||||||
|
|
||||||
if params[:jam_ruby_user][:show_frame_options].to_i == 1
|
if params[:jam_ruby_user][:show_frame_options].to_i == 1
|
||||||
|
|
@ -113,11 +683,117 @@ ActiveAdmin.register JamRuby::User, :as => 'Users' do
|
||||||
@user.delete_mod(User::MOD_GEAR, User::MOD_GEAR_FRAME_OPTIONS)
|
@user.delete_mod(User::MOD_GEAR, User::MOD_GEAR_FRAME_OPTIONS)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
if params[:jam_ruby_user][:how_to_use_video_no_show].to_i == 1
|
||||||
|
@user.mod_merge({User::MOD_NO_SHOW => {User::HOWTO_USE_VIDEO_NOSHOW => true}})
|
||||||
|
else
|
||||||
|
@user.delete_mod(User::MOD_NO_SHOW, User::HOWTO_USE_VIDEO_NOSHOW)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
if params[:jam_ruby_user][:configure_video_no_show].to_i == 1
|
||||||
|
@user.mod_merge({User::MOD_NO_SHOW => {User::CONFIGURE_VIDEO_NOSHOW => true}})
|
||||||
|
else
|
||||||
|
@user.delete_mod(User::MOD_NO_SHOW, User::CONFIGURE_VIDEO_NOSHOW)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
@user.save!
|
@user.save!
|
||||||
|
|
||||||
redirect_to edit_admin_user_path(@user)
|
redirect_to edit_admin_user_path(@user)
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def user_latency_recommendation
|
||||||
|
recommendation_params = params[:latency_recommendation]
|
||||||
|
|
||||||
|
offset = recommendation_params[:offset].blank?? 0 : recommendation_params[:offset]
|
||||||
|
limit = recommendation_params[:limit].blank?? 20 : recommendation_params[:limit]
|
||||||
|
|
||||||
|
is_valid = [
|
||||||
|
recommendation_params[:my_user_id],
|
||||||
|
recommendation_params[:my_public_ip]
|
||||||
|
].all?{ |param|
|
||||||
|
param.present?
|
||||||
|
}
|
||||||
|
|
||||||
|
if is_valid
|
||||||
|
instruments = []
|
||||||
|
instruments << recommendation_params[:instruments_beginner].reject(&:blank?).map{|i| { id: i, proficiency: 1} }
|
||||||
|
instruments << recommendation_params[:instruments_advanced].reject(&:blank?).map{|i| { id: i, proficiency: 2} }
|
||||||
|
instruments << recommendation_params[:instruments_expert].reject(&:blank?).map{|i| { id: i, proficiency: 3} }
|
||||||
|
instruments.flatten!
|
||||||
|
genres = recommendation_params[:genres].reject(&:blank?)
|
||||||
|
wifi = recommendation_params[:wifi]
|
||||||
|
max_latency = recommendation_params[:max_latency]
|
||||||
|
|
||||||
|
data = {
|
||||||
|
my_user_id: recommendation_params[:my_user_id],
|
||||||
|
my_public_ip: recommendation_params[:my_public_ip],
|
||||||
|
offset: offset,
|
||||||
|
limit: limit
|
||||||
|
}
|
||||||
|
|
||||||
|
data.merge!({query: recommendation_params[:query]}) unless recommendation_params[:query].blank?
|
||||||
|
data.merge!({instruments: instruments}) unless instruments.empty?
|
||||||
|
data.merge!({genres: genres}) unless genres.empty?
|
||||||
|
data.merge!({wifi: wifi}) if %w(true false).include?(wifi)
|
||||||
|
data.merge!({max_latency: max_latency}) unless max_latency.blank?
|
||||||
|
|
||||||
|
latency_url = "#{Rails.application.config.latency_data_host}/recommendations"
|
||||||
|
uri = URI(latency_url)
|
||||||
|
|
||||||
|
begin
|
||||||
|
http = Net::HTTP.new(uri.host, uri.port)
|
||||||
|
http.read_timeout = 5
|
||||||
|
http.use_ssl = true if Rails.application.config.latency_data_host.start_with?("https://")
|
||||||
|
request = Net::HTTP::Post.new(uri.path, 'Content-Type' => 'application/json')
|
||||||
|
request.body = data.to_json
|
||||||
|
request["Authorization"] = "Basic #{Rails.application.config.latency_data_host_auth_code}"
|
||||||
|
response = http.request(request)
|
||||||
|
@latency_recommendation = response.body
|
||||||
|
rescue => exception
|
||||||
|
render text: exception.message
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
flash[:error] = 'Please provide all required fields'
|
||||||
|
redirect_to admin_latency_recommendation_path
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def user_latencies
|
||||||
|
latency_params = params[:latencies]
|
||||||
|
latency_url = "#{Rails.application.config.latency_data_host}/user_latencies"
|
||||||
|
uri = URI(latency_url)
|
||||||
|
if not ([latency_params[:my_user_id], latency_params[:my_public_ip], latency_params[:user_1_id]]).any?{|param| param.blank? }
|
||||||
|
user_ids = [latency_params[:user_1_id]]
|
||||||
|
user_ids.push(latency_params[:user_2_id]) unless latency_params[:user_2_id].blank?
|
||||||
|
user_ids.push(latency_params[:user_3_id]) unless latency_params[:user_3_id].blank?
|
||||||
|
user_ids.push(latency_params[:user_4_id]) unless latency_params[:user_4_id].blank?
|
||||||
|
user_ids.push(latency_params[:user_5_id]) unless latency_params[:user_5_id].blank?
|
||||||
|
begin
|
||||||
|
http = Net::HTTP.new(uri.host, uri.port)
|
||||||
|
http.read_timeout = 5
|
||||||
|
http.use_ssl = true if Rails.application.config.latency_data_host.start_with?("https://")
|
||||||
|
request = Net::HTTP::Post.new(uri.path, 'Content-Type' => 'application/json')
|
||||||
|
request.body = {
|
||||||
|
my_user_id: latency_params[:my_user_id],
|
||||||
|
my_public_ip: latency_params[:my_public_ip],
|
||||||
|
users: user_ids
|
||||||
|
}.to_json
|
||||||
|
request["Authorization"] = "Basic #{Rails.application.config.latency_data_host_auth_code}"
|
||||||
|
response = http.request(request)
|
||||||
|
@user_latencies = response.body
|
||||||
|
#render text: JSON.pretty_generate(@user_latencies)
|
||||||
|
rescue => e
|
||||||
|
render text: e.message
|
||||||
|
end
|
||||||
|
else
|
||||||
|
flash[:error] = 'Please provide all required fields'
|
||||||
|
redirect_to admin_latency_between_users_path
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
ActiveAdmin.register_page "Harry Fox Request" do
|
||||||
|
menu :parent => 'JamTracks'
|
||||||
|
|
||||||
|
page_action :create_request, :method => :post do
|
||||||
|
|
||||||
|
name = params[:jam_ruby_jam_track_hfa_request][:name]
|
||||||
|
|
||||||
|
request = JamTrackHfaRequest.create(name)
|
||||||
|
redirect_to admin_harry_fox_request_path, :notice => "Request created. Check Amazon S3 in the 'jamkazam' bucket; specifically #{request.request_csv_filename}"
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
content do
|
||||||
|
active_admin_form_for JamTrackHfaRequest.new, :url => admin_harry_fox_request_create_request_path, :builder => ActiveAdmin::FormBuilder do |f|
|
||||||
|
f.inputs "New Harry Fox Licensing Request" do
|
||||||
|
f.input :name, :hint => "Some sort of name to help us remember what this request was for"
|
||||||
|
end
|
||||||
|
f.actions
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -17,8 +17,16 @@ ActiveAdmin.register JamRuby::JamTrackRight, :as => 'JamTrackRights' do
|
||||||
|
|
||||||
filter :jam_track
|
filter :jam_track
|
||||||
|
|
||||||
|
controller do
|
||||||
|
def create
|
||||||
|
jt_params = params[:jam_ruby_jam_track_right]
|
||||||
|
jt_params[:jam_track] =JamRuby::JamTrack.where("id=?", jt_params[:jam_track_id_val]).first # jt_params[:jam_track_id_val]
|
||||||
|
jt_params[:user] = JamRuby::User.where("id=?", jt_params[:user_id_val]).first # jt_params[:user_id_val]
|
||||||
|
create!
|
||||||
|
end
|
||||||
|
end
|
||||||
index do
|
index do
|
||||||
default_actions
|
actions
|
||||||
|
|
||||||
#column "Order" do |right|
|
#column "Order" do |right|
|
||||||
#link_to("Place", order_admin_jam_track_right_path(right)) + " | " +
|
#link_to("Place", order_admin_jam_track_right_path(right)) + " | " +
|
||||||
|
|
@ -47,8 +55,14 @@ ActiveAdmin.register JamRuby::JamTrackRight, :as => 'JamTrackRights' do
|
||||||
|
|
||||||
form do |f|
|
form do |f|
|
||||||
f.inputs 'New Jam Track Right' do
|
f.inputs 'New Jam Track Right' do
|
||||||
f.input :jam_track, :required=>true, collection: JamTrack.all, include_blank: false
|
#f.input :jam_track, :required=>true, collection: JamTrack.all, include_blank: false
|
||||||
f.input :user, :required=>true, collection: User.all, include_blank: false
|
f.input :jam_track_id_val, :required=>true, :as => :hidden
|
||||||
|
|
||||||
|
f.input :jam_track, :required=>true, :as => :autocomplete, :url => autocomplete_jam_track_name_admin_jam_tracks_path, hint: 'Select a jamtrack to give to this user'
|
||||||
|
#f.input :user, :required=>true, collection: User.all, include_blank: false
|
||||||
|
f.input :user_id_val, :required=>true, :as => :hidden
|
||||||
|
f.input :user, :required=>true, :as => :autocomplete, :url => autocomplete_user_email_admin_users_path, hint: 'Give a free jamtrack to this user'
|
||||||
|
f.input :can_download, :required => true, as: :boolean, :input_html => { :checked => 'checked' }
|
||||||
end
|
end
|
||||||
f.actions
|
f.actions
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,42 @@
|
||||||
ActiveAdmin.register JamRuby::JamTrack, :as => 'JamTracks' do
|
ActiveAdmin.register JamRuby::JamTrack, :as => 'JamTracks' do
|
||||||
|
|
||||||
|
collection_action :autocomplete_jam_track_name, :method => :get
|
||||||
|
|
||||||
menu :label => 'JamTracks', :parent => 'JamTracks'
|
menu :label => 'JamTracks', :parent => 'JamTracks'
|
||||||
|
|
||||||
config.sort_order = 'name_asc'
|
config.sort_order = 'name_asc'
|
||||||
config.batch_actions = false
|
config.batch_actions = false
|
||||||
|
|
||||||
filter :genre
|
filter :name
|
||||||
|
filter :original_artist
|
||||||
|
filter :genres
|
||||||
filter :status, :as => :select, collection: JamRuby::JamTrack::STATUS
|
filter :status, :as => :select, collection: JamRuby::JamTrack::STATUS
|
||||||
|
|
||||||
|
scope("Default", default: true) { |scope| scope }
|
||||||
|
scope("Onboarding TODO") { |scope| scope.where('onboarding_exceptions is not null') }
|
||||||
|
scope("Tency Only") { |scope| scope.joins('INNER JOIN jam_track_licensors as licensors ON jam_tracks.licensor_id = licensors.id').where("licensors.name = 'Tency Music'") }
|
||||||
|
scope("TimTracks Only") { |scope| scope.joins('INNER JOIN jam_track_licensors as licensors ON jam_tracks.licensor_id = licensors.id').where("licensors.name = 'Tim Waurick'") }
|
||||||
|
scope("Drumma Boy Only") { |scope| scope.joins('INNER JOIN jam_track_licensors as licensors ON jam_tracks.licensor_id = licensors.id').where("licensors.name = 'Drumma Boy'") }
|
||||||
|
# scope("Onboarding TODO w/ Tency Only") { |scope| scope.joins('INNER JOIN jam_track_licensors as licensors ON jam_tracks.licensor_id = licensors.id').where("licensors.name = 'Tency Music'").where('onboarding_exceptions is not null') }
|
||||||
|
|
||||||
form :partial => 'form'
|
form :partial => 'form'
|
||||||
|
|
||||||
|
|
||||||
|
controller do
|
||||||
|
|
||||||
|
# this actually searches on first name, last name, and email, because of get_autocomplete_items defined below
|
||||||
|
autocomplete :jam_track, :name, :full => true, :display_value => :autocomplete_display_name
|
||||||
|
|
||||||
|
def get_autocomplete_items(parameters)
|
||||||
|
JamTrack.select("name, original_artist, id").where(["name ILIKE ? OR original_artist ILIKE ?", "%#{parameters[:term]}%", "%#{parameters[:term]}%"])
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
index do
|
index do
|
||||||
|
|
||||||
# default_actions # use this for all view/edit/delete links
|
# actions # use this for all view/edit/delete links
|
||||||
column "Actions" do |jam_track|
|
column "Actions" do |jam_track|
|
||||||
links = ''.html_safe
|
links = ''.html_safe
|
||||||
clz = "member_link view_link show_tracks"
|
clz = "member_link view_link show_tracks"
|
||||||
|
|
@ -24,11 +48,21 @@ ActiveAdmin.register JamRuby::JamTrack, :as => 'JamTracks' do
|
||||||
|
|
||||||
column :original_artist
|
column :original_artist
|
||||||
column :name
|
column :name
|
||||||
column :onboarding_flags do |jam_track| jam_track.onboard_warnings end
|
column :onboarding_exceptions do |jam_track|
|
||||||
|
if jam_track.onboarding_exceptions
|
||||||
|
exceptions = jam_track.onboarding_exceptions
|
||||||
|
exceptions.keys.join(',')
|
||||||
|
else
|
||||||
|
''
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
column :status
|
column :status
|
||||||
column :master_track do |jam_track| jam_track.master_track.nil? ? 'None' : (link_to "Download", jam_track.master_track.url_by_sample_rate(44)) end
|
column :master_track do |jam_track| jam_track.master_track.nil? ? 'None' : (link_to "Download", jam_track.master_track.url_by_sample_rate(44)) end
|
||||||
column :licensor
|
column :licensor
|
||||||
column :genre
|
column :genres do |jam_track|
|
||||||
|
jam_track.genres.map(&:description).join(',')
|
||||||
|
end
|
||||||
column :price
|
column :price
|
||||||
column :reproduction_royalty
|
column :reproduction_royalty
|
||||||
column :public_performance_royalty
|
column :public_performance_royalty
|
||||||
|
|
@ -36,6 +70,7 @@ ActiveAdmin.register JamRuby::JamTrack, :as => 'JamTracks' do
|
||||||
column :licensor_royalty_amount
|
column :licensor_royalty_amount
|
||||||
column :id
|
column :id
|
||||||
|
|
||||||
|
=begin
|
||||||
column :jam_track_tracks do |jam_track|
|
column :jam_track_tracks do |jam_track|
|
||||||
table_for jam_track.jam_track_tracks.order('position ASC') do
|
table_for jam_track.jam_track_tracks.order('position ASC') do
|
||||||
column :id
|
column :id
|
||||||
|
|
@ -58,6 +93,8 @@ ActiveAdmin.register JamRuby::JamTrack, :as => 'JamTracks' do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
=end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,40 @@
|
||||||
|
ActiveAdmin.register JamRuby::Jamblaster, :as => 'Jamblaster' do
|
||||||
|
|
||||||
|
|
||||||
|
config.filters = false
|
||||||
|
menu :label => 'JamBlasters', :parent => 'JamBlaster'
|
||||||
|
|
||||||
|
scope("Connected", default: true) { |scope| scope.where('client_id in (select client_id from connections)') }
|
||||||
|
scope("All") { |scope| scope.order('created_at desc') }
|
||||||
|
|
||||||
|
form do |f|
|
||||||
|
f.inputs 'New JamBlaster' do
|
||||||
|
f.input :user, required: true, collection: User.all, include_blank: false
|
||||||
|
f.input :serial_no, required: true
|
||||||
|
f.input :client_id, required: false
|
||||||
|
f.input :users, required: true, collection: User.all, include_blank: false
|
||||||
|
end
|
||||||
|
f.actions
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
index do
|
||||||
|
|
||||||
|
# actions # use this for all view/edit/delete links
|
||||||
|
|
||||||
|
column 'Serial' do |oo|
|
||||||
|
oo.serial_no
|
||||||
|
end
|
||||||
|
|
||||||
|
column 'IPv4' do |oo|
|
||||||
|
oo.ipv4_link_local
|
||||||
|
end
|
||||||
|
|
||||||
|
column 'IPv6' do |oo|
|
||||||
|
oo.ipv6_link_local
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,185 @@
|
||||||
|
class Spacer
|
||||||
|
def self.spacer(val, row)
|
||||||
|
|
||||||
|
percentage = ((val * 100) / row.total.to_f).round(1).to_s
|
||||||
|
('%-5.5s' % percentage).gsub(' ', ' ') + '% - ' + val.to_s
|
||||||
|
end
|
||||||
|
end
|
||||||
|
=begin
|
||||||
|
select
|
||||||
|
count(id) as total,
|
||||||
|
count(first_downloaded_client_at) as downloaded,
|
||||||
|
count(first_ran_client_at) as ran_client,
|
||||||
|
count(first_certified_gear_at) as ftue,
|
||||||
|
count(first_music_session_at) as any_session,
|
||||||
|
count(first_real_music_session_at) as real_session,
|
||||||
|
count(first_good_music_session_at) as good_session,
|
||||||
|
count(first_invited_at) as invited,
|
||||||
|
count(first_friended_at) as friended,
|
||||||
|
count(first_subscribed_at) as subscribed
|
||||||
|
from users where users.created_at >= '2024-11-01' AND users.created_at < '2025-04-01'
|
||||||
|
|
||||||
|
select first_name, last_name, email
|
||||||
|
from users where users.created_at >= '2024-11-01' AND users.created_at < '2025-04-01'
|
||||||
|
AND first_music_session_at is NULL;
|
||||||
|
|
||||||
|
=end
|
||||||
|
|
||||||
|
ActiveAdmin.register_page "Jammers Subscription Cohorts" do
|
||||||
|
menu :parent => 'Reports'
|
||||||
|
|
||||||
|
content :title => "Jammers Subscription Cohorts" do
|
||||||
|
|
||||||
|
filter_type = params[:filter_type] || 'All'
|
||||||
|
filter_campaign = params[:filter_campaign]
|
||||||
|
filter_campaign_id = params[:filter_campaign_id]
|
||||||
|
filter_ad_set = params[:filter_ad_set]
|
||||||
|
filter_ad_name = params[:filter_ad_name]
|
||||||
|
|
||||||
|
campaigns = User.where("origin_utm_medium = 'cpc'").distinct.pluck(:origin_utm_campaign).compact.sort
|
||||||
|
campaign_ids = User.where("origin_utm_medium = 'cpc'").distinct.pluck(:origin_id).compact.sort
|
||||||
|
ad_sets = User.where("origin_utm_medium = 'cpc'").distinct.pluck(:origin_term).compact.sort
|
||||||
|
ad_names = User.where("origin_utm_medium = 'cpc'").distinct.pluck(:origin_content).compact.sort
|
||||||
|
|
||||||
|
div style: "margin-bottom: 20px; padding: 10px; background-color: #f4f4f4; border-radius: 4px;" do
|
||||||
|
form action: admin_jammers_subscription_cohorts_path, method: :get do
|
||||||
|
span "Source: ", style: "font-weight: bold; margin-right: 5px;"
|
||||||
|
select name: 'filter_type', onchange: 'this.form.submit()', style: "margin-right: 15px;" do
|
||||||
|
option "All", value: 'All', selected: filter_type == 'All'
|
||||||
|
option "Organic", value: 'Organic', selected: filter_type == 'Organic'
|
||||||
|
option "Advertising", value: 'Advertising', selected: filter_type == 'Advertising'
|
||||||
|
end
|
||||||
|
|
||||||
|
if filter_type == 'Advertising'
|
||||||
|
div style: "margin-top: 10px;" do
|
||||||
|
span "Campaign Name: ", style: "font-weight: bold; margin-right: 5px;"
|
||||||
|
select name: 'filter_campaign', onchange: 'this.form.submit()', style: "margin-right: 15px;" do
|
||||||
|
option "All", value: ''
|
||||||
|
option "Null", value: 'NULL', selected: filter_campaign == 'NULL'
|
||||||
|
campaigns.each do |c|
|
||||||
|
option c, value: c, selected: filter_campaign == c
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
div style: "margin-top: 10px;" do
|
||||||
|
span "Campaign ID: ", style: "font-weight: bold; margin-right: 5px;"
|
||||||
|
select name: 'filter_campaign_id', onchange: 'this.form.submit()', style: "margin-right: 15px;" do
|
||||||
|
option "All", value: ''
|
||||||
|
option "Null", value: 'NULL', selected: filter_campaign_id == 'NULL'
|
||||||
|
campaign_ids.each do |c|
|
||||||
|
option c, value: c, selected: filter_campaign_id == c
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
div style: "margin-top: 10px;" do
|
||||||
|
span "Ad Set: ", style: "font-weight: bold; margin-right: 5px;"
|
||||||
|
select name: 'filter_ad_set', onchange: 'this.form.submit()', style: "margin-right: 15px;" do
|
||||||
|
option "All", value: ''
|
||||||
|
option "Null", value: 'NULL', selected: filter_ad_set == 'NULL'
|
||||||
|
ad_sets.each do |c|
|
||||||
|
option c, value: c, selected: filter_ad_set == c
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
div style: "margin-top: 10px;" do
|
||||||
|
span "Ad Name: ", style: "font-weight: bold; margin-right: 5px;"
|
||||||
|
select name: 'filter_ad_name', onchange: 'this.form.submit()', style: "margin-right: 15px;" do
|
||||||
|
option "All", value: ''
|
||||||
|
option "Null", value: 'NULL', selected: filter_ad_name == 'NULL'
|
||||||
|
ad_names.each do |c|
|
||||||
|
option c, value: c, selected: filter_ad_name == c
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
noscript { input type: :submit, value: "Filter" }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
h2 "Users Grouped By Month as Paying Subscribers"
|
||||||
|
|
||||||
|
query = User.select(%Q{date_trunc('month', users.created_at) as month,
|
||||||
|
count(id) as total,
|
||||||
|
count(first_downloaded_client_at) as downloaded,
|
||||||
|
count(first_ran_client_at) as ran_client,
|
||||||
|
count(first_certified_gear_at) as ftue,
|
||||||
|
count(first_music_session_at) as any_session,
|
||||||
|
count(first_real_music_session_at) as real_session,
|
||||||
|
count(first_good_music_session_at) as good_session,
|
||||||
|
count(first_invited_at) as invited,
|
||||||
|
count(first_friended_at) as friended,
|
||||||
|
count(first_subscribed_at) as subscribed,
|
||||||
|
count(first_played_jamtrack_at) as played_jamtrack
|
||||||
|
})
|
||||||
|
.joins(%Q{LEFT JOIN LATERAL (
|
||||||
|
SELECT
|
||||||
|
j.created_at
|
||||||
|
FROM
|
||||||
|
jam_track_rights as j
|
||||||
|
WHERE
|
||||||
|
j.user_id = users.id
|
||||||
|
ORDER BY
|
||||||
|
j.created_at
|
||||||
|
LIMIT 1 -- Select only that single row
|
||||||
|
) j ON TRUE })
|
||||||
|
|
||||||
|
if filter_type == 'Organic'
|
||||||
|
query = query.where("users.origin_utm_source = 'organic'")
|
||||||
|
elsif filter_type == 'Advertising'
|
||||||
|
query = query.where("origin_utm_medium = 'cpc'")
|
||||||
|
|
||||||
|
if filter_campaign.present?
|
||||||
|
if filter_campaign == 'NULL'
|
||||||
|
query = query.where("users.origin_utm_campaign IS NULL")
|
||||||
|
elsif filter_campaign != 'All'
|
||||||
|
query = query.where("users.origin_utm_campaign = ?", filter_campaign)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if filter_campaign_id.present?
|
||||||
|
if filter_campaign_id == 'NULL'
|
||||||
|
query = query.where("users.origin_id IS NULL")
|
||||||
|
elsif filter_campaign_id != 'All'
|
||||||
|
query = query.where("users.origin_id = ?", filter_campaign_id)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if filter_ad_set.present?
|
||||||
|
if filter_ad_set == 'NULL'
|
||||||
|
query = query.where("users.origin_term IS NULL")
|
||||||
|
elsif filter_ad_set != 'All'
|
||||||
|
query = query.where("users.origin_term = ?", filter_ad_set)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if filter_ad_name.present?
|
||||||
|
if filter_ad_name == 'NULL'
|
||||||
|
query = query.where("users.origin_content IS NULL")
|
||||||
|
elsif filter_ad_name != 'All'
|
||||||
|
query = query.where("users.origin_content = ?", filter_ad_name)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
table_for query.group("date_trunc('month', users.created_at)")
|
||||||
|
.where("j.created_at IS NULL OR (j.created_at - users.created_at) >= INTERVAL '2 hours'")
|
||||||
|
.order("date_trunc('month', users.created_at) DESC") do |row|
|
||||||
|
column "Month", Proc.new { |user| user.month.strftime('%B %Y') }
|
||||||
|
column "Total", :total
|
||||||
|
column "Subscribed", Proc.new { |user| raw(Spacer.spacer(user.subscribed, user)) }
|
||||||
|
column "Downloaded", Proc.new { |user| raw(Spacer.spacer(user.downloaded, user)) }
|
||||||
|
column "Ran Client", Proc.new { |user| raw(Spacer.spacer(user.ran_client, user)) }
|
||||||
|
column "FTUE", Proc.new { |user| raw(Spacer.spacer(user.ftue, user)) }
|
||||||
|
column "Any Session", Proc.new { |user| raw(Spacer.spacer(user.any_session, user)) }
|
||||||
|
column "2+ Session", Proc.new { |user| raw(Spacer.spacer(user.real_session, user)) }
|
||||||
|
column "Good Session", Proc.new { |user| raw(Spacer.spacer(user.good_session, user)) }
|
||||||
|
column "Invited", Proc.new { |user| raw(Spacer.spacer(user.invited, user)) }
|
||||||
|
column "Friended", Proc.new { |user| raw(Spacer.spacer(user.friended, user)) }
|
||||||
|
column "Played JT", Proc.new { |user| raw(Spacer.spacer(user.played_jamtrack, user)) }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,73 @@
|
||||||
|
class Spacer
|
||||||
|
def self.spacer(val, row)
|
||||||
|
|
||||||
|
percentage = ((val * 100) / row.total.to_f).round(1).to_s
|
||||||
|
('%-5.5s' % percentage).gsub(' ', ' ') + '% - ' + val.to_s
|
||||||
|
end
|
||||||
|
end
|
||||||
|
=begin
|
||||||
|
select
|
||||||
|
count(id) as total,
|
||||||
|
count(first_downloaded_client_at) as downloaded,
|
||||||
|
count(first_ran_client_at) as ran_client,
|
||||||
|
count(first_certified_gear_at) as ftue,
|
||||||
|
count(first_music_session_at) as any_session,
|
||||||
|
count(first_real_music_session_at) as real_session,
|
||||||
|
count(first_good_music_session_at) as good_session,
|
||||||
|
count(first_invited_at) as invited,
|
||||||
|
count(first_friended_at) as friended,
|
||||||
|
count(first_subscribed_at) as subscribed
|
||||||
|
from users where users.created_at >= '2024-11-01' AND users.created_at < '2025-04-01'
|
||||||
|
|
||||||
|
select first_name, last_name, email
|
||||||
|
from users where users.created_at >= '2024-11-01' AND users.created_at < '2025-04-01'
|
||||||
|
AND first_music_session_at is NULL;
|
||||||
|
|
||||||
|
=end
|
||||||
|
|
||||||
|
ActiveAdmin.register_page "JamTrack Subscription Cohorts" do
|
||||||
|
menu :parent => 'Reports'
|
||||||
|
|
||||||
|
content :title => "JamTrack Subscription Cohorts" do
|
||||||
|
h2 "Users Grouped By Month as Paying Subscribers"
|
||||||
|
table_for User.select(%Q{date_trunc('month', users.created_at) as month,
|
||||||
|
count(id) as total,
|
||||||
|
count(first_downloaded_client_at) as downloaded,
|
||||||
|
count(first_ran_client_at) as ran_client,
|
||||||
|
count(first_certified_gear_at) as ftue,
|
||||||
|
count(first_music_session_at) as any_session,
|
||||||
|
count(first_real_music_session_at) as real_session,
|
||||||
|
count(first_good_music_session_at) as good_session,
|
||||||
|
count(first_invited_at) as invited,
|
||||||
|
count(first_friended_at) as friended,
|
||||||
|
count(first_subscribed_at) as subscribed,
|
||||||
|
count(first_played_jamtrack_at) as played_jamtrack
|
||||||
|
})
|
||||||
|
.joins(%Q{INNER JOIN LATERAL (
|
||||||
|
SELECT
|
||||||
|
j.created_at
|
||||||
|
FROM
|
||||||
|
jam_track_rights as j
|
||||||
|
WHERE
|
||||||
|
j.user_id = users.id
|
||||||
|
ORDER BY
|
||||||
|
j.created_at
|
||||||
|
LIMIT 1 -- Select only that single row
|
||||||
|
) j ON (j.created_at - users.created_at) < INTERVAL '2 hours' })
|
||||||
|
.group("date_trunc('month', users.created_at)").order("date_trunc('month', users.created_at) DESC") do |row|
|
||||||
|
column "Month", Proc.new { |user| user.month.strftime('%B %Y') }
|
||||||
|
column "Total", :total
|
||||||
|
column "Subscribed", Proc.new { |user| raw(Spacer.spacer(user.subscribed, user)) }
|
||||||
|
column "Downloaded", Proc.new { |user| raw(Spacer.spacer(user.downloaded, user)) }
|
||||||
|
column "Ran Client", Proc.new { |user| raw(Spacer.spacer(user.ran_client, user)) }
|
||||||
|
column "FTUE", Proc.new { |user| raw(Spacer.spacer(user.ftue, user)) }
|
||||||
|
column "Any Session", Proc.new { |user| raw(Spacer.spacer(user.any_session, user)) }
|
||||||
|
column "2+ Session", Proc.new { |user| raw(Spacer.spacer(user.real_session, user)) }
|
||||||
|
column "Good Session", Proc.new { |user| raw(Spacer.spacer(user.good_session, user)) }
|
||||||
|
column "Invited", Proc.new { |user| raw(Spacer.spacer(user.invited, user)) }
|
||||||
|
column "Friended", Proc.new { |user| raw(Spacer.spacer(user.friended, user)) }
|
||||||
|
column "Played JT", Proc.new { |user| raw(Spacer.spacer(user.played_jamtrack, user)) }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,78 @@
|
||||||
|
ActiveAdmin.register JamRuby::LessonBooking, :as => 'LessonBookings' do
|
||||||
|
|
||||||
|
menu :label => 'Lesson Booking', :parent => 'JamClass'
|
||||||
|
|
||||||
|
config.sort_order = 'created_at desc'
|
||||||
|
config.batch_actions = false
|
||||||
|
config.per_page = 100
|
||||||
|
config.paginate = true
|
||||||
|
config.filters = false
|
||||||
|
|
||||||
|
scope("All", default: true) { |scope| scope.unscoped.order('created_at desc') }
|
||||||
|
scope("Requested") { |scope| scope.unscoped.where(status: LessonBooking::STATUS_REQUESTED).order('created_at desc') }
|
||||||
|
scope("Approved") { |scope| scope.unscoped.approved.order('created_at desc') }
|
||||||
|
scope("Suspended") { |scope| scope.unscoped.suspended.order('created_at desc') }
|
||||||
|
scope("Canceled") { |scope| scope.unscoped.canceled.order('created_at desc') }
|
||||||
|
|
||||||
|
index do
|
||||||
|
column "User Link" do |lesson_booking|
|
||||||
|
span do
|
||||||
|
link_to "Lesson Session URL", "#{lesson_booking.next_lesson.admin_url}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
column "Type" do |lesson_booking|
|
||||||
|
lesson_booking.display_type
|
||||||
|
end
|
||||||
|
column "Status" do |lesson_booking|
|
||||||
|
lesson_booking.status
|
||||||
|
end
|
||||||
|
column "Teacher" do |lesson_booking|
|
||||||
|
teacher = lesson_booking.teacher
|
||||||
|
span do
|
||||||
|
link_to "#{teacher.name} (#{teacher.email})", "#{Rails.application.config.external_root_url}/client#/profile/teacher/#{teacher.id}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
column "Student" do |lesson_booking|
|
||||||
|
student = lesson_booking.student
|
||||||
|
span do
|
||||||
|
link_to "#{student.name} (#{student.email})", "#{Rails.application.config.external_root_url}/client#/profile/#{student.id}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
show do
|
||||||
|
attributes_table do
|
||||||
|
row "User Link" do |lesson_booking|
|
||||||
|
span do
|
||||||
|
link_to "Web URL", "#{Rails.application.config.external_root_url}/client#/jamclass/lesson-booking/#{lesson_booking.id}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
row "Type" do |lesson_booking|
|
||||||
|
lesson_booking.display_type
|
||||||
|
end
|
||||||
|
row "Status" do |lesson_booking|
|
||||||
|
lesson_booking.status
|
||||||
|
end
|
||||||
|
row "Teacher" do |lesson_booking|
|
||||||
|
teacher = lesson_booking.teacher
|
||||||
|
span do
|
||||||
|
link_to "#{teacher.name} (#{teacher.email})", "#{Rails.application.config.external_root_url}/client#/profile/teacher/#{teacher.id}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
row "Student" do |lesson_booking|
|
||||||
|
student = lesson_booking.student
|
||||||
|
span do
|
||||||
|
link_to "#{student.name} (#{student.email})", "#{Rails.application.config.external_root_url}/client#/profile/#{student.id}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
row "Created At" do |lesson_booking|
|
||||||
|
lesson_booking.created_at
|
||||||
|
end
|
||||||
|
row "Booked Price" do |lesson_booking|
|
||||||
|
lesson_booking.booked_price
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,295 @@
|
||||||
|
ActiveAdmin.register JamRuby::LessonSession, :as => 'LessonSessions' do
|
||||||
|
|
||||||
|
menu :label => 'Lesson Session', :parent => 'JamClass'
|
||||||
|
|
||||||
|
config.sort_order = 'created_at desc'
|
||||||
|
config.batch_actions = false
|
||||||
|
config.per_page = 100
|
||||||
|
config.paginate = true
|
||||||
|
config.filters = true
|
||||||
|
|
||||||
|
scope("All", default: true) { |scope| scope.order('created_at desc') }
|
||||||
|
scope("Requested") { |scope| scope.where(status: LessonBooking::STATUS_REQUESTED).order('created_at desc') }
|
||||||
|
scope("Approved") { |scope| scope.approved.order('created_at desc') }
|
||||||
|
scope("Suspended") { |scope| scope.suspended.order('created_at desc') }
|
||||||
|
scope("Canceled") { |scope| scope.canceled.order('created_at desc') }
|
||||||
|
scope("Missed") { |scope| scope.missed.order('created_at desc') }
|
||||||
|
scope("Completed") { |scope| scope.completed.order('created_at desc') }
|
||||||
|
|
||||||
|
#filter :jamuser_full_name_or_user_email_cont, label: 'Student Name', as: :string
|
||||||
|
|
||||||
|
#filter :teacher_user_email_cont, label: 'Student Name', as: :string
|
||||||
|
|
||||||
|
filter :student_full_name_or_user_email_cont, label: 'Student Name Or Email', as: :string
|
||||||
|
filter :by_search_teacher_in, label: 'Teacher Name Or Email', as: :string
|
||||||
|
filter :by_lesson_package_type_in, label: 'Card Type', as: :select, collection: -> { LessonPackageType.all.map { |t| [t.admin_name, t.id] } }
|
||||||
|
|
||||||
|
controller do
|
||||||
|
active_admin_config.includes.push :teacher, :music_session
|
||||||
|
end
|
||||||
|
|
||||||
|
action_item :only => [:show] do
|
||||||
|
link_to('Mark As Success', mark_success_admin_lesson_session_path(resource.id))
|
||||||
|
end
|
||||||
|
|
||||||
|
member_action :mark_success, :method => :get do
|
||||||
|
if !resource.success
|
||||||
|
resource.mark_lesson(true, true)
|
||||||
|
end
|
||||||
|
redirect_to :back
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
index do
|
||||||
|
column "Actions" do |teacher|
|
||||||
|
links = ''.html_safe
|
||||||
|
links << link_to("View", resource_path(teacher), :class => "member_link view_link")
|
||||||
|
links << link_to("Edit", edit_resource_path(teacher), :class => "member_link edit_link")
|
||||||
|
links
|
||||||
|
end
|
||||||
|
column "App Link" do |lesson_session|
|
||||||
|
lesson_booking = lesson_session.lesson_booking
|
||||||
|
span do
|
||||||
|
link_to "link", "#{Rails.application.config.external_root_url}/client#/jamclass/lesson-booking/#{lesson_booking.id}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
column "Status" do |lesson_session|
|
||||||
|
link_to lesson_session.status, admin_lesson_session_path(lesson_session.id)
|
||||||
|
end
|
||||||
|
column "Start Time" do |lesson_session|
|
||||||
|
span do
|
||||||
|
if lesson_session.music_session.nil?
|
||||||
|
raise "Lessonsesison with no id #{lesson_session.id}"
|
||||||
|
else
|
||||||
|
lesson_session.music_session.pretty_scheduled_start(true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
br
|
||||||
|
span do
|
||||||
|
lesson_session.music_session.scheduled_start
|
||||||
|
end
|
||||||
|
end
|
||||||
|
column "Duration" do |lesson_session|
|
||||||
|
lesson_session.duration
|
||||||
|
end
|
||||||
|
column "Teacher" do |lesson_session|
|
||||||
|
teacher = lesson_session.teacher
|
||||||
|
span do
|
||||||
|
# link_to "#{teacher.name} (#{teacher.email})", "#{Rails.application.config.external_root_url}/client#/profile/teacher/#{teacher.id}"
|
||||||
|
link_to teacher.admin_name, teacher.admin_url
|
||||||
|
end
|
||||||
|
end
|
||||||
|
column "Student" do |lesson_session|
|
||||||
|
student = lesson_session.student
|
||||||
|
span do
|
||||||
|
#link_to "#{student.name} (#{student.email})", "#{Rails.application.config.external_root_url}/client#/profile/#{student.id}"
|
||||||
|
link_to student.admin_name, student.admin_url
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
show do
|
||||||
|
attributes_table do
|
||||||
|
row "Lesson Booking" do |lesson_session|
|
||||||
|
span do
|
||||||
|
link_to "Lesson Booking", lesson_session.lesson_booking.admin_url
|
||||||
|
end
|
||||||
|
end
|
||||||
|
row "App Link" do |lesson_session|
|
||||||
|
lesson_booking = lesson_session.lesson_booking
|
||||||
|
span do
|
||||||
|
link_to "link", "#{Rails.application.config.external_root_url}/client#/jamclass/lesson-booking/#{lesson_booking.id}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
row "Status" do |lesson_session|
|
||||||
|
lesson_session.status
|
||||||
|
end
|
||||||
|
row "Start Time" do |lesson_session|
|
||||||
|
span do
|
||||||
|
lesson_session.music_session.pretty_scheduled_start(true)
|
||||||
|
end
|
||||||
|
br
|
||||||
|
span do
|
||||||
|
lesson_session.music_session.scheduled_start
|
||||||
|
end
|
||||||
|
end
|
||||||
|
row "Duration" do |lesson_session|
|
||||||
|
lesson_session.duration
|
||||||
|
end
|
||||||
|
row "Teacher" do |lesson_session|
|
||||||
|
teacher = lesson_session.teacher
|
||||||
|
span do
|
||||||
|
# link_to teacher.admin_name, "#{Rails.application.config.external_root_url}/client#/profile/teacher/#{teacher.id}"
|
||||||
|
link_to teacher.admin_name, teacher.admin_url
|
||||||
|
end
|
||||||
|
end
|
||||||
|
row "Student" do |lesson_session|
|
||||||
|
student = lesson_session.student
|
||||||
|
span do
|
||||||
|
# link_to student.admin_name, "#{Rails.application.config.external_root_url}/client#/profile/#{student.id}"
|
||||||
|
link_to student.admin_name, student.admin_url
|
||||||
|
end
|
||||||
|
end
|
||||||
|
row "Followup Emails Sent" do |lesson_session|
|
||||||
|
span do
|
||||||
|
lesson_session.sent_notices
|
||||||
|
end
|
||||||
|
end
|
||||||
|
row "Success" do |lesson_session|
|
||||||
|
span do
|
||||||
|
lesson_session.success
|
||||||
|
end
|
||||||
|
end
|
||||||
|
row "Billed" do |lesson_session|
|
||||||
|
span do
|
||||||
|
if lesson_session.is_test_drive?
|
||||||
|
'N/A (because is Test Drive)'
|
||||||
|
else
|
||||||
|
lesson_session.billed
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
row "Distribution" do |lesson_session|
|
||||||
|
distribution = lesson_session.teacher_distribution
|
||||||
|
|
||||||
|
if distribution
|
||||||
|
payment = distribution.teacher_payment
|
||||||
|
|
||||||
|
if payment
|
||||||
|
charge = payment.teacher_payment_charge
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
div do
|
||||||
|
if distribution
|
||||||
|
table_for distribution do
|
||||||
|
column :amount_in_cents
|
||||||
|
column :distributed
|
||||||
|
column :ready
|
||||||
|
column :teacher_fee_in_cents
|
||||||
|
column :reduced_roll_forward_amount_in_cents
|
||||||
|
column :created_at
|
||||||
|
column :updated_at
|
||||||
|
column do
|
||||||
|
link_to "Link", distribution.admin_url
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
''
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
row "Teacher Payment" do |lesson_session|
|
||||||
|
distribution = lesson_session.teacher_distribution
|
||||||
|
|
||||||
|
if distribution
|
||||||
|
payment = distribution.teacher_payment
|
||||||
|
end
|
||||||
|
|
||||||
|
div do
|
||||||
|
if payment
|
||||||
|
table_for payment do
|
||||||
|
column :amount_in_cents
|
||||||
|
column :fee_in_cents
|
||||||
|
column :created_at
|
||||||
|
column :updated_at
|
||||||
|
column do
|
||||||
|
link_to "Link", payment.admin_url
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
''
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
row "Stripe Charge" do |lesson_session|
|
||||||
|
distribution = lesson_session.teacher_distribution
|
||||||
|
|
||||||
|
if distribution
|
||||||
|
payment = distribution.teacher_payment
|
||||||
|
if payment
|
||||||
|
charge = payment.teacher_payment_charge
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
div do
|
||||||
|
if charge
|
||||||
|
table_for charge do
|
||||||
|
column :amount_in_cents
|
||||||
|
column :fee_in_cents
|
||||||
|
column :billed
|
||||||
|
column :billed_at
|
||||||
|
column :post_processed
|
||||||
|
column :post_processed_at
|
||||||
|
column :billing_error_reason
|
||||||
|
column :billing_error_detail
|
||||||
|
column :billing_should_retry
|
||||||
|
column :billing_attempts
|
||||||
|
column :stripe_charge_id
|
||||||
|
column :created_at
|
||||||
|
column :updated_at
|
||||||
|
column do
|
||||||
|
link_to "Stripe", "https://dashboard.stripe.com/payments/#{charge.stripe_charge_id}" if charge.stripe_charge_id
|
||||||
|
end
|
||||||
|
column do
|
||||||
|
link_to "Link", charge.admin_url
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
''
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
row "Admin Marked" do |lesson_session|
|
||||||
|
span do
|
||||||
|
lesson_session.admin_marked
|
||||||
|
end
|
||||||
|
end
|
||||||
|
row "Description" do |lesson_session|
|
||||||
|
span do
|
||||||
|
lesson_session.timed_description
|
||||||
|
end
|
||||||
|
end
|
||||||
|
row "Session" do |lesson_session|
|
||||||
|
span do
|
||||||
|
link_to "Session", lesson_session.music_session.admin_url
|
||||||
|
end
|
||||||
|
end
|
||||||
|
row "Analysis" do |lesson_session|
|
||||||
|
if lesson_session.analysed
|
||||||
|
span style: "white-space: pre;" do
|
||||||
|
begin
|
||||||
|
JSON.pretty_generate(lesson_session.analysis_json)
|
||||||
|
rescue
|
||||||
|
"barf"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
row "Chat Messages" do |lesson_session|
|
||||||
|
div do
|
||||||
|
table_for ChatMessage.unscoped.where(lesson_session: lesson_session).order(:created_at) do
|
||||||
|
column :created_at
|
||||||
|
column do |chat_msg|
|
||||||
|
chat_msg.purpose ? chat_msg.purpose : 'Chat Msg'
|
||||||
|
end
|
||||||
|
column 'Sender' do |chat_msg|
|
||||||
|
link_to(chat_msg.user.name, chat_msg.user.admin_url)
|
||||||
|
end
|
||||||
|
column :target_user do |chat_msg|
|
||||||
|
chat_msg.target_user ? link_to(chat_msg.target_user.name, chat_msg.target_user.admin_url) : ''
|
||||||
|
end
|
||||||
|
column :message
|
||||||
|
column :id
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
ActiveAdmin.register JamRuby::LiveStream, :as => 'LiveStream' do
|
||||||
|
menu :parent => 'Misc'
|
||||||
|
|
||||||
|
config.sort_order = 'created_at DESC'
|
||||||
|
|
||||||
|
filter :listed
|
||||||
|
filter :event_id
|
||||||
|
|
||||||
|
before_build do |record|
|
||||||
|
if !record.event_type.nil?
|
||||||
|
puts "escape"
|
||||||
|
else
|
||||||
|
record.slug = 'please-do-this-sort-of-thing'
|
||||||
|
record.starts_at = 10.days.from_now.midnight
|
||||||
|
record.ends_at = 11.days.from_now.midnight
|
||||||
|
record.event_type = 'eventbrite'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,38 @@
|
||||||
|
ActiveAdmin.register_page "Monthly Stats" do
|
||||||
|
menu :parent => 'Reports'
|
||||||
|
|
||||||
|
|
||||||
|
content :title => "Monthly Stats" do
|
||||||
|
h2 "Distinct Users Playing in Sessions"
|
||||||
|
table_for MusicSession.select([:month, :count]).find_by_sql("select date_trunc('month', msuh.created_at)::date as month, count(distinct(user_id)) from music_sessions_user_history msuh group by month order by month desc;") do
|
||||||
|
column "Month", Proc.new { |row| row.month.strftime('%B %Y') }
|
||||||
|
column "Users", :count
|
||||||
|
end
|
||||||
|
|
||||||
|
h2 "Music Sessions"
|
||||||
|
table_for MusicSession.select([:month, :count]).find_by_sql("select date_trunc('month', ms.created_at)::date as month, count(id) from music_sessions ms where started_at is not null group by month order by month desc;") do
|
||||||
|
column "Month", Proc.new { |row| row.month.strftime('%B %Y') }
|
||||||
|
column "Sessions", :count
|
||||||
|
end
|
||||||
|
|
||||||
|
h2 "Distinct Users Who Played with a JamTrack"
|
||||||
|
table_for MusicSession.select([:month, :count]).find_by_sql("select date_trunc('month', jts.created_at)::date as month, count(distinct(user_id)) from jam_track_sessions jts group by month order by month desc;") do
|
||||||
|
column "Month", Proc.new { |row| row.month.strftime('%B %Y') }
|
||||||
|
column "Users", :count
|
||||||
|
end
|
||||||
|
|
||||||
|
h2 "Music Sessions with JamTracks Played"
|
||||||
|
table_for MusicSession.select([:month, :count]).find_by_sql("select date_trunc('month', jts.created_at)::date as month, count(distinct(music_session_id)) from jam_track_sessions jts where session_type = 'session' group by month order by month desc;") do
|
||||||
|
column "Month", Proc.new { |row| row.month.strftime('%B %Y') }
|
||||||
|
column "Sessions", :count
|
||||||
|
end
|
||||||
|
|
||||||
|
h2 "JamTrack Web Player Sessions"
|
||||||
|
table_for MusicSession.select([:month, :count]).find_by_sql("select date_trunc('month', jts.created_at)::date as month, count(id) from jam_track_sessions jts where session_type = 'browser' group by month order by month desc;") do
|
||||||
|
column "Month", Proc.new { |row| row.month.strftime('%B %Y') }
|
||||||
|
column "Sessions", :count
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
@ -60,4 +60,51 @@ ActiveAdmin.register JamRuby::MusicSession, :as => 'Music Session' do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
show do
|
||||||
|
attributes_table do
|
||||||
|
row :id
|
||||||
|
row :name
|
||||||
|
row :description
|
||||||
|
row :creator do |session|
|
||||||
|
link_to(session.creator.admin_name, session.creator.admin_url)
|
||||||
|
end
|
||||||
|
row :created_at
|
||||||
|
row :started_at
|
||||||
|
row :session_ended_at do |session| session.session_removed_at end
|
||||||
|
row :genre
|
||||||
|
row :recurring_mode
|
||||||
|
row :timezone
|
||||||
|
row :fan_access
|
||||||
|
row :music_access
|
||||||
|
row :approval_required
|
||||||
|
row :open_rsvps
|
||||||
|
row :is_unstructured_rsv
|
||||||
|
row :canceled
|
||||||
|
row :lesson_session do |session|
|
||||||
|
lesson_session = session.lesson_session
|
||||||
|
if lesson_session
|
||||||
|
link_to("Lesson", lesson_session.admin_url)
|
||||||
|
else
|
||||||
|
''
|
||||||
|
end
|
||||||
|
end
|
||||||
|
row 'Session Attendances' do |session|
|
||||||
|
|
||||||
|
table_for(msuh = session.music_session_user_histories) do
|
||||||
|
column :user do |msuh| msuh.user.admin_name end
|
||||||
|
column :joined do |msuh| msuh.created_at.strftime('%b %d %Y, %H:%M') end
|
||||||
|
column :duration do |msuh| "#{msuh.duration_minutes.round} minutes" end
|
||||||
|
column :perf_data do |msuh|
|
||||||
|
unless (uu = msuh.perf_uri).blank?
|
||||||
|
link_to('Per Data Link', uu)
|
||||||
|
else
|
||||||
|
'No Perf Data'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
ActiveAdmin.register JamRuby::News, :as => 'News' do
|
||||||
|
|
||||||
|
menu :parent => 'Misc'
|
||||||
|
|
||||||
|
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,91 @@
|
||||||
|
ActiveAdmin.register JamRuby::User, :as => 'Onboarder' do
|
||||||
|
|
||||||
|
menu :label => 'Onboarder Settings', :parent => 'JamClass'
|
||||||
|
|
||||||
|
config.sort_order = 'created_at'
|
||||||
|
config.batch_actions = true
|
||||||
|
config.per_page = 100
|
||||||
|
config.paginate = true
|
||||||
|
config.filters = false
|
||||||
|
config.clear_action_items!
|
||||||
|
batch_action :destroy, false
|
||||||
|
|
||||||
|
scope("All Onboarders", default: true) { |scope| scope.where(is_onboarder: true).order(:created_at) }
|
||||||
|
|
||||||
|
controller do
|
||||||
|
active_admin_config.includes.push :onboarding_users
|
||||||
|
|
||||||
|
def update
|
||||||
|
resource.max_onboardings = params[:jam_ruby_user][:max_onboardings]
|
||||||
|
resource.save!
|
||||||
|
success.json {}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
index do
|
||||||
|
def last_week
|
||||||
|
@last_week_result ||= calculate_last_week
|
||||||
|
end
|
||||||
|
|
||||||
|
def calculate_last_week
|
||||||
|
start_day = Date.today.beginning_of_week(:sunday).yesterday.beginning_of_week(:sunday)
|
||||||
|
end_day = start_day.end_of_week(:sunday)
|
||||||
|
result = [start_day, end_day]
|
||||||
|
result
|
||||||
|
end
|
||||||
|
|
||||||
|
def this_week
|
||||||
|
@this_week_result ||= calculate_this_week
|
||||||
|
end
|
||||||
|
|
||||||
|
def calculate_this_week
|
||||||
|
start_day = Date.today.beginning_of_week(:sunday)
|
||||||
|
end_day = start_day.end_of_week(:sunday)
|
||||||
|
result = [start_day, end_day]
|
||||||
|
result
|
||||||
|
end
|
||||||
|
|
||||||
|
def week_display(week)
|
||||||
|
start_day = week[0]
|
||||||
|
end_day = week[1]
|
||||||
|
mmyy = start_day.strftime('%b')
|
||||||
|
"#{mmyy} #{start_day.day}-#{end_day.day}"
|
||||||
|
end
|
||||||
|
|
||||||
|
def onboarding_select
|
||||||
|
array = []
|
||||||
|
100.times do |i|
|
||||||
|
array.push [i.to_s, i.to_s]
|
||||||
|
end
|
||||||
|
array
|
||||||
|
end
|
||||||
|
column "Name" do |user|
|
||||||
|
div do
|
||||||
|
div do
|
||||||
|
link_to user.name, user.admin_url
|
||||||
|
end
|
||||||
|
div do
|
||||||
|
user.email
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
column "Max Onboardings" do |user|
|
||||||
|
best_in_place user, :max_onboardings, as: :select, url: admin_onboarder_path(user),:collection => onboarding_select
|
||||||
|
end
|
||||||
|
column "Current Week #{week_display(this_week)}" do |user|
|
||||||
|
start_date, last_date = this_week
|
||||||
|
user.onboarding_users.where(onboarder_assigned_at: start_date..last_date).count
|
||||||
|
end
|
||||||
|
column "Previous Week #{week_display(last_week)}" do |user|
|
||||||
|
start_date, last_date = last_week
|
||||||
|
user.onboarding_users.where(onboarder_assigned_at: start_date..last_date).count
|
||||||
|
end
|
||||||
|
column "Current Student WIP" do |user|
|
||||||
|
user.onboarding_users.where('onboarding_status = ? OR onboarding_status = ?', User::ONBOARDING_STATUS_ASSIGNED, User::ONBOARDING_STATUS_EMAILED).count
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,138 @@
|
||||||
|
ActiveAdmin.register JamRuby::User, :as => 'OnboarderManagement' do
|
||||||
|
|
||||||
|
menu :label => 'Onboarder Management', :parent => 'JamClass'
|
||||||
|
|
||||||
|
config.sort_order = 'created_at desc'
|
||||||
|
config.batch_actions = true
|
||||||
|
config.per_page = 100
|
||||||
|
config.paginate = true
|
||||||
|
config.filters = true
|
||||||
|
config.clear_action_items!
|
||||||
|
batch_action :destroy, false
|
||||||
|
|
||||||
|
batch_action :onboarder, form: -> { {
|
||||||
|
support_consultant: (User.where(is_onboarder: true).includes(:onboarding_users).map {|user| ["#{user.name} (#{user.onboarding_users.where('onboarding_status = ? OR onboarding_status = ?', User::ONBOARDING_STATUS_ASSIGNED, User::ONBOARDING_STATUS_EMAILED).count})", user.id]}).to_a.unshift(['Unassign', ''])
|
||||||
|
} } do |ids, inputs|
|
||||||
|
onboarder = inputs[:support_consultant]
|
||||||
|
if onboarder.blank?
|
||||||
|
onboarder = nil
|
||||||
|
else
|
||||||
|
onboarder = User.find(onboarder)
|
||||||
|
end
|
||||||
|
|
||||||
|
ids.each do |id|
|
||||||
|
user = User.find(id)
|
||||||
|
user.onboarder = onboarder
|
||||||
|
user.onboarder_assigned_at = Date.today
|
||||||
|
user.save
|
||||||
|
end
|
||||||
|
|
||||||
|
if onboarder
|
||||||
|
msg = 'Assigned ' + User.find(onboarder).name + " to #{ids.length} users"
|
||||||
|
|
||||||
|
else
|
||||||
|
msg = "Unassigned any Support Consultant from #{ids.length} users"
|
||||||
|
end
|
||||||
|
|
||||||
|
redirect_to :back, notice: msg
|
||||||
|
end
|
||||||
|
|
||||||
|
filter :jamuser_full_name_or_email_cont, label: 'Name Or Email', as: :string
|
||||||
|
filter :onboarder, as: :select, :collection => User.where(is_onboarder: true), label: 'Support Consultant'
|
||||||
|
filter :onboarder_id_blank, :as => :boolean, label: 'Unassigned'
|
||||||
|
filter :onboarding_escalation_reason_present, :as => :boolean, label: 'Escalated'
|
||||||
|
scope("Unassigned", default: true) { |scope| scope.joins(:posa_cards).where(onboarding_status: User::ONBOARDING_STATUS_UNASSIGNED).where('posa_cards.lesson_package_type_id in (?)', LessonPackageType::AMAZON_PACKAGES + LessonPackageType::LESSON_PACKAGE_TYPES) }
|
||||||
|
scope("Escalated") { |scope| scope.joins(:posa_cards).where('onboarding_status = ?', User::ONBOARDING_STATUS_ESCALATED).where('posa_cards.lesson_package_type_id in (?)', LessonPackageType::AMAZON_PACKAGES + LessonPackageType::LESSON_PACKAGE_TYPES) }
|
||||||
|
scope("Needs Manual Email") { |scope| scope.joins(:posa_cards).where(onboarding_status: User::ONBOARDING_STATUS_ONBOARDED).where('(stuck_take_flesson = TRUE AND sent_admin_take_flesson_email_at is NULL) OR (stuck_take_2nd_flesson = TRUE AND sent_admin_take_2nd_flesson_email_at IS NULL) OR (stuck_take_plesson = TRUE AND sent_admin_take_plesson_email_at IS NULL)').where('posa_cards.lesson_package_type_id in (?)', LessonPackageType::AMAZON_PACKAGES + LessonPackageType::LESSON_PACKAGE_TYPES) }
|
||||||
|
scope("Assigned") { |scope| scope.joins(:posa_cards).where('onboarding_status = ? OR onboarding_status = ?', User::ONBOARDING_STATUS_ASSIGNED, User::ONBOARDING_STATUS_EMAILED).where('posa_cards.lesson_package_type_id in (?)', LessonPackageType::AMAZON_PACKAGES + LessonPackageType::LESSON_PACKAGE_TYPES) }
|
||||||
|
scope("All TestDrive/Amazon Users") { |scope| scope.joins(:posa_cards).where('posa_cards.lesson_package_type_id in (?)', LessonPackageType::AMAZON_PACKAGES + LessonPackageType::LESSON_PACKAGE_TYPES) }
|
||||||
|
|
||||||
|
|
||||||
|
controller do
|
||||||
|
active_admin_config.includes.push :onboarding_users
|
||||||
|
end
|
||||||
|
|
||||||
|
index do
|
||||||
|
selectable_column
|
||||||
|
column "Name" do |user|
|
||||||
|
link_to user.name, user.admin_url
|
||||||
|
end
|
||||||
|
column :email
|
||||||
|
column :onboarding_status
|
||||||
|
column "Lost Reason", :onboarding_lost_reason
|
||||||
|
column "Escalated Reason", :onboarding_escalation_reason
|
||||||
|
column "Support Consultant" do |user|
|
||||||
|
if user.onboarder
|
||||||
|
link_to "#{user.onboarder.name} (#{user.onboarder.onboarding_users.where('onboarding_status = ? OR onboarding_status = ?', User::ONBOARDING_STATUS_ASSIGNED, User::ONBOARDING_STATUS_EMAILED).count})", user.onboarder.admin_url
|
||||||
|
else
|
||||||
|
end
|
||||||
|
end
|
||||||
|
column "Manual Email Needed" do |user|
|
||||||
|
|
||||||
|
div do
|
||||||
|
if user.stuck_take_plesson
|
||||||
|
link_to("sent take paid lesson email", mark_sent_paid_lesson_admin_onboarder_management_path(user.id), {'data-confirm': "You sent an email manually to the user to remind them to take a paid lesson?"})
|
||||||
|
elsif user.stuck_take_2nd_flesson
|
||||||
|
link_to("sent take 2nd lesson email", mark_sent_2nd_free_lesson_admin_onboarder_management_path(user.id), {'data-confirm': "You sent an email manually to the user to remind them to take 2nd free lesson?"})
|
||||||
|
elsif user.stuck_take_flesson
|
||||||
|
link_to("sent take 1st lesson email", mark_sent_1st_free_lesson_admin_onboarder_management_path(user.id), {'data-confirm': "You sent an email manually to the user to remind them to take a 1st free lesson?"})
|
||||||
|
else
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
column "Signup" do |user|
|
||||||
|
user.created_at.to_date
|
||||||
|
end
|
||||||
|
column "Assigned", :onboarder_assigned_at
|
||||||
|
column "Email 1", :onboarding_email_1_sent_at
|
||||||
|
column "Email 2", :onboarding_email_2_sent_at
|
||||||
|
column "Email 3", :onboarding_email_3_sent_at
|
||||||
|
column "Email 4", :onboarding_email_4_sent_at
|
||||||
|
column "Email 5", :onboarding_email_5_sent_at
|
||||||
|
column "Test Session", :onboarding_test_session_scheduled_at
|
||||||
|
column "Admin Actions" do |user|
|
||||||
|
div do
|
||||||
|
if user.is_waiting_onboarding || user.is_onboarding
|
||||||
|
link_to("mark onboarded", mark_onboarded_admin_onboarder_management_path(user.id), { 'data-confirm': "Mark onboarded?"})
|
||||||
|
end
|
||||||
|
if user.is_waiting_onboarding || user.is_onboarding
|
||||||
|
link_to("mark lost", mark_lost_admin_onboarder_management_path(user.id), { 'data-confirm': "Mark lost (reason = Other)?"})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
column "Onboarder Notes", :onboarding_onboarder_notes
|
||||||
|
end
|
||||||
|
|
||||||
|
member_action :update_onboarder, :method => :post do
|
||||||
|
resource.onboarder = params[:onboarder]
|
||||||
|
resource.save!
|
||||||
|
redirect_to :back
|
||||||
|
end
|
||||||
|
|
||||||
|
member_action :mark_sent_paid_lesson, :method => :get do
|
||||||
|
resource.mark_sent_paid_lesson
|
||||||
|
redirect_to :back
|
||||||
|
end
|
||||||
|
|
||||||
|
member_action :mark_sent_2nd_free_lesson, :method => :get do
|
||||||
|
resource.mark_sent_2nd_free_lesson
|
||||||
|
redirect_to :back
|
||||||
|
end
|
||||||
|
|
||||||
|
member_action :mark_sent_1st_free_lesson, :method => :get do
|
||||||
|
resource.mark_sent_1st_free_lesson
|
||||||
|
redirect_to :back
|
||||||
|
end
|
||||||
|
|
||||||
|
member_action :mark_onboarded, :method => :get do
|
||||||
|
resource.mark_onboarded
|
||||||
|
redirect_to :back
|
||||||
|
end
|
||||||
|
|
||||||
|
member_action :mark_lost, :method => :get do
|
||||||
|
resource.mark_lost
|
||||||
|
redirect_to :back
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,117 @@
|
||||||
|
ActiveAdmin.register_page "POSA Card Uploads" do
|
||||||
|
|
||||||
|
menu :label => 'Posa Cards Upload', :parent => 'JamClass'
|
||||||
|
|
||||||
|
page_action :upload_posacards, :method => :post do
|
||||||
|
PosaCard.transaction do
|
||||||
|
|
||||||
|
puts params
|
||||||
|
|
||||||
|
file = params[:jam_ruby_posa_card][:csv]
|
||||||
|
array_of_arrays = CSV.read(file.tempfile.path)
|
||||||
|
array_of_arrays.each do |row|
|
||||||
|
if row.length != 5
|
||||||
|
raise "UKNONWN CSV FORMAT! Must be 5 columns"
|
||||||
|
end
|
||||||
|
|
||||||
|
code = row[0]
|
||||||
|
lesson_package_type = row[1]
|
||||||
|
preactivate = row[2].strip.downcase == "true"
|
||||||
|
requires_purchase = row[3].downcase== "true"
|
||||||
|
is_test = row[4].strip.downcase == "true"
|
||||||
|
|
||||||
|
posa_card = PosaCard.new
|
||||||
|
posa_card.code = code
|
||||||
|
posa_card.lesson_package_type = LessonPackageType.find(lesson_package_type)
|
||||||
|
posa_card.preactivate = preactivate
|
||||||
|
posa_card.requires_purchase = requires_purchase
|
||||||
|
posa_card.purchased = !requires_purchase
|
||||||
|
posa_card.card_type = params[:jam_ruby_posa_card][:card_type]
|
||||||
|
posa_card.is_test = is_test
|
||||||
|
|
||||||
|
|
||||||
|
if posa_card.card_type == PosaCard::JAM_CLASS_4
|
||||||
|
posa_card.is_lesson = true
|
||||||
|
posa_card.credits = 4
|
||||||
|
elsif posa_card.card_type == PosaCard::JAM_CLASS_2
|
||||||
|
posa_card.is_lesson = true
|
||||||
|
posa_card.credits = 2
|
||||||
|
end
|
||||||
|
posa_card.origin = file .original_filename
|
||||||
|
posa_card.save!
|
||||||
|
end
|
||||||
|
|
||||||
|
redirect_to admin_posa_card_uploads_path, :notice => "Created #{array_of_arrays.length} POSA cards!"
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
=begin
|
||||||
|
form :html => {:multipart => true} do |f|
|
||||||
|
f.inputs "Details" do
|
||||||
|
f.input :version, :hint => "Should match Jenkins build number of artifact"
|
||||||
|
f.input :environment, :hint => "Typically just 'public'"
|
||||||
|
f.input :product, :as => :select, :collection => JamRuby::ArtifactUpdate::PRODUCTS
|
||||||
|
end
|
||||||
|
f.inputs "Artifact Upload" do
|
||||||
|
f.input :uri, :as => :file, :hint => "Upload the artifact from Jenkins"
|
||||||
|
end
|
||||||
|
|
||||||
|
f.actions
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
# fr manual entry of huge CSVs from rails c command line
|
||||||
|
|
||||||
|
PosaCard.transaction do
|
||||||
|
|
||||||
|
|
||||||
|
array_of_arrays = CSV.read('codes.csv')
|
||||||
|
array_of_arrays.each do |row|
|
||||||
|
if row.length != 5
|
||||||
|
raise "UKNONWN CSV FORMAT! Must be 5 columns"
|
||||||
|
end
|
||||||
|
|
||||||
|
code = row[0]
|
||||||
|
lesson_package_type = row[1]
|
||||||
|
preactivate = row[2].strip.downcase == "true"
|
||||||
|
requires_purchase = row[3].downcase== "true"
|
||||||
|
is_test = row[4].strip.downcase == "true"
|
||||||
|
|
||||||
|
posa_card = PosaCard.new
|
||||||
|
posa_card.code = code
|
||||||
|
posa_card.lesson_package_type = LessonPackageType.find(lesson_package_type)
|
||||||
|
posa_card.preactivate = preactivate
|
||||||
|
posa_card.requires_purchase = requires_purchase
|
||||||
|
posa_card.purchased = !requires_purchase
|
||||||
|
posa_card.card_type = 'jam_class_2'
|
||||||
|
posa_card.is_test = is_test
|
||||||
|
|
||||||
|
|
||||||
|
if posa_card.card_type == PosaCard::JAM_CLASS_4
|
||||||
|
posa_card.is_lesson = true
|
||||||
|
posa_card.credits = 4
|
||||||
|
elsif posa_card.card_type == PosaCard::JAM_CLASS_2
|
||||||
|
posa_card.is_lesson = true
|
||||||
|
posa_card.credits = 2
|
||||||
|
end
|
||||||
|
posa_card.origin = 'posa-cards-amazon-test-drive-paid-4-50k.csv'
|
||||||
|
posa_card.save!
|
||||||
|
end
|
||||||
|
end
|
||||||
|
=end
|
||||||
|
|
||||||
|
content do
|
||||||
|
active_admin_form_for PosaCard.new, :url => admin_posa_card_uploads_upload_posacards_path, :builder => ActiveAdmin::FormBuilder do |f|
|
||||||
|
f.inputs "Upload POSA Cards" do
|
||||||
|
f.input :csv, as: :file, required: true, :label => "A single column CSV that contains ONE type of gift card (5 JamTrack, 10 JamTrack, 4 JamClass etc)"
|
||||||
|
f.input :card_type, required:true, as: :select, :collection => JamRuby::PosaCard::CARD_TYPES
|
||||||
|
|
||||||
|
end
|
||||||
|
f.actions
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
|
@ -18,7 +18,7 @@ ActiveAdmin.register JamRuby::PromoBuzz, :as => 'Buzz' do
|
||||||
column 'State' do |pp| pp.aasm_state end
|
column 'State' do |pp| pp.aasm_state end
|
||||||
column 'Position' do |pp| pp.position end
|
column 'Position' do |pp| pp.position end
|
||||||
column 'Updated' do |pp| pp.updated_at end
|
column 'Updated' do |pp| pp.updated_at end
|
||||||
default_actions
|
actions
|
||||||
end
|
end
|
||||||
|
|
||||||
show do
|
show do
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ ActiveAdmin.register JamRuby::PromoLatest, :as => 'Latest' do
|
||||||
column 'State' do |pp| pp.aasm_state end
|
column 'State' do |pp| pp.aasm_state end
|
||||||
column 'Position' do |pp| pp.position end
|
column 'Position' do |pp| pp.position end
|
||||||
column 'Updated' do |pp| pp.updated_at end
|
column 'Updated' do |pp| pp.updated_at end
|
||||||
default_actions
|
actions
|
||||||
end
|
end
|
||||||
|
|
||||||
show do
|
show do
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ ActiveAdmin.register JamRuby::RecurlyTransactionWebHook, :as => 'RecurlyHooks'
|
||||||
|
|
||||||
index do
|
index do
|
||||||
|
|
||||||
default_actions
|
actions
|
||||||
|
|
||||||
column :transaction_type
|
column :transaction_type
|
||||||
column :transaction_at
|
column :transaction_at
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,51 @@
|
||||||
|
ActiveAdmin.register JamRuby::SaleLineItem, :as => 'Sale Line Items' do
|
||||||
|
|
||||||
|
menu :label => 'Line Items', :parent => 'Purchases'
|
||||||
|
|
||||||
|
config.sort_order = 'created_at DESC'
|
||||||
|
config.batch_actions = false
|
||||||
|
config.clear_action_items!
|
||||||
|
config.filters = true
|
||||||
|
config.per_page = 50
|
||||||
|
config.paginate = true
|
||||||
|
|
||||||
|
filter :affiliate_referral_id
|
||||||
|
filter :free
|
||||||
|
|
||||||
|
form :partial => 'form'
|
||||||
|
|
||||||
|
scope("Non Free", default: true) { |scope| scope.where(free: false).order('created_at desc') }
|
||||||
|
scope("Free") { |scope| scope.where(free: true).order('created_at desc') }
|
||||||
|
|
||||||
|
index do
|
||||||
|
# default_actions # use this for all view/edit/delete links
|
||||||
|
|
||||||
|
column 'Product' do |oo| oo.product end
|
||||||
|
column "Partner" do |oo|
|
||||||
|
link_to("#{oo.affiliate_referral.display_name} #{oo.affiliate_referral_fee_in_cents ? "#{oo.affiliate_referral_fee_in_cents}\u00A2" : ''}", oo.affiliate_referral.admin_url, {:title => oo.affiliate_referral.display_name}) if oo.affiliate_referral
|
||||||
|
end
|
||||||
|
column 'User' do |oo|
|
||||||
|
if oo.sale.user
|
||||||
|
link_to(oo.sale.user.name, admin_user_path(oo.sale.user.id), {:title => oo.sale.user.name})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
column 'Source' do |oo|
|
||||||
|
if oo.sale.source == JamRuby::Sale::SOURCE_PAYPAL
|
||||||
|
link_to(oo.sale.source, 'https://history.paypal.com/webscr?cmd=_history-details-from-hub&id=' + oo.sale.recurly_invoice_id)
|
||||||
|
else
|
||||||
|
oo.sale.source
|
||||||
|
end
|
||||||
|
end
|
||||||
|
column 'When' do |oo|
|
||||||
|
oo.created_at
|
||||||
|
end
|
||||||
|
column 'Link' do |oo|
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
controller do
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,129 @@
|
||||||
|
ActiveAdmin.register_page "SchoolUserUploads" do
|
||||||
|
|
||||||
|
menu :label => 'School User Upload', :parent => 'Misc'
|
||||||
|
|
||||||
|
page_action :upload_schooluseruploads, :method => :post do
|
||||||
|
User.transaction do
|
||||||
|
|
||||||
|
puts params
|
||||||
|
|
||||||
|
@client = RecurlyClient.new
|
||||||
|
|
||||||
|
file = params[:jam_ruby_user][:csv]
|
||||||
|
|
||||||
|
created = 0
|
||||||
|
errors = 0
|
||||||
|
updated = 0
|
||||||
|
skipped = 0
|
||||||
|
array_of_arrays = CSV.read(file.tempfile.path, headers: true, encoding: 'bom|utf-8')
|
||||||
|
array_of_arrays.each do |row|
|
||||||
|
school_name = row['School Name'].strip
|
||||||
|
school_tag = row['School ID'].strip
|
||||||
|
school = School.autocreate_find_from_upload(school_name, school_tag)
|
||||||
|
first_name = row['First Name'].strip
|
||||||
|
last_name = row['Last Name'].strip
|
||||||
|
email_address = row['Email Address'].strip.downcase
|
||||||
|
license_start = parse_date(row['License Start Date'].strip)
|
||||||
|
license_end = parse_date(row['License End Date'].strip)
|
||||||
|
source = row['Source'].strip
|
||||||
|
password = SecureRandom.uuid
|
||||||
|
options = {
|
||||||
|
first_name: first_name,
|
||||||
|
last_name: last_name,
|
||||||
|
email: email_address,
|
||||||
|
license_start: license_start,
|
||||||
|
license_end: license_end,
|
||||||
|
import_source: source,
|
||||||
|
school_id: school.id,
|
||||||
|
terms_of_service: true,
|
||||||
|
musician: true,
|
||||||
|
skip_recaptcha: true,
|
||||||
|
password: password,
|
||||||
|
password_confirmation: password
|
||||||
|
}
|
||||||
|
|
||||||
|
parse_user_type(row['User Type'].strip, options)
|
||||||
|
|
||||||
|
instrument = Instrument.find('electric guitar')
|
||||||
|
instruments= [{instrument_id: instrument.id, proficiency_level: 3, priority: 1}]
|
||||||
|
options[:instruments] = instruments
|
||||||
|
|
||||||
|
existing = User.find_by_email(options[:email])
|
||||||
|
|
||||||
|
if existing
|
||||||
|
if existing.import_source.nil?
|
||||||
|
if options[:student]
|
||||||
|
existing.school = school
|
||||||
|
existing.is_a_student = true
|
||||||
|
existing.import_source = options[:import_source]
|
||||||
|
existing.license_start = options[:license_start]
|
||||||
|
existing.license_end = options[:license_end]
|
||||||
|
elsif options[:teacher]
|
||||||
|
existing.school = school
|
||||||
|
existing.import_source = options[:import_source]
|
||||||
|
existing.license_start = options[:license_start]
|
||||||
|
existing.license_end = options[:license_end]
|
||||||
|
if existing.teacher.nil?
|
||||||
|
existing.teacher = Teacher.build_teacher(existing, validate_introduction: true, biography: "Empty biography", school_id: school.id)
|
||||||
|
end
|
||||||
|
elsif options[:platform_instructor]
|
||||||
|
existing.import_source = options[:import_source]
|
||||||
|
existing.is_platform_instructor = true
|
||||||
|
existing.license_start = options[:license_start]
|
||||||
|
existing.license_end = options[:license_end]
|
||||||
|
end
|
||||||
|
|
||||||
|
existing.save
|
||||||
|
|
||||||
|
if existing.errors.any?
|
||||||
|
puts "User #{user.name} #{user.email} had errors"
|
||||||
|
puts user.errors.inspect
|
||||||
|
errors = errors + 1
|
||||||
|
else
|
||||||
|
@client.sync_subscription(existing)
|
||||||
|
updated = updated + 1
|
||||||
|
if options[:student]
|
||||||
|
UserMailer.school_welcome_message(existing, nil).deliver_now
|
||||||
|
elsif options[:teacher]
|
||||||
|
UserMailer.school_welcome_message(existing, nil).deliver_now
|
||||||
|
elsif options[:platform_instructor]
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
skipped = skipped + 1
|
||||||
|
end
|
||||||
|
else
|
||||||
|
user = User.signup(options)
|
||||||
|
|
||||||
|
if user.errors.any?
|
||||||
|
puts "User #{user.name} #{user.email} had errors"
|
||||||
|
puts user.errors.inspect
|
||||||
|
errors = errors + 1
|
||||||
|
else
|
||||||
|
@client.sync_subscription(user)
|
||||||
|
puts "User #{user.email} created"
|
||||||
|
created = created + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
redirect_to admin_schooluseruploads_path, :notice => "Created #{created}. Updated #{updated}. Errors #{errors}. Skipped #{skipped}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
content do
|
||||||
|
panel "Help" do
|
||||||
|
link_to "Download Sample CSV", asset_path("Sample_School_User_Upload.csv", target: "_blank", download: "Sample_School_User_Upload.csv")
|
||||||
|
end
|
||||||
|
|
||||||
|
active_admin_form_for User.new, :url => admin_schooluseruploads_upload_schooluseruploads_path, :builder => ActiveAdmin::FormBuilder do |f|
|
||||||
|
f.inputs "Upload School Users" do
|
||||||
|
f.input :csv, as: :file, required: true, :label => "A school user upload"
|
||||||
|
end
|
||||||
|
f.actions
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
@ -0,0 +1,40 @@
|
||||||
|
ActiveAdmin.register JamRuby::School, :as => 'Schools' do
|
||||||
|
|
||||||
|
menu :label => 'Schools', :parent => 'JamClass'
|
||||||
|
|
||||||
|
config.sort_order = 'created_at asc'
|
||||||
|
config.batch_actions = false
|
||||||
|
config.per_page = 100
|
||||||
|
config.paginate = true
|
||||||
|
config.filters = false
|
||||||
|
|
||||||
|
index do
|
||||||
|
|
||||||
|
actions
|
||||||
|
|
||||||
|
column "Name" do |school|
|
||||||
|
school.name
|
||||||
|
end
|
||||||
|
column "Owner" do |school|
|
||||||
|
link_to school.owner.name, "#{Rails.application.config.external_root_url}/client#/profile/#{school.owner.id}"
|
||||||
|
end
|
||||||
|
column "Scheduling Communication" do |school|
|
||||||
|
school.scheduling_communication
|
||||||
|
end
|
||||||
|
column "Correspondence Email" do |school|
|
||||||
|
school.correspondence_email
|
||||||
|
end
|
||||||
|
|
||||||
|
column "Base Fee Rate" do |school|
|
||||||
|
school.jamkazam_rate
|
||||||
|
end
|
||||||
|
column "JamKazam Sourced Fee Rate" do |school|
|
||||||
|
school.base_rate
|
||||||
|
end
|
||||||
|
column "Is Education?" do |school|
|
||||||
|
school.education ? 'Yes' : ''
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,106 @@
|
||||||
|
ActiveAdmin.register JamRuby::LessonSession, :as => 'SlowResponses' do
|
||||||
|
|
||||||
|
menu :label => 'Slow Responses', :parent => 'JamClass'
|
||||||
|
|
||||||
|
config.sort_order = 'created_at desc'
|
||||||
|
config.batch_actions = false
|
||||||
|
config.per_page = 100
|
||||||
|
config.paginate = true
|
||||||
|
config.filters = true
|
||||||
|
|
||||||
|
filter :intervened_at_null, label: 'Not Yet Intervened', as: :boolean
|
||||||
|
|
||||||
|
scope("72 hours since last request/counter", default: true) { |scope| scope.slow_responses }
|
||||||
|
|
||||||
|
member_action :cancel_lesson, :method => :get do
|
||||||
|
result = resource.cancel_by_admin
|
||||||
|
|
||||||
|
if result.errors.any?
|
||||||
|
redirect_to :back, notice: resource.errors.inspect
|
||||||
|
else
|
||||||
|
redirect_to :back, notice: 'Canceled lesson'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
member_action :intervened, :method => :get do
|
||||||
|
resource.intervened
|
||||||
|
redirect_to :back
|
||||||
|
end
|
||||||
|
|
||||||
|
index do
|
||||||
|
column "Not Responded" do |lesson_session|
|
||||||
|
div do
|
||||||
|
if lesson_session.student_last_proposed?
|
||||||
|
"Teacher"
|
||||||
|
else
|
||||||
|
"Student"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
div do
|
||||||
|
late_responder = lesson_session.late_responder
|
||||||
|
span do
|
||||||
|
link_to "#{late_responder.name}", late_responder.admin_url
|
||||||
|
end
|
||||||
|
end
|
||||||
|
div do
|
||||||
|
lesson_session.late_responder.email
|
||||||
|
end
|
||||||
|
end
|
||||||
|
column "Proposer" do |lesson_session|
|
||||||
|
div do
|
||||||
|
if lesson_session.student_last_proposed?
|
||||||
|
"Student"
|
||||||
|
else
|
||||||
|
"Teacher"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
div do
|
||||||
|
last_proposer = lesson_session.last_proposer
|
||||||
|
span do
|
||||||
|
link_to "#{last_proposer.name}", last_proposer.admin_url
|
||||||
|
end
|
||||||
|
end
|
||||||
|
div do
|
||||||
|
lesson_session.last_proposer.email
|
||||||
|
end
|
||||||
|
end
|
||||||
|
column "Lesson Type" do |lesson_session|
|
||||||
|
lesson_session.display_type
|
||||||
|
end
|
||||||
|
column "Proposed Start Time" do |lesson_session|
|
||||||
|
span do
|
||||||
|
if lesson_session.music_session.nil?
|
||||||
|
raise "Lessonsesison with no id #{lesson_session.id}"
|
||||||
|
else
|
||||||
|
link_to lesson_session.music_session.pretty_scheduled_start(true), lesson_session.admin_url
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
column "Days with no response" do |lesson_session|
|
||||||
|
if lesson_session.last_response_time.nil?
|
||||||
|
'N/A'
|
||||||
|
else
|
||||||
|
"#{((Time.now - lesson_session.last_response_time) / 24 / 3600).floor} days"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
column "Num Reqs/Counters" do |lesson_session|
|
||||||
|
ChatMessage.unscoped.where(lesson_session_id: lesson_session.id).where('purpose = ? OR purpose = ?', "Lesson Requested", "New Time Proposed").count(:purpose)
|
||||||
|
end
|
||||||
|
column "Intervene" do |lesson_session|
|
||||||
|
span do
|
||||||
|
if lesson_session.intervened_at
|
||||||
|
lesson_session.intervened_at.to_date
|
||||||
|
else
|
||||||
|
link_to("intervened", intervened_admin_slow_response_path(lesson_session.id), {confirm: "Mark Lesson as 'Intervened' (i.e., email sent to by hand)?"})
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
column "Cancel Lesson" do |lesson_session|
|
||||||
|
span do
|
||||||
|
link_to("cancel", cancel_lesson_admin_slow_response_path(lesson_session.id), {confirm: "Cancel Lesson?"})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,72 @@
|
||||||
|
ActiveAdmin.register JamRuby::User, :as => 'Students' do
|
||||||
|
|
||||||
|
menu :label => 'Students', :parent => 'JamClass'
|
||||||
|
|
||||||
|
config.sort_order = 'created_at desc'
|
||||||
|
config.batch_actions = false
|
||||||
|
config.per_page = 100
|
||||||
|
config.paginate = true
|
||||||
|
config.filters = true
|
||||||
|
|
||||||
|
def booked_anything(scope)
|
||||||
|
scope.joins(:student_lesson_bookings).where('lesson_bookings.active = true').uniq
|
||||||
|
end
|
||||||
|
|
||||||
|
filter :jamuser_full_name_or_email_cont, label: 'Name Or Email', as: :string
|
||||||
|
filter :school, label: 'School'
|
||||||
|
|
||||||
|
scope("TestDrive/Amazon Users", default: true) {|scope| scope.joins(:posa_cards).where('posa_cards.lesson_package_type_id in (?)', LessonPackageType::AMAZON_PACKAGES + LessonPackageType::LESSON_PACKAGE_TYPES) }
|
||||||
|
scope("Student Or Has Credits Or Has Lesson") { |scope| scope.where('is_a_student = true OR jamclass_credits > 0 OR ((select count(id) from lesson_bookings where lesson_bookings.user_id = users.id) > 0)').order('users.ready_for_session_at IS NULL DESC') }
|
||||||
|
|
||||||
|
index do
|
||||||
|
column "Name" do |user|
|
||||||
|
link_to user.name, user.admin_url
|
||||||
|
end
|
||||||
|
column "Email" do |user|
|
||||||
|
user.email
|
||||||
|
end
|
||||||
|
column "Location" do |user|
|
||||||
|
user.location(country = true)
|
||||||
|
end
|
||||||
|
|
||||||
|
column "Session Ready" do |user|
|
||||||
|
div do
|
||||||
|
if user.ready_for_session_at
|
||||||
|
span do
|
||||||
|
'YES'
|
||||||
|
end
|
||||||
|
else
|
||||||
|
span do
|
||||||
|
'NO'
|
||||||
|
end
|
||||||
|
span do
|
||||||
|
br
|
||||||
|
end
|
||||||
|
span do
|
||||||
|
link_to("mark as checked", mark_session_ready_admin_student_path(user.id), {confirm: "Mark as ready for session?"})
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
column "School" do |user|
|
||||||
|
if user.school
|
||||||
|
user.school.name
|
||||||
|
end
|
||||||
|
end
|
||||||
|
column :updated_at
|
||||||
|
end
|
||||||
|
|
||||||
|
member_action :mark_session_ready, :method => :get do
|
||||||
|
resource.mark_session_ready
|
||||||
|
redirect_to :back
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
member_action :mark_session_not_ready, :method => :get do
|
||||||
|
resource.mark_session_not_ready
|
||||||
|
redirect_to :back
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
ActiveAdmin.register User, :as => 'User_Override' do
|
||||||
|
|
||||||
|
menu :label => 'Subscription', :parent => 'Users'
|
||||||
|
|
||||||
|
form title: 'Use This To Give a No-Payment Subscription' do |f|
|
||||||
|
inputs 'Details' do
|
||||||
|
input :admin_override_touch, :as => :hidden, value: 'true'
|
||||||
|
input :admin_override_reason, :as => :text
|
||||||
|
input :admin_override_plan_code, :as => :select, :collection => SubscriptionDefinitions::MONTHLY_PLANS + ['Remove Override']
|
||||||
|
input :admin_override_ends_at, as: :datepicker,
|
||||||
|
datepicker_options: {
|
||||||
|
min_date: Date.today,
|
||||||
|
max_date: "+10Y"
|
||||||
|
}
|
||||||
|
li "User has admin override set to #{f.object.admin_override_plan_code}. Lasts until #{f.object.admin_override_ends_at}" if !f.object.admin_override_plan_code.nil?
|
||||||
|
li "User does not have admin override. They are currently on the #{f.object.subscription_plan_code ? f.object.subscription_plan_code : 'Free'} plan" if f.object.admin_override_plan_code.nil?
|
||||||
|
end
|
||||||
|
panel 'Instructions' do
|
||||||
|
"If you select a plan, the user will have their current subscription (if any) cancelled and set to the new plan for free. If you instead select Remove Override, you can cancel the gifted plan and the user will be o normal free-tier user again."
|
||||||
|
end
|
||||||
|
para "Press cancel to return to the list without saving."
|
||||||
|
actions
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
|
@ -0,0 +1,51 @@
|
||||||
|
ActiveAdmin.register JamRuby::TeacherDistribution, :as => 'TeacherDistributions' do
|
||||||
|
|
||||||
|
menu :label => 'Teacher Distributions', :parent => 'JamClass'
|
||||||
|
|
||||||
|
config.sort_order = 'created_at desc'
|
||||||
|
config.batch_actions = false
|
||||||
|
config.per_page = 100
|
||||||
|
config.paginate = true
|
||||||
|
config.filters = true
|
||||||
|
|
||||||
|
controller do
|
||||||
|
active_admin_config.includes.push :teacher
|
||||||
|
end
|
||||||
|
|
||||||
|
filter :teacher_full_name_or_teacher_email_cont, label: 'Name', as: :string
|
||||||
|
|
||||||
|
index do
|
||||||
|
column "Actions" do |distribution|
|
||||||
|
links = ''.html_safe
|
||||||
|
links << link_to("View", resource_path(distribution), :class => "member_link view_link")
|
||||||
|
links << link_to("Edit", edit_resource_path(distribution), :class => "member_link edit_link")
|
||||||
|
links
|
||||||
|
end
|
||||||
|
column "Teacher" do |distribution|
|
||||||
|
link_to distribution.teacher.name, distribution.teacher.admin_url
|
||||||
|
end
|
||||||
|
column :amount_in_cents
|
||||||
|
column :distributed
|
||||||
|
column :ready
|
||||||
|
column :teacher_fee_in_cents
|
||||||
|
column :reduced_roll_forward_amount_in_cents
|
||||||
|
column :created_at
|
||||||
|
column :updated_at
|
||||||
|
end
|
||||||
|
|
||||||
|
show do
|
||||||
|
attributes_table do
|
||||||
|
row "Teacher" do |distribution|
|
||||||
|
link_to distribution.teacher.name, distribution.teacher.admin_url
|
||||||
|
end
|
||||||
|
row :amount_in_cents
|
||||||
|
row :distributed
|
||||||
|
row :ready
|
||||||
|
row :teacher_fee_in_cents
|
||||||
|
row :reduced_roll_forward_amount_in_cents
|
||||||
|
row :created_at
|
||||||
|
row :updated_at
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,45 @@
|
||||||
|
ActiveAdmin.register JamRuby::TeacherPayment, :as => 'TeacherPayments' do
|
||||||
|
|
||||||
|
menu :label => 'Teacher Payments', :parent => 'JamClass'
|
||||||
|
|
||||||
|
config.sort_order = 'created_at desc'
|
||||||
|
config.batch_actions = false
|
||||||
|
config.per_page = 100
|
||||||
|
config.paginate = true
|
||||||
|
config.filters = true
|
||||||
|
|
||||||
|
controller do
|
||||||
|
active_admin_config.includes.push :teacher
|
||||||
|
end
|
||||||
|
|
||||||
|
filter :teacher_full_name_or_teacher_email_cont, label: 'Name', as: :string
|
||||||
|
|
||||||
|
index do
|
||||||
|
column "Actions" do |payment|
|
||||||
|
links = ''.html_safe
|
||||||
|
links << link_to("View", resource_path(payment), :class => "member_link view_link")
|
||||||
|
links << link_to("Edit", edit_resource_path(payment), :class => "member_link edit_link")
|
||||||
|
links
|
||||||
|
end
|
||||||
|
column "Teacher" do |payment|
|
||||||
|
link_to payment.teacher.name, payment.teacher.admin_url
|
||||||
|
end
|
||||||
|
column :amount_in_cents
|
||||||
|
column :fee_in_cents
|
||||||
|
column :created_at
|
||||||
|
column :updated_at
|
||||||
|
end
|
||||||
|
|
||||||
|
show do
|
||||||
|
attributes_table do
|
||||||
|
row "Teacher" do |payment|
|
||||||
|
link_to payment.teacher.name, payment.teacher.admin_url
|
||||||
|
end
|
||||||
|
row :amount_in_cents
|
||||||
|
row :fee_in_cents
|
||||||
|
row :created_at
|
||||||
|
row :updated_at
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,364 @@
|
||||||
|
ActiveAdmin.register JamRuby::Teacher, :as => 'Teachers' do
|
||||||
|
|
||||||
|
menu :label => 'Teachers', :parent => 'JamClass'
|
||||||
|
|
||||||
|
config.sort_order = 'created_at desc'
|
||||||
|
config.batch_actions = false
|
||||||
|
config.per_page = 100
|
||||||
|
config.paginate = true
|
||||||
|
config.filters = true
|
||||||
|
|
||||||
|
scope("All", default: true) { |scope| scope.order("background_check_at > '#{(Date.today - 365).to_s}}' NULLS FIRST, teachers.ready_for_session_at IS NULL DESC") }
|
||||||
|
scope("All Sorted By Sign Up") { |scope| scope.order("teachers.created_at DESC, background_check_at > '#{(Date.today - 365).to_s}}' NULLS FIRST, teachers.ready_for_session_at IS NULL DESC") }
|
||||||
|
scope("50% and Session Ready") { |scope| scope.where('profile_pct >= ?', 50.0).where('teachers.ready_for_session_at IS NOT NULL').order("background_check_at > '#{(Date.today - 365).to_s}}' NULLS FIRST, teachers.ready_for_session_at IS NULL DESC") }
|
||||||
|
scope("50% and Not Session Ready") { |scope| scope.where('profile_pct > ?', 50.0).where('teachers.ready_for_session_at IS NULL').order("background_check_at > '#{(Date.today - 365).to_s}}' NULLS FIRST, teachers.ready_for_session_at IS NULL DESC") }
|
||||||
|
|
||||||
|
controller do
|
||||||
|
active_admin_config.includes.push :user
|
||||||
|
end
|
||||||
|
|
||||||
|
filter :teacher_full_name_or_user_email_cont, label: 'Name', as: :string
|
||||||
|
filter :user_phantom, label: 'Phantom ', as: :boolean, selected: 'false'
|
||||||
|
|
||||||
|
#filter :by_search_user_name, label: "Name", as: :string
|
||||||
|
|
||||||
|
index do
|
||||||
|
column "Name" do |teacher|
|
||||||
|
span do
|
||||||
|
link_to "#{teacher.user.name} (#{teacher.user.email})", "#{Rails.application.config.external_root_url}/client#/profile/teacher/#{teacher.user.id}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
column "Instruments & Genres" do |teacher|
|
||||||
|
div do
|
||||||
|
div do
|
||||||
|
teacher.instruments.join(', ')
|
||||||
|
end
|
||||||
|
br
|
||||||
|
div do
|
||||||
|
teacher.genres.join(', ')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
column "Location" do |teacher|
|
||||||
|
teacher.user.location(country = true)
|
||||||
|
end
|
||||||
|
column "Profile %" do |teacher|
|
||||||
|
div do
|
||||||
|
span do
|
||||||
|
"#{teacher.pct_complete[:pct]}%"
|
||||||
|
end
|
||||||
|
br
|
||||||
|
span do
|
||||||
|
link_to "Detail", admin_teacher_path(teacher.id)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
column "Background Check" do |teacher|
|
||||||
|
div do
|
||||||
|
if teacher.background_check_at
|
||||||
|
span do
|
||||||
|
teacher.background_check_at.to_date
|
||||||
|
end
|
||||||
|
span do
|
||||||
|
br
|
||||||
|
end
|
||||||
|
span do
|
||||||
|
link_to(edit_admin_teacher_background_check_path(teacher.id)) do
|
||||||
|
"update background check"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
span do
|
||||||
|
'NO'
|
||||||
|
end
|
||||||
|
span do
|
||||||
|
br
|
||||||
|
end
|
||||||
|
span do
|
||||||
|
link_to("update background check", edit_admin_teacher_background_check_path(teacher.id))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
column "Session Ready" do |teacher|
|
||||||
|
div do
|
||||||
|
if teacher.ready_for_session_at
|
||||||
|
span do
|
||||||
|
'YES'
|
||||||
|
end
|
||||||
|
span do
|
||||||
|
br
|
||||||
|
end
|
||||||
|
span do
|
||||||
|
link_to("mark not checked", mark_not_session_ready_admin_teacher_path(teacher.id), {confirm: "Mark not ready for session??"})
|
||||||
|
end
|
||||||
|
else
|
||||||
|
span do
|
||||||
|
'NO'
|
||||||
|
end
|
||||||
|
span do
|
||||||
|
br
|
||||||
|
end
|
||||||
|
span do
|
||||||
|
link_to("mark as checked", mark_session_ready_admin_teacher_path(teacher.id), {confirm: "Mark as ready for session?"})
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
column "Top Teacher" do |teacher|
|
||||||
|
div do
|
||||||
|
if teacher.top_rated
|
||||||
|
span do
|
||||||
|
'YES'
|
||||||
|
end
|
||||||
|
span do
|
||||||
|
br
|
||||||
|
end
|
||||||
|
span do
|
||||||
|
link_to("mark not top", mark_not_top_admin_teacher_path(teacher.id), {confirm: "Mark as not top rated?"})
|
||||||
|
end
|
||||||
|
else
|
||||||
|
span do
|
||||||
|
'NO'
|
||||||
|
end
|
||||||
|
span do
|
||||||
|
br
|
||||||
|
end
|
||||||
|
span do
|
||||||
|
link_to("mark as top", mark_top_admin_teacher_path(teacher.id), {confirm: "Mark as top rated?"})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
column "Signed Up" do |teacher|
|
||||||
|
teacher.created_at.to_date
|
||||||
|
end
|
||||||
|
column "School" do |teacher|
|
||||||
|
if teacher.school
|
||||||
|
teacher.school.name
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
show do
|
||||||
|
attributes_table do
|
||||||
|
row "Name" do |teacher|
|
||||||
|
link_to teacher.user.name, "#{Rails.application.config.external_root_url}/client#/profile/teacher/#{teacher.user.id}"
|
||||||
|
end
|
||||||
|
row "Email" do |teacher|
|
||||||
|
teacher.user.email
|
||||||
|
end
|
||||||
|
row "Location" do |teacher|
|
||||||
|
teacher.user.location(country = true)
|
||||||
|
end
|
||||||
|
row "Profile %" do |teacher|
|
||||||
|
div do
|
||||||
|
span do
|
||||||
|
"#{teacher.pct_complete[:pct]}%"
|
||||||
|
end
|
||||||
|
br
|
||||||
|
br
|
||||||
|
div do
|
||||||
|
h5 do
|
||||||
|
"Completed Sections"
|
||||||
|
end
|
||||||
|
teacher.pct_complete.each do |k, v|
|
||||||
|
if k != :pct && v
|
||||||
|
div do
|
||||||
|
k
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
br
|
||||||
|
br
|
||||||
|
h5 do
|
||||||
|
"Uncompleted Sections"
|
||||||
|
end
|
||||||
|
teacher.pct_complete.each do |k, v|
|
||||||
|
if k != :pct && !v
|
||||||
|
div do
|
||||||
|
k
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
=begin
|
||||||
|
row "Background Check" do |teacher|
|
||||||
|
div do
|
||||||
|
if teacher.background_check_at
|
||||||
|
span do
|
||||||
|
teacher.background_check_at.to_date
|
||||||
|
end
|
||||||
|
span do
|
||||||
|
br
|
||||||
|
end
|
||||||
|
span do
|
||||||
|
link_to(mark_background_check_admin_teacher_path(teacher.id), {confirm: "Mark as background checked?"}) do
|
||||||
|
"mark as checked"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
span do
|
||||||
|
'NOT DONE'
|
||||||
|
end
|
||||||
|
span do
|
||||||
|
br
|
||||||
|
end
|
||||||
|
span do
|
||||||
|
link_to("mark as checked", mark_background_check_admin_teacher_path(teacher.id), {confirm: "Mark as background checked?"})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
=end
|
||||||
|
|
||||||
|
row "Session Ready" do |teacher|
|
||||||
|
div do
|
||||||
|
if teacher.ready_for_session_at
|
||||||
|
span do
|
||||||
|
'YES'
|
||||||
|
end
|
||||||
|
span do
|
||||||
|
br
|
||||||
|
end
|
||||||
|
span do
|
||||||
|
link_to("mark not checked", mark_not_session_ready_admin_teacher_path(teacher.id), {confirm: "Mark not ready for session??"})
|
||||||
|
end
|
||||||
|
else
|
||||||
|
span do
|
||||||
|
'NO'
|
||||||
|
end
|
||||||
|
span do
|
||||||
|
br
|
||||||
|
end
|
||||||
|
span do
|
||||||
|
link_to("mark as checked", mark_session_ready_admin_teacher_path(teacher.id), {confirm: "Mark as ready for session?"})
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
row "Top Teacher" do |teacher|
|
||||||
|
div do
|
||||||
|
if teacher.top_rated
|
||||||
|
span do
|
||||||
|
'YES'
|
||||||
|
end
|
||||||
|
span do
|
||||||
|
br
|
||||||
|
end
|
||||||
|
span do
|
||||||
|
link_to("mark not top", mark_not_top_admin_teacher_path(teacher.id), {confirm: "Mark as not top rated?"})
|
||||||
|
end
|
||||||
|
else
|
||||||
|
span do
|
||||||
|
'NO'
|
||||||
|
end
|
||||||
|
span do
|
||||||
|
br
|
||||||
|
end
|
||||||
|
span do
|
||||||
|
link_to("mark as top", mark_top_admin_teacher_path(teacher.id), {confirm: "Mark as top rated?"})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
row "Signed Up" do |teacher|
|
||||||
|
teacher.created_at.to_date
|
||||||
|
end
|
||||||
|
|
||||||
|
row "School" do |teacher|
|
||||||
|
if teacher.school
|
||||||
|
teacher.school.name
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
row "Booking Prices" do |teacher|
|
||||||
|
div do
|
||||||
|
table = teacher.booking_price_table
|
||||||
|
if table[:single].length == 0 and table[:monthly].length == 0
|
||||||
|
'No Pricing'
|
||||||
|
else
|
||||||
|
if table[:single].length > 0
|
||||||
|
div do
|
||||||
|
span do
|
||||||
|
'SINGLE'
|
||||||
|
end
|
||||||
|
span do
|
||||||
|
br
|
||||||
|
end
|
||||||
|
table[:single].each do |single|
|
||||||
|
span do
|
||||||
|
"#{single[:minutes]} min = $#{'%.2f' % (single[:price]/100.0)}"
|
||||||
|
end
|
||||||
|
span do
|
||||||
|
br
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if table[:monthly].length > 0
|
||||||
|
div do
|
||||||
|
span do
|
||||||
|
'MONTHLY'
|
||||||
|
end
|
||||||
|
span do
|
||||||
|
br
|
||||||
|
end
|
||||||
|
table[:monthly].each do |monthly|
|
||||||
|
span do
|
||||||
|
"#{monthly[:minutes]} min = $#{'%.2f' % (monthly[:price]/100.0)}"
|
||||||
|
end
|
||||||
|
span do
|
||||||
|
br
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
member_action :mark_background_check, :method => :get do
|
||||||
|
resource.mark_background_checked
|
||||||
|
redirect_to :back
|
||||||
|
end
|
||||||
|
|
||||||
|
member_action :mark_session_ready, :method => :get do
|
||||||
|
resource.mark_session_ready
|
||||||
|
redirect_to :back
|
||||||
|
end
|
||||||
|
|
||||||
|
member_action :mark_not_session_ready, :method => :get do
|
||||||
|
resource.mark_not_session_ready
|
||||||
|
redirect_to :back
|
||||||
|
end
|
||||||
|
|
||||||
|
member_action :mark_top, :method => :get do
|
||||||
|
resource.mark_top_rated
|
||||||
|
redirect_to :back
|
||||||
|
end
|
||||||
|
|
||||||
|
member_action :mark_not_top, :method => :get do
|
||||||
|
resource.mark_not_top_rated
|
||||||
|
redirect_to :back
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,102 @@
|
||||||
|
ActiveAdmin.register JamRuby::TestDrivePackage, :as => 'TestDrivePackage' do
|
||||||
|
|
||||||
|
menu :label => 'Test Drive Packages', :parent => 'JamClass'
|
||||||
|
|
||||||
|
config.sort_order = 'created_at desc'
|
||||||
|
config.batch_actions = false
|
||||||
|
config.per_page = 100
|
||||||
|
config.paginate = true
|
||||||
|
config.filters = false
|
||||||
|
|
||||||
|
form :partial => 'form'
|
||||||
|
|
||||||
|
|
||||||
|
controller do
|
||||||
|
=begin
|
||||||
|
def new
|
||||||
|
test_drive_package = TestDrivePackage.new
|
||||||
|
t = TestDrivePackageTeacher.new
|
||||||
|
t.test_drive_package = test_drive_package
|
||||||
|
test_drive_package.test_drive_package_teachers << t
|
||||||
|
|
||||||
|
t = TestDrivePackageTeacher.new
|
||||||
|
t.test_drive_package = test_drive_package
|
||||||
|
test_drive_package.test_drive_package_teachers << t
|
||||||
|
|
||||||
|
@test_drive_package = test_drive_package
|
||||||
|
puts "OK #{test_drive_package.test_drive_package_teachers.length}"
|
||||||
|
super
|
||||||
|
end
|
||||||
|
=end
|
||||||
|
|
||||||
|
|
||||||
|
# def create
|
||||||
|
# puts params.inspect
|
||||||
|
# hash = params[:jam_ruby_test_drive_package]
|
||||||
|
# package = TestDrivePackage.new
|
||||||
|
# package.name = hash[:name]
|
||||||
|
# package.package_type = hash[:package_type]
|
||||||
|
# package.description = hash[:description]
|
||||||
|
# if package.save
|
||||||
|
# redirect_to admin_test_drive_package_path(package.id)
|
||||||
|
# else
|
||||||
|
# redirect_to admin_test_drive_packages_path, :notice => "Unable to create package. Error: #{package.errors.first[1][0]}"
|
||||||
|
# end
|
||||||
|
#end
|
||||||
|
end
|
||||||
|
index do
|
||||||
|
|
||||||
|
column "Package ID" do |package|
|
||||||
|
link_to package.name, "#{APP_CONFIG.external_root_url}/landing/jamclass/students?utm-teachers=#{package.name}"
|
||||||
|
end
|
||||||
|
|
||||||
|
column "Package Type" do |package|
|
||||||
|
package.package_type
|
||||||
|
end
|
||||||
|
|
||||||
|
column "Teachers" do |package|
|
||||||
|
package.test_drive_package_teachers.each do |package_teacher|
|
||||||
|
|
||||||
|
span do
|
||||||
|
teacher = package_teacher.user
|
||||||
|
link_to "#{teacher.name} (#{teacher.email})", "#{Rails.application.config.external_root_url}/client#/profile/teacher/#{teacher.id}"
|
||||||
|
end
|
||||||
|
br
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
column "Detail" do |package|
|
||||||
|
link_to "Detail", admin_test_drive_package_path(package.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
show do
|
||||||
|
|
||||||
|
attributes_table do
|
||||||
|
row "Package ID" do |package|
|
||||||
|
link_to package.name, "#{APP_CONFIG.external_root_url}/landing/jamclass/students?utm-teachers=#{package.name}"
|
||||||
|
end
|
||||||
|
|
||||||
|
row "Package Type" do |package|
|
||||||
|
package.package_type
|
||||||
|
end
|
||||||
|
|
||||||
|
row "Teachers" do |package|
|
||||||
|
package.test_drive_package_teachers.each do |package_teacher|
|
||||||
|
|
||||||
|
span do
|
||||||
|
teacher = package_teacher.user
|
||||||
|
link_to "#{teacher.name} (#{teacher.email})", "#{Rails.application.config.external_root_url}/client#/profile/teacher/#{teacher.id}"
|
||||||
|
end
|
||||||
|
br
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
row "Description" do |package|
|
||||||
|
package.description
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
@ -15,7 +15,7 @@ ActiveAdmin.register_page "Test Jobs" do
|
||||||
|
|
||||||
content do
|
content do
|
||||||
|
|
||||||
semantic_form_for LongRunning.new, :url => admin_test_jobs_long_running_path, :builder => ActiveAdmin::FormBuilder do |f|
|
active_admin_form_for LongRunning.new, :url => admin_test_jobs_long_running_path, :builder => ActiveAdmin::FormBuilder do |f|
|
||||||
f.inputs "Queue a long running job" do
|
f.inputs "Queue a long running job" do
|
||||||
f.input :time
|
f.input :time
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
ActiveAdmin.register_page "Top Selling JamTracks" do
|
||||||
|
menu :parent => 'Reports'
|
||||||
|
|
||||||
|
top_selling_jamtracks = JamTrack.select([:id, :original_artist, :name, :has_tap_in]).find_by_sql("select count(jam_tracks.id) as count , jam_tracks.id, original_artist, name, (jmep_text is not null) has_tap_in from jam_tracks inner join jam_track_rights on (jam_track_rights.jam_track_id = jam_tracks.id AND jam_track_rights.is_test_purchase = false) group by jam_tracks.id order by count(jam_tracks.id) desc ")
|
||||||
|
|
||||||
|
content :title => "Top Selling JamTracks" do
|
||||||
|
table_for top_selling_jamtracks do
|
||||||
|
column "Count", :count
|
||||||
|
column "Original Artist", :original_artist
|
||||||
|
column "Name", :name
|
||||||
|
column "Has Count-in", :has_tap_in
|
||||||
|
|
||||||
|
column "ID", :id
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,31 @@
|
||||||
|
ActiveAdmin.register JamRuby::Teacher, :as => 'TeacherBackgroundCheck' do
|
||||||
|
|
||||||
|
|
||||||
|
config.filters = false
|
||||||
|
menu :label => 'Teacher Background Check', :parent => 'JamClass'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
form do |f|
|
||||||
|
f.inputs 'Set Background Check' do
|
||||||
|
f.input :background_check_at, as: :date_select
|
||||||
|
end
|
||||||
|
f.actions
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
index do
|
||||||
|
column "Actions" do |teacher|
|
||||||
|
links = ''.html_safe
|
||||||
|
links << link_to("View", resource_path(teacher), :class => "member_link view_link")
|
||||||
|
links << link_to("Edit", edit_resource_path(teacher), :class => "member_link edit_link")
|
||||||
|
links
|
||||||
|
end
|
||||||
|
|
||||||
|
column 'User' do |oo|
|
||||||
|
oo.user.email
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
ActiveAdmin.register JamRuby::UserBlacklist, :as => 'User Blacklist' do
|
||||||
|
|
||||||
|
menu :label => 'User Blacklist', :parent => 'Operations'
|
||||||
|
|
||||||
|
config.sort_order = 'created_at desc'
|
||||||
|
config.batch_actions = false
|
||||||
|
|
||||||
|
index do
|
||||||
|
column :user
|
||||||
|
column :notes
|
||||||
|
column :created_at
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
ActiveAdmin.register_page "Latency Between Users" do
|
||||||
|
menu parent: 'Users'
|
||||||
|
|
||||||
|
content :title => "Latency Between Users" do
|
||||||
|
render 'admin/users/users_latency_form'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
ActiveAdmin.register_page "Latency Recommendation" do
|
||||||
|
menu parent: 'Users'
|
||||||
|
|
||||||
|
content :title => "Latency Recommentation" do
|
||||||
|
render 'admin/users/latency_recommendation_form'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -9,7 +9,7 @@ ActiveAdmin.register JamRuby::User, :as => 'User Progression' do
|
||||||
config.filters = false
|
config.filters = false
|
||||||
|
|
||||||
index do
|
index do
|
||||||
column :email do |user| link_to(truncate(user.email, {:length => 12}), resource_path(user), {:title => "#{user.first_name} #{user.last_name} (#{user.email})"}) end
|
column :email do |user| link_to(truncate(user.email, {:length => 12}), resource_path(user), {:title => "#{user.name} (#{user.email})"}) end
|
||||||
column :updated_at do |uu| uu.updated_at.strftime(PROGRESSION_DATE) end
|
column :updated_at do |uu| uu.updated_at.strftime(PROGRESSION_DATE) end
|
||||||
column :created_at do |uu| uu.created_at.strftime(PROGRESSION_DATE) end
|
column :created_at do |uu| uu.created_at.strftime(PROGRESSION_DATE) end
|
||||||
column :city
|
column :city
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,50 @@
|
||||||
|
ActiveAdmin.register JamRuby::User, :as => 'UserSource' do
|
||||||
|
|
||||||
|
menu :label => 'User Campaigns', :parent => 'Users'
|
||||||
|
|
||||||
|
config.sort_order = 'created_at DESC'
|
||||||
|
config.batch_actions = false
|
||||||
|
config.clear_action_items!
|
||||||
|
config.filters = false
|
||||||
|
config.per_page = 250
|
||||||
|
|
||||||
|
scope("Paid", default: true) { |scope| scope.unscoped.where(:origin_utm_medium => 'cpc').order('created_at desc') }
|
||||||
|
scope("Inorganic Source") { |scope| scope.unscoped.where("origin_utm_source != 'organic' OR origin_utm_source IS NULL").order('created_at desc') }
|
||||||
|
scope("Include Organic") { |scope| scope.unscoped.order('created_at desc') }
|
||||||
|
|
||||||
|
index do
|
||||||
|
column "Email" do |user|
|
||||||
|
user.email
|
||||||
|
end
|
||||||
|
column "Signup (CST)" do |user|
|
||||||
|
user.created_at.in_time_zone("Central Time (US & Canada)")
|
||||||
|
end
|
||||||
|
column "UTM Source" do |user|
|
||||||
|
user.origin_utm_source
|
||||||
|
end
|
||||||
|
column "UTM Medium" do |user|
|
||||||
|
user.origin_utm_medium
|
||||||
|
end
|
||||||
|
column "UTM Campaign" do |user|
|
||||||
|
user.origin_utm_campaign
|
||||||
|
end
|
||||||
|
column "UTM ID" do |user|
|
||||||
|
user.origin_id
|
||||||
|
end
|
||||||
|
column "UTM Term" do |user|
|
||||||
|
user.origin_term
|
||||||
|
end
|
||||||
|
column "UTM Content" do |user|
|
||||||
|
user.origin_content
|
||||||
|
end
|
||||||
|
column "Referrer" do |user|
|
||||||
|
user.origin_referrer
|
||||||
|
end
|
||||||
|
column "FB Click ID" do |user|
|
||||||
|
user.facebook_click_id
|
||||||
|
end
|
||||||
|
column "FB Browser ID" do |user|
|
||||||
|
user.facebook_browser_id
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
ActiveAdmin.register JamRuby::UserWhitelist, :as => 'User Whitelist' do
|
||||||
|
|
||||||
|
menu :label => 'User Whitelist', :parent => 'Operations'
|
||||||
|
|
||||||
|
config.sort_order = 'created_at desc'
|
||||||
|
config.batch_actions = false
|
||||||
|
|
||||||
|
index do
|
||||||
|
column :user
|
||||||
|
column :notes
|
||||||
|
column :created_at
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
First Name,Last Name,Email Address,User Type,School ID,School Name,License Start Date,License End Date,Source
Student,Student,seth+student1@jamkazam.com,Student,school_a,School A,1/1/20,1/1/21,K12
Student,Expired,seth+student2@jamkazam.com,Student,school_a,School A,1/2/19,1/1/20,K12
Teacher,Teacher,seth+teacher1@jamkazam.com,Student Instructor,school_a,School A,1/1/20,1/1/21,K12
Platform,Instructor,seth+platform1@jamkazam.com,Platform Instructor,school_a,School A,1/1/20,1/2/21,K12
|
||||||
|
|
|
@ -1,14 +1,23 @@
|
||||||
// //= require active_admin/base
|
//= require active_admin/base
|
||||||
//= require jquery
|
|
||||||
//= require jquery_ujs
|
//= require activeadmin_addons/all
|
||||||
//= require jquery-ui
|
// //= require jquery-ui
|
||||||
// require jquery.ui.core
|
// require jquery.ui.core
|
||||||
// require jquery.ui.widget
|
// require jquery.ui.widget
|
||||||
// require jquery.ui.datepicker
|
// require jquery.ui.datepicker
|
||||||
// require jquery.ui.dialog
|
// require jquery.ui.dialog
|
||||||
// require jquery.ui.autocomplete
|
// require jquery.ui.autocomplete
|
||||||
//= require cocoon
|
//= require cocoon
|
||||||
//= require active_admin/application
|
//= require active_admin/base
|
||||||
//= require autocomplete-rails
|
//= require active_admin/searchable_select
|
||||||
|
// //= require autocomplete-rails
|
||||||
//= require base
|
//= require base
|
||||||
//= require_tree .
|
//= require_tree .
|
||||||
|
//= require best_in_place.jquery-ui
|
||||||
|
|
||||||
|
$(document).ready(function() {
|
||||||
|
jQuery(".best_in_place").best_in_place();
|
||||||
|
$.datepicker.setDefaults({
|
||||||
|
dateFormat: 'yy-mm-dd',
|
||||||
|
});
|
||||||
|
})
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
#= require active_admin/base
|
||||||
|
#= require jquery3
|
||||||
|
#= require best_in_place
|
||||||
|
#= require jquery.purr
|
||||||
|
#= require best_in_place.purr
|
||||||
|
|
||||||
|
$(document).ready ->
|
||||||
|
# IS NOT HAPPENING: USE ACTIVE_ADMIN.JS
|
||||||
|
console.log("DAT COFFEE INIT")
|
||||||
|
jQuery(".best_in_place").best_in_place()
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
$(document).ready(function() {
|
||||||
|
jQuery(".ac_bip").bind("ajax:success", function(){ window.location.reload(); });
|
||||||
|
})
|
||||||
|
|
@ -10,5 +10,3 @@
|
||||||
// WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
|
// WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
|
||||||
// GO AFTER THE REQUIRES BELOW.
|
// GO AFTER THE REQUIRES BELOW.
|
||||||
//
|
//
|
||||||
//= require jquery
|
|
||||||
//= require jquery_ujs
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,110 @@
|
||||||
|
function intToIP(int) {
|
||||||
|
var part1 = int & 255;
|
||||||
|
var part2 = ((int >> 8) & 255);
|
||||||
|
var part3 = ((int >> 16) & 255);
|
||||||
|
var part4 = ((int >> 24) & 255);
|
||||||
|
|
||||||
|
return part4 + "." + part3 + "." + part2 + "." + part1;
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleJamTrackRightsForm() {
|
||||||
|
var $jamTrackRights = $('form#new_jam_ruby_jam_track_right');
|
||||||
|
var $jamTrack = $jamTrackRights.find('#jam_ruby_jam_track_right_jam_track_id');
|
||||||
|
var $jamTrackVal = $jamTrackRights.find('#jam_ruby_jam_track_right_jam_track_id_val')
|
||||||
|
|
||||||
|
var $user = $jamTrackRights.find('#jam_ruby_jam_track_right_user_id');
|
||||||
|
var $userVal = $jamTrackRights.find('#jam_ruby_jam_track_right_user_id_val');
|
||||||
|
$jamTrack.on('change', function(){
|
||||||
|
console.log("change jam track");
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
$user.on('change', function(){
|
||||||
|
console.log("change user");
|
||||||
|
});
|
||||||
|
|
||||||
|
$jamTrack.on('focus', function(){
|
||||||
|
$userVal.val('')
|
||||||
|
});*/
|
||||||
|
|
||||||
|
$jamTrack.bind('railsAutocomplete.select', function(event, data){
|
||||||
|
$jamTrackVal.val('');
|
||||||
|
$jamTrackVal.val(data.item.id);
|
||||||
|
console.log("jam track selected with id " + data.item.id);
|
||||||
|
});
|
||||||
|
|
||||||
|
$user.bind('railsAutocomplete.select', function(event, data){
|
||||||
|
$userVal.val('');
|
||||||
|
$userVal.val(data.item.id);
|
||||||
|
console.log("user selected with id " + data.item.id);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
function handleUserLatencyForm(){
|
||||||
|
var $userLatenciesForm = $('form#user_latencies_form');
|
||||||
|
var $latenciesMyUser = $userLatenciesForm.find('#latencies_my_user');
|
||||||
|
var $latenciesMyUserId = $userLatenciesForm.find('#latencies_my_user_id');
|
||||||
|
var $latenciesMyPublicIp = $userLatenciesForm.find('#latencies_my_public_ip');
|
||||||
|
|
||||||
|
$latenciesMyUser.on('focus', function(){
|
||||||
|
$latenciesMyUserId.val('')
|
||||||
|
});
|
||||||
|
|
||||||
|
$latenciesMyUser.bind('railsAutocomplete.select', function(event, data){
|
||||||
|
$latenciesMyUserId.val('');
|
||||||
|
$latenciesMyPublicIp.val('');
|
||||||
|
if(data.item.last_jam_addr){
|
||||||
|
var ipAddr = intToIP(data.item.last_jam_addr);
|
||||||
|
$latenciesMyPublicIp.val(ipAddr);
|
||||||
|
}
|
||||||
|
$latenciesMyUserId.val(data.item.id);
|
||||||
|
});
|
||||||
|
|
||||||
|
$userLatenciesForm.find('#latencies_user_1').bind('railsAutocomplete.select', function(event, data){
|
||||||
|
$userLatenciesForm.find('#latencies_user_1_id').val(data.item.id);
|
||||||
|
});
|
||||||
|
|
||||||
|
$userLatenciesForm.find('#latencies_user_2').bind('railsAutocomplete.select', function(event, data){
|
||||||
|
$userLatenciesForm.find('#latencies_user_2_id').val(data.item.id);
|
||||||
|
});
|
||||||
|
|
||||||
|
$userLatenciesForm.find('#latencies_user_3').bind('railsAutocomplete.select', function(event, data){
|
||||||
|
$userLatenciesForm.find('#latencies_user_3_id').val(data.item.id);
|
||||||
|
});
|
||||||
|
|
||||||
|
$userLatenciesForm.find('#latencies_user_4').bind('railsAutocomplete.select', function(event, data){
|
||||||
|
$userLatenciesForm.find('#latencies_user_4_id').val(data.item.id);
|
||||||
|
});
|
||||||
|
|
||||||
|
$userLatenciesForm.find('#latencies_user_5').bind('railsAutocomplete.select', function(event, data){
|
||||||
|
$userLatenciesForm.find('#latencies_user_5_id').val(data.item.id);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleLatencyRecommendationForm(){
|
||||||
|
var $latencyRecommendationForm = $('form#latency_recommendation_form');
|
||||||
|
var $latenciesMyUser = $latencyRecommendationForm.find('#latency_recommendation_my_user');
|
||||||
|
var $latenciesMyUserId = $latencyRecommendationForm.find('#latency_recommendation_my_user_id');
|
||||||
|
var $latenciesMyPublicIp = $latencyRecommendationForm.find('#latency_recommendation_my_public_ip');
|
||||||
|
|
||||||
|
$latenciesMyUser.on('focus', function(){
|
||||||
|
$latenciesMyUserId.val('')
|
||||||
|
});
|
||||||
|
|
||||||
|
$latenciesMyUser.bind('railsAutocomplete.select', function(event, data){
|
||||||
|
$latenciesMyUserId.val('');
|
||||||
|
$latenciesMyPublicIp.val('');
|
||||||
|
if(data.item.last_jam_addr){
|
||||||
|
var ipAddr = intToIP(data.item.last_jam_addr);
|
||||||
|
$latenciesMyPublicIp.val(ipAddr);
|
||||||
|
}
|
||||||
|
$latenciesMyUserId.val(data.item.id);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
$(document).ready(function() {
|
||||||
|
handleUserLatencyForm();
|
||||||
|
handleLatencyRecommendationForm();
|
||||||
|
handleJamTrackRightsForm();
|
||||||
|
});
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
//= require activeadmin_addons/all
|
||||||
// SASS variable overrides must be declared before loading up Active Admin's styles.
|
// SASS variable overrides must be declared before loading up Active Admin's styles.
|
||||||
//
|
//
|
||||||
// To view the variables that Active Admin provides, take a look at
|
// To view the variables that Active Admin provides, take a look at
|
||||||
|
|
@ -8,12 +9,13 @@
|
||||||
// $sidebar-width: 242px;
|
// $sidebar-width: 242px;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*= require jquery.ui.all
|
*= require jquery-ui
|
||||||
*= require custom
|
*= require custom
|
||||||
*/
|
*/
|
||||||
// Active Admin's got SASS!
|
// Active Admin's got SASS!
|
||||||
@import "active_admin/mixins";
|
@import "active_admin/mixins";
|
||||||
@import "active_admin/base";
|
@import "active_admin/base";
|
||||||
|
@import "active_admin/searchable_select";
|
||||||
|
|
||||||
// Overriding any non-variable SASS must be done after the fact.
|
// Overriding any non-variable SASS must be done after the fact.
|
||||||
// For example, to change the default status-tag color:
|
// For example, to change the default status-tag color:
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
// SASS variable overrides must be declared before loading up Active Admin's styles.
|
||||||
|
//
|
||||||
|
// To view the variables that Active Admin provides, take a look at
|
||||||
|
// `app/assets/stylesheets/active_admin/mixins/_variables.scss` in the
|
||||||
|
// Active Admin source.
|
||||||
|
//
|
||||||
|
// For example, to change the sidebar width:
|
||||||
|
// $sidebar-width: 242px;
|
||||||
|
|
||||||
|
// Active Admin's got SASS!
|
||||||
|
@import "active_admin/mixins";
|
||||||
|
@import "active_admin/base";
|
||||||
|
|
||||||
|
// Overriding any non-variable SASS must be done after the fact.
|
||||||
|
// For example, to change the default status-tag color:
|
||||||
|
//
|
||||||
|
// .status_tag { background: #6090DB; }
|
||||||
|
|
@ -9,6 +9,6 @@
|
||||||
* compiled file, but it's generally better to create a new file per style scope.
|
* compiled file, but it's generally better to create a new file per style scope.
|
||||||
*
|
*
|
||||||
*= require_self
|
*= require_self
|
||||||
*= require jquery.ui.all
|
*= require jquery-ui
|
||||||
*= require_tree .
|
*= require_tree .
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -30,3 +30,15 @@
|
||||||
border:1px solid gray;
|
border:1px solid gray;
|
||||||
padding:5px;
|
padding:5px;
|
||||||
}
|
}
|
||||||
|
.datetime_select li.fragment {
|
||||||
|
|
||||||
|
|
||||||
|
label {
|
||||||
|
display: block;
|
||||||
|
width:auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.admin_subscription_cohorts #main_content td.col{
|
||||||
|
font-family:Courier;
|
||||||
|
}
|
||||||
|
|
@ -1,9 +1,13 @@
|
||||||
class ApplicationController < ActionController::Base
|
class ApplicationController < ActionController::Base
|
||||||
|
include ApplicationHelper
|
||||||
|
|
||||||
protect_from_forgery
|
protect_from_forgery
|
||||||
|
|
||||||
before_filter :prepare_gon
|
before_filter :prepare_gon
|
||||||
|
|
||||||
def prepare_gon
|
def prepare_gon
|
||||||
|
@olark_enabled = false
|
||||||
|
gon.olark_box_start_hidden = false
|
||||||
gon.prefix = ENV['RAILS_RELATIVE_URL_ROOT'] || '/'
|
gon.prefix = ENV['RAILS_RELATIVE_URL_ROOT'] || '/'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue