diff --git a/.gitignore b/.gitignore index 31859aa8fa226..4c93a874bad0e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ *.pyc changelog.sh -babel .DS_Store .coverage _build diff --git a/CHANGELOG.md b/CHANGELOG.md index 887db010005d5..ff487f467eb97 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,80 @@ ## Change Log +### 0.9.0 (2016/05/12 15:24 +00:00) +- [a0099ad](https://github.com/airbnb/caravel/commit/a0099ad6d673163facc7134e93e6eb87f7a29eb2) v0.9.0 (@mistercrunch) +- [f28c2b2](https://github.com/airbnb/caravel/commit/f28c2b2557a56725c900d30bef06e8953c394e4f) Cosmetric tweaks in the CRUD list view (#458) (@mistercrunch) +- [52bbb38](https://github.com/airbnb/caravel/commit/52bbb38188505c2f1b03be3f352b5befed0328af) Don't limit parallel coordinates table size (#455) (@mistercrunch) +- [aa6e6bd](https://github.com/airbnb/caravel/commit/aa6e6bdf7a29a00d7160f26f625d60321f9186cc) Allowing for templated urls in iFrame (#460) (@mistercrunch) +- [6c333d5](https://github.com/airbnb/caravel/commit/6c333d50108f6ccb0c3997e9f687cfceb3e85552) Fixing the missing searchbox bug (#431) (@mistercrunch) +- [673cce9](https://github.com/airbnb/caravel/commit/673cce9e561d9f264d70efb0ac2449fab64d05d1) Attempting to fix #412 (#430) (@mistercrunch) +- [d79089c](https://github.com/airbnb/caravel/commit/d79089c5874cab21709cf473d27f75aaa55c72ce) Improving the parallel coordinate viz (#452) (@mistercrunch) +- [c4e3020](https://github.com/airbnb/caravel/commit/c4e3020369fe883afa581d1eda1eeed054521925) Conververting datetime based on database dialects (#446) (@mistercrunch) +- [77e9e6a](https://github.com/airbnb/caravel/commit/77e9e6a5d70e589b282eb9c0a60c93ac96b7899e) Fixing issue #444 color function chokes on non-string param (#447) (@mistercrunch) +- [a75d6bc](https://github.com/airbnb/caravel/commit/a75d6bc52ca7677099e361671e31486fbf112507) add timestamp toggle in chart options (Table Viz) (#439) (@sid88in) +- [c5fcbc0](https://github.com/airbnb/caravel/commit/c5fcbc07097810ec3d562f314bc3d78491aabe44) Support hyperUniqueCardinality type in post aggregation (#451) (@x4base) +- [2f64c42](https://github.com/airbnb/caravel/commit/2f64c42062dc041408371dd0cecddd940e0bcf47) blacklist druid datasources to be refreshed because it takes forever to load all druid datasources metadata which is not even required (given the use cases user should be able to blacklist data sources which are not required to be refreshed). (#441) (@sid88in) +- [d304ee0](https://github.com/airbnb/caravel/commit/d304ee005a976b2582f0be3b5bfc8cd9aa7c60e8) Bugfix in line chart where the series name is an empty string (#434) (@mistercrunch) +- [82fa501](https://github.com/airbnb/caravel/commit/82fa501deacc9b1f9c3207f0b449c9387be5f7ab) Update Chinese translation (#438) (@liaojunshuo) +- [bc71707](https://github.com/airbnb/caravel/commit/bc7170769baf6cbcebeaa1ee05188315291269f3) Recursively get the dependency fields of post aggregators (#437) (@x4base) +- [6941f1d](https://github.com/airbnb/caravel/commit/6941f1de64795fae017a14b1dd1aedfcd2d71869) add unicode data to tests (#432) (@andrewhn) +- [a3f549b](https://github.com/airbnb/caravel/commit/a3f549bb9e55affc0da46dfe6f8a4b721905f716) Some chinese translations as a Proof of Concept (#435) (@mistercrunch) +- [0bedaed](https://github.com/airbnb/caravel/commit/0bedaed3676c2185aff8f0de52f07fd40b45b985) Make sure anonymous user with proper permissions can access data (#415) (@asydorchuk) +- [1d0863a](https://github.com/airbnb/caravel/commit/1d0863abfe9295b4287bc07647265ddc4cb93d12) Rename the dummy variable _ to avoid conflict with lazy_gettext (#427) (@x4base) +- [a3a9ec9](https://github.com/airbnb/caravel/commit/a3a9ec926fbb74dec6b427015109f04ebb592a3c) [hotfix] piechart goes black on refresh (#424) (@mistercrunch) +- [a8d0ae1](https://github.com/airbnb/caravel/commit/a8d0ae1361e9816fca681b78b55a7becec52ff74) Fix name of test script in contributing guide (#428) (@itajaja) +- [9a08c45](https://github.com/airbnb/caravel/commit/9a08c45e593cd3c25cea8814d02377fde85b3747) add additional postgres and redshift time grains (#429) (@itajaja) +- [88c9516](https://github.com/airbnb/caravel/commit/88c9516e20bbfd1f5fb9ec478cc9a1624f6eed33) Getting started on translations (#423) (@mistercrunch) +- [ec7dbed](https://github.com/airbnb/caravel/commit/ec7dbed800d42b6e0bd6e480939196b5ad1010a6) Blank theme (#419) (@mistercrunch) +- [26d2736](https://github.com/airbnb/caravel/commit/26d273643b9798af24e8e55303e8eeb41297d36d) Allowing for druid post aggregations (#418) (@mistercrunch) +- [0ca3f5e](https://github.com/airbnb/caravel/commit/0ca3f5ec800b5543747a00f24377a86a6f017226) Improving SQLA query generation (#421) (@mistercrunch) +- [d7ea473](https://github.com/airbnb/caravel/commit/d7ea47387f13f13e6586cc8d897bcf25dfb45827) enable timerotateloghandler (configurable) (#311) (@sid88in) +- [7b5b602](https://github.com/airbnb/caravel/commit/7b5b602e962c20fc745909994075c7bbdc54d8e5) Use batch_alter_table to drop column in the migration script (#406) (@x4base) +- [b78ec54](https://github.com/airbnb/caravel/commit/b78ec54650e1602d800f73cc7bd8a49eebdd0835) Merge pull request #414 from airbnb/chris/fix-sunburst-level-trunc (@williaster) +- [77e4d4b](https://github.com/airbnb/caravel/commit/77e4d4b2d4e0e2f29998896b1089c0a78330144c) Fixgin README link (@mistercrunch) +- [2198fd4](https://github.com/airbnb/caravel/commit/2198fd4e3d0ea2d19e3539f05f17a3c2c675ded3) Adding badge for python versions (@mistercrunch) +- [bd47a29](https://github.com/airbnb/caravel/commit/bd47a29076c4558b907554d97eccb35bf67f8b50) CHANGELOG update (@mistercrunch) + +### 0.8.9 (2016/04/28 02:38 +00:00) +- [337c9d5](https://github.com/airbnb/caravel/commit/337c9d59ae68778ecea84afee999c9799fcf9d5f) v0.8.9 (@mistercrunch) +- [54860a8](https://github.com/airbnb/caravel/commit/54860a874c69e7d13e2bd0c57eb29c9d6f472511) Adding reference to another docker image in READMEM (@mistercrunch) +- [89d1a77](https://github.com/airbnb/caravel/commit/89d1a77281b83a3d86835a70a936b71cee67b3e1) [hotfix] filter_immune_slices fix (@mistercrunch) +- [b634d03](https://github.com/airbnb/caravel/commit/b634d03ac3d5ce36b8b44805e18bb26bc0c08be4) Show only Slices and Dashboards users have access to (#404) (@mistercrunch) +- [ab64a26](https://github.com/airbnb/caravel/commit/ab64a26b5b7d5cad88e5fd8f48865a685c339bea) fix img loading overlay in explore view (#403) (@mistercrunch) +- [a2f2ad8](https://github.com/airbnb/caravel/commit/a2f2ad84da3e98d6fa51af670a7d1a4f51826243) add navigation, zoom to treemap (#396) (@andrewhn) +- [c0fb9ee](https://github.com/airbnb/caravel/commit/c0fb9eeca484c00647117645ce620edb6cdaba24) [bugfix] big_number doesn't fadeout on hover (@mistercrunch) +- [42ac46c](https://github.com/airbnb/caravel/commit/42ac46c1e15b6b446491b6d3f7020f59f45e41b4) [bugfix] fix context confusion in Slice (@mistercrunch) +- [7b10759](https://github.com/airbnb/caravel/commit/7b1075990cfb89a6bd12761c12e25dd38e9a169f) [hotfix] periodic refresh dashboard feature had broken caching (@mistercrunch) +- [37be01b](https://github.com/airbnb/caravel/commit/37be01bc1261599dd381181e3dc9eeb4506c31c3) [hotfix] adding cache_key in payload (@mistercrunch) +- [7d90f26](https://github.com/airbnb/caravel/commit/7d90f265548d38c89999867e16b31f5c00ef78fb) Fixing #388 (#391) (@mistercrunch) +- [f1e10d8](https://github.com/airbnb/caravel/commit/f1e10d8d25eba04fd5326d77ee3028bef893b9d2) One more Druid test (#387) (@mistercrunch) +- [b01d378](https://github.com/airbnb/caravel/commit/b01d3784756f8ea5d8e7eab391c1823df22aa38a) Fix the label of the periodic-refresh button (#386) (@x4base) +- [a5f33fe](https://github.com/airbnb/caravel/commit/a5f33fecd81ce1c86859856bdc1a3a4f73b7893c) Adding login call for Druid test (@mistercrunch) +- [f4177bf](https://github.com/airbnb/caravel/commit/f4177bfa9481a04cd3293216ad25fb671dcb6ac0) More examples / tests (#385) (@mistercrunch) +- [d8a2b62](https://github.com/airbnb/caravel/commit/d8a2b621d8b4895560be0eca6529e8a52d62be2b) Periodically update the slices in the dashboard (#374) (@x4base) +- [9a33557](https://github.com/airbnb/caravel/commit/9a335571128a012aa042ba95b44daf21624b9546) Removing forgotten print statement (@mistercrunch) +- [efc6bf4](https://github.com/airbnb/caravel/commit/efc6bf4eb8f9b4619e334c2e896242dc1a08c80b) Redirect application log to stderr, which is picked up by gunicorn. (#335) (@coleslaw) +- [17e711f](https://github.com/airbnb/caravel/commit/17e711fda2659cd025410ec8c4002475164cbb7f) Druid unit tests using Mock (#384) (@mistercrunch) +- [01a8c96](https://github.com/airbnb/caravel/commit/01a8c96820f13639d33fcaeb3faf11f6494eb8f1) Specifying python versions supported in setup.py (#382) (@mistercrunch) +- [d96b634](https://github.com/airbnb/caravel/commit/d96b634ded33353881907ba6c683f45d4ea32aaf) split sunburst breadcrumb names on '_' to apply ' '-dependent wrapping more freqently (#376) (@williaster) +- [afcdcf0](https://github.com/airbnb/caravel/commit/afcdcf06a17319a19001f19e0cccbc7050b251b8) Fixing overwrite and save slice permissions for a give role (#298) (@sid88in) +- [5597eb4](https://github.com/airbnb/caravel/commit/5597eb4cc4f8739016c66a5e18d3875fcca059f7) Fix db upgrade script b4456560d4f3 (#370) (@mistercrunch) +- [3f0171b](https://github.com/airbnb/caravel/commit/3f0171b77be43adbce17a98b0e109e1935a6d96f) Configure Visualizations (#365) (@sid88in) +- [badcd8b](https://github.com/airbnb/caravel/commit/badcd8bfa19ee7725509fe83bdd686a33482845d) Storing version number in only one place (#362) (@mistercrunch) +- [04f1b17](https://github.com/airbnb/caravel/commit/04f1b176c49fc3d005178e18db39d08b8fc7de30) Fixes issue #364 (@mistercrunch) +- [899fe19](https://github.com/airbnb/caravel/commit/899fe19afb5f0ded2e02a054d9c00060ed362590) [WiP] Attempting to support Druid's granularity origin as a hidden url param (#194) (@mistercrunch) +- [f316851](https://github.com/airbnb/caravel/commit/f3168518e2d2dd45fa522d694db2bac433e87ea8) New url default for iframe viz (@mistercrunch) +- [04d769f](https://github.com/airbnb/caravel/commit/04d769ff249e8c9e616133dc17639088438667cb) Some more error handling when rendering the explore view (#361) (@mistercrunch) +- [01c2c7b](https://github.com/airbnb/caravel/commit/01c2c7baf88d3876d2f73ccf802376648797d060) Fixing unique constraint in SqlaTable model (#360) (@mistercrunch) + +### 0.8.8 (2016/04/15 04:25 +00:00) +- [2d420ee](https://github.com/airbnb/caravel/commit/2d420eee25b4c039350c72c5dea30d5eaaff88d8) v0.8.8 (@mistercrunch) +- [1a6757f](https://github.com/airbnb/caravel/commit/1a6757f10a6e68377776cd498a5bb3cba66b7b09) Better type detection for inference of column matrix (#353) (@mistercrunch) +- [63e5e93](https://github.com/airbnb/caravel/commit/63e5e932cb0c6ba80e4f21c1dcf740f54568af5b) Hide password from database 'show' view (#355) (@mistercrunch) +- [e6e8ec9](https://github.com/airbnb/caravel/commit/e6e8ec96205f5a83e09362994a224857a266b8f3) [bugfix] missing redirect when datasource is missing (#352) (@mistercrunch) +- [4b48e9f](https://github.com/airbnb/caravel/commit/4b48e9f1e9c5a4d2474f487d816b58c52accf821) Updating CHANGELOG (@mistercrunch) + ### 0.8.7 (2016/04/14 05:45 +00:00) +- [ffdae19](https://github.com/airbnb/caravel/commit/ffdae19312ce4ad7e0b8a6f75eb8cfa076e4e5ca) v0.8.7 (@mistercrunch) - [e5fabf3](https://github.com/airbnb/caravel/commit/e5fabf39df1b0fadc8b3bac02e21592cd61c3196) Adjusting positioning in the examples (@mistercrunch) - [eb5a417](https://github.com/airbnb/caravel/commit/eb5a41728edc46dbcf837a78a7229a8129ed4dbf) Change the size of the column datasource_name in datasource creation … (#345) (@gyzmau) - [91a3594](https://github.com/airbnb/caravel/commit/91a3594be34c18ea9a7b008b5f3a42149295a5e3) Fixing the thumbs and the galery (#346) (@mistercrunch) @@ -12,6 +86,7 @@ - [8fe5790](https://github.com/airbnb/caravel/commit/8fe5790ec35b00f2f86df8ac4ab7444601ddc539) Don't die on malformed json in the extras field. Give feedback to user (#338) (@deniszgonjanin) - [1e08b3e](https://github.com/airbnb/caravel/commit/1e08b3e8c589fc70d7cd4a14a5a9de49e2a93a45) add tooltips to sankey (#341) (@williaster) - [77828b6](https://github.com/airbnb/caravel/commit/77828b630ab0f151c0377b6d1304c39e1cfdf65a) [bugfix] druid granularity form field should be select2_freeform (@mistercrunch) +- [3c72751](https://github.com/airbnb/caravel/commit/3c72751c26c94e550a6869ff114cef961ce35bcd) [bugfix] druid granularity form field should be select2Sortable (@mistercrunch) - [af417b6](https://github.com/airbnb/caravel/commit/af417b6b58b4b4de4885d7d5ae16dd12626df401) Adding expression column description in the CRUD (@mistercrunch) - [3d1fc99](https://github.com/airbnb/caravel/commit/3d1fc99353557aa42c14e760e01774fd624d7805) Adding not in docs about connecting to dbs over SSL (@mistercrunch) - [1dd4165](https://github.com/airbnb/caravel/commit/1dd416570a3b4f5d431135459e9049e3eaf8f3a8) Json dumps iso date for Table view (#328) (@mistercrunch) @@ -25,6 +100,8 @@ - [c6da811](https://github.com/airbnb/caravel/commit/c6da8117b7d827f98984126d656470d93c9adc8f) Adding missing dep to dev-reqs.txt (@mistercrunch) - [a9af6b1](https://github.com/airbnb/caravel/commit/a9af6b1b9697ad2f5c8808555f0f83b6fb83a3dc) Fix for undefined inner_time_filter on missing granularity in models.SqlaTable (#309) (@antbell) - [fe045ad](https://github.com/airbnb/caravel/commit/fe045ad076d2c7d3810feb49dda84170e1595b6b) New viz: box plot (#312) (@andrewhn) +- [dab31eb](https://github.com/airbnb/caravel/commit/dab31eb66dd9ca8e988e3a7eb03bc13049cc4dbf) Bugfix, link pointing to json (@mistercrunch) +- [da421bb](https://github.com/airbnb/caravel/commit/da421bb9afd02b5919b1a30dac18840bc7ec02ad) Updating TODO (@mistercrunch) - [f8e5d30](https://github.com/airbnb/caravel/commit/f8e5d30e2eb4ef7c7d3312dc57d45bafe4c390cc) Revert previous css commit (@mistercrunch) - [bfd1c87](https://github.com/airbnb/caravel/commit/bfd1c8711bf3de1218eb2f091c013b15d02a883c) Forcing widget overflow to be visible (@mistercrunch) - [542b66e](https://github.com/airbnb/caravel/commit/542b66ef6800a7256ea307445536b0f6b85992e6) Giving credit where credit is due (#307) (@mistercrunch) @@ -39,9 +116,9 @@ - [ef64884](https://github.com/airbnb/caravel/commit/ef64884e532f2ff09a54cb4bc60a52e8534d95a6) [heatmap] fix bug to display this view properly in dashboards. fix bug to display their d3-tip tooltips in dashboards. don't show empty tooltips on heatmap. update logic for margins so they fit dynamically based on label size. (#301) (@williaster) - [0afa5d2](https://github.com/airbnb/caravel/commit/0afa5d2cbaf1f4e009d81fe9c117f28178f3cbba) Added FAQ and db dependencies to docs (@mistercrunch) - [eff0beb](https://github.com/airbnb/caravel/commit/eff0beb195b85f831d14e147a6dbecceb02dbc4e) Optimizing import statements for better readability and to avoid unused, excessive and duplicating imports in the project. (#294) (@sid88in) +- [ee42aa7](https://github.com/airbnb/caravel/commit/ee42aa790aa63abae7fe84b867331c4521536c08) Updating CHANGELOG (@mistercrunch) - [2972122](https://github.com/airbnb/caravel/commit/2972122f40780a5d0f56e5037311764fb7e46781) Adding link to Strata slides (@mistercrunch) - ### 0.8.6 (2016/04/07 21:26 +00:00) - [d933a21](https://github.com/airbnb/caravel/commit/d933a2121608de06946850792c059ce26be7b473) Prettyfying an image in the docs (@mistercrunch) - [c5dead4](https://github.com/airbnb/caravel/commit/c5dead4791b9d1444c0f42e4c34790160c63bbb6) v0.8.6 (@mistercrunch) @@ -93,187 +170,830 @@ - [dafdb51](https://github.com/airbnb/caravel/commit/dafdb51f350778ba26684c3ccbc91c44a444897b) Adding Caravel Docker link to README (@mistercrunch) - [2d0fdf7](https://github.com/airbnb/caravel/commit/2d0fdf7e59ab88651a914835a685cfee61ad68aa) Adding a CHANGELOG.md (@mistercrunch) - ### 0.8.5 (2016/04/01 20:30 +00:00) -- [#234](https://github.com/airbnb/caravel/pull/234) Pin pandas, remove numpy (@mistercrunch) -- [#229](https://github.com/airbnb/caravel/pull/229) Remove "requirements.txt" mention from README (@jmcomets) -- [#225](https://github.com/airbnb/caravel/pull/225) remove power units from sankey diagram (@williaster) -- [#219](https://github.com/airbnb/caravel/pull/219) Add 'Percent of previous' to sunburst vis. Appease npm warnings for data tables and d3.layout.cloud (@williaster) -- [#224](https://github.com/airbnb/caravel/pull/224) Fixing minor typos in the readme (@cyrusstoller) -- [#214](https://github.com/airbnb/caravel/pull/214) Fix an installation bug. (@kim-pham-airbnb) -- [#218](https://github.com/airbnb/caravel/pull/218) Redirecting URL from previous names to caravel (@mistercrunch) -- [#223](https://github.com/airbnb/caravel/pull/223) Fixed typo in README (@thebucknerlife) -- [#222](https://github.com/airbnb/caravel/pull/222) remove duplicate Druid.io section in README.md (@brchristian) -- [#213](https://github.com/airbnb/caravel/pull/213) Fix a bug when loading DruidDatasource. (@kim-pham-airbnb) -- [#204](https://github.com/airbnb/caravel/pull/204) Fixing the order and coverage report for the unit tests (@mistercrunch) -- [#209](https://github.com/airbnb/caravel/pull/209) Fresh screenshots (@mistercrunch) -- [#206](https://github.com/airbnb/caravel/pull/206) Caravel (@mistercrunch) -- [#205](https://github.com/airbnb/caravel/pull/205) fix sunburst error. add `less` to package.json (@williaster) -- [#203](https://github.com/airbnb/caravel/pull/203) Fixing mysql install (@mistercrunch) -- [#202](https://github.com/airbnb/caravel/pull/202) Using setup.py nosetests to run tests (@mistercrunch) -- [#199](https://github.com/airbnb/caravel/pull/199) Fix a few minor bugs (@mistercrunch) -- [#200](https://github.com/airbnb/caravel/pull/200) Add a sankey example (@mistercrunch) -- [#192](https://github.com/airbnb/caravel/pull/192) Fix Druid metadata refresh. (@kim-pham-airbnb) -- [#198](https://github.com/airbnb/caravel/pull/198) A welcome page (@mistercrunch) -- [#197](https://github.com/airbnb/caravel/pull/197) Adding a DRUID_IS_ACTIVE flag and changing nav bar (@NiharikaRay) -- [#196](https://github.com/airbnb/caravel/pull/196) Fixing issues around fk nullable=False on audit fields (@mistercrunch) +- [718de6c](https://github.com/airbnb/caravel/commit/718de6cd50fe522001d32b6cf89578aa11d373cd) v0.8.5 (@mistercrunch) +- [38062f1](https://github.com/airbnb/caravel/commit/38062f160a490ebc6c4c721b0a0fbcc609d47daa) Adding an INTHEWILD file (@mistercrunch) +- [#234](https://github.com/airbnb/caravel/pull/234) Merge pull request #234 from airbnb/pinpandas (@airbnb) +- [481d821](https://github.com/airbnb/caravel/commit/481d821721b1fdbcee92da67096b4b94f3229b5f) Tweaking docs (@mistercrunch) +- [7b111b7](https://github.com/airbnb/caravel/commit/7b111b790e7e896778fe538f825c28b4306e3d82) Adding an OS dependencies section to the install docs (@mistercrunch) +- [ab92e7a](https://github.com/airbnb/caravel/commit/ab92e7a94d211cf8e7f8558a27201c3e83735683) Pin pandas, remove numpy (@mistercrunch) +- [#229](https://github.com/airbnb/caravel/pull/229) Merge pull request #229 from jmcomets/patch-1 (@jmcomets) +- [23319ee](https://github.com/airbnb/caravel/commit/23319eed109a0dac7c15b930c614618bd816cbca) Remove "requirements.txt" mention from README (@jmcomets) +- [#225](https://github.com/airbnb/caravel/pull/225) Merge pull request #225 from airbnb/chris/remove-random-power-units (@airbnb) +- [#219](https://github.com/airbnb/caravel/pull/219) Merge pull request #219 from airbnb/chris/sunburst-conditional-percent (@airbnb) +- [#224](https://github.com/airbnb/caravel/pull/224) Merge pull request #224 from cyrusstoller/typo_fix (@cyrusstoller) +- [#214](https://github.com/airbnb/caravel/pull/214) Merge pull request #214 from airbnb/kim/fix_druid_datasource_bug (@airbnb) +- [0e2c0ce](https://github.com/airbnb/caravel/commit/0e2c0ce8587755219ad64762808333e70936aead) remove power units from sankey diagram (@williaster) +- [807f4dd](https://github.com/airbnb/caravel/commit/807f4dd0e57c57a3a70dece1503a8582b0d272af) Fixing minor typos in the readme (@cyrusstoller) +- [0b3e2e0](https://github.com/airbnb/caravel/commit/0b3e2e00cc431257d71faf4c26858c4f1f99b330) Add 'Percent of previous' to sunburst vis. Appease npm warnings for data tables and d3-sankey. (@williaster) +- [b87d8a0](https://github.com/airbnb/caravel/commit/b87d8a0fbf1960371d38806c72545c6ced8c2640) change 'of previous' to 'of parent' (@williaster) +- [#218](https://github.com/airbnb/caravel/pull/218) Merge pull request #218 from airbnb/redirects (@airbnb) +- [eeba80c](https://github.com/airbnb/caravel/commit/eeba80c487c1c97246247ea6089fc25a8e560d3f) Merge branch 'master' into redirects (@mistercrunch) +- [#223](https://github.com/airbnb/caravel/pull/223) Merge pull request #223 from thebucknerlife/master (@thebucknerlife) +- [#222](https://github.com/airbnb/caravel/pull/222) Merge pull request #222 from brchristian/patch-1 (@brchristian) +- [9595dcf](https://github.com/airbnb/caravel/commit/9595dcff4dd7ee27dda7df5a8f15fcdb9ce37803) Fixed typo in README (@thebucknerlife) +- [58ab4e2](https://github.com/airbnb/caravel/commit/58ab4e2415f03273ddb892fdc0395f5d8e234dd1) remove duplicate Druid.io section in README.md (@brchristian) +- [2b71b72](https://github.com/airbnb/caravel/commit/2b71b7206523273442705229e65fd0d812f4e958) Redirecting URL from previous names to caravel (@mistercrunch) +- [bd9051a](https://github.com/airbnb/caravel/commit/bd9051a16818d77dfe896884b6b337d981774731) Fixing README link (@mistercrunch) +- [6f63b30](https://github.com/airbnb/caravel/commit/6f63b3033f93e47d1f3b7c4a20ab6b1cf00eb772) Dedupping info in README by pointing to docs (@mistercrunch) +- [f659caa](https://github.com/airbnb/caravel/commit/f659caa06bb3b9b12652fc6225c1c80a9ccddc25) Fix an installation bug. (@kim-pham-airbnb) +- [#213](https://github.com/airbnb/caravel/pull/213) Merge pull request #213 from airbnb/kim/fix_druid_datasource_bug (@airbnb) +- [e5553ab](https://github.com/airbnb/caravel/commit/e5553ab45eadc1dc46db72cba18eabaf0d51830d) Fix lint warning. (@kim-pham-airbnb) +- [4a77b70](https://github.com/airbnb/caravel/commit/4a77b70046054f655c292917b8b3de0027d18433) A better fix. (@kim-pham-airbnb) +- [f67c6b5](https://github.com/airbnb/caravel/commit/f67c6b5f46bd5609ef4ec7709c03b33ed0b3f832) Fix a bug when loading DruidDatasource. (@kim-pham-airbnb) +- [fd40742](https://github.com/airbnb/caravel/commit/fd407424add807728593a7115c9aa7900d7f1117) A few replacements related to the rename (@mistercrunch) +- [e1b8719](https://github.com/airbnb/caravel/commit/e1b871982e821d0751f32a8af6e53d65ed68616d) Adding docs link badge (@mistercrunch) +- [b164244](https://github.com/airbnb/caravel/commit/b164244cd85c023cad2da55e0f01b4eb1fbc564e) Renaming forgotten doc file (@mistercrunch) +- [00226cc](https://github.com/airbnb/caravel/commit/00226cce7fbc8404bac63949f63a52ca680293cb) Changing image size, second try (@mistercrunch) +- [3a3d5cd](https://github.com/airbnb/caravel/commit/3a3d5cd7fbb6ab84f8f7f98312315f308fe4b575) Changing image size (@mistercrunch) +- [c6b7720](https://github.com/airbnb/caravel/commit/c6b77206eafc3ca689626f6281a57302ca98157f) Adding build status badge and image to README (@mistercrunch) +- [d885dd3](https://github.com/airbnb/caravel/commit/d885dd34f9ddb24988de7cab71a347bbdebc99fe) Getting coveralls to work (@mistercrunch) +- [54fe234](https://github.com/airbnb/caravel/commit/54fe2348fca994bf381b93b3f0b3a122e13202f2) Dummy commit to trigger travis (@mistercrunch) +- [6e1413d](https://github.com/airbnb/caravel/commit/6e1413d2ddeea0179ab37d70461161ca76150371) Adding dev-reqs.txt to build (@mistercrunch) +- [0296b83](https://github.com/airbnb/caravel/commit/0296b839ec30517fb8920fe81e3ff77a2c261b50) Changing repo token for coveralls (@mistercrunch) +- [#204](https://github.com/airbnb/caravel/pull/204) Merge pull request #204 from airbnb/fixes (@airbnb) +- [#209](https://github.com/airbnb/caravel/pull/209) Merge pull request #209 from airbnb/screenshots (@airbnb) +- [cda1bd5](https://github.com/airbnb/caravel/commit/cda1bd59f948cb96fe61607d3dd0028051a3a52e) Fresh screenshots (@mistercrunch) +- [8e27099](https://github.com/airbnb/caravel/commit/8e27099866c793dc04db9d809a2a5d4ffc9cc839) Fixing the tests for py3 (@mistercrunch) +- [60bce9e](https://github.com/airbnb/caravel/commit/60bce9ed5900abd4f87cabb5483cd02e5175c336) Fixing the order and coverage report for the unit tests (@mistercrunch) +- [#206](https://github.com/airbnb/caravel/pull/206) Merge pull request #206 from airbnb/caravel (@airbnb) +- [619d358](https://github.com/airbnb/caravel/commit/619d35878f928048a3a96865fe1a29857b0f6fe7) [dashed->caravel] Replace in files (@mistercrunch) +- [d48796f](https://github.com/airbnb/caravel/commit/d48796f00e391d3c254aa226e671b0b336e9fbf6) Caravel - renaming files (@mistercrunch) +- [#205](https://github.com/airbnb/caravel/pull/205) Merge pull request #205 from airbnb/chris/sunburst-fix (@airbnb) +- [1aee5b7](https://github.com/airbnb/caravel/commit/1aee5b7801d9d80d2296232dfb11709196964a46) fix sunburst error. add less to package.json because less-loader complains if it's not there. (@williaster) +- [#203](https://github.com/airbnb/caravel/pull/203) Merge pull request #203 from airbnb/fixes (@airbnb) +- [09021aa](https://github.com/airbnb/caravel/commit/09021aacad81840e55900b57419f8a25fca75a7c) Adding LONG to list of numeric types, updating TODO (@mistercrunch) +- [26c7251](https://github.com/airbnb/caravel/commit/26c725171ba8a5a3c706e3ea3faa7fd7b475ac26) Fixing mysql install (@mistercrunch) +- [#202](https://github.com/airbnb/caravel/pull/202) Merge pull request #202 from airbnb/better_tests (@airbnb) +- [301dce2](https://github.com/airbnb/caravel/commit/301dce2dd1e1ac457862354c58ce3b52ca4e9558) Using setup.py nosetests to run tests (@mistercrunch) +- [6dce6df](https://github.com/airbnb/caravel/commit/6dce6df6b28ba1af20ecb4557f95d9b315a7e3d3) JS Lint breaks the build (@mistercrunch) +- [2397645](https://github.com/airbnb/caravel/commit/2397645ed45fc038f6079300d673cefd6d90b265) Fix intermitent bug with npm locks (@mistercrunch) +- [2102e04](https://github.com/airbnb/caravel/commit/2102e04feca95ae335854426107892e3d7d2b4bd) Adding tests for ping and health enpoint (@mistercrunch) +- [#199](https://github.com/airbnb/caravel/pull/199) Merge pull request #199 from airbnb/touchups (@airbnb) +- [#200](https://github.com/airbnb/caravel/pull/200) Merge pull request #200 from airbnb/sankey (@airbnb) +- [48210d5](https://github.com/airbnb/caravel/commit/48210d5275f02fa10ba807b9716de78aa42dc219) Add a sankey example (@mistercrunch) +- [5804991](https://github.com/airbnb/caravel/commit/5804991b19358278f730d3c424b5c795cfdcf4ce) Fix a few minor bugs (@mistercrunch) +- [5be7b03](https://github.com/airbnb/caravel/commit/5be7b03ba4fb5094f64f9cc5aff0100abeee673a) [hotfix] Fix tooltip overflow to be visible outside widget (@mistercrunch) +- [a898c27](https://github.com/airbnb/caravel/commit/a898c27403aebbaf30f6e4d988534954633884cd) Minor CSS for navbar brand to not decorate the link (@mistercrunch) +- [4974715](https://github.com/airbnb/caravel/commit/49747150ae2250df2654842a6580353eaa88aa66) [hotfix] merging 2 migration scripts (@mistercrunch) +- [#192](https://github.com/airbnb/caravel/pull/192) Merge pull request #192 from airbnb/kim/misc_hack (@airbnb) +- [#198](https://github.com/airbnb/caravel/pull/198) Merge pull request #198 from airbnb/welcome (@airbnb) +- [#197](https://github.com/airbnb/caravel/pull/197) Merge pull request #197 from NiharikaRay/master (@NiharikaRay) +- [#196](https://github.com/airbnb/caravel/pull/196) Merge pull request #196 from airbnb/fix_audit (@airbnb) +- [e7bed92](https://github.com/airbnb/caravel/commit/e7bed925191dde972d0eedf5147e93a649f5f884) [hotfix] can't back out of history after entering explore (@mistercrunch) +- [8c0870e](https://github.com/airbnb/caravel/commit/8c0870e6eac82f16d597b1fd75faf6a693ccb69d) Linting to perfection (@mistercrunch) +- [c920355](https://github.com/airbnb/caravel/commit/c9203554e74e9753b561cc1df608d69e134680ab) a welcome page (@mistercrunch) +- [2378fdf](https://github.com/airbnb/caravel/commit/2378fdf9ce83d8f99672c0b5606c72c02ed9ec37) Disable polymorphism in DruidMetric as well (@kim-pham-airbnb) +- [23b6bca](https://github.com/airbnb/caravel/commit/23b6bca89ec70b9543a3c3f49efd4b05c59c9594) Fix style warning (@kim-pham-airbnb) +- [7a7eb33](https://github.com/airbnb/caravel/commit/7a7eb3334834e014aff0adbec2fd558199827c98) Disable Datasource sql polymorphism & Fix refresh Druid metadata. (@kim-pham-airbnb) +- [fee6b3f](https://github.com/airbnb/caravel/commit/fee6b3fafaee3fca18454a70d9c3de2a8ea3a267) Adding a DRUID_IS_ACTIVE flag and changing nav bar +- [0f637bd](https://github.com/airbnb/caravel/commit/0f637bdd2e7207a4d553214d82e20c6cf5f0930c) Fixing issues around fk nullable=False on audit fields (@mistercrunch) +- [10a1edd](https://github.com/airbnb/caravel/commit/10a1eddaa741959989e015158dff9f3c8e95e5ce) Improving the docs build script (@mistercrunch) ### 0.8.4 (2016/03/24 05:26 +00:00) -- [#193](https://github.com/airbnb/caravel/pull/193) Adding favorites for Slices and Dashboards (@mistercrunch) +- [21d1c0a](https://github.com/airbnb/caravel/commit/21d1c0a1b502ed90616f067f95ee09e52a597481) 0.8.4 (@mistercrunch) +- [#193](https://github.com/airbnb/caravel/pull/193) Merge pull request #193 from airbnb/favstar (@airbnb) +- [2362b5a](https://github.com/airbnb/caravel/commit/2362b5a15799f4e443c2204d329a3941317cf1fb) Tunning tooltips (@mistercrunch) +- [7ede732](https://github.com/airbnb/caravel/commit/7ede732892fe1e1e81529e470c8ea31619f9ece7) Adding favorites for Slices and Dashboards (@mistercrunch) +- [5b10b19](https://github.com/airbnb/caravel/commit/5b10b19ed722da40310201c6f25e5b7b33cf7601) Fixing the docs (@mistercrunch) +- [14f298b](https://github.com/airbnb/caravel/commit/14f298b3855de9730e5dd8433714ec83ed192c2a) dashboard bug fixes and better page titles (@mistercrunch) +- [89da51f](https://github.com/airbnb/caravel/commit/89da51f8d790d403bfd8a13ab9b35fd38f09fcc6) Pointing landscape badge to the right branch (@mistercrunch) + +### 0.8.3 (2016/03/23 21:11 +00:00) +- [d5487c6](https://github.com/airbnb/caravel/commit/d5487c6b25b8680d9a70525528a2937122f168d5) 0.8.3 (@mistercrunch) +- [a244f3a](https://github.com/airbnb/caravel/commit/a244f3aafb8b3e8c29e7cd62743156e6b17f6c6c) Fixing build issues with preventive rm /Users/maxime_beauchemin/.npm/*.lock (@mistercrunch) ### 0.8.2 (2016/03/23 20:43 +00:00) -- [#188](https://github.com/airbnb/caravel/pull/188) Introducing a caching layer! (@mistercrunch) +- [9d3bf77](https://github.com/airbnb/caravel/commit/9d3bf7763cc42589702b2f1a7260ebff8f4785c7) Fixing build issues with preventive rm /Users/maxime_beauchemin/.npm/*.lock (@mistercrunch) +- [#188](https://github.com/airbnb/caravel/pull/188) Merge pull request #188 from airbnb/caching (@airbnb) +- [417749f](https://github.com/airbnb/caravel/commit/417749f880ef208eaa633244356ea173103f3770) Explore mode should only expose cache on first load (@mistercrunch) +- [d8192ec](https://github.com/airbnb/caravel/commit/d8192eca0a07e313d899826495aee498dc61a92c) Introducing a caching layer (@mistercrunch) +- [fded04a](https://github.com/airbnb/caravel/commit/fded04a51d14ebb7ca638cc56da3a758775a858c) Hack to get the force refresh in the explore view (@mistercrunch) +- [2d3edf3](https://github.com/airbnb/caravel/commit/2d3edf3a2ed35664d3c461e909a92dbf120d7540) js lint breaks the build (@mistercrunch) ### 0.8.1 (2016/03/21 23:41 +00:00) -- [#191](https://github.com/airbnb/caravel/pull/191) Add week ending and week start to grain (@airbnb) -- [#190](https://github.com/airbnb/caravel/pull/190) Cranking up version numbers (@mistercrunch) -- [#184](https://github.com/airbnb/caravel/pull/184) sunburst improvements (@williaster) -- [#186](https://github.com/airbnb/caravel/pull/186) Adding docstrings ! (@mistercrunch) -- [#181](https://github.com/airbnb/caravel/pull/181) Dynamic time granularity on any datetime column (@mistercrunch) -- [#182](https://github.com/airbnb/caravel/pull/182) more css fixes (@williaster) -- [#178](https://github.com/airbnb/caravel/pull/178) Allowing all extra fields in AuditMixin to be nullable (@mistercrunch) -- [#175](https://github.com/airbnb/caravel/pull/175) refactor dashboard chart html, make several css improvements. (@williaster) +- [#191](https://github.com/airbnb/caravel/pull/191) Merge pull request #191 from airbnb/week-grain (@airbnb) +- [bad3128](https://github.com/airbnb/caravel/commit/bad3128df9562582b6fc3c1995ddbaba196f2d61) Update grain label name +- [48c8a90](https://github.com/airbnb/caravel/commit/48c8a9024785e61ee9339aa783d94a8b9ff9de1b) Fix multi-line statement +- [a9ba47f](https://github.com/airbnb/caravel/commit/a9ba47fe120338326c3f897a38a6179ff6b6a217) Add week ending and week start to grain +- [#190](https://github.com/airbnb/caravel/pull/190) Merge pull request #190 from airbnb/vnum (@airbnb) +- [e17d78e](https://github.com/airbnb/caravel/commit/e17d78e196ba96f99edd2f2cdfa106ba79d16c17) Cranking up version numbers (@mistercrunch) +- [9450c12](https://github.com/airbnb/caravel/commit/9450c12552dda9219044769cf0491fd4dde40d49) note about the previous name in README (@mistercrunch) +- [f01b418](https://github.com/airbnb/caravel/commit/f01b41827e062d4a4790e9f2793b60fdfb0f9851) Adding reqs badge (@mistercrunch) +- [b5f4d3b](https://github.com/airbnb/caravel/commit/b5f4d3b5151ee6c4747f821a4745d33f4f2b73c5) Adding reqs badge (@mistercrunch) +- [28e5a87](https://github.com/airbnb/caravel/commit/28e5a87cd07d8ffb611d85e05d40e8024f44a086) pypi badges (@mistercrunch) +- [10c48f0](https://github.com/airbnb/caravel/commit/10c48f04cde28a71e4d84a6a67273f42e1146615) [renaming] (@mistercrunch) +- [f79aca1](https://github.com/airbnb/caravel/commit/f79aca179632527bc5cbc3d9ba25859d0cc0398a) rename - 2nd phase (@mistercrunch) +- [be6b2fe](https://github.com/airbnb/caravel/commit/be6b2fe5560829e5b0bae2fb6613a8a32dcf4f69) [panoramix] -> [dashed] (@mistercrunch) +- [#184](https://github.com/airbnb/caravel/pull/184) Merge pull request #184 from mistercrunch/chris/sunburst-fixes (@mistercrunch) +- [2b1dcf0](https://github.com/airbnb/caravel/commit/2b1dcf0d2ec1f005a10d516829366e08a2713924) [hotfix] granularity fix (@mistercrunch) +- [987a1af](https://github.com/airbnb/caravel/commit/987a1afbb7d6d379f08f8296691b1ba5b9cae28d) [hotfix] granularity fix (@mistercrunch) +- [f453932](https://github.com/airbnb/caravel/commit/f453932589ef3e14c01bb569b4fa862467696605) [hotfix] druid granularity missing (@mistercrunch) +- [3dc9996](https://github.com/airbnb/caravel/commit/3dc9996e967ad38e15383a8ef54b3759e67ee2e3) hide breadcrumbs on mouseout (@williaster) +- [3197c4b](https://github.com/airbnb/caravel/commit/3197c4b3f9228e566d3d4993b0eed0356ba55867) add utility function for wrapping svg text, apply to sunburst breadcrumbs, and make colors more readable for sunburst. (@williaster) +- [#186](https://github.com/airbnb/caravel/pull/186) Merge pull request #186 from mistercrunch/docstrings (@mistercrunch) +- [1c9c154](https://github.com/airbnb/caravel/commit/1c9c154f0f76c111e79e1c58069ece0a97dcaff2) More docstrings (@mistercrunch) +- [ebf55bf](https://github.com/airbnb/caravel/commit/ebf55bf20dead58b2ceb93d0aad9cbafe2c7e028) Adding docstrings ! (@mistercrunch) +- [3461538](https://github.com/airbnb/caravel/commit/3461538fed4789fb2a917ec0f9eef85129316271) [hotfix] appbuilder modal z-index fix (@mistercrunch) +- [7cdb23f](https://github.com/airbnb/caravel/commit/7cdb23f585fbc0b25e9f6bf34584e5dbe30fa5f7) [hotfix] grouping by grain, filtering on raw expression (@mistercrunch) +- [73daf2f](https://github.com/airbnb/caravel/commit/73daf2f8d1a22956688f2564f7ab18aaae6e7c1a) [hotfix] casting dates for presto grain functions (@mistercrunch) +- [#181](https://github.com/airbnb/caravel/pull/181) Merge pull request #181 from mistercrunch/time_grain (@mistercrunch) +- [0608094](https://github.com/airbnb/caravel/commit/06080945b6db24fe276a35d1e0a9381469e419b5) fix misc sunburst bugs from refactor. (@williaster) +- [61ab06d](https://github.com/airbnb/caravel/commit/61ab06d640cf6e80267ae1af7cd85fb73278d87e) Removing unicode from country data (@mistercrunch) +- [0c045a9](https://github.com/airbnb/caravel/commit/0c045a9e52a181c1ba52e099c02dfd2062303a62) trim '0' groups from sunburst paths to show null groups. add ability to map color to sunburst groupby groups. add fancier breadcrumbs to sunburst. (@williaster) +- [27fb810](https://github.com/airbnb/caravel/commit/27fb810dd7b318e9065babeaf91f31d2ecd617a5) Dynamic time granularity on any datetime column (@mistercrunch) +- [#182](https://github.com/airbnb/caravel/pull/182) Merge pull request #182 from mistercrunch/chris/modal-and-dashboard-css-fixes (@mistercrunch) +- [417b5a5](https://github.com/airbnb/caravel/commit/417b5a5e090283d84ce148383dcaaff2e11f0ad9) Adding linting note to CONTRIBUTING.md (@mistercrunch) +- [#178](https://github.com/airbnb/caravel/pull/178) Merge pull request #178 from mistercrunch/fix_audit (@mistercrunch) +- [1a58b6d](https://github.com/airbnb/caravel/commit/1a58b6d441d0aea93da4613ccee8c8af2800eeed) fix overflow scroll bars on all dashboard charts. make dashboard chart control toggle interaction nicer. make sure user-stylesheets are applied last. remove ace css editor error/warning parsing. make filters look nicer in dashboards. fix some linting. (@williaster) +- [1ab8963](https://github.com/airbnb/caravel/commit/1ab89631b950a1a126b79cf602627eb05a37f624) Adding caching to TODO (@mistercrunch) +- [#175](https://github.com/airbnb/caravel/pull/175) Merge pull request #175 from mistercrunch/chris/css-fixes (@mistercrunch) +- [95b7b97](https://github.com/airbnb/caravel/commit/95b7b9779bb67dc24fd9dab5ff509aea30adb03d) Allowing all extra fields in AuditMixin to be nullable (@mistercrunch) +- [b0fa4bc](https://github.com/airbnb/caravel/commit/b0fa4bc9241192dff85fbd3ef51fca0c81749808) remove unused css (@williaster) +- [49590e2](https://github.com/airbnb/caravel/commit/49590e28e3b97e99131efae95dcd47d72aa45a9e) refactor dashboard chart html, make several css improvements. (@williaster) ### 0.8.0 (2016/03/11 03:33 +00:00) -- [#172](https://github.com/airbnb/caravel/pull/172) Fixing the python and js packaging (@mistercrunch) -- [#171](https://github.com/airbnb/caravel/pull/171) Fixing multiple refresh bug in filter_box (@mistercrunch) -- [#169](https://github.com/airbnb/caravel/pull/169) Fixing the look of select2 components (@mistercrunch) -- [#168](https://github.com/airbnb/caravel/pull/168) Getting travis to build the npm related stuff (@mistercrunch) -- [#166](https://github.com/airbnb/caravel/pull/166) make css theme customization easier by using less for bootstrap themes (@williaster) -- [#163](https://github.com/airbnb/caravel/pull/163) Shipping with CSS templates out of the box (@mistercrunch) -- [#164](https://github.com/airbnb/caravel/pull/164) Improving the docs (@mistercrunch) -- [#165](https://github.com/airbnb/caravel/pull/165) Fixing window resize for explore and standalone (@mistercrunch) -- [#161](https://github.com/airbnb/caravel/pull/161) Add linting to package.json, do all of the linting. (@williaster) -- [#160](https://github.com/airbnb/caravel/pull/160) Fixing the dashed line when using time compare (@mistercrunch) -- [#159](https://github.com/airbnb/caravel/pull/159) Fixing the standalone mode (@mistercrunch) -- [#158](https://github.com/airbnb/caravel/pull/158) Refactor (@mistercrunch) -- [#154](https://github.com/airbnb/caravel/pull/154) Digging into leap year bug and improvming tests (@mistercrunch) -- [#157](https://github.com/airbnb/caravel/pull/157) add button to auto-copy short URLs in /explore page (@williaster) -- [#149](https://github.com/airbnb/caravel/pull/149) Allowing to make certain widgets immune to filter (@mistercrunch) -- [#151](https://github.com/airbnb/caravel/pull/151) Linting (@mistercrunch) -- [#153](https://github.com/airbnb/caravel/pull/153) Improve README (@tay) -- [#139](https://github.com/airbnb/caravel/pull/139) NPMification & Reactification (@williaster, @mistercrunch) -- [#147](https://github.com/airbnb/caravel/pull/147) Tackling Featured Datasets (@mistercrunch) -- [#148](https://github.com/airbnb/caravel/pull/148) Fix typo (@tay) -- [#145](https://github.com/airbnb/caravel/pull/145) Moving files around ... yay! (@mistercrunch) -- [#142](https://github.com/airbnb/caravel/pull/142) A few cosmetic fixes (nvd3 tooltips, buttons, tables) (@mistercrunch) -- [#141](https://github.com/airbnb/caravel/pull/141) A simple base template for npm (@mistercrunch) -- [#140](https://github.com/airbnb/caravel/pull/140) use the latest segment to extract metadata (@dayzzz) -- [#136](https://github.com/airbnb/caravel/pull/136) Improved the bar char to allow for dimensional breakdowns (@mistercrunch) -- [#134](https://github.com/airbnb/caravel/pull/134) Fixing the roles auto maintenance (@mistercrunch) -- [#132](https://github.com/airbnb/caravel/pull/132) [nvd3] fixing the legend toggle bug (@mistercrunch) -- [#131](https://github.com/airbnb/caravel/pull/131) More tests using doctests! (@mistercrunch) -- [#130](https://github.com/airbnb/caravel/pull/130) Logging more (@mistercrunch) -- [#129](https://github.com/airbnb/caravel/pull/129) Renaming Classes related to Druid (@mistercrunch) -- [#127](https://github.com/airbnb/caravel/pull/127) SQL editor, eventually will be tied to a flow to create views (@mistercrunch) -- [#128](https://github.com/airbnb/caravel/pull/128) Allowing definition of css templates (@mistercrunch) -- [#126](https://github.com/airbnb/caravel/pull/126) New viz: Heatmap! (@mistercrunch) -- [#125](https://github.com/airbnb/caravel/pull/125) Consistent colors rendered client side (@mistercrunch) -- [#124](https://github.com/airbnb/caravel/pull/124) A more cohesive color strategy (@mistercrunch) +- [#172](https://github.com/airbnb/caravel/pull/172) Merge pull request #172 from mistercrunch/packaging (@mistercrunch) +- [9e4b38b](https://github.com/airbnb/caravel/commit/9e4b38b5e6174d9f6d8eb662748522a439567fbb) Adjusting css for display not to flicker on dashboard load (@mistercrunch) +- [e2cd14d](https://github.com/airbnb/caravel/commit/e2cd14d3207b582df0a909fd2563ec9d9f4ea405) Fixing the python and js packaging (@mistercrunch) +- [370c5af](https://github.com/airbnb/caravel/commit/370c5af425b226050c9253a0aae38426fcbf1f98) [hotfix] fix utils.markdown function chokes on None (@mistercrunch) +- [e53a1cc](https://github.com/airbnb/caravel/commit/e53a1cc75b7304d157f58bbc6083a7f0667d8a3b) Adding a TODO entry for viz selector (@mistercrunch) +- [#171](https://github.com/airbnb/caravel/pull/171) Merge pull request #171 from mistercrunch/fix_filter (@mistercrunch) +- [8292714](https://github.com/airbnb/caravel/commit/829271417eb9d9c6c53e8c6a293fd7e33af03384) Fixing bug in filter_box (@mistercrunch) +- [#169](https://github.com/airbnb/caravel/pull/169) Merge pull request #169 from mistercrunch/select2-style (@mistercrunch) +- [d6db3a9](https://github.com/airbnb/caravel/commit/d6db3a9cf1de4c9a8eb9237f9471f5751d0bfd79) semicolon (@mistercrunch) +- [c0e4aca](https://github.com/airbnb/caravel/commit/c0e4aca7e47f80c3aa43539c2e0cdc3b951cd4e0) Using dash - instead of _ on filename, making input form-control white (@mistercrunch) +- [9855a60](https://github.com/airbnb/caravel/commit/9855a60013e1a1588e4ce704b912885c60469689) Fixing the look of select2 components (@mistercrunch) +- [#168](https://github.com/airbnb/caravel/pull/168) Merge pull request #168 from mistercrunch/travis_npm (@mistercrunch) +- [b2d72fb](https://github.com/airbnb/caravel/commit/b2d72fbfe120630a77a23b51c4a2a1bcab7eaca1) Tweaks (@mistercrunch) +- [78e01ab](https://github.com/airbnb/caravel/commit/78e01ab0a15f3b30fb2094b587b46b027e8ec590) Caching node_modules (@mistercrunch) +- [454bb10](https://github.com/airbnb/caravel/commit/454bb10f5a89a6b6dab462d191ec0487ebb7b33b) Getting travis to build the npm related stuff (@mistercrunch) +- [ee025b3](https://github.com/airbnb/caravel/commit/ee025b33319be4c1c76c745e118c545652cf0e7e) Fixing REST api and unsortable columns (@mistercrunch) +- [#166](https://github.com/airbnb/caravel/pull/166) Merge pull request #166 from mistercrunch/chris/css (@mistercrunch) +- [9095cd3](https://github.com/airbnb/caravel/commit/9095cd3bca55dc1670c45e1e2045a5611485eae0) update contributing.md to explain updated LESS/CSS customization (@williaster) +- [#163](https://github.com/airbnb/caravel/pull/163) Merge pull request #163 from mistercrunch/css (@mistercrunch) +- [d3f7bbd](https://github.com/airbnb/caravel/commit/d3f7bbd3f15e7bd708292d2aabafaf61dfea6f7a) remove pre-compiled bootstrap themes, use npm/wepack to compile from less variables instead. also fix a few css style bugs. (@williaster) +- [#164](https://github.com/airbnb/caravel/pull/164) Merge pull request #164 from mistercrunch/docs (@mistercrunch) +- [#165](https://github.com/airbnb/caravel/pull/165) Merge pull request #165 from mistercrunch/window_resize (@mistercrunch) +- [9de19b1](https://github.com/airbnb/caravel/commit/9de19b169f3616b8124614ef73f713eb5e86a97f) setResizeOnWindowResize -> bindResizeToWindowResize (@mistercrunch) +- [722c16a](https://github.com/airbnb/caravel/commit/722c16a6e5a0a0e9f7202a527a7d63c47e033d6d) Fixing window resize for explore and standalone (@mistercrunch) +- [5486e5c](https://github.com/airbnb/caravel/commit/5486e5cac8785506bece39a5256a60dd470df2fc) barol -> tirol (@mistercrunch) +- [#161](https://github.com/airbnb/caravel/pull/161) Merge pull request #161 from mistercrunch/chris/eslint (@mistercrunch) +- [0a8ab6c](https://github.com/airbnb/caravel/commit/0a8ab6c499a230eafbbad9ed11f2386833f0202c) Shipping with a CSS template out of the box (@mistercrunch) +- [486fb8b](https://github.com/airbnb/caravel/commit/486fb8bfb452f351a7f3270c93af022a3e02efce) [hotfix] fixing the examples (@mistercrunch) +- [a7e75a2](https://github.com/airbnb/caravel/commit/a7e75a2bc5b4db75e8264e046715fff85d37fe5e) [hotfix] cosmetic fitting for nvd3 line chart overflowing (@mistercrunch) +- [bd29672](https://github.com/airbnb/caravel/commit/bd296720b8ef6e0345053688e1fe04c72961475b) Improving the docs (@mistercrunch) +- [68f8937](https://github.com/airbnb/caravel/commit/68f8937a2e3a7011652afc57de26e86bc17e0fec) lint standalone.js (@williaster) +- [#160](https://github.com/airbnb/caravel/pull/160) Merge pull request #160 from mistercrunch/fix_dashed (@mistercrunch) +- [673f741](https://github.com/airbnb/caravel/commit/673f741aa6084c913749dd3bd1c9ce73cbe2074a) Add linting to package.json, run 'npm run lint' to run (will try to add commit hook later). Do all of the linting... (@williaster) +- [b61ddd0](https://github.com/airbnb/caravel/commit/b61ddd00091230b0a0701f0de4e2e53ce8155709) semicolon (@mistercrunch) +- [e1e1746](https://github.com/airbnb/caravel/commit/e1e17469672f570c0fb264d0ea9971d6dbe25817) Fixing the dashed line when using time compare (@mistercrunch) +- [b6a2521](https://github.com/airbnb/caravel/commit/b6a2521722adc8d57c07e43151b2e46435604a40) hotfix - forgot to add standalone.js (@mistercrunch) +- [#159](https://github.com/airbnb/caravel/pull/159) Merge pull request #159 from mistercrunch/standalone (@mistercrunch) +- [51797ca](https://github.com/airbnb/caravel/commit/51797ca9a5ae6b3e1433448f568dbbcdbaa517ca) Fixing the standalone mode (@mistercrunch) +- [#158](https://github.com/airbnb/caravel/pull/158) Merge pull request #158 from mistercrunch/refactor (@mistercrunch) +- [b44d48c](https://github.com/airbnb/caravel/commit/b44d48c7249c464b3f520dac5e9803c04deb8243) Using vim-jsbeautify (@mistercrunch) +- [a68d742](https://github.com/airbnb/caravel/commit/a68d7428c33fb3f40f8577d466c3c800238a73ee) Javascript refactor (@mistercrunch) +- [e434cbe](https://github.com/airbnb/caravel/commit/e434cbe268a5956946d05e33a4488e1d01206e11) Better filtering (@mistercrunch) +- [#154](https://github.com/airbnb/caravel/pull/154) Merge pull request #154 from mistercrunch/fix_dates (@mistercrunch) +- [4fe89a3](https://github.com/airbnb/caravel/commit/4fe89a38117963ea45c026d1fa62856d47fa60ca) Pinning parsedatetime to 2.0 (@mistercrunch) +- [8c525b7](https://github.com/airbnb/caravel/commit/8c525b7b8ffc4f72fe3ef5a5253784bf7fc4e71c) Hotfix nvd3's secondary xaxis uses the wrong formating (@mistercrunch) +- [#157](https://github.com/airbnb/caravel/pull/157) Merge pull request #157 from mistercrunch/chris/copy-short-url (@mistercrunch) +- [88f9442](https://github.com/airbnb/caravel/commit/88f94422972453ba8a8871cc9eef8fc6b387e075) add button to auto-copy short URLs in /explore page (@williaster) +- [32cd9f5](https://github.com/airbnb/caravel/commit/32cd9f5e73769b5b7253aad7ddad785dd56d8d5d) Updating TODO.md (@mistercrunch) +- [eccf9c2](https://github.com/airbnb/caravel/commit/eccf9c2ac7b1c7f73f610a95059aee7aa95d0419) [hotfix] saving as new bugfix (@mistercrunch) +- [#149](https://github.com/airbnb/caravel/pull/149) Merge pull request #149 from mistercrunch/immune_to_filter (@mistercrunch) +- [be4a7a4](https://github.com/airbnb/caravel/commit/be4a7a407705f82a7c87a9010ff31b4f87e27606) Linting (@mistercrunch) +- [69cfcab](https://github.com/airbnb/caravel/commit/69cfcabb72f6b955974e9c8494b4d4d4bfc11c78) Making Dashboard look better (@mistercrunch) +- [22327e2](https://github.com/airbnb/caravel/commit/22327e204f134633b3a1983e1c1cc84e27b85b3d) Transfering all the json in one point (@mistercrunch) +- [bd06f99](https://github.com/airbnb/caravel/commit/bd06f995eefa51d76156727e16125f637c876b1e) Allowing to make certain widgets immune to filter (@mistercrunch) +- [3a38c60](https://github.com/airbnb/caravel/commit/3a38c601e06e6d45ea085775d31513f93befde83) Fixing tooltips (@mistercrunch) +- [9f809e9](https://github.com/airbnb/caravel/commit/9f809e9f8bd77cc58783ffaab809c4b5d1666ca0) hotfix, readme pointing to the right landscape branch (@mistercrunch) +- [34709c8](https://github.com/airbnb/caravel/commit/34709c8846b35a0df0e4c9bfe0c541afdc95facb) Digging into leap year bug and improvming tests (@mistercrunch) +- [#151](https://github.com/airbnb/caravel/pull/151) Merge pull request #151 from mistercrunch/lint (@mistercrunch) +- [#153](https://github.com/airbnb/caravel/pull/153) Merge pull request #153 from tay/patch-1 (@tay) +- [ca124f2](https://github.com/airbnb/caravel/commit/ca124f271b74111244674615a6059748cbce424e) Improve README (@tay) +- [0a84259](https://github.com/airbnb/caravel/commit/0a842598df457546e2c0a3bf30dc91e2e86edc04) More linting (@mistercrunch) +- [cb46a61](https://github.com/airbnb/caravel/commit/cb46a61728e92a76d1f3f16fea230a5adc567283) Linting (@mistercrunch) +- [8bf629c](https://github.com/airbnb/caravel/commit/8bf629c0b26da6003b73b57bc561adee9ea93c16) [hotfix] fixing explore view (@mistercrunch) +- [#139](https://github.com/airbnb/caravel/pull/139) Merge pull request #139 from mistercrunch/chris/npm-ify2 (@mistercrunch) +- [#147](https://github.com/airbnb/caravel/pull/147) Merge pull request #147 from mistercrunch/npm (@mistercrunch) +- [bc41820](https://github.com/airbnb/caravel/commit/bc4182060a937342028c28572e1574aece14fa07) Rolling back to previous theme until we polish bootswarch.paper (@mistercrunch) +- [58c7b8c](https://github.com/airbnb/caravel/commit/58c7b8c4362f446adae8485a557c9ab1b40ef1c6) Removing js_files and css_files entries from viz.py (@mistercrunch) +- [c304cc4](https://github.com/airbnb/caravel/commit/c304cc493a6c04eb00070278f7be8e8e5013b250) Moving content of assets/readme.md to contributing.md (@mistercrunch) +- [4f4c67c](https://github.com/airbnb/caravel/commit/4f4c67ce15dfeaa57af5260f9925f90006f3a6d3) Moving html assets back to flask template folder (@mistercrunch) +- [c929b2a](https://github.com/airbnb/caravel/commit/c929b2a9c9d8fac095262b623f82815753e279b6) npmify datamaps dependency (@mistercrunch) +- [fd0e680](https://github.com/airbnb/caravel/commit/fd0e680cf0a26c6274836bc49b7a9f0c0f686cb7) Cleaning up assets/vendors (@mistercrunch) +- [70e1aa3](https://github.com/airbnb/caravel/commit/70e1aa37e32bb4f6bd22097f335dba73b25cc2a4) Adding missing fonts (@mistercrunch) +- [e4e7b91](https://github.com/airbnb/caravel/commit/e4e7b911c585517254bf5d87c8adf2020c96c16a) Fixing dashboard.html (@mistercrunch) +- [d8409c1](https://github.com/airbnb/caravel/commit/d8409c1e0a8ff67997b6c28265eb5bdfcf3e65b5) Fixing table and pivot_table (@mistercrunch) +- [8dcd5e0](https://github.com/airbnb/caravel/commit/8dcd5e062871125e37e1c575f143c720aebf5207) Tackling Featured Datasets (@mistercrunch) +- [#148](https://github.com/airbnb/caravel/pull/148) Merge pull request #148 from tay/patch-1 (@tay) +- [7c96a2e](https://github.com/airbnb/caravel/commit/7c96a2eddf509933699897f4a10390098e3d0dde) Fix typo (@tay) +- [#145](https://github.com/airbnb/caravel/pull/145) Merge pull request #145 from mistercrunch/npm (@mistercrunch) +- [e70542d](https://github.com/airbnb/caravel/commit/e70542d743c13631491a8d3167eb8c8f4c0be01e) NPMify sql.html (@mistercrunch) +- [171301b](https://github.com/airbnb/caravel/commit/171301b6cfc46f186ac74a388229f108e6e151f9) Moving files around (@mistercrunch) +- [3e83460](https://github.com/airbnb/caravel/commit/3e834603fcdcd09fd2509c339b60a916900d157e) Remove base.entry.js, declare all JS dependencies in explore using npm. Pin older select2 version to enable select2Sortable. (@williaster) +- [#142](https://github.com/airbnb/caravel/pull/142) Merge pull request #142 from mistercrunch/npm (@mistercrunch) +- [df8ea52](https://github.com/airbnb/caravel/commit/df8ea5287b0d81fa70ab48707e133db42be5bca7) Adjustments based on comment (@mistercrunch) +- [9552d09](https://github.com/airbnb/caravel/commit/9552d09b856722a39a12eb07e4b944340af9a17f) A few cosmetic fixes (nvd3 tooltips, buttons, tables) (@mistercrunch) +- [#141](https://github.com/airbnb/caravel/pull/141) Merge pull request #141 from mistercrunch/npm (@mistercrunch) +- [d582efe](https://github.com/airbnb/caravel/commit/d582efe76b2431863ba2ffa445f74329ef4bbfd4) Fixing 2 links (@mistercrunch) +- [f5e0ed7](https://github.com/airbnb/caravel/commit/f5e0ed7239ecf3b404e56d6d7352079e915648d1) A simple base template for npm (@mistercrunch) +- [79e6fc9](https://github.com/airbnb/caravel/commit/79e6fc986db59fcecac0fca26086257134483efc) huge npm refactor of all visualizations. table views are broken due to broken shimming for jquery/jquery-ui, dashboards are broken due to refactor of explore views. (@williaster) +- [#140](https://github.com/airbnb/caravel/pull/140) Merge pull request #140 from dayzzz/segment_selection (@dayzzz) +- [5c38fc7](https://github.com/airbnb/caravel/commit/5c38fc731a142ea8b98f5345a2d23bf91411f3b1) use the latest segment to extract metadata +- [af34549](https://github.com/airbnb/caravel/commit/af345493773c750d959a7eab5466c33968b9e777) partial refactor of explore page, visualizations not managed with webpack yet. (@williaster) +- [0eb3dcd](https://github.com/airbnb/caravel/commit/0eb3dcd81fdfd3a71549f0fe5ae4c9110af61c35) Update readme.md +- [f40c024](https://github.com/airbnb/caravel/commit/f40c024fdafc8e43e259c379406e708c390d3dd2) Add npm package.json and setup webpack to transpile ES6/JSX and compile JS files for frontend refactor. See readme.md in assets/ for npm setup instructions and visit the panoramix home page for a React sandbox. (@williaster) +- [#136](https://github.com/airbnb/caravel/pull/136) Merge pull request #136 from mistercrunch/barbar (@mistercrunch) +- [7e60b14](https://github.com/airbnb/caravel/commit/7e60b144481f6cc2519e82109b559f00bcfb0ed2) Trying to fix a unicode bug with presto (@mistercrunch) +- [e42d1a1](https://github.com/airbnb/caravel/commit/e42d1a1fc5c576722bcb50ff1f70e1c35aa04111) Improved the bar char to allow for dimensional breakdowns (@mistercrunch) +- [6f4397c](https://github.com/airbnb/caravel/commit/6f4397c7d7ea8889e97f2438edac3843125b9c80) Fixing druid metadata import (@mistercrunch) +- [1f41ce3](https://github.com/airbnb/caravel/commit/1f41ce3a7d1c8108a2e688f2305a7c16f1aaed16) CLI adding refresh_druid command (@mistercrunch) +- [d970e89](https://github.com/airbnb/caravel/commit/d970e896ad3b0b8b1e51b2455d90be3f2dc59939) bugfix - Cluster -> DruidCluster (@mistercrunch) +- [5686dc0](https://github.com/airbnb/caravel/commit/5686dc08650d56509b8a56757ef4754c96d27efa) Bugfix Column -> DruidColumn (@mistercrunch) +- [80651a5](https://github.com/airbnb/caravel/commit/80651a5dc22fe784b4abcec69a365a1568fe8457) More logging (@mistercrunch) +- [2c43968](https://github.com/airbnb/caravel/commit/2c4396882e335179248fd05162a4d030cc0f98e8) More verbose druid metadata refresh (@mistercrunch) +- [ba28fbb](https://github.com/airbnb/caravel/commit/ba28fbbd6b4faf41595af5d19d95e41252ccd404) Fixing link to cluster view (@mistercrunch) +- [#134](https://github.com/airbnb/caravel/pull/134) Merge pull request #134 from mistercrunch/fix_init (@mistercrunch) +- [53a0f81](https://github.com/airbnb/caravel/commit/53a0f81985ef313946cfb9c38a86f342eeba7be6) Fixing the roles auto maintenance (@mistercrunch) +- [baac8c4](https://github.com/airbnb/caravel/commit/baac8c44a549f03804a9969240e43cfd47bb6f08) Desperatly changing view name to avoid proxy odd bug (@mistercrunch) +- [88b8f73](https://github.com/airbnb/caravel/commit/88b8f73489d0fc7d10a17dcfdb2fd72d55add827) Not specifying flask-login version, letting flask-appbuilder do it (@mistercrunch) +- [e02702d](https://github.com/airbnb/caravel/commit/e02702d320365168ca86ea5e1de92328cac57b4c) Pinning appbuilder to 1.6 (@mistercrunch) +- [e39d6db](https://github.com/airbnb/caravel/commit/e39d6dbc3d05de00a960114b573ddf7b873112ef) Hack to log dashboard_ids when slugs are used (@mistercrunch) +- [#132](https://github.com/airbnb/caravel/pull/132) Merge pull request #132 from mistercrunch/fix_legend (@mistercrunch) +- [c7ecb33](https://github.com/airbnb/caravel/commit/c7ecb331e455a9621dd7c6baa05affbdf3767cfd) [nvd3] fixing the legend toggle bug (@mistercrunch) +- [ec05668](https://github.com/airbnb/caravel/commit/ec0566860ad14c2872f6eac10876168448a66792) Fixing legend toggle in nvd3 charts (@mistercrunch) +- [#131](https://github.com/airbnb/caravel/pull/131) Merge pull request #131 from mistercrunch/moretests (@mistercrunch) +- [e039547](https://github.com/airbnb/caravel/commit/e039547762a8ed4abbdbab722d07dd7fce6d09e2) More tests using doctests (@mistercrunch) +- [#130](https://github.com/airbnb/caravel/pull/130) Merge pull request #130 from mistercrunch/log_more (@mistercrunch) +- [#129](https://github.com/airbnb/caravel/pull/129) Merge pull request #129 from mistercrunch/rename_druid_classes (@mistercrunch) +- [b1f88a5](https://github.com/airbnb/caravel/commit/b1f88a53ad6f0b3f0e480cfa9aa2a4769832dbd9) Logging more (@mistercrunch) +- [32442aa](https://github.com/airbnb/caravel/commit/32442aa6b7449c6ed2fdf2830ed535cc823ca015) Adding Metric class as well (@mistercrunch) +- [b18d117](https://github.com/airbnb/caravel/commit/b18d117852d2e5d5cb8ba81dc4e3d8805d3fd4f5) Renaming Classes related to Druid (@mistercrunch) +- [460f6cb](https://github.com/airbnb/caravel/commit/460f6cbed53ad37d550868cb193c3cca02633a63) Updated TODO and color bugfix (@mistercrunch) +- [61b3a85](https://github.com/airbnb/caravel/commit/61b3a85d7a69aee99b92bf56701771a05f29634a) improving the sql view (@mistercrunch) +- [98ba323](https://github.com/airbnb/caravel/commit/98ba32399e6fa58f45b4486e0535b8916eab51ce) Polish (@mistercrunch) +- [b10487c](https://github.com/airbnb/caravel/commit/b10487cf39bf3a6ed37a02f9fb7cc60b6bff970e) Fixing the overflow for tables (@mistercrunch) +- [#127](https://github.com/airbnb/caravel/pull/127) Merge pull request #127 from mistercrunch/sql (@mistercrunch) +- [3b9b81f](https://github.com/airbnb/caravel/commit/3b9b81f93e22e1e62dfb11b286e7daaaba30ebfb) Getting the back button to work (@mistercrunch) +- [9c47415](https://github.com/airbnb/caravel/commit/9c47415d62b24cb15b685073e2dfe027649da681) Error handling and table links (@mistercrunch) +- [50d7d0f](https://github.com/airbnb/caravel/commit/50d7d0fb5ba455c226197be4410d8e71bf22218e) Making progress (@mistercrunch) +- [e8ae49d](https://github.com/airbnb/caravel/commit/e8ae49d18155215c8f7c1b40fa1d2dda64832edd) An airpal like interface (@mistercrunch) +- [354ef9b](https://github.com/airbnb/caravel/commit/354ef9b4bb6bb5c5de7fe9cde94d1a9837a7124a) Polishing the CSS template feature (@mistercrunch) +- [d276be8](https://github.com/airbnb/caravel/commit/d276be8d5080c793d1ec1e9a95861d67ff6e4a01) Moving CSS templates link to Sources (@mistercrunch) +- [#128](https://github.com/airbnb/caravel/pull/128) Merge pull request #128 from mistercrunch/css_templates (@mistercrunch) +- [dbbedc3](https://github.com/airbnb/caravel/commit/dbbedc3ba4d814f2ed18113486fc3443b19cff8e) Allowing definition of css templates (@mistercrunch) +- [9838fbb](https://github.com/airbnb/caravel/commit/9838fbb107950a6ea5e4c0615ade6df670dbeb9f) Fixing bad merge (@mistercrunch) +- [95aa6e0](https://github.com/airbnb/caravel/commit/95aa6e00fa941b91418e74275b1135f090debd60) [fix] can't back out with back button (@mistercrunch) +- [#126](https://github.com/airbnb/caravel/pull/126) Merge pull request #126 from mistercrunch/heatmap (@mistercrunch) +- [4e6e20d](https://github.com/airbnb/caravel/commit/4e6e20daa4f398cdaf1c09c77afed3fbae658905) Allowing for normalizing across x or y (@mistercrunch) +- [44b43a3](https://github.com/airbnb/caravel/commit/44b43a352ab73ea97602ba948cd759207cc78ae4) Adding vid to README.md (@mistercrunch) +- [0714dc6](https://github.com/airbnb/caravel/commit/0714dc62d0a6ffef61aff0d0641a1571f1740e74) Added smoothening option (@mistercrunch) +- [40b28d0](https://github.com/airbnb/caravel/commit/40b28d0afa5896237162f45763296e462b083fac) Allowing different color schemes (@mistercrunch) +- [09c7724](https://github.com/airbnb/caravel/commit/09c77242fc923856425f0571558dcfbe911eaafd) Working without zoom (@mistercrunch) +- [0f58c60](https://github.com/airbnb/caravel/commit/0f58c609d010aa20a2f411e21a6a3738db456349) Heatmap (@mistercrunch) +- [a2f14b3](https://github.com/airbnb/caravel/commit/a2f14b37873fb86943c98bdf2244665f660ab5bf) getting something to show (@mistercrunch) +- [b91460d](https://github.com/airbnb/caravel/commit/b91460db4f86e07b2b97e500a8b4a61ba0fe96b7) [bugfix] sunburst text shows behind arcs (@mistercrunch) +- [#125](https://github.com/airbnb/caravel/pull/125) Merge pull request #125 from mistercrunch/colors_perfect (@mistercrunch) +- [a3c2ee0](https://github.com/airbnb/caravel/commit/a3c2ee0e1d4c9045ea4ce84259842b36b03368f0) Consistent colors rendered client side (@mistercrunch) +- [e6920f8](https://github.com/airbnb/caravel/commit/e6920f8066bdbd7694eccdb3b8a88d5fc694c4da) CRUD views improvements (@mistercrunch) +- [0ca59bc](https://github.com/airbnb/caravel/commit/0ca59bcc210452e5b2b43fe9469e01316e7f29bd) Curating list of fields (@mistercrunch) +- [#124](https://github.com/airbnb/caravel/pull/124) Merge pull request #124 from mistercrunch/colors (@mistercrunch) +- [32e4b9f](https://github.com/airbnb/caravel/commit/32e4b9f2bcd957beebbf728ecaf70e0ebcbb4479) A more cohesive color strategy (@mistercrunch) ### 0.7.0 (2016/01/23 15:16 +00:00) -- [#123](https://github.com/airbnb/caravel/pull/123) Adding a color factory (@mistercrunch) -- [#122](https://github.com/airbnb/caravel/pull/122) Adding Parallel coordinates viz (@mistercrunch) -- [#121](https://github.com/airbnb/caravel/pull/121) Iframe (@mistercrunch) -- [#120](https://github.com/airbnb/caravel/pull/120) Slice information can be displayed in dashboard (@mistercrunch) -- [#117](https://github.com/airbnb/caravel/pull/117) Doing some refactoring (@mistercrunch) -- [#115](https://github.com/airbnb/caravel/pull/115) Providing options for Y axis number formating (@mistercrunch) -- [#112](https://github.com/airbnb/caravel/pull/112) Adding an URL shortner (@mistercrunch) -- [#113](https://github.com/airbnb/caravel/pull/113) Prettier checkboxes (@mistercrunch) -- [#111](https://github.com/airbnb/caravel/pull/111) Loading another example amazing dash (@mistercrunch) -- [#109](https://github.com/airbnb/caravel/pull/109) Getting browser history to work on the explore view (@mistercrunch) -- [#108](https://github.com/airbnb/caravel/pull/108) pulling to the front on hover (@BradBaker) -- [#104](https://github.com/airbnb/caravel/pull/104) simplifying tooltip code (@BradBaker) -- [#105](https://github.com/airbnb/caravel/pull/105) adding stagger for all charts that have a date axis (@BradBaker) -- [#102](https://github.com/airbnb/caravel/pull/102) Fix for 2-axis charts where it shrinks them a little bit (@bradmbaker, @BradBaker) -- [#101](https://github.com/airbnb/caravel/pull/101) Add a Gitter chat badge to README.md (@gitter-badger) -- [#100](https://github.com/airbnb/caravel/pull/100) Update tooltips with new classes (@bradmbaker) -- [#99](https://github.com/airbnb/caravel/pull/99) Time resampling as in Pandas (@mistercrunch) -- [#98](https://github.com/airbnb/caravel/pull/98) Change Scaling to Operate on SVG instead of Div (@bradmbaker) -- [#96](https://github.com/airbnb/caravel/pull/96) Adding a filter box widget (@mistercrunch) -- [#95](https://github.com/airbnb/caravel/pull/95) Working on docs (@mistercrunch) -- [#94](https://github.com/airbnb/caravel/pull/94) Massive js refactor + Dashboard filters (@mistercrunch) -- [#93](https://github.com/airbnb/caravel/pull/93) Controller (@mistercrunch) -- [#92](https://github.com/airbnb/caravel/pull/92) Allowing not to group by on table view (@mistercrunch) -- [#91](https://github.com/airbnb/caravel/pull/91) Exports (@mistercrunch) -- [#90](https://github.com/airbnb/caravel/pull/90) A basic squeleton for the docs (@mistercrunch) -- [#89](https://github.com/airbnb/caravel/pull/89) Featured datasets (@michellethomas) -- [#87](https://github.com/airbnb/caravel/pull/87) fixing a few bugs with tool tip overflow (@BradBaker) -- [#88](https://github.com/airbnb/caravel/pull/88) World Map viz with bubbles (@mistercrunch) -- [#86](https://github.com/airbnb/caravel/pull/86) adjusting date formats (@BradBaker) -- [#85](https://github.com/airbnb/caravel/pull/85) Adding sankey diagrams (@mistercrunch) -- [#84](https://github.com/airbnb/caravel/pull/84) Adding directed force layout viz (@mistercrunch) -- [#83](https://github.com/airbnb/caravel/pull/83) Big JS refactor (@mistercrunch) -- [#82](https://github.com/airbnb/caravel/pull/82) letting tooltips in the dashboard overflow (@BradBaker) -- [#81](https://github.com/airbnb/caravel/pull/81) Slightly better layout for explore page (@mistercrunch) -- [#80](https://github.com/airbnb/caravel/pull/80) Checkboxes everywhere (@mistercrunch) -- [#79](https://github.com/airbnb/caravel/pull/79) Cleanup around multiple select fields (@mistercrunch) +- [012a651](https://github.com/airbnb/caravel/commit/012a651586b0332b6f7753111fd008f7597019b5) v0.7.0 (@mistercrunch) +- [#123](https://github.com/airbnb/caravel/pull/123) Merge pull request #123 from mistercrunch/color_factory (@mistercrunch) +- [2df3cfd](https://github.com/airbnb/caravel/commit/2df3cfd774f312a6333dfb47bd31646b41a542e6) Adding a color factory (@mistercrunch) +- [#122](https://github.com/airbnb/caravel/pull/122) Merge pull request #122 from mistercrunch/para (@mistercrunch) +- [73989f4](https://github.com/airbnb/caravel/commit/73989f41ac0f6eb6f07b92b3b101c6f13b0be493) Adding Parallel coordinates viz (@mistercrunch) +- [2885227](https://github.com/airbnb/caravel/commit/2885227050a865cca8c4d72f77d162bce10a3987) Autodocs (@mistercrunch) +- [#121](https://github.com/airbnb/caravel/pull/121) Merge pull request #121 from mistercrunch/iframe (@mistercrunch) +- [5f88068](https://github.com/airbnb/caravel/commit/5f880682c0887c5ef8e34168ad40da377a474cda) Fixing a bug (@mistercrunch) +- [5f9f95b](https://github.com/airbnb/caravel/commit/5f9f95b717ee54f20e43e72a1e2d87a888e04c8a) Adding a basic ifram viz (@mistercrunch) +- [#120](https://github.com/airbnb/caravel/pull/120) Merge pull request #120 from mistercrunch/sliceinfo (@mistercrunch) +- [110be35](https://github.com/airbnb/caravel/commit/110be3551a66f792a1a65ffbe035c530f2c4b63e) bugfix in explore view (@mistercrunch) +- [8d40717](https://github.com/airbnb/caravel/commit/8d40717a9226bef08d75766ab7e80b3b2e2179a6) Adding description for new field in crud (@mistercrunch) +- [e40f5bc](https://github.com/airbnb/caravel/commit/e40f5bc6d6db98c985156dd9496279b20d0b6c7a) Displaying markdown slice info on dash view (@mistercrunch) +- [ba1dfcb](https://github.com/airbnb/caravel/commit/ba1dfcb8456e225c055069ce021f2333c6920445) Refactor + timeformating options (@mistercrunch) +- [b594b8a](https://github.com/airbnb/caravel/commit/b594b8a93b6c8420ae6359dffe400cf227a98cae) BigNumber tweaks (@mistercrunch) +- [#117](https://github.com/airbnb/caravel/pull/117) Merge pull request #117 from mistercrunch/refact (@mistercrunch) +- [085430c](https://github.com/airbnb/caravel/commit/085430cb53864f124a0c0b3ec230b01165546898) Doing some refactoring (@mistercrunch) +- [#115](https://github.com/airbnb/caravel/pull/115) Merge pull request #115 from mistercrunch/y_format (@mistercrunch) +- [d9e4c75](https://github.com/airbnb/caravel/commit/d9e4c7512280654e54cb5e30a89ca3189b333a22) Parameterizing the number of gunicorn workers (@mistercrunch) +- [976b777](https://github.com/airbnb/caravel/commit/976b7772f0716fb063a88fdae1c92a1128c41056) Weeding some useless lines (@mistercrunch) +- [02e519a](https://github.com/airbnb/caravel/commit/02e519ab61814a1094cd2a4665c9a66e5ef98237) Fixing the bug where filters don't apply on load (@mistercrunch) +- [5910bf0](https://github.com/airbnb/caravel/commit/5910bf007acd15676d14ece67801cb85355f4abd) Providing options for Y axis number formating (@mistercrunch) +- [69a385b](https://github.com/airbnb/caravel/commit/69a385bade2d6e5e35e45289ff25574b3f4b5fe3) [hotfix] date casting (@mistercrunch) +- [#112](https://github.com/airbnb/caravel/pull/112) Merge pull request #112 from mistercrunch/url_shortner (@mistercrunch) +- [#113](https://github.com/airbnb/caravel/pull/113) Merge pull request #113 from mistercrunch/check (@mistercrunch) +- [#111](https://github.com/airbnb/caravel/pull/111) Merge pull request #111 from mistercrunch/load_ex_dash (@mistercrunch) +- [df797c0](https://github.com/airbnb/caravel/commit/df797c0ae0e4bd8fb720ac7d3dcb6a2e8f8e1ecb) Prettier checkboxes (@mistercrunch) +- [f4ef1c0](https://github.com/airbnb/caravel/commit/f4ef1c02a27a934ccb63f8252a82fd6e6d8c01c7) Adding an URL shortner (@mistercrunch) +- [a3727fc](https://github.com/airbnb/caravel/commit/a3727fc0919dd5004f13cc26848bd1fed9a72d60) Making sqlite work (@mistercrunch) +- [ef5511c](https://github.com/airbnb/caravel/commit/ef5511cccf68b170a71fcbc6b884b84e928dc7f0) Getting stuff to load (@mistercrunch) +- [a38a8d4](https://github.com/airbnb/caravel/commit/a38a8d476e04c242a154b9c509ae1b68f55e0878) Loading another example amazing dash (@mistercrunch) +- [d726bd0](https://github.com/airbnb/caravel/commit/d726bd0e0512cbfe8fda92c8e717bcf369549d62) NVD3 form optinos for stacked/expanded/grouped ... (@mistercrunch) +- [7982dee](https://github.com/airbnb/caravel/commit/7982dee83495584de18a7ca6cd8085c8c4eb1c58) Updating the CONTRIBUTING.md (@mistercrunch) +- [4f7a5f3](https://github.com/airbnb/caravel/commit/4f7a5f33bb57ea532d6cded8399f4cad623d9356) Refactoring (@mistercrunch) +- [b6b8d04](https://github.com/airbnb/caravel/commit/b6b8d046c86e8fbc0121eddb2cf334c1d4d3b768) Tunning timeseries settings (@mistercrunch) +- [089a8c6](https://github.com/airbnb/caravel/commit/089a8c677cc911e62880c8a29d28e835adc3c707) [hotfix] no data (@mistercrunch) +- [f434f3c](https://github.com/airbnb/caravel/commit/f434f3c7561b060f8b48646b2adfe25cb19df084) Raising earlier on no data (@mistercrunch) +- [ffe9a68](https://github.com/airbnb/caravel/commit/ffe9a68712a36634893681f1910f36fe6dd89197) Adding a picture for who dataset (@mistercrunch) +- [2b01340](https://github.com/airbnb/caravel/commit/2b01340bb61a928f29d33f9e1cb5b74c8093b94d) Allowing TableViz to show time granularity (@mistercrunch) +- [0e0ae7b](https://github.com/airbnb/caravel/commit/0e0ae7bc929b126c57a4f873690ab5c20af0ac68) Increasing page_size to 500 in crud (@mistercrunch) +- [4941565](https://github.com/airbnb/caravel/commit/4941565a419e554b26e9f57e52bd15361c297693) Making TableViz support a time_series (@mistercrunch) +- [299ad09](https://github.com/airbnb/caravel/commit/299ad095760f1ed6d1f43549a4c979df508bd624) [bugfix] columns dupplicated in Druid df (@mistercrunch) +- [552a309](https://github.com/airbnb/caravel/commit/552a3094df104eb42c597153d35dd481a4dcf0ca) Getting the markdown to do what it should (@mistercrunch) +- [2b0c550](https://github.com/airbnb/caravel/commit/2b0c550a0bb67a4ab4e46e3e9fd4ee168e5d38b5) Improvments to load_examples (@mistercrunch) +- [2b69912](https://github.com/airbnb/caravel/commit/2b69912c460fcc453f39e46e5d51f0c0ae828379) Minor bug fixes (@mistercrunch) +- [ceb0dc1](https://github.com/airbnb/caravel/commit/ceb0dc198562043b4661218e8747782421f42709) Touchups on field list (@mistercrunch) +- [ed96f9b](https://github.com/airbnb/caravel/commit/ed96f9b92fa052909f12612a5ff1ceb86fe5afb8) Fixing the word bad assumptions about field ordering (@mistercrunch) +- [4aa70d0](https://github.com/airbnb/caravel/commit/4aa70d0f43fcf919670995a3acf348c109b52a25) Ordering columns in the Druid pandas df (@mistercrunch) +- [6c92fa4](https://github.com/airbnb/caravel/commit/6c92fa471d23196e3e319fbfb82728ef18e38386) some error handling for WordCloud (@mistercrunch) +- [3efaec8](https://github.com/airbnb/caravel/commit/3efaec8983dd77ee728d5ad21368d3d168e05735) Minor fix + TODO alterations (@mistercrunch) +- [#109](https://github.com/airbnb/caravel/pull/109) Merge pull request #109 from mistercrunch/hash_change (@mistercrunch) +- [f0cdf43](https://github.com/airbnb/caravel/commit/f0cdf4318d712c35ab38c96c31fc7b85c9334e57) Getting browser history to work on the explore view (@mistercrunch) +- [#108](https://github.com/airbnb/caravel/pull/108) Merge pull request #108 from bradmbaker/brad_baker_final_fix_for_tooltip (@bradmbaker) +- [7fb845f](https://github.com/airbnb/caravel/commit/7fb845f38d630fc3234276283bc05d9730ab72e4) pulling to the front on hover (@BradBaker) +- [af55285](https://github.com/airbnb/caravel/commit/af5528519dd6c3b06d2df1eb197dbf3b25aa801e) Made json csv and standalone button more dynamic (@mistercrunch) +- [4c8b275](https://github.com/airbnb/caravel/commit/4c8b275f8837b23dd1a606fac9d959addb458165) Minor tweaks (@mistercrunch) +- [a4c7964](https://github.com/airbnb/caravel/commit/a4c79648a9f4fb0f2b8a16d34852c6e2c802f88a) Minor cosmetic changes (@mistercrunch) +- [fc038a6](https://github.com/airbnb/caravel/commit/fc038a6e78a3f9fb68665df155d16c146aa93af5) JS bugfixes (@mistercrunch) +- [#104](https://github.com/airbnb/caravel/pull/104) Merge pull request #104 from bradmbaker/brad_baker_fixing_tooltips_v2 (@bradmbaker) +- [#105](https://github.com/airbnb/caravel/pull/105) Merge pull request #105 from bradmbaker/brad_baker_adding_stagger_to_all_date_charts (@bradmbaker) +- [99aa6f7](https://github.com/airbnb/caravel/commit/99aa6f71e22ef693736da04218151c3e3cf633f6) adding stagger for all charts that have a date axis (@BradBaker) +- [e4f45ac](https://github.com/airbnb/caravel/commit/e4f45ac2858d65473180745c6de6534f1a486215) simplifying tooltip code (@BradBaker) +- [#102](https://github.com/airbnb/caravel/pull/102) Merge pull request #102 from bradmbaker/brad_baker_adding_two_x_axis_rescaling_to_nvd3_file (@bradmbaker) +- [7e827da](https://github.com/airbnb/caravel/commit/7e827da3b12cf8aadd524aa2a999ca6a2bd23760) fixing indents (@bradmbaker) +- [#101](https://github.com/airbnb/caravel/pull/101) Merge pull request #101 from gitter-badger/gitter-badge (@gitter-badger) +- [98809cb](https://github.com/airbnb/caravel/commit/98809cb3f4886f3e0ff33724342da73acce85bb0) Fix for 2-axis charts where it shrinks them a little bit (@BradBaker) +- [#100](https://github.com/airbnb/caravel/pull/100) Merge pull request #100 from bradmbaker/patch-1 (@bradmbaker) +- [09b8ed5](https://github.com/airbnb/caravel/commit/09b8ed55487acf0e724d0ad6b73a59ee9d414f97) Adding link to Gitter channel in README (@mistercrunch) +- [05b391c](https://github.com/airbnb/caravel/commit/05b391cf1ccf918cff35bb9eec2c27bbb1ac175c) Add Gitter badge (@gitter-badger) +- [9bc2f08](https://github.com/airbnb/caravel/commit/9bc2f08b10f1f9a8feaa47215c2d438f278fb9f9) Improving the Test Connection button (@mistercrunch) +- [a04cf27](https://github.com/airbnb/caravel/commit/a04cf2706ff221b5f8c9a54192db35968a28d821) Update tooltips with new classes (@bradmbaker) +- [27ceb15](https://github.com/airbnb/caravel/commit/27ceb150c3114f33986611605d1b83bbb0cd77b9) Fixing jumpy clock number (@mistercrunch) +- [3fa3ce1](https://github.com/airbnb/caravel/commit/3fa3ce1a12b809d0d5e802425b096ef0bccefa85) Fixing resampling options (@mistercrunch) +- [51e9cb3](https://github.com/airbnb/caravel/commit/51e9cb3d3e3f1713461b1b66f64c160e46decda0) Making all nvd3 timeseries have the full fieldset (@mistercrunch) +- [ee73b6f](https://github.com/airbnb/caravel/commit/ee73b6fd1205adf75e824d771aa8c9b7c3f24d89) Changing the time range selector default to False (@mistercrunch) +- [#99](https://github.com/airbnb/caravel/pull/99) Merge pull request #99 from mistercrunch/resample (@mistercrunch) +- [3216fa2](https://github.com/airbnb/caravel/commit/3216fa2140463fdb29b495ff0171ebd6b22006d2) Allowing line breaks in fieldsets (@mistercrunch) +- [#98](https://github.com/airbnb/caravel/pull/98) Merge pull request #98 from bradmbaker/patch-1 (@bradmbaker) +- [ade9175](https://github.com/airbnb/caravel/commit/ade917582f2c0a619de074f066be05bae1986bdb) Adding basic resampling capabilities from pandas (@mistercrunch) +- [9959d26](https://github.com/airbnb/caravel/commit/9959d266f0ced7f8a13265b72c5d44b3988f2c4f) Change Scaling to Operate on SVG instead of Div (@bradmbaker) +- [4f12e78](https://github.com/airbnb/caravel/commit/4f12e78a648f9ba953287227afd2e0d8432c21ce) Fixed left panel in explore view (@mistercrunch) +- [3a3e7c8](https://github.com/airbnb/caravel/commit/3a3e7c8964bb173fd106b64ba2364d87eba0ef3a) A much more clear TODO.md (@mistercrunch) +- [#96](https://github.com/airbnb/caravel/pull/96) Merge pull request #96 from mistercrunch/filter_box (@mistercrunch) +- [37cbf61](https://github.com/airbnb/caravel/commit/37cbf61480d05a355d64e1a01f5a9a59b30286a2) Adding markdown support for table descriptions (@mistercrunch) +- [6df3e67](https://github.com/airbnb/caravel/commit/6df3e67bdbcdb39f97ca44c43363eddac494cb87) Fixing the filters (@mistercrunch) +- [ef14c21](https://github.com/airbnb/caravel/commit/ef14c212814179ccc03cea701d14517bcd93f08f) Adding volume indicators on filter box (@mistercrunch) +- [5ad4f38](https://github.com/airbnb/caravel/commit/5ad4f38c49644de5c4aa8d515b939529dc7ee609) Fixing images in docs (@mistercrunch) +- [07df0f1](https://github.com/airbnb/caravel/commit/07df0f109f78aa8a1ff28107872c2bb04cc17e87) Adding a filter box widget (@mistercrunch) +- [#95](https://github.com/airbnb/caravel/pull/95) Merge pull request #95 from mistercrunch/docs2 (@mistercrunch) +- [e96494e](https://github.com/airbnb/caravel/commit/e96494e0cfdf6137f77533836bec53c5cb059d2d) Working on docs (@mistercrunch) +- [0a9600d](https://github.com/airbnb/caravel/commit/0a9600d994dc2bdfffcb6fd3f5ada93df0cba880) Minor improvements on the bubble plot (@mistercrunch) +- [#94](https://github.com/airbnb/caravel/pull/94) Merge pull request #94 from mistercrunch/context (@mistercrunch) +- [010fbc3](https://github.com/airbnb/caravel/commit/010fbc369350fe76bdedfc7e1f6aea04428f7a34) Fixed standalone view (@mistercrunch) +- [dfee55d](https://github.com/airbnb/caravel/commit/dfee55df1af17705816fc8a8e8f5692212aac8d4) Fixing save ops (@mistercrunch) +- [9427cd6](https://github.com/airbnb/caravel/commit/9427cd6216424dae36fe5f956b73cc81a5ddc474) Fixing date processing (@mistercrunch) +- [e7ccbef](https://github.com/airbnb/caravel/commit/e7ccbefe87b746c6c28787a381c218d76ca5dace) Achieving ASYNC explore (@mistercrunch) +- [527bc14](https://github.com/airbnb/caravel/commit/527bc141628034b88ea82c65a78d9e70c4b6a225) TODO (@mistercrunch) +- [b88f282](https://github.com/airbnb/caravel/commit/b88f2825ea92103fb011a81b70a284823cc62426) Improvements to bubble chart (@mistercrunch) +- [c3bec3e](https://github.com/airbnb/caravel/commit/c3bec3e35b679e65ed3bdb7cefaf92a964d889fb) refactoring the imports (@mistercrunch) +- [a5c1358](https://github.com/airbnb/caravel/commit/a5c13582297bc798d04c77a3fd8fc505fa9486f3) Fixing py3 error (@mistercrunch) +- [0f892c6](https://github.com/airbnb/caravel/commit/0f892c6a4d57b49a8f86a5488db08af7b2726093) Fixing sqlite error msg (@mistercrunch) +- [afae892](https://github.com/airbnb/caravel/commit/afae89239d1b0831b5615d1ab24d2534ebc8c6be) Adding another example file (@mistercrunch) +- [8682196](https://github.com/airbnb/caravel/commit/8682196eb88e3046f9c4e6b6fc471804531c928c) Getting filters to a reasonable place (@mistercrunch) +- [e0586ec](https://github.com/airbnb/caravel/commit/e0586ec6664657e8d942e1438eebbf32d70e5be8) Working state (@mistercrunch) +- [4e21fb4](https://github.com/airbnb/caravel/commit/4e21fb42850a898ccaf3c86076222a2e6ff16f18) Adding support for quoted field names (@mistercrunch) +- [6a28ad3](https://github.com/airbnb/caravel/commit/6a28ad3f4e295f8401555c4fd51c946ea01a90c6) Adding standalone mode (@mistercrunch) +- [fffb0a7](https://github.com/airbnb/caravel/commit/fffb0a7a804df8fce09e2d464e20ccee7e225670) Getting rid of the template heavy approach (@mistercrunch) +- [458703d](https://github.com/airbnb/caravel/commit/458703d9c864055870e0ada0ad08b40e095d9486) Getting the dashboard filters to work (@mistercrunch) +- [b1399b9](https://github.com/airbnb/caravel/commit/b1399b97a9de9b26a8eca583b858e4fc19725897) Progress (@mistercrunch) +- [48f5fcf](https://github.com/airbnb/caravel/commit/48f5fcfcc7907feb20858de25b9ff86ee564e753) Some major refactoring (@mistercrunch) +- [4b481e9](https://github.com/airbnb/caravel/commit/4b481e938a37617c696f23cbfd6b10f1244eda02) Getting in a working state (@mistercrunch) +- [973f1a6](https://github.com/airbnb/caravel/commit/973f1a62352cb7e226b4fc7bbcd79665914a9d6f) removing table-info from featured datasets (@mistercrunch) +- [#93](https://github.com/airbnb/caravel/pull/93) Merge pull request #93 from mistercrunch/controller (@mistercrunch) +- [c108063](https://github.com/airbnb/caravel/commit/c1080638ae5c94b7a6e1f213f0125a4daa35a059) Passing a ctrl to the js (@mistercrunch) +- [5435f53](https://github.com/airbnb/caravel/commit/5435f53702160660e52f38d5b62dcc833b5fc664) Passing a controller object to widget (@mistercrunch) +- [#92](https://github.com/airbnb/caravel/pull/92) Merge pull request #92 from mistercrunch/nogroupby (@mistercrunch) +- [19eb177](https://github.com/airbnb/caravel/commit/19eb177fe362ec942c7ce7d9ba388f8bab5760fe) Changing resize action to do nothing (@mistercrunch) +- [bd75a58](https://github.com/airbnb/caravel/commit/bd75a58f241b2c4072334cc39f87db674600f2f4) Re writting table viz (@mistercrunch) +- [55c4433](https://github.com/airbnb/caravel/commit/55c4433b0bcf66200ff07445451faa823745e8fd) Allowing to not group by on table view (@mistercrunch) +- [#91](https://github.com/airbnb/caravel/pull/91) Merge pull request #91 from mistercrunch/exports (@mistercrunch) +- [d933810](https://github.com/airbnb/caravel/commit/d933810cae4c1035113c4ccba1e51602964398eb) updating TODO (@mistercrunch) +- [1cd63c3](https://github.com/airbnb/caravel/commit/1cd63c3e4a6ead15151d139e5881d451b81558bd) Adding a unit test (@mistercrunch) +- [5f6236c](https://github.com/airbnb/caravel/commit/5f6236c80bbe143c283bcb0e8bd36b4195f1aaf2) Export to csv or json (@mistercrunch) +- [#90](https://github.com/airbnb/caravel/pull/90) Merge pull request #90 from mistercrunch/docs (@mistercrunch) +- [880c739](https://github.com/airbnb/caravel/commit/880c7397e1d3e97b74df0293140670d987054cc8) A basic squeleton for the docs (@mistercrunch) +- [#89](https://github.com/airbnb/caravel/pull/89) Merge pull request #89 from mistercrunch/featured_datasets (@mistercrunch) +- [79e7818](https://github.com/airbnb/caravel/commit/79e7818ba83237c78092a66a391d5bfa809038c5) Changes to the layout of the featured datasets page (@michellethomas) +- [2a30908](https://github.com/airbnb/caravel/commit/2a309083283606a067d6e3ede6a7a160aff6d750) Merge branch 'master' of github.com:mistercrunch/panoramix (@mistercrunch) +- [4e3d284](https://github.com/airbnb/caravel/commit/4e3d284785c5b6cd815b5ec1bc06e86223cf5ad6) Restoring error bubbling (@mistercrunch) +- [e5256ef](https://github.com/airbnb/caravel/commit/e5256ef6da462a7259436c10f5e435eb3023a0d1) Fixing alignment of a hanging indent for code quality (@michellethomas) +- [f24e58a](https://github.com/airbnb/caravel/commit/f24e58abf295a048d31d980e291adc83adb15d3a) Fixes to the downgrade migration for user_id in sqlatables (@michellethomas) +- [#87](https://github.com/airbnb/caravel/pull/87) Merge pull request #87 from bradmbaker/brad_adding_js_to_allow_overflow_to_actually_work (@bradmbaker) +- [#88](https://github.com/airbnb/caravel/pull/88) Merge pull request #88 from mistercrunch/map (@mistercrunch) +- [b3edc07](https://github.com/airbnb/caravel/commit/b3edc077dcec61c99bc33477137c006983860e94) Touchups (@mistercrunch) +- [48c1481](https://github.com/airbnb/caravel/commit/48c1481caaf5a4521f07e41ff2aad4d702257a80) World Map with bubbles (@mistercrunch) +- [6f948f0](https://github.com/airbnb/caravel/commit/6f948f07838ae037ba92f2c2cedd2bddaf1fc948) Changing DataTables to default to show all and sort by database (@michellethomas) +- [6bbcbe5](https://github.com/airbnb/caravel/commit/6bbcbe524a4027a1b19e18c365d7a085230ab135) Fixing the button on the featured datasets page (@michellethomas) +- [6155ff8](https://github.com/airbnb/caravel/commit/6155ff8de6a9d7c8c18f6bfcb15e5938c2404bc8) Adding owner to sqlatables and changing some of the formatting using DataTables +- [30df7be](https://github.com/airbnb/caravel/commit/30df7be25842ca9087fc0aa1ba46147e3ea2d69d) Adding a view for featured datasets +- [e0f8f2c](https://github.com/airbnb/caravel/commit/e0f8f2cdcafe0ae2412c9b0086e2cd6e13078c96) fixing a few bugs with tool tip overflow (@BradBaker) +- [#86](https://github.com/airbnb/caravel/pull/86) Merge pull request #86 from bradmbaker/brad_adding_new_and_improved_date_formats (@bradmbaker) +- [d6b6433](https://github.com/airbnb/caravel/commit/d6b6433d52404c75c90cdb8706674bc581713339) Better list view for druid datasurces (@mistercrunch) +- [e2220de](https://github.com/airbnb/caravel/commit/e2220ded7f916d0eea093318c83f7e1b54f1fe00) adjusting date formats (@BradBaker) +- [#85](https://github.com/airbnb/caravel/pull/85) Merge pull request #85 from mistercrunch/sankey (@mistercrunch) +- [c09ff2b](https://github.com/airbnb/caravel/commit/c09ff2b7eb77209633e4e7074a4be5fe2f7de8c4) Getting the query to show (@mistercrunch) +- [0b0a095](https://github.com/airbnb/caravel/commit/0b0a0951639816abecfd2a5b897dd7799cdc3e99) Adding sankey diagrams (@mistercrunch) +- [eb6890f](https://github.com/airbnb/caravel/commit/eb6890f7428ef5aba418e5ed20956070fc8521d8) Namespacing sunburst CSS (@mistercrunch) +- [c2736b3](https://github.com/airbnb/caravel/commit/c2736b34cd43bdbd31e14ad24ea2093632ee4609) Making row_limit freeform (@mistercrunch) +- [#84](https://github.com/airbnb/caravel/pull/84) Merge pull request #84 from mistercrunch/force (@mistercrunch) +- [c563057](https://github.com/airbnb/caravel/commit/c563057099089c18f6461ed163afbc73d916e6fd) Adding directed force layout viz (@mistercrunch) +- [#83](https://github.com/airbnb/caravel/pull/83) Merge pull request #83 from mistercrunch/js (@mistercrunch) +- [51b273b](https://github.com/airbnb/caravel/commit/51b273b5b8f21350e1f33a1ba7b1dd38450d73cb) Big JS refactor (@mistercrunch) +- [#82](https://github.com/airbnb/caravel/pull/82) Merge pull request #82 from bradmbaker/letting_tool_tips_overflow (@bradmbaker) +- [65be15c](https://github.com/airbnb/caravel/commit/65be15cc8d290b425fe76d8f6d6b46a484d8ec80) letting tooltips in the dashboard overflow (@BradBaker) +- [c6d007c](https://github.com/airbnb/caravel/commit/c6d007cc8b48c9831de27050c46f9391163d52fa) Style (@mistercrunch) +- [eb13ce1](https://github.com/airbnb/caravel/commit/eb13ce1840e6937c244d2dfc7c62f857853693e1) Cleaning up the html indentation on explore.html (@mistercrunch) +- [6b069c6](https://github.com/airbnb/caravel/commit/6b069c6741dbf87cb2206b30a83c5aee3b3b168b) Cosmetics on dropdowns (@mistercrunch) +- [#81](https://github.com/airbnb/caravel/pull/81) Merge pull request #81 from mistercrunch/layout (@mistercrunch) +- [d50a768](https://github.com/airbnb/caravel/commit/d50a768df9057ae575f30abab59e214bdabadfda) Fix td align (@mistercrunch) +- [#80](https://github.com/airbnb/caravel/pull/80) Merge pull request #80 from mistercrunch/checkboxes (@mistercrunch) +- [0d6720a](https://github.com/airbnb/caravel/commit/0d6720ad37a2b16ecea8ff1be2943f6481c54ea9) Checkboxes everywhere (@mistercrunch) +- [c97b0b6](https://github.com/airbnb/caravel/commit/c97b0b6026f634f16b7cd48bcea23a408878d7dc) Slightly better layout for explore page (@mistercrunch) +- [#79](https://github.com/airbnb/caravel/pull/79) Merge pull request #79 from mistercrunch/freeform_dropd (@mistercrunch) +- [5701696](https://github.com/airbnb/caravel/commit/5701696c7982805bcb291a3892470dbaad4dbbfe) py3 compatibility (@mistercrunch) +- [f4e4c52](https://github.com/airbnb/caravel/commit/f4e4c529a04f38fc4f7411b7bf5215063560a6d2) Cleanup around multiple select fields (@mistercrunch) + +### 0.6.1 (2015/12/12 17:44 +00:00) +- [08fd4d1](https://github.com/airbnb/caravel/commit/08fd4d125870c9c30240d26483bf9dacc22bf98c) 0.6.1 (@mistercrunch) +- [18a2670](https://github.com/airbnb/caravel/commit/18a2670f419b8d1f28ede6ed948ec9ebb1f741f3) [bugfix] sqlite ALTER issue (@mistercrunch) +- [65c1c42](https://github.com/airbnb/caravel/commit/65c1c42bc816241943553515f490462382bbe35e) Align dashboard title (@mistercrunch) +- [1fe1549](https://github.com/airbnb/caravel/commit/1fe15496cefe073959699ea909962fea114b5149) Formatting change_on column in list views (@mistercrunch) +- [b628713](https://github.com/airbnb/caravel/commit/b62871368550a5c2ac848d558776d88ffafb3d92) Adding a link section to readme (@mistercrunch) +- [59c1ee3](https://github.com/airbnb/caravel/commit/59c1ee3c0375a9743b82e9379a17cf397e0bdc69) fix migrations (@mistercrunch) ### 0.6.0 (2015/12/11 01:17 +00:00) -- [#77](https://github.com/airbnb/caravel/pull/77) Better tooltips and more ways to integrate them easily (@mistercrunch) -- [#76](https://github.com/airbnb/caravel/pull/76) Introducing form overrides for label and tooltips (@mistercrunch) -- [#75](https://github.com/airbnb/caravel/pull/75) New viz: sunbursts (@mistercrunch) -- [#74](https://github.com/airbnb/caravel/pull/74) Introducing fieldsets (@mistercrunch) -- [#73](https://github.com/airbnb/caravel/pull/73) Airflowlike theme (@mistercrunch) -- [#72](https://github.com/airbnb/caravel/pull/72) Logging slice and dash views (@mistercrunch) -- [#70](https://github.com/airbnb/caravel/pull/70) Adding url slug support for dashboard model (@mistercrunch) -- [#71](https://github.com/airbnb/caravel/pull/71) Add option to show minmax on x axis (@mistercrunch) -- [#69](https://github.com/airbnb/caravel/pull/69) Allowing for [Save AS] and [Overwrite] (@mistercrunch) -- [#68](https://github.com/airbnb/caravel/pull/68) Adding cumsum to rolling functions (@mistercrunch) -- [#67](https://github.com/airbnb/caravel/pull/67) Fix debug mode calls get_json twice (@mistercrunch) -- [#66](https://github.com/airbnb/caravel/pull/66) Adding a PivotTableViz (@mistercrunch) -- [#65](https://github.com/airbnb/caravel/pull/65) Adding custom HAVING clause (@mistercrunch) -- [#64](https://github.com/airbnb/caravel/pull/64) Preserving the ordering in selectmultiple (@mistercrunch) -- [#63](https://github.com/airbnb/caravel/pull/63) Encrypting the passwords out of connection strings (@mistercrunch) -- [#61](https://github.com/airbnb/caravel/pull/61) BetterBooleanField to fix html omitting non-checked (@patrickleotardif) -- [#60](https://github.com/airbnb/caravel/pull/60) Fix Markup Widget bug (@NiharikaRay) -- [#59](https://github.com/airbnb/caravel/pull/59) Adding y-axis format option (@patrickleotardif) -- [#58](https://github.com/airbnb/caravel/pull/58) Setting min_periods to 1 for rolling windows (@mistercrunch) -- [#56](https://github.com/airbnb/caravel/pull/56) adding sort order of the slices on changed_on field (@mistercrunch) +- [a4065e4](https://github.com/airbnb/caravel/commit/a4065e4be6552efacd3c3351cfb08d16c231edc7) v0.6.0 (@mistercrunch) +- [#77](https://github.com/airbnb/caravel/pull/77) Merge pull request #77 from mistercrunch/tooltips (@mistercrunch) +- [fc93f36](https://github.com/airbnb/caravel/commit/fc93f36339d6dc8bf4146db6afc89bc9ac889146) Better tooltips and more ways to integrate them easily (@mistercrunch) +- [c64473c](https://github.com/airbnb/caravel/commit/c64473c49e9635c48d6ee99827f156e8e0b06885) [sunburst] limit -> row_limit (@mistercrunch) +- [c3f9607](https://github.com/airbnb/caravel/commit/c3f96074b95d7030e9cd142964d91ac9da7597fa) Insuring column order (@mistercrunch) +- [#76](https://github.com/airbnb/caravel/pull/76) Merge pull request #76 from mistercrunch/form_overrides (@mistercrunch) +- [d476dd2](https://github.com/airbnb/caravel/commit/d476dd2b8ad46644446fb15b3bd85c8516dfee3e) Introducing form overrides for label and tooltips (@mistercrunch) +- [#75](https://github.com/airbnb/caravel/pull/75) Merge pull request #75 from mistercrunch/sunburst (@mistercrunch) +- [f5b4a02](https://github.com/airbnb/caravel/commit/f5b4a0290e5aaa6ae35527ff66a2f96769903767) New viz: sunbursts (@mistercrunch) +- [d526711](https://github.com/airbnb/caravel/commit/d526711f1e7816102a31fe07533ff724de3773c5) Changing default sort order for databases (@mistercrunch) +- [2833bd3](https://github.com/airbnb/caravel/commit/2833bd3825081c40691d47367c900ca21e221dbe) bugfix - empty slug field (@mistercrunch) +- [#74](https://github.com/airbnb/caravel/pull/74) Merge pull request #74 from mistercrunch/fieldsets (@mistercrunch) +- [a32712d](https://github.com/airbnb/caravel/commit/a32712d9cb97eb725f69ab7f45b4152ee05995c2) Cleaning up (@mistercrunch) +- [b666508](https://github.com/airbnb/caravel/commit/b66650808516a47242ba2a0ca45827ea0026cb45) Introducing field sets (@mistercrunch) +- [#73](https://github.com/airbnb/caravel/pull/73) Merge pull request #73 from mistercrunch/theme (@mistercrunch) +- [1a62d5f](https://github.com/airbnb/caravel/commit/1a62d5f74fa1d52219e1acbf1e622350a77ebb10) Bugfix pivot table with no groupby (@mistercrunch) +- [04c0c05](https://github.com/airbnb/caravel/commit/04c0c05c01712026b1e27eb1b427d8757ec2813e) Airflowlike theme (@mistercrunch) +- [#72](https://github.com/airbnb/caravel/pull/72) Merge pull request #72 from mistercrunch/log (@mistercrunch) +- [f882ff1](https://github.com/airbnb/caravel/commit/f882ff13ff2bc3ad91a4b3d393000534afd26c28) Logging slice and dash views (@mistercrunch) +- [#70](https://github.com/airbnb/caravel/pull/70) Merge pull request #70 from mistercrunch/dash_slug (@mistercrunch) +- [#71](https://github.com/airbnb/caravel/pull/71) Merge pull request #71 from mistercrunch/showminmax (@mistercrunch) +- [66089a8](https://github.com/airbnb/caravel/commit/66089a89488556a7e1b0088083de5b6647952285) Adding migration file (@mistercrunch) +- [#69](https://github.com/airbnb/caravel/pull/69) Merge pull request #69 from mistercrunch/save_as (@mistercrunch) +- [63b27bb](https://github.com/airbnb/caravel/commit/63b27bbecea64d88cfeeee7ae1b517db1ef6d0bb) Add option to show minmax on x axis (@mistercrunch) +- [2743b24](https://github.com/airbnb/caravel/commit/2743b2412f23e2f486b5cf500c63b4346261de7a) Adding url slug support for dashboard model (@mistercrunch) +- [b9d7253](https://github.com/airbnb/caravel/commit/b9d7253a485df391d32741cc70777d1d98eb546d) Save AS and Overwrite (@mistercrunch) +- [#68](https://github.com/airbnb/caravel/pull/68) Merge pull request #68 from mistercrunch/cumsum (@mistercrunch) +- [03e13cb](https://github.com/airbnb/caravel/commit/03e13cb957a63a2afa77fa3ae0d7ae3eef252364) Adding cumsum to rolling functions (@mistercrunch) +- [#67](https://github.com/airbnb/caravel/pull/67) Merge pull request #67 from mistercrunch/fix_debug_dup_call (@mistercrunch) +- [2002f5e](https://github.com/airbnb/caravel/commit/2002f5e369169327151f7fef6d96661fa08d10b4) Fix debug mode calls get_json twice (@mistercrunch) +- [#66](https://github.com/airbnb/caravel/pull/66) Merge pull request #66 from mistercrunch/pivot_table (@mistercrunch) +- [7cd3696](https://github.com/airbnb/caravel/commit/7cd3696dd2de550b326f9f401846a6547c1a0f56) Adding missing jquery-ui images (@mistercrunch) +- [139e594](https://github.com/airbnb/caravel/commit/139e594ccee5f375ef76265c5399498d789ce74b) Bugfix, wrong css reference (@mistercrunch) +- [b0f7b3c](https://github.com/airbnb/caravel/commit/b0f7b3c595ff467870acb751527c7e6c3cf295e6) A little bit more explicit error handling (@mistercrunch) +- [8b0b13e](https://github.com/airbnb/caravel/commit/8b0b13eedc65b237d2e48262bba64b6bef9a3a49) Adding a PivotTableViz (@mistercrunch) +- [#65](https://github.com/airbnb/caravel/pull/65) Merge pull request #65 from mistercrunch/custom_having (@mistercrunch) +- [#64](https://github.com/airbnb/caravel/pull/64) Merge pull request #64 from mistercrunch/sort_select2 (@mistercrunch) +- [4819be2](https://github.com/airbnb/caravel/commit/4819be2fb2ac76fd029b5a5f66317d13b4caf8c5) Adding groupby to select2Sortable (@mistercrunch) +- [3cc5db5](https://github.com/airbnb/caravel/commit/3cc5db5bbf795c9acad29e9a3e8291d38587e638) Adding custom HAVING clause (@mistercrunch) +- [c8faeed](https://github.com/airbnb/caravel/commit/c8faeed5b3ff7eb6ff24c47a8b25ab8950a0b6e9) Preserving the ordering in selectmultiple (@mistercrunch) +- [de52449](https://github.com/airbnb/caravel/commit/de52449c2a782d4e68380bd4fffde246b7f6210b) Removing dups in color array (@mistercrunch) +- [#63](https://github.com/airbnb/caravel/pull/63) Merge pull request #63 from mistercrunch/hide_pass (@mistercrunch) +- [8522791](https://github.com/airbnb/caravel/commit/85227912b3c6d0fcecc9c2904c93277f99771f7a) Encrypting the passwords out of connection strings (@mistercrunch) +- [#61](https://github.com/airbnb/caravel/pull/61) Merge pull request #61 from mistercrunch/better-boolean-field (@mistercrunch) +- [f592aa1](https://github.com/airbnb/caravel/commit/f592aa1012073b136433d57ca022edae904e63a2) Add BetterBooleanField (@patrickleotardif) +- [d8c79cd](https://github.com/airbnb/caravel/commit/d8c79cd26e0aea4f3ec2375ac41708dc65b1a2a8) bugfix for error msg not surfaced (@mistercrunch) +- [1842628](https://github.com/airbnb/caravel/commit/184262844a73d8e188782a6945c52215b5fbff67) Fixing resize for nvd3 widgets (@mistercrunch) +- [#60](https://github.com/airbnb/caravel/pull/60) Merge pull request #60 from NiharikaRay/fix_markup_widget (@NiharikaRay) +- [54e45ba](https://github.com/airbnb/caravel/commit/54e45babe742fe6b7d341e389dc51022fd25ab8f) Fix Markup Widget bug +- [#59](https://github.com/airbnb/caravel/pull/59) Merge pull request #59 from patrickleotardif/y_axis_format (@patrickleotardif) +- [93c660f](https://github.com/airbnb/caravel/commit/93c660f2c7d241bc231157ac5e073128eb5eb965) make y axis format one col width only (@patrickleotardif) +- [4233d34](https://github.com/airbnb/caravel/commit/4233d3467865c1b7ee35442d210d511cb81623f4) handle y2axis for y axis format (@patrickleotardif) +- [6b13d78](https://github.com/airbnb/caravel/commit/6b13d78f699ebd4433a63e3f5b1d64c452e55e79) verbose explanation and link for d3 format" (@patrickleotardif) +- [38a4157](https://github.com/airbnb/caravel/commit/38a4157ac670a1bf291f49bd7732ce9ffaceca79) Adding y-axis format option (@patrickleotardif) +- [#58](https://github.com/airbnb/caravel/pull/58) Merge pull request #58 from mistercrunch/min_periods (@mistercrunch) +- [d75c5c8](https://github.com/airbnb/caravel/commit/d75c5c8da85ccbba03f1cd1627a78e553704e821) Setting min_periods to 1 for rolling windows (@mistercrunch) +- [a18cf2d](https://github.com/airbnb/caravel/commit/a18cf2d26bcee005dc6e18a480d1a1a25c465923) Adding audit info to a few list views (@mistercrunch) +- [0889947](https://github.com/airbnb/caravel/commit/088994739475ce088a16960734f11edaef47b532) Clarifying time filters, small refactor (@mistercrunch) +- [4e6aa4c](https://github.com/airbnb/caravel/commit/4e6aa4c5b5b6c8a88567978e088eec22f451add5) Improvments around date handling for nvd3 charts (@mistercrunch) +- [#56](https://github.com/airbnb/caravel/pull/56) Merge pull request #56 from mistercrunch/kp_enable_sort_order (@mistercrunch) +- [6ecea91](https://github.com/airbnb/caravel/commit/6ecea9123c89fd18754fcb2c0d1330583be6ece3) adding sort order of the slices on changed_on field + +### 0.5.3 (2015/10/24 15:02 +00:00) +- [5057593](https://github.com/airbnb/caravel/commit/5057593ec9deee8cbb7e8a834356553fa4bced43) v0.5.3 (@mistercrunch) +- [ec805d3](https://github.com/airbnb/caravel/commit/ec805d3bd850d02dbc715052d7e323fc969c2dc9) pinning flask-sqlalchemy==2.0 (@mistercrunch) +- [774f205](https://github.com/airbnb/caravel/commit/774f205d24af8d5fa3971289dfef05973359438d) pinning sqla (@mistercrunch) ### 0.5.2 (2015/10/24 01:06 +00:00) -- [#53](https://github.com/airbnb/caravel/pull/53) Py3 (@mistercrunch) -- [#51](https://github.com/airbnb/caravel/pull/51) Adding timezone offset as a datasource param (@mistercrunch) -- [#52](https://github.com/airbnb/caravel/pull/52) Speed up travis builds with wheels (@mistercrunch) -- [#48](https://github.com/airbnb/caravel/pull/48) Allowing to specify the gunicorn timeout in CLI and config (@mistercrunch) +- [c07770e](https://github.com/airbnb/caravel/commit/c07770e52a4a2f141225cabf5044bd8e9c682b5f) v0.5.2 (@mistercrunch) +- [0ec69a4](https://github.com/airbnb/caravel/commit/0ec69a4ac513296a4485a29641ceedfa73056080) druid bugfix (@mistercrunch) +- [3051311](https://github.com/airbnb/caravel/commit/30513116f941729d1dc30c2d8950710506e33bf4) Using mysqlclient instead of pymysql (@mistercrunch) +- [c3903ef](https://github.com/airbnb/caravel/commit/c3903eff4f024dcc213f843803e56b2bd3b1be72) Adding forgotten template (@mistercrunch) +- [#53](https://github.com/airbnb/caravel/pull/53) Merge pull request #53 from mistercrunch/py3 (@mistercrunch) +- [4d89663](https://github.com/airbnb/caravel/commit/4d8966376fc11c3ddf875f4c060789cb83902f55) Aiming at python 3.4 - test (@mistercrunch) +- [a58d184](https://github.com/airbnb/caravel/commit/a58d184711e021ad11878b42958b01fb737961cc) Removing references to basestring (@mistercrunch) +- [fc76e87](https://github.com/airbnb/caravel/commit/fc76e87653fff7c1a45b6b3ca601bac84040bf3a) Trying mode='rt' (@mistercrunch) +- [e3e3d0b](https://github.com/airbnb/caravel/commit/e3e3d0b1f543e8a9a2c6122de894ef3c26d718bd) py3 compat changes (@mistercrunch) +- [5a96703](https://github.com/airbnb/caravel/commit/5a967031c8ea0a71d4d8aa2bef5823941831c507) Adding python 3.5 to build matrix (@mistercrunch) +- [1ffb9a0](https://github.com/airbnb/caravel/commit/1ffb9a0fc6ca043ea64edc5cbee5887f2df7f236) Reverting to old deps notation as server is on 2.7.3 (@mistercrunch) +- [2ddebc1](https://github.com/airbnb/caravel/commit/2ddebc1a4c402c6a8791788c9246cf015ffcedd8) Pinning flask version (@mistercrunch) +- [#51](https://github.com/airbnb/caravel/pull/51) Merge pull request #51 from mistercrunch/offset (@mistercrunch) +- [#52](https://github.com/airbnb/caravel/pull/52) Merge pull request #52 from mistercrunch/travis_speedup (@mistercrunch) +- [bdd5b08](https://github.com/airbnb/caravel/commit/bdd5b087875bde924185ad4d6b3208d85581b283) Cleaning up reqs versions (@mistercrunch) +- [ea18aad](https://github.com/airbnb/caravel/commit/ea18aad3b2c721bedfd6dc0947857341b33f1e13) Speed up travis builds with wheels (@mistercrunch) +- [a7fca30](https://github.com/airbnb/caravel/commit/a7fca30010e0878e3d4573bf86a45b3a1e5b030d) Tweaks (@mistercrunch) +- [06e57bf](https://github.com/airbnb/caravel/commit/06e57bf890b74520ca6cd44c0436b18de95bc721) Adding timezone offset as a datasource param (@mistercrunch) +- [8aa97f7](https://github.com/airbnb/caravel/commit/8aa97f7e0847a4936f14730b0a53ff9450fb2cf9) Better defaults for Druid endpoints and better error handling (@mistercrunch) +- [9d61ee2](https://github.com/airbnb/caravel/commit/9d61ee2323457ce624bce2a8a8c03c2d002e42f2) Bugfix for time series bar chart (@mistercrunch) +- [9605962](https://github.com/airbnb/caravel/commit/960596228ee77bad1de9cb0abb7e84a34471c641) +entry in TODO (@mistercrunch) +- [#48](https://github.com/airbnb/caravel/pull/48) Merge pull request #48 from mistercrunch/timeout (@mistercrunch) +- [0a1eb64](https://github.com/airbnb/caravel/commit/0a1eb64da0634fc3afd8a8e09bcacf751c51986c) Bumping timeout to 60 (@mistercrunch) +- [686069d](https://github.com/airbnb/caravel/commit/686069d283ab6792adb0c6c8310c3c9af4512a6a) Allowing to specify the gunicorn timeout in CLI and config (@mistercrunch) +- [7793e24](https://github.com/airbnb/caravel/commit/7793e243ad90f4c385a6a77cbb9b521b8baa62c9) Note about python version support (@mistercrunch) + +### 0.5.1 (2015/10/13 15:05 +00:00) +- [37629fb](https://github.com/airbnb/caravel/commit/37629fb548bed9194a09d370b523e87f258aa4f9) v0.5.1 (@mistercrunch) + +### rm (2015/10/13 14:55 +00:00) +- [8cd27db](https://github.com/airbnb/caravel/commit/8cd27db8937093deabcadd130a7e186a7046454d) Stop attribution of datasource_access to gamma on init (@mistercrunch) +- [b25393b](https://github.com/airbnb/caravel/commit/b25393be082ffa6907390b7d3d775acb15e3ab59) Adding a note to run init script in installation process (@mistercrunch) +- [179622d](https://github.com/airbnb/caravel/commit/179622da7790f555bc29de6573bf5afdcdcc14ff) Bugfix around empty compare_lag (@mistercrunch) +- [7137d75](https://github.com/airbnb/caravel/commit/7137d7597e574cfada498871f94301ae00f52e6f) Adding missing installation step (@mistercrunch) ### 0.5.0 (2015/10/13 01:09 +00:00) -- [#46](https://github.com/airbnb/caravel/pull/46) Allowing to change the "Time Column" on SqlA (@mistercrunch) -- [#45](https://github.com/airbnb/caravel/pull/45) Bootstrapping widgets from javascript initializer. (@akuhn) -- [#43](https://github.com/airbnb/caravel/pull/43) Supporting arbitrary expressions (@mistercrunch) -- [#42](https://github.com/airbnb/caravel/pull/42) Adding ability to style a dashboard with CSS (@mistercrunch) -- [#41](https://github.com/airbnb/caravel/pull/41) Cleaning up the static folder (@mistercrunch) -- [#35](https://github.com/airbnb/caravel/pull/35) A first draft on default security roles (@mistercrunch) -- [#40](https://github.com/airbnb/caravel/pull/40) Introducing time comparison (@mistercrunch) -- [#39](https://github.com/airbnb/caravel/pull/39) Adding interpolation choice for line charts (@mistercrunch) -- [#38](https://github.com/airbnb/caravel/pull/38) Extract css rules and scripts into separate files. (@akuhn) -- [#37](https://github.com/airbnb/caravel/pull/37) Viz type (@mistercrunch) -- [#36](https://github.com/airbnb/caravel/pull/36) Extract widget javascript to separate files. (@akuhn) -- [#34](https://github.com/airbnb/caravel/pull/34) Ripping out Highcharts. (@mistercrunch) +- [51d7225](https://github.com/airbnb/caravel/commit/51d7225f06584962045d352f15f5c40d68bb860b) v0.5.0 (@mistercrunch) +- [85f3857](https://github.com/airbnb/caravel/commit/85f3857285ff4ad4f3b84785315d57ae99bf73db) Removing raise statement used for testing (@mistercrunch) +- [7a4eaf4](https://github.com/airbnb/caravel/commit/7a4eaf41b260cf15677c35515277b1ab47fceabe) Adding error handler that shows the stacktrace (@mistercrunch) +- [e5aa49f](https://github.com/airbnb/caravel/commit/e5aa49fb0801b4b8693502649e097eb78a29516a) Descriptions for confusing columns (@mistercrunch) +- [93b7672](https://github.com/airbnb/caravel/commit/93b76727d419039a1eccbcb202a5bec0a73174e5) Removing done items from TODO (@mistercrunch) +- [#46](https://github.com/airbnb/caravel/pull/46) Merge pull request #46 from mistercrunch/time_grain (@mistercrunch) +- [f0d84f6](https://github.com/airbnb/caravel/commit/f0d84f634f9ff6cfb880fde61d78469a3a575a68) Forcing pandas versino (@mistercrunch) +- [cb92cac](https://github.com/airbnb/caravel/commit/cb92cac77663d4de5eb643788ae0d6602fe9754d) Allowing to define multiple time columns for time series on Sqla (@mistercrunch) +- [b84ede1](https://github.com/airbnb/caravel/commit/b84ede1aef2fe3b74148fad6b5742721acef8596) Bugfix druid datasource onsave (@mistercrunch) +- [#45](https://github.com/airbnb/caravel/pull/45) Merge pull request #45 from mistercrunch/px_render_refresh (@mistercrunch) +- [694f82e](https://github.com/airbnb/caravel/commit/694f82ec6582ed12047d66f2a90620bdc2689b47) Boostrapping widgets from javascript initializer (RFC). (@akuhn) +- [4679635](https://github.com/airbnb/caravel/commit/467963533b97403e44f29465bb7d19b86f61ba75) Button Druidify\!->Slice\! (@mistercrunch) +- [#43](https://github.com/airbnb/caravel/pull/43) Merge pull request #43 from mistercrunch/expr (@mistercrunch) +- [6db1b97](https://github.com/airbnb/caravel/commit/6db1b97a0e7df38a905a6da88c6ea3743e1cf90d) Supporting arbitrary expressions (@mistercrunch) +- [36c7406](https://github.com/airbnb/caravel/commit/36c7406786fc24a5d6d3c0400cbb2ec90231896f) Upgrading nvd3 to dev version fixes a bug around classed series (@mistercrunch) +- [0b87ea6](https://github.com/airbnb/caravel/commit/0b87ea6e9b41a1b61009c1feeff5c75624985e94) Bugfix around specific datasource access permissions (@mistercrunch) +- [#42](https://github.com/airbnb/caravel/pull/42) Merge pull request #42 from mistercrunch/dash_css (@mistercrunch) +- [bd32170](https://github.com/airbnb/caravel/commit/bd32170b36f909a67502801241b8e0e0bd97cbdc) Adding ability to style a dashboard with CSS (@mistercrunch) +- [a033282](https://github.com/airbnb/caravel/commit/a0332823ff35472c7103fa6816b2c088c13ea1cd) Changing default for time_compare to empty (@mistercrunch) +- [096f697](https://github.com/airbnb/caravel/commit/096f6977c4f5d1adde82c0ea970214ff78887a36) Bugfix, missing WHERE CLAUSE field in form (@mistercrunch) +- [d810a9d](https://github.com/airbnb/caravel/commit/d810a9d5ad62ea388ab92adff89fc25effe6ae5c) Adding perm property to Datasource model (@mistercrunch) +- [#41](https://github.com/airbnb/caravel/pull/41) Merge pull request #41 from mistercrunch/cosmetico (@mistercrunch) +- [2bb2992](https://github.com/airbnb/caravel/commit/2bb299225a3010beb4fc286605d04b9694194ff1) Cleaning up the static folder (@mistercrunch) +- [c9b7c5d](https://github.com/airbnb/caravel/commit/c9b7c5daa82cf9220c6a806ce420c87170f33847) Adjusting width of dashboard view controls (@mistercrunch) +- [5f62a1f](https://github.com/airbnb/caravel/commit/5f62a1fe0223c4f536274283277782c9be842b26) Adding css file for viz_nvd3 (@mistercrunch) +- [#35](https://github.com/airbnb/caravel/pull/35) Merge pull request #35 from mistercrunch/roles (@mistercrunch) +- [6ea178e](https://github.com/airbnb/caravel/commit/6ea178eced0dcb512915c042aa8db2a6114cfb5d) Perms are kept from getting duped, created on save (@mistercrunch) +- [c2049f8](https://github.com/airbnb/caravel/commit/c2049f837c0152a400fbba0a075389c8f2812158) Automate Panoramix role creation (@mistercrunch) +- [45b5950](https://github.com/airbnb/caravel/commit/45b595001986d68f48278e1c217eb4ab5e0c5a40) Definining a Gamma role (@mistercrunch) +- [b4c8d7a](https://github.com/airbnb/caravel/commit/b4c8d7a81e0062608d0d666e412697cae74e8e38) Cosmetics (@mistercrunch) +- [459048a](https://github.com/airbnb/caravel/commit/459048abe0f8873ada861edc712d5abcf0456216) Bugfix (@mistercrunch) +- [71cf515](https://github.com/airbnb/caravel/commit/71cf515d0d48cb26467eaed08ee613afd77e170d) Getting this thing to work (@mistercrunch) +- [e3cdf5b](https://github.com/airbnb/caravel/commit/e3cdf5bb2c1b699d8c747f1157f425373fd9d871) Progress (@mistercrunch) +- [#40](https://github.com/airbnb/caravel/pull/40) Merge pull request #40 from mistercrunch/time_compare (@mistercrunch) +- [ede6768](https://github.com/airbnb/caravel/commit/ede6768cbea5c2f97c137bdf07a1fb98f788db83) Small improvements to dashboard controls (@mistercrunch) +- [959418c](https://github.com/airbnb/caravel/commit/959418cc4e9d8b15ed0c16a265542fe2ff287e6a) Making sure to alert only once (@mistercrunch) +- [f83d933](https://github.com/airbnb/caravel/commit/f83d93327f350528cb35c6b8d92e30c7a2581597) Updating TODO (@mistercrunch) +- [2eb8c1b](https://github.com/airbnb/caravel/commit/2eb8c1be8de5c6269171c217991559394afd87a1) Introducing time comparison (@mistercrunch) +- [46ee9d2](https://github.com/airbnb/caravel/commit/46ee9d2c133792b9648cdd50c43a461f3f7ede17) Improved free form date parsing (@mistercrunch) +- [bc8f9d2](https://github.com/airbnb/caravel/commit/bc8f9d2e1a9e8fdcbf0f893b522f6b53272a3eed) Specifying the fields for DistributionBarViz as it was showing donut (@mistercrunch) +- [#39](https://github.com/airbnb/caravel/pull/39) Merge pull request #39 from mistercrunch/interpolation (@mistercrunch) +- [e1900fc](https://github.com/airbnb/caravel/commit/e1900fcfe96ad32bdb959ec8a63bf3faf5818479) Bugfix, distributino bar chart shows NaN on xAxis (@mistercrunch) +- [774b1ef](https://github.com/airbnb/caravel/commit/774b1ef9d9aacc1b92beb10891a2bb5948e5de84) removing console.log (@mistercrunch) +- [bb535a3](https://github.com/airbnb/caravel/commit/bb535a373dd1790b67066165ad92096c33a8da97) Adding an option for line_interpolation in line chart (@mistercrunch) +- [3f9c838](https://github.com/airbnb/caravel/commit/3f9c83828ad2a43ee3c49ad7a50bb78515e8930a) Removing leftover print statetments (@mistercrunch) +- [33a4577](https://github.com/airbnb/caravel/commit/33a45772ab6e7298669c0e251ef471cb3146862d) py3 (@mistercrunch) +- [#38](https://github.com/airbnb/caravel/pull/38) Merge pull request #38 from mistercrunch/px_javascript_css_files_2 (@mistercrunch) +- [4a256b1](https://github.com/airbnb/caravel/commit/4a256b1dc46073fd404d9d5fc93369975b51a135) Reformat javascript code. (@akuhn) +- [ad1ebaa](https://github.com/airbnb/caravel/commit/ad1ebaa6dadc843748d98375bdab420000970c58) Extract scripts into javascript file. (@akuhn) +- [367c256](https://github.com/airbnb/caravel/commit/367c2562e18b3cefcd685fe9eb6547b5c5b29d14) Extract css rules into stylesheet file. (@akuhn) +- [#37](https://github.com/airbnb/caravel/pull/37) Merge pull request #37 from mistercrunch/viz_type (@mistercrunch) +- [ee6cc15](https://github.com/airbnb/caravel/commit/ee6cc157f692d1707ba5447fbdd130a59fbe945b) Removing chart_kind artefact (@mistercrunch) +- [f3e3415](https://github.com/airbnb/caravel/commit/f3e3415712b87cbf91f001d2dbbb8d176003bacd) Re-adding images, mistakenly did mv instead of git mv (@mistercrunch) +- [c4ff8d1](https://github.com/airbnb/caravel/commit/c4ff8d1760eeb49e1e40452ea6aa5f6917fed163) Moving static jpg/pngs to static/img (@mistercrunch) +- [d3c420e](https://github.com/airbnb/caravel/commit/d3c420ea01b8ed49ebbc169bb45fcf2193849d5c) Adding hint to not consider a bakced up function for coverage accounting (@mistercrunch) +- [f36ea7a](https://github.com/airbnb/caravel/commit/f36ea7aa50049be502d2e8e12f221351fbffbf27) Aligingin stackedAreaChart with area (@mistercrunch) +- [04f914f](https://github.com/airbnb/caravel/commit/04f914fb5c6bcaa2a3388e835069aeaa2db5cbd3) Viz type clarifications (@mistercrunch) +- [601e30a](https://github.com/airbnb/caravel/commit/601e30aa3732d03f699128a19608f948b485dacd) Changing 'since' default to 7 days (@mistercrunch) +- [fa08d35](https://github.com/airbnb/caravel/commit/fa08d353e86e9e5fd3e3780d1522a2b6fdc0143a) Bug fixes (@mistercrunch) +- [#36](https://github.com/airbnb/caravel/pull/36) Merge pull request #36 from mistercrunch/px_javascript_css_files (@mistercrunch) +- [ad2cc10](https://github.com/airbnb/caravel/commit/ad2cc107883dc258e6c69a1ad64c4dac216cad01) Fix unit tests for viz without json endpoint. (@akuhn) +- [83d7bf3](https://github.com/airbnb/caravel/commit/83d7bf3a1a4633dd9502916afcf067f72726e908) Extract nvd3 javascript to separate file. (@akuhn) +- [669a0a4](https://github.com/airbnb/caravel/commit/669a0a4e2c783f9efe77d90189f122c5c9b4a6ef) Extract bignumber javascript to separate file. (@akuhn) +- [b75c89b](https://github.com/airbnb/caravel/commit/b75c89b81f6b3fa5eed86d3b561d42feccbfd4a6) Extract word cloud javascript to separate file. (@akuhn) +- [7172be9](https://github.com/airbnb/caravel/commit/7172be9705d7ed7729c4a92ba867adca9cbe09a9) Bugfix for nvd3 charts (@mistercrunch) +- [c9e4239](https://github.com/airbnb/caravel/commit/c9e42390258e6327f841fcd9576d3ea5d8759fd8) Moving button to the right (@mistercrunch) +- [ca28d9c](https://github.com/airbnb/caravel/commit/ca28d9c524a71ede74318a1f32f5673e45c2c400) Penguins under construction (@mistercrunch) +- [2243623](https://github.com/airbnb/caravel/commit/224362343011984b4bfd5be4216530cc1c8e189c) Temporary hack to see the query for NVD3 vizs (@mistercrunch) +- [5cf5019](https://github.com/airbnb/caravel/commit/5cf5019ff162ea4484217c496d6ed384ab626e43) Done fixing form continuity (@mistercrunch) +- [74e5a3e](https://github.com/airbnb/caravel/commit/74e5a3e868a60d295493c55ffb668e36ff0c6cd1) Mostly working (@mistercrunch) +- [f3f807d](https://github.com/airbnb/caravel/commit/f3f807d0425d98ea8b5f16d1d323ba9b876ba99f) Forms (@mistercrunch) +- [c3f0597](https://github.com/airbnb/caravel/commit/c3f0597c072e1422d27691855f51ce2950b000b0) Small improvments to tests (@mistercrunch) +- [4a9987a](https://github.com/airbnb/caravel/commit/4a9987affaf9430ecc4d8dfb394f197bf400084d) Bugfix around using an Int in a groupby (@mistercrunch) +- [4d62adb](https://github.com/airbnb/caravel/commit/4d62adb618751a37a57d5785bfb87aec25c3e77a) Removing last highcharts file standing (@mistercrunch) +- [0033c92](https://github.com/airbnb/caravel/commit/0033c927cce6b67e9ef611c4207c285f128cb15d) Adding missing dependency (@mistercrunch) +- [af98972](https://github.com/airbnb/caravel/commit/af989726249bd7c85c51d783ea969b3b5af0d70d) Cleaning up previous hack (@mistercrunch) +- [391b31e](https://github.com/airbnb/caravel/commit/391b31e3507e82b6fb24c10f1fc6f5daaab4ca87) Forgot the .coveralls.yml file (@mistercrunch) +- [ac2446c](https://github.com/airbnb/caravel/commit/ac2446cf093626f861456b13e68dd14c35001ac7) Adding coverage badge (@mistercrunch) +- [930dad4](https://github.com/airbnb/caravel/commit/930dad4eb0dd37a648522be1a488850445af6b8e) Further CI integration (@mistercrunch) +- [db272f8](https://github.com/airbnb/caravel/commit/db272f831bbc40bc3ac7746a498e6ea5ab0b214e) Adding markdown dep (@mistercrunch) +- [e473a82](https://github.com/airbnb/caravel/commit/e473a828e773c220b201e996bbf673e5f25f631c) Adding flask-testing to list of deps (@mistercrunch) +- [50adfdc](https://github.com/airbnb/caravel/commit/50adfdc662f4aa0ae66737ab67e37252d98fdeba) Explicit flask dependency (@mistercrunch) +- [80228ac](https://github.com/airbnb/caravel/commit/80228ac29368ee8b3cd6224a8d1598409a5e0ab7) Adapting command (@mistercrunch) +- [a2a0545](https://github.com/airbnb/caravel/commit/a2a0545323bd95eff141e34204e63dbd2bf00309) Integrating with travis-ci (@mistercrunch) +- [#34](https://github.com/airbnb/caravel/pull/34) Merge pull request #34 from mistercrunch/nvd3_2 (@mistercrunch) +- [a674fca](https://github.com/airbnb/caravel/commit/a674fca26df18cf2530f68bcbf89f12616122e71) Better form handling (@mistercrunch) +- [721113d](https://github.com/airbnb/caravel/commit/721113db0d93edfe040c059b1b98372f9600bc3d) About to rip out args (@mistercrunch) +- [625bd9d](https://github.com/airbnb/caravel/commit/625bd9dd82006d2f287f54538640d87c8239f68d) Period ratio compare (@mistercrunch) +- [7143972](https://github.com/airbnb/caravel/commit/7143972341a8cbd1774c3c16bbb937d7e75f5a1f) Adding contribution to total (@mistercrunch) +- [4cd7c3d](https://github.com/airbnb/caravel/commit/4cd7c3d098089a0d3cedbe6c8734fdaa6d435661) Introducing compare (@mistercrunch) +- [495c2df](https://github.com/airbnb/caravel/commit/495c2dfeca3dc30c0c4041f947e8e55652e59182) Ripping highcharts out (@mistercrunch) +- [bf8ce17](https://github.com/airbnb/caravel/commit/bf8ce1716a479bac34480ebb79c3252bc4e9f156) nvd3 Stacked Area chart (@mistercrunch) ### 0.4.0 (2015/09/27 04:39 +00:00) -- [#33](https://github.com/airbnb/caravel/pull/33) Adding nvd3 support (@mistercrunch) -- [#32](https://github.com/airbnb/caravel/pull/32) Adding a foundation for unit tests (@mistercrunch) -- [#31](https://github.com/airbnb/caravel/pull/31) Adding a button to test connections (@mistercrunch) -- [#30](https://github.com/airbnb/caravel/pull/30) Word cloud widget! (@mistercrunch) -- [#29](https://github.com/airbnb/caravel/pull/29) Adding support for markup (html/markdown) widgets (@mistercrunch) -- [#28](https://github.com/airbnb/caravel/pull/28) Fix default Sqlite path. (@noddi) -- [#27](https://github.com/airbnb/caravel/pull/27) More refactor and bugfixes (@mistercrunch) -- [#26](https://github.com/airbnb/caravel/pull/26) Bugfix (@mistercrunch) -- [#25](https://github.com/airbnb/caravel/pull/25) Adding basic dashboarding support! (@mistercrunch) -- [#23](https://github.com/airbnb/caravel/pull/23) Custom WHERE clause for tables (not druid) + error handling refactor (@mistercrunch) -- [#22](https://github.com/airbnb/caravel/pull/22) Form factory refactor (@mistercrunch) -- [#20](https://github.com/airbnb/caravel/pull/20) add tzinfo config, useful when start druid without utc timezone (@wbchn) +- [e643671](https://github.com/airbnb/caravel/commit/e64367149e54401736cc8f2edf78a0a78e644ff5) v0.4.0 (@mistercrunch) +- [#33](https://github.com/airbnb/caravel/pull/33) Merge pull request #33 from mistercrunch/nvd3 (@mistercrunch) +- [89e9290](https://github.com/airbnb/caravel/commit/89e92904e1316bfbd88da45a41526bd28404e6f3) Adding nvd3 support (@mistercrunch) +- [703b6f6](https://github.com/airbnb/caravel/commit/703b6f612bca37df9f239ea9154aa5076ca1ad42) Forgot to add some files for unit tests (@mistercrunch) +- [f1a64c0](https://github.com/airbnb/caravel/commit/f1a64c0988181f6626400b308e9718aaf065e2ad) Allowing 2 widgets to overflow (@mistercrunch) +- [8d4c3ea](https://github.com/airbnb/caravel/commit/8d4c3ea381a3fecb535ef72dc126fd48a851fba1) Increasing test coverage to 68% (@mistercrunch) +- [aea304d](https://github.com/airbnb/caravel/commit/aea304d8145814d0560562eb5176cbf92bfa6659) Making sum metrics for numeric columns (@mistercrunch) +- [1d6d821](https://github.com/airbnb/caravel/commit/1d6d8210081a1e6ae3a3dafd0a5bd5e15c0c6f15) Changing default to 100 items per page (@mistercrunch) +- [82bf543](https://github.com/airbnb/caravel/commit/82bf5437cd21df1f3ce299efff04e0262e109549) More screenshots (@mistercrunch) +- [#32](https://github.com/airbnb/caravel/pull/32) Merge pull request #32 from mistercrunch/tests (@mistercrunch) +- [c4b24cb](https://github.com/airbnb/caravel/commit/c4b24cb9cca3797dbfa85fd3f0c15d7ffb99369b) Adding a foundation for unit tests (@mistercrunch) +- [f95e844](https://github.com/airbnb/caravel/commit/f95e84442fc0cdd2ae9b1cb7f3af85443c33f713) Trying POST instead of GET for testconn (@mistercrunch) +- [83e37f6](https://github.com/airbnb/caravel/commit/83e37f66fa5663906af3821341096efe5fe66e67) Adding fields to list_columns of DatabaseView (@mistercrunch) +- [74ae4ee](https://github.com/airbnb/caravel/commit/74ae4ee7049c306aa023ced6791f281b1e3d0b37) ADding help text around sqlalchemy URI (@mistercrunch) +- [#31](https://github.com/airbnb/caravel/pull/31) Merge pull request #31 from mistercrunch/test_connection (@mistercrunch) +- [e854798](https://github.com/airbnb/caravel/commit/e854798730f0d2f1d73cff9edd033cc018b79568) Adding a button to test connections (@mistercrunch) +- [caafb1e](https://github.com/airbnb/caravel/commit/caafb1ef4c568ee1d4b5a2a45b9d2c33f77007be) Changing title (@mistercrunch) +- [63d55c9](https://github.com/airbnb/caravel/commit/63d55c9f93bcce1adec039a11ad8dcd8a7550a77) Polish (@mistercrunch) +- [71274ae](https://github.com/airbnb/caravel/commit/71274ae6098e3739c5a98b76b75cea92d8e7d2a2) Beautifying the index page (@mistercrunch) +- [e126ab4](https://github.com/airbnb/caravel/commit/e126ab4eb8aed5f8514004a4a366f45f2d5cc256) Improvements (@mistercrunch) +- [f395c83](https://github.com/airbnb/caravel/commit/f395c83bae344a0e20f2090e7f0f350583da5ced) Improving the main page (@mistercrunch) +- [#30](https://github.com/airbnb/caravel/pull/30) Merge pull request #30 from mistercrunch/word_cloud (@mistercrunch) +- [2cbc2e3](https://github.com/airbnb/caravel/commit/2cbc2e36e35b503c58df8adb9f50075427cbd987) Adding a word cloud widget (@mistercrunch) +- [a28d9d4](https://github.com/airbnb/caravel/commit/a28d9d4bb1d0e61ae4daa1f5bdbc0235a04442ff) Bugfix (@mistercrunch) +- [#29](https://github.com/airbnb/caravel/pull/29) Merge pull request #29 from mistercrunch/markup_widgets (@mistercrunch) +- [2488288](https://github.com/airbnb/caravel/commit/24882884b823415bd0d68d37c1826909da5f1833) Forgot to git add viz_markup.html (@mistercrunch) +- [f5e355a](https://github.com/airbnb/caravel/commit/f5e355a26f518c6d9b667e3ffd8e19fe4680e7a1) Forgot to git add viz_markup.html (@mistercrunch) +- [e4a5f34](https://github.com/airbnb/caravel/commit/e4a5f34f71fdc2a89398128bab5d7fe1145e9d41) Uncommenting try block (@mistercrunch) +- [449441f](https://github.com/airbnb/caravel/commit/449441fed5097b30eb9600a6a0225647423c8801) Adding support for markup (html/markdown) widgets (@mistercrunch) +- [3d8fbaa](https://github.com/airbnb/caravel/commit/3d8fbaa96650299c58289fca813751a34ff1b0d9) Improvments to the dashboard view (@mistercrunch) +- [ff29f90](https://github.com/airbnb/caravel/commit/ff29f905c9ec2d346d6702006110cd04dba061e8) Loading examples with a CLI subcommand (@mistercrunch) +- [4d1d3ad](https://github.com/airbnb/caravel/commit/4d1d3ad0f67b6fba197236b3e3d94c97bd9f3401) Minor bugfix (@mistercrunch) +- [e1b3c7e](https://github.com/airbnb/caravel/commit/e1b3c7e63b83082dbe1aa79e25e6d634933a23cf) Bugfixes+ better docs (@mistercrunch) +- [2cbe25c](https://github.com/airbnb/caravel/commit/2cbe25c6b59fba3991224dfd673ba6b9469e1766) Changing an icon (@mistercrunch) +- [c09dca5](https://github.com/airbnb/caravel/commit/c09dca514d15df1718521a1088fa96ecf8c09cbc) Adding a BigNumber widget (@mistercrunch) +- [72ec6ae](https://github.com/airbnb/caravel/commit/72ec6ae5702b0008e4f1939824cddb2206fd8a1c) Cosmetics (@mistercrunch) +- [#28](https://github.com/airbnb/caravel/pull/28) Merge pull request #28 from noddi/bugfix/default_sqlite_path (@noddi) +- [6c8f268](https://github.com/airbnb/caravel/commit/6c8f26858794ffa3c5b80cf8ab83d685a57a7c01) Fix default Sqlite path in README. (@noddi) +- [8ac35bd](https://github.com/airbnb/caravel/commit/8ac35bd6106254e75e0ef5e4c4a2084d1a6b6b63) Fix default Sqlite path. (@noddi) +- [e0d6d20](https://github.com/airbnb/caravel/commit/e0d6d209939f6536b8a2a30b990a790190834da3) Adding a command to load a sample dataset (@mistercrunch) +- [4edbbd3](https://github.com/airbnb/caravel/commit/4edbbd350db0a356bed4d6b60a8feed02f512bd3) More bug squashing (@mistercrunch) +- [#27](https://github.com/airbnb/caravel/pull/27) Merge pull request #27 from mistercrunch/dash (@mistercrunch) +- [e5e2988](https://github.com/airbnb/caravel/commit/e5e2988e2df1097ae7a2afcf95f649840d1de3a3) More refactor and bugfixes (@mistercrunch) +- [#26](https://github.com/airbnb/caravel/pull/26) Merge pull request #26 from mistercrunch/dash (@mistercrunch) +- [16550b9](https://github.com/airbnb/caravel/commit/16550b9753b92e203ad8844fada4d865e34fcd1e) Bugfix (@mistercrunch) +- [#25](https://github.com/airbnb/caravel/pull/25) Merge pull request #25 from mistercrunch/dash (@mistercrunch) +- [cd09b0d](https://github.com/airbnb/caravel/commit/cd09b0ddef97c67d4340154fc6697adb92ffc65a) Bugfixes (@mistercrunch) +- [f6753af](https://github.com/airbnb/caravel/commit/f6753afa75dc1229f5b5ab4188808b66b9be9962) Panoramix v1 dashboards is up (@mistercrunch) +- [521b000](https://github.com/airbnb/caravel/commit/521b000ab6733026e00ec9db38dd0388828bcdc6) Checkpoint (@mistercrunch) +- [359a81e](https://github.com/airbnb/caravel/commit/359a81eee3ff04cf92dd5db0569c3fdd58b14379) Getting back into a working state (@mistercrunch) +- [0bc2e71](https://github.com/airbnb/caravel/commit/0bc2e71ac6dbb74e651cd428f8180a42a24a64db) Changing the way viz templates are defined using macros instead (@mistercrunch) +- [6daf92e](https://github.com/airbnb/caravel/commit/6daf92e3c1fdbd76079bbeb4dd6f8790f6551871) About to start ajaxifying (@mistercrunch) +- [a5b8964](https://github.com/airbnb/caravel/commit/a5b896414d1ae73783c9a26bd74342bd4c05d75f) Dashboards (@mistercrunch) +- [95b0801](https://github.com/airbnb/caravel/commit/95b080160f6b1cd144631f13cf5c5a4545d473ec) Pinning flask-login (@mistercrunch) +- [3635191](https://github.com/airbnb/caravel/commit/36351918c92504af27603c35a981f25ff31e732f) Dashboards (@mistercrunch) +- [e755854](https://github.com/airbnb/caravel/commit/e755854c29206195a872c7b754486f80ac1391a0) Save and embed (@mistercrunch) +- [5f20a08](https://github.com/airbnb/caravel/commit/5f20a080f408fe21dc799cbf45cb3f860f91440c) Setting up alembic (@mistercrunch) +- [ca39597](https://github.com/airbnb/caravel/commit/ca3959783ccaa3662b256de67df2bf1b20b4b8a8) New script (@mistercrunch) +- [9a63a31](https://github.com/airbnb/caravel/commit/9a63a312b6518c58d4423d2297f5482e468f56db) Warn on row limit reached (@mistercrunch) +- [5825f45](https://github.com/airbnb/caravel/commit/5825f4539de92edcf784a43f3570ec745b4c50dc) Allowing for form field description and tooltips (@mistercrunch) +- [#23](https://github.com/airbnb/caravel/pull/23) Merge pull request #23 from mistercrunch/where (@mistercrunch) +- [fab0670](https://github.com/airbnb/caravel/commit/fab067066934ccdd8b118b41c9642db2a711f4f5) Custom WHERE clause for tables (not druid) + error handling refactor (@mistercrunch) +- [67c5f63](https://github.com/airbnb/caravel/commit/67c5f637d12a286896b1fe7487c1bf50d46cf3b9) Linting (@mistercrunch) +- [#22](https://github.com/airbnb/caravel/pull/22) Merge pull request #22 from mistercrunch/forms (@mistercrunch) +- [#20](https://github.com/airbnb/caravel/pull/20) Merge pull request #20 from wbchn/master (@wbchn) +- [1283bc0](https://github.com/airbnb/caravel/commit/1283bc07889714a6f0c6232b5a892b7b0e0ff226) Form factory refactor (@mistercrunch) +- [6dd81a3](https://github.com/airbnb/caravel/commit/6dd81a3e95a9d67be743815ff9bfcd465278b3e9) Adding argparse for port and debug mode on bin/panoramix (@mistercrunch) +- [483935c](https://github.com/airbnb/caravel/commit/483935cc12a3cebc92f7d26c0e4d9ac5cb36b510) Marking distribution as is_timeseries=False (@mistercrunch) +- [bca1e15](https://github.com/airbnb/caravel/commit/bca1e15e44710d90d8c57afadb6d3f9dd7bec0ca) Temp DB in /tmp (@mistercrunch) +- [11aaaf3](https://github.com/airbnb/caravel/commit/11aaaf3e11595d1f7f5a26749ff6fea649fc6a55) add tzinfo config, useful when start druid without utc timezone ### 0.2.1 (2015/09/05 22:08 +00:00) -- [#19](https://github.com/airbnb/caravel/pull/19) Preparing pypi package (@mistercrunch) +- [c95c252](https://github.com/airbnb/caravel/commit/c95c2522ab61349376686bdfd30cca7db229a3a6) v0.2.1 (@mistercrunch) +- [58c2186](https://github.com/airbnb/caravel/commit/58c2186f564b509a6738a9b024f987656def9a4b) Adding a few screenshots to README (@mistercrunch) +- [#19](https://github.com/airbnb/caravel/pull/19) Merge pull request #19 from mistercrunch/setup (@mistercrunch) ### 0.2.0 (2015/09/05 20:43 +00:00) -- [#16](https://github.com/airbnb/caravel/pull/16) Adding Bubble charts (@mistercrunch) -- [#13](https://github.com/airbnb/caravel/pull/13) Now supporting SQL Multiple database (@mistercrunch) -- [#12](https://github.com/airbnb/caravel/pull/12) Cosmetricks (@mistercrunch) -- [#11](https://github.com/airbnb/caravel/pull/11) Fixing the ways metrics are autogenerated (@mistercrunch) -- [#10](https://github.com/airbnb/caravel/pull/10) Now enabling multi-cluster, connection info managed in UI (@mistercrunch) -- [#9](https://github.com/airbnb/caravel/pull/9) Multi delete action on datasources (@mistercrunch) -- [#8](https://github.com/airbnb/caravel/pull/8) Preventing bad json from creating problems (@mistercrunch) -- [#3](https://github.com/airbnb/caravel/pull/3) Implementing my own highcharts wrapper (@mistercrunch) +- [efc54e0](https://github.com/airbnb/caravel/commit/efc54e0f65f7c9df18b2a15d230350fd19f51426) Preparing pypi package (@mistercrunch) +- [d419279](https://github.com/airbnb/caravel/commit/d419279d706e3a0ea5f1d23fc4a5cacb1b8ec952) Minor improvments (@mistercrunch) +- [e1e2980](https://github.com/airbnb/caravel/commit/e1e298044e2dfbc449a4e8770bd13efc3059dd93) Making x in timeseries non-ordinal (@mistercrunch) +- [b7acbd8](https://github.com/airbnb/caravel/commit/b7acbd8d100fc8690863a8a396096fa3df3a895a) Bugfix on timeseries where granularity=all (@mistercrunch) +- [8e5a827](https://github.com/airbnb/caravel/commit/8e5a827b7515f9ed621000a134a87425deee54ac) Adding gunicorn as a multi-threaded production server (@mistercrunch) +- [acd14af](https://github.com/airbnb/caravel/commit/acd14afd4efe24afc046b06b88ccbdfa3a63598f) More readable long error msg (@mistercrunch) +- [39a9b3b](https://github.com/airbnb/caravel/commit/39a9b3b1e98f9f10d1d39f60ced56e4655fc3f88) Better automation around database table semantic layer (@mistercrunch) +- [b240265](https://github.com/airbnb/caravel/commit/b240265d84db394626a7d148a91bc82997de5e38) Squashing a small bug (@mistercrunch) +- [4ecf9d1](https://github.com/airbnb/caravel/commit/4ecf9d1beb18162638a12ab3da4c561a4af04f74) Table view now shows metrics histograms (@mistercrunch) +- [584ced5](https://github.com/airbnb/caravel/commit/584ced5eab4c1c6f481cb09c10daace52c862a1e) Fillna (@mistercrunch) +- [0517f1c](https://github.com/airbnb/caravel/commit/0517f1ca00a585144e985d6f3753871df9389306) Bugfix (@mistercrunch) +- [6510ee6](https://github.com/airbnb/caravel/commit/6510ee64279c45b237e816b7bfea63cdb653d9c9) Sizes first (@mistercrunch) +- [#16](https://github.com/airbnb/caravel/pull/16) Merge pull request #16 from mistercrunch/scatter (@mistercrunch) +- [56bfc31](https://github.com/airbnb/caravel/commit/56bfc31966d661973e8a1be0071a828563b519fb) Adding Bubble charts (@mistercrunch) +- [#15](https://github.com/airbnb/caravel/pull/15) Merge pull request #15 from mistercrunch/scatter (@mistercrunch) +- [0cfa0e6](https://github.com/airbnb/caravel/commit/0cfa0e618a048aac7cf243d49a29551200646ec7) Adding Bubble charts (@mistercrunch) +- [36a58e8](https://github.com/airbnb/caravel/commit/36a58e88850f9a09bac37f5cd2dee8bdb1677cb1) Minor fixes and improvments (@mistercrunch) +- [59efbcd](https://github.com/airbnb/caravel/commit/59efbcdead99ed9e5e185c0052c27b872eb37029) Using sqlalchemy expression API to support all SQL dialects (@mistercrunch) +- [3a0eb07](https://github.com/airbnb/caravel/commit/3a0eb07fe9f04540ebea1bbf0712c05209a963e7) Bugfixes (@mistercrunch) +- [221b86b](https://github.com/airbnb/caravel/commit/221b86b55100320fc428f76047a461c9371f68e8) Using default permission names (@mistercrunch) +- [3321a56](https://github.com/airbnb/caravel/commit/3321a56782debe12db16b531378f485a7c673f0c) Final touches on getting decent database support (@mistercrunch) +- [9e22749](https://github.com/airbnb/caravel/commit/9e227494cae4c3b8a66e1a6ab810360dc03dec92) Refreshing the docs after adding support for SQLA (@mistercrunch) +- [fac6dd1](https://github.com/airbnb/caravel/commit/fac6dd102d18cb0f290753d188133520425752d6) Adding a compare by value viz (@mistercrunch) +- [b4e7623](https://github.com/airbnb/caravel/commit/b4e76236a754a267d3e409fca03ff62655b7ed4a) Adding query time (@mistercrunch) +- [055d760](https://github.com/airbnb/caravel/commit/055d760d64057a4b675c57e4475256eb9fbe4304) Adding AuditMixin everywhere (@mistercrunch) +- [db56e84](https://github.com/airbnb/caravel/commit/db56e84fa863ef66885d88da73ffaf2a1afde112) Fixing FKs (@mistercrunch) +- [#13](https://github.com/airbnb/caravel/pull/13) Merge pull request #13 from mistercrunch/sql (@mistercrunch) +- [8ea0157](https://github.com/airbnb/caravel/commit/8ea0157f1c084a2edaee40c485f1cf21e2f5bcc6) SQL working ! (@mistercrunch) +- [b70b270](https://github.com/airbnb/caravel/commit/b70b270b1aa85512eb51c2aa7249e7858257c6bc) Pivoting into sqla instead of sql (@mistercrunch) +- [f39b241](https://github.com/airbnb/caravel/commit/f39b24175b4463e80576a0b393e4bf3442bd7695) About to mess with filters (@mistercrunch) +- [34acc90](https://github.com/airbnb/caravel/commit/34acc90f3fa22747e243f4750937cd70ab7aaf09) ALL OF SQL is coming along nicely (@mistercrunch) +- [2d192d1](https://github.com/airbnb/caravel/commit/2d192d1ae85eebb31f9e5350a8486d136ff9fa83) Query obj (@mistercrunch) +- [28c0292](https://github.com/airbnb/caravel/commit/28c0292920ee6748b7d83097c105e71776ab413f) Getting ready to gut panoramix (@mistercrunch) +- [#12](https://github.com/airbnb/caravel/pull/12) Merge pull request #12 from mistercrunch/cluster (@mistercrunch) +- [b734ace](https://github.com/airbnb/caravel/commit/b734aceff3ca99c81c7b904cd1cb8b5250c829ed) Cosmetics (@mistercrunch) +- [b1d009f](https://github.com/airbnb/caravel/commit/b1d009ffb8070882744731249a1235cead89ef26) Bug fixes (@mistercrunch) +- [#11](https://github.com/airbnb/caravel/pull/11) Merge pull request #11 from mistercrunch/cluster (@mistercrunch) +- [f851d20](https://github.com/airbnb/caravel/commit/f851d20a02feefb65a41279de7a286ac3817361b) Fixing the ways metrics are autogenerated (@mistercrunch) +- [#10](https://github.com/airbnb/caravel/pull/10) Merge pull request #10 from mistercrunch/cluster (@mistercrunch) +- [5e8fcab](https://github.com/airbnb/caravel/commit/5e8fcabf10eed37b585d83230345400630252098) Removing compare feature (@mistercrunch) +- [374802e](https://github.com/airbnb/caravel/commit/374802e437720ebe4a230115e3b4d7c61f2fff2c) Now enabling multi-cluster, connection info managed in UI (@mistercrunch) +- [6032daf](https://github.com/airbnb/caravel/commit/6032daf5f01266fc4414973ac84afed5041ada82) Multi clusters (@mistercrunch) +- [#9](https://github.com/airbnb/caravel/pull/9) Merge pull request #9 from mistercrunch/actions (@mistercrunch) +- [e8f480f](https://github.com/airbnb/caravel/commit/e8f480fc48dccef2d1e61b7316dedbfe0aa51cf9) Multi delete action on datasources (@mistercrunch) +- [f07ea2b](https://github.com/airbnb/caravel/commit/f07ea2b83e0f18263c306fc8b771a24ca7e3688e) TODO (@mistercrunch) +- [#8](https://github.com/airbnb/caravel/pull/8) Merge pull request #8 from mistercrunch/bad_json (@mistercrunch) +- [6be2224](https://github.com/airbnb/caravel/commit/6be22246e967f6095e0de4fd1c011ce1e3091605) Preventing bad json from creating problems (@mistercrunch) +- [fb365cd](https://github.com/airbnb/caravel/commit/fb365cd17823a1e49e17161262f485b857f145ab) Making DEBUG a configuration (@mistercrunch) +- [0d92bcc](https://github.com/airbnb/caravel/commit/0d92bccbb0bddf2976658cac77a9f90c9adb9de7) Adding health and ping endpoints (@mistercrunch) +- [c379430](https://github.com/airbnb/caravel/commit/c379430a4174bed8dd95a8db8db408322e8bdc83) Removing debug print statement (@mistercrunch) +- [bc1db2d](https://github.com/airbnb/caravel/commit/bc1db2db21843464975a413e68dabd4d7f979ca8) Simplify install (@mistercrunch) +- [1c6177c](https://github.com/airbnb/caravel/commit/1c6177ce4be712e507b69f26ba733736f445a454) All sorts of improvements (@mistercrunch) +- [c29444e](https://github.com/airbnb/caravel/commit/c29444e1a74c104846309a1ffccdf0fb0b196410) Better PORT defaults (@mistercrunch) +- [74a2e7d](https://github.com/airbnb/caravel/commit/74a2e7df54820f2609cedb2a0fc49ca2468b16f9) Managing perms for new views (@mistercrunch) +- [#3](https://github.com/airbnb/caravel/pull/3) Merge pull request #3 from mistercrunch/charts (@mistercrunch) +- [d438520](https://github.com/airbnb/caravel/commit/d438520660cf16dd4376c20a6660c8e47b2331fc) Implementing my own highcharts wrapper (@mistercrunch) +- [9ce4f68](https://github.com/airbnb/caravel/commit/9ce4f684734c9c3000aa9fa30f5e953971410f6a) New Charts (@mistercrunch) +- [056be73](https://github.com/airbnb/caravel/commit/056be737af50967ca7ccc291f2218ec9c9b995b8) Fixing filter for timeseries (@mistercrunch) +- [4bb313c](https://github.com/airbnb/caravel/commit/4bb313cc4492ada5102cc0f6afabc237c9abaeb9) Improving the installation instructions (@mistercrunch) +- [67de93d](https://github.com/airbnb/caravel/commit/67de93d9f1c1864891cc732bb44c995ab5ee9ab4) Minor change in README (@mistercrunch) +- [6b30eec](https://github.com/airbnb/caravel/commit/6b30eec5b217146b79f84a70c9ef9dc0b7d44db3) Adding missing req (@mistercrunch) +- [6031772](https://github.com/airbnb/caravel/commit/60317727ab69f6c209352fad5b3580213d9025e5) Adding installation infromation in README.md (@mistercrunch) +- [34fd113](https://github.com/airbnb/caravel/commit/34fd11364fcfc3e2ca28341522fa5ca75012b448) LICENSE (@mistercrunch) +- [0b6d808](https://github.com/airbnb/caravel/commit/0b6d808d7abeeed2ae9b15bb3b7b133728c68c77) A slightly better README (@mistercrunch) +- [4d6e358](https://github.com/airbnb/caravel/commit/4d6e358fb623b21f7b1dd88cd94a22f0a3d56608) A screenshot in the README (@mistercrunch) +- [c6dca0f](https://github.com/airbnb/caravel/commit/c6dca0f27d6abcbeb392b33b6e9bc2952f247ccd) Improvements (@mistercrunch) +- [bd1d8eb](https://github.com/airbnb/caravel/commit/bd1d8eb2424a330b6cbbb84c1514260c1cf82c04) Better and better (@mistercrunch) +- [4334373](https://github.com/airbnb/caravel/commit/4334373a33264906ddf6ea3d70a3979cc4d697fc) Numerous improvements (@mistercrunch) +- [d268b6b](https://github.com/airbnb/caravel/commit/d268b6b231373c6d7a245a8990d203e289b7d262) Now supporting multi-metric selection (@mistercrunch) +- [8b17563](https://github.com/airbnb/caravel/commit/8b175638cdb5d3f4105d82e7fae43cbf4d05e61c) Humanized time boundaries and granularity (@mistercrunch) +- [16f7bf9](https://github.com/airbnb/caravel/commit/16f7bf9054b2ab2875a90aaa5861ef805954002e) Cosmetics (@mistercrunch) +- [9ad7d54](https://github.com/airbnb/caravel/commit/9ad7d5480b683fd114eeec694abbe786827177cd) A better README (@mistercrunch) +- [c441c5e](https://github.com/airbnb/caravel/commit/c441c5e211351866d1b706a84cba89525ea5f43c) Merge branch 'objects' (@mistercrunch) +- [dd867da](https://github.com/airbnb/caravel/commit/dd867da115f785ab078e5cfa3fd8db07a2fffc3c) Cleaning up (@mistercrunch) +- [29b0bdd](https://github.com/airbnb/caravel/commit/29b0bdd00acb7bb5d103d9d37eb1a5fdaa914bb9) Stable (@mistercrunch) +- [8431800](https://github.com/airbnb/caravel/commit/8431800bd60955a2b932eb407d98cc4a87926626) Starting over (@mistercrunch) +- [4cb380d](https://github.com/airbnb/caravel/commit/4cb380d9ba10bf098a0a9a330c91f469d867da95) Starting over with flask app-builder (@mistercrunch) +- [3bce904](https://github.com/airbnb/caravel/commit/3bce90445478f6f8d4ad930259a25bfb3429068c) Integrated the admin (@mistercrunch) +- [66dca37](https://github.com/airbnb/caravel/commit/66dca37c9c98eae6acf0c8b1698987ffe33a85eb) Refactoring (@mistercrunch) +- [059c02a](https://github.com/airbnb/caravel/commit/059c02aed05093a8ba7973611a0429443db2256b) Checkpoint (@mistercrunch) +- [9f12046](https://github.com/airbnb/caravel/commit/9f1204605f8a22ce87d797cb4d1f6ad580835a2d) Working checkpoint before classifying Viz (@mistercrunch) +- [68c5a48](https://github.com/airbnb/caravel/commit/68c5a48c1ffcc65029c479212e9063074b54eb47) Initial commit (@mistercrunch) +- [447eefc](https://github.com/airbnb/caravel/commit/447eefc79bff4c3fb06b37a2d5d0add380362d65) Initial commit (@mistercrunch) \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e8f25e9ee3896..49ec182ceee0c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -142,7 +142,7 @@ npm run dev Tests can then be run with: - ./run_unit_tests.sh + ./run_tests.sh Lint the project with: @@ -159,12 +159,12 @@ Generate the documentation with: cd docs && ./build.sh ## CSS Themes -As part of the npm build process, CSS for Caravel is compiled from ```Less```, a dynamic stylesheet language. +As part of the npm build process, CSS for Caravel is compiled from `Less`, a dynamic stylesheet language. It's possible to customize or add your own theme to Caravel, either by overriding CSS rules or preferably -by modifying the Less variables or files in ```assets/stylesheets/less/```. +by modifying the Less variables or files in `assets/stylesheets/less/`. -The ```variables.less``` and ```bootswatch.less``` files that ship with Caravel are derived from +The `variables.less` and `bootswatch.less` files that ship with Caravel are derived from [Bootswatch](https://bootswatch.com) and thus extend Bootstrap. Modify variables in these files directly, or swap them out entirely with the equivalent files from other Bootswatch (themes)[https://github.com/thomaspark/bootswatch.git] @@ -179,7 +179,43 @@ meets these guidelines: as part of the same PR. Doc string are often sufficient, make sure to follow the sphinx compatible standards. 3. The pull request should work for Python 2.6, 2.7, and ideally python 3.3. - `from __future__ import ` will be required in every `.py` file soon. + ``from __future__ import`` will be required in every `.py` file soon. 4. Code will be reviewed by re running the unittests, flake8 and syntax should be as rigorous as the core Python project. 5. Please rebase and resolve all conflicts before submitting. + + +## Tranlations + +We use [Babel](http://babel.pocoo.org/en/latest/) to translate Caravel. The +key is to instrument the strings that need translation using +`from flask.ext.babelpkg import lazy_gettext as _`. Once this is imported in +a module, all you have to do is to `_("Wrap your strings")` using the +underscore `_` "function". + +To enable changing language in your environment, you can simply add the +`LANGUAGES` parameter to your `caravel_config.py`. Having more than one +options here will add a language selection dropdown on the right side of the +navigation bar. + + LANGUAGES = { + 'en': {'flag': 'us', 'name': 'English'}, + 'fr': {'flag': 'fr', 'name': 'French'}, + 'zh': {'flag': 'cn', 'name': 'Chinese'}, + } + +As per the [Flask AppBuilder documentation] about translation, to create a +new language dictionary, run the following command: + + pybabel init -i ./babel/messages.pot -d caravel/translations -l es + +Then it's a matter of running the statement bellow to gather all stings that +need translation + + fabmanager babel-extract --target caravel/translations/ + +You can then translate the strings gathered in files located under +`caravel/translation`, where there's one per language. For the translations +to take effect, they need to be compiled using this command: + + fabmanager babel-compile --target caravel/translations/ diff --git a/README.md b/README.md index 066c272ab675b..bf2dc7066fd48 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ Caravel [![PyPI version](https://badge.fury.io/py/caravel.svg)](https://badge.fury.io/py/caravel) [![Coverage Status](https://coveralls.io/repos/airbnb/caravel/badge.svg?branch=master&service=github)](https://coveralls.io/github/airbnb/caravel?branch=master) [![Code Health](https://landscape.io/github/airbnb/caravel/master/landscape.svg?style=flat)](https://landscape.io/github/airbnb/caravel/master) +[![PyPI](https://img.shields.io/pypi/pyversions/caravel.svg?maxAge=2592000)](https://pypi.python.org/pypi/caravel) [![Requirements Status](https://requires.io/github/airbnb/caravel/requirements.svg?branch=master)](https://requires.io/github/airbnb/caravel/requirements/?branch=master) [![Join the chat at https://gitter.im/airbnb/caravel](https://badges.gitter.im/airbnb/caravel.svg)](https://gitter.im/airbnb/caravel?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Documentation](https://img.shields.io/badge/docs-airbnb.io-blue.svg)](http://airbnb.io/caravel/) @@ -89,7 +90,8 @@ Resources ------------- * [Caravel Google Group](https://groups.google.com/forum/#!forum/airbnb_caravel) * [Gitter (live chat) Channel](https://gitter.im/airbnb/caravel) -* [Docker image](https://hub.docker.com/r/kochalex/caravel/) (community contributed) +* [Docker image 1](https://hub.docker.com/r/kochalex/caravel/) + [Docker image 2](https://hub.docker.com/r/amancevice/caravel/) (community contributed) * [Slides from Strata (March 2016)](https://drive.google.com/open?id=0B5PVE0gzO81oOVJkdF9aNkJMSmM) diff --git a/TODO.md b/TODO.md index a12340c544bd1..042531cdbef37 100644 --- a/TODO.md +++ b/TODO.md @@ -13,8 +13,6 @@ List of TODO items for Caravel * **Dashboard URL filters:** `{dash_url}#fltin__fieldname__value1,value2` * **Default slice:** choose a default slice for the dataset instead of default endpoint -* **refresh freq**: specifying the refresh frequency of a dashboard and - specific slices within it, some randomization would be nice * **Widget sets / chart grids:** a way to have all charts support making a series of charts and putting them in a grid. The same way that you can groupby for series, you could chart by. The form field set would be @@ -27,8 +25,6 @@ List of TODO items for Caravel some visualizations as annotations. An example of a layer might be "holidays" or "site outages", ... * **Slack integration** - TBD -* **Sexy Viz Selector:** the visualization selector should be a nice large - modal with nice thumbnails for each one of the viz * **Comments:** allow for people to comment on slices and dashes @@ -37,7 +33,6 @@ List of TODO items for Caravel * CREATE VIEW button from SQL editor * Test button for when editing SQL expression * Slider form element -* datasource in explore mode could be a dropdown * [druid] Allow for post aggregations (ratios!) * in/notin filters autocomplete (druid) diff --git a/babel/babel.cfg b/babel/babel.cfg new file mode 100644 index 0000000000000..9daea0201c672 --- /dev/null +++ b/babel/babel.cfg @@ -0,0 +1,4 @@ +[ignore: caravel/assets/node_modules/**] +[python: caravel/**.py] +[jinja2: caravel/**/templates/**.html] +encoding = utf-8 diff --git a/babel/messages.pot b/babel/messages.pot new file mode 100644 index 0000000000000..66280dee0a4c6 --- /dev/null +++ b/babel/messages.pot @@ -0,0 +1,117 @@ +# Translations template for Caravel. +# Copyright (C) 2016 ORGANIZATION +# This file is distributed under the same license as the Caravel project. +# Maxime Beauchemin , 2016. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PROJECT VERSION\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2016-05-02 00:21-0700\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +#: caravel/models.py:564 +msgid "" +"Datetime column not provided as part table configuration and is required " +"by this type of chart" +msgstr "" + +#: caravel/models.py:1153 +msgid "No data was returned." +msgstr "" + +#: caravel/views.py:116 +msgid "" +"Whether to make this column available as a [Time Granularity] option, " +"column has to be DATETIME or DATETIME-like" +msgstr "" + +#: caravel/views.py:215 +msgid "Databases" +msgstr "" + +#: caravel/views.py:217 caravel/views.py:261 caravel/views.py:284 +msgid "Sources" +msgstr "" + +#: caravel/views.py:260 +msgid "Tables" +msgstr "" + +#: caravel/views.py:282 +msgid "Druid Clusters" +msgstr "" + +#: caravel/views.py:313 +msgid "Slices" +msgstr "" + +#: caravel/views.py:341 +msgid "" +"This json object describes the positioning of the widgets in the " +"dashboard. It is dynamically generated when adjusting the widgets size " +"and positions by using drag & drop in the dashboard view" +msgstr "" + +#: caravel/views.py:346 +msgid "" +"The css for individual dashboards can be altered here, or in the " +"dashboard view where changes are immediately visible" +msgstr "" + +#: caravel/views.py:367 +msgid "Dashboards" +msgstr "" + +#: caravel/views.py:392 +msgid "Action Log" +msgstr "" + +#: caravel/views.py:393 +msgid "Security" +msgstr "" + +#: caravel/views.py:430 +msgid "Druid Datasources" +msgstr "" + +#: caravel/views.py:514 +msgid "The datasource seems to have been deleted" +msgstr "" + +#: caravel/views.py:522 +msgid "You don't seem to have access to this datasource" +msgstr "" + +#: caravel/views.py:843 +msgid "This view requires the `all_datasource_access` permission" +msgstr "" + +#: caravel/views.py:954 +msgid "CSS Templates" +msgstr "" + +#: caravel/templates/appbuilder/navbar_right.html:34 +msgid "Profile" +msgstr "" + +#: caravel/templates/appbuilder/navbar_right.html:35 +msgid "Logout" +msgstr "" + +#: caravel/templates/appbuilder/navbar_right.html:40 +msgid "Login" +msgstr "" + +#: caravel/templates/caravel/welcome.html:8 +#: caravel/templates/caravel/welcome.html:13 +msgid "Welcome!" +msgstr "" + diff --git a/caravel/__init__.py b/caravel/__init__.py index 74dcbd5584106..72999097b8ea6 100644 --- a/caravel/__init__.py +++ b/caravel/__init__.py @@ -6,6 +6,7 @@ import logging import os +from logging.handlers import TimedRotatingFileHandler from flask import Flask, redirect from flask.ext.appbuilder import SQLA, AppBuilder, IndexView @@ -20,10 +21,6 @@ APP_DIR = os.path.dirname(__file__) CONFIG_MODULE = os.environ.get('CARAVEL_CONFIG', 'caravel.config') -# Logging configuration -logging.basicConfig(format='%(asctime)s:%(levelname)s:%(name)s:%(message)s') -logging.getLogger().setLevel(logging.DEBUG) - app = Flask(__name__) app.config.from_object(CONFIG_MODULE) if not app.debug: @@ -37,6 +34,18 @@ migrate = Migrate(app, db, directory=APP_DIR + "/migrations") +# Logging configuration +logging.basicConfig(format=app.config.get('LOG_FORMAT')) +logging.getLogger().setLevel(app.config.get('LOG_LEVEL')) + +if app.config.get('ENABLE_TIME_ROTATE'): + logging.getLogger().setLevel(app.config.get('TIME_ROTATE_LOG_LEVEL')) + handler = TimedRotatingFileHandler(app.config.get('FILENAME'), + when=app.config.get('ROLLOVER'), + interval=app.config.get('INTERVAL'), + backupCount=app.config.get('BACKUP_COUNT')) + logging.getLogger().addHandler(handler) + class MyIndexView(IndexView): @expose('/') diff --git a/caravel/assets/images/viz_thumbnails/cal_heatmap.png b/caravel/assets/images/viz_thumbnails/cal_heatmap.png new file mode 100644 index 0000000000000..bf79a9e237add Binary files /dev/null and b/caravel/assets/images/viz_thumbnails/cal_heatmap.png differ diff --git a/caravel/assets/images/viz_thumbnails/horizon.png b/caravel/assets/images/viz_thumbnails/horizon.png new file mode 100644 index 0000000000000..7ccd90f3ff231 Binary files /dev/null and b/caravel/assets/images/viz_thumbnails/horizon.png differ diff --git a/caravel/assets/javascripts/dashboard.js b/caravel/assets/javascripts/dashboard.js index da711d725faa1..89b96f324d1d5 100644 --- a/caravel/assets/javascripts/dashboard.js +++ b/caravel/assets/javascripts/dashboard.js @@ -13,6 +13,8 @@ require('./caravel-select2.js'); require('../node_modules/gridster/dist/jquery.gridster.min.css'); require('../node_modules/gridster/dist/jquery.gridster.min.js'); +require('../stylesheets/dashboard.css'); + var Dashboard = function (dashboardData) { var dashboard = $.extend(dashboardData, { filters: {}, @@ -92,7 +94,7 @@ var Dashboard = function (dashboardData) { fetchAndRender(); }, refreshExcept: function (slice_id) { - var immune = this.metadata.filter_immune_slice || []; + var immune = this.metadata.filter_immune_slices || []; this.slices.forEach(function (slice) { if (slice.data.slice_id !== slice_id && immune.indexOf(slice.data.slice_id) === -1) { slice.render(); diff --git a/caravel/assets/javascripts/explore.js b/caravel/assets/javascripts/explore.js index 1f655b5ab9810..55c71b90e0c81 100644 --- a/caravel/assets/javascripts/explore.js +++ b/caravel/assets/javascripts/explore.js @@ -18,6 +18,7 @@ require('../node_modules/bootstrap-toggle/js/bootstrap-toggle.min.js'); // css require('../vendor/pygments.css'); +require('../stylesheets/explore.css'); require('../node_modules/bootstrap-toggle/css/bootstrap-toggle.min.css'); var slice; diff --git a/caravel/assets/javascripts/modules/caravel.js b/caravel/assets/javascripts/modules/caravel.js index 4931dfcdcddbe..c3794b7af4e3c 100644 --- a/caravel/assets/javascripts/modules/caravel.js +++ b/caravel/assets/javascripts/modules/caravel.js @@ -1,6 +1,7 @@ var $ = require('jquery'); var jQuery = $; var d3 = require('d3'); +var Mustache = require('mustache'); // vis sources var sourceMap = { @@ -26,7 +27,9 @@ var sourceMap = { table: 'table.js', word_cloud: 'word_cloud.js', world_map: 'world_map.js', - treemap: 'treemap.js' + treemap: 'treemap.js', + cal_heatmap: 'cal_heatmap.js', + horizon: 'horizon.js' }; var color = function () { @@ -48,6 +51,7 @@ var color = function () { var seen = {}; return function (s) { if (!s) { return; } + s = String(s); // next line is for caravel series that should have the same color s = s.replace('---', ''); if (seen[s] === undefined) { @@ -214,6 +218,13 @@ var px = (function () { getWidgetHeader: function () { return this.container.parents("li.widget").find(".chart-header"); }, + render_template: function (s) { + var context = { + width: this.width, + height: this.height + }; + return Mustache.render(s, context); + }, jsonEndpoint: function () { var parser = document.createElement('a'); parser.href = data.json_endpoint; @@ -301,6 +312,7 @@ var px = (function () { }, bindResizeToWindowResize: function () { var resizeTimer; + var slice = this; $(window).on('resize', function (e) { clearTimeout(resizeTimer); resizeTimer = setTimeout(function () { @@ -314,7 +326,7 @@ var px = (function () { } this.force = force; token.find("img.loading").show(); - container.css('height', slice.height()); + container.css('height', this.height()); dttm = 0; timer = setInterval(stopwatch, 10); $('#timer').removeClass('btn-danger btn-success'); @@ -323,7 +335,7 @@ var px = (function () { }, resize: function () { token.find("img.loading").show(); - container.css('height', slice.height()); + container.css('height', this.height()); this.viz.render(); this.viz.resize(); }, diff --git a/caravel/assets/javascripts/welcome.js b/caravel/assets/javascripts/welcome.js index fea8bbe95f873..79a0ea82dc785 100644 --- a/caravel/assets/javascripts/welcome.js +++ b/caravel/assets/javascripts/welcome.js @@ -6,6 +6,7 @@ require('bootstrap'); require('datatables.net-bs'); require('../node_modules/datatables-bootstrap3-plugin/media/css/datatables-bootstrap3.css'); require('../node_modules/cal-heatmap/cal-heatmap.css'); +var d3 = require('d3'); var CalHeatMap = require('cal-heatmap'); @@ -55,15 +56,26 @@ function modelViewTable(selector, modelView, orderCol, order) { } $(document).ready(function () { - var cal = new CalHeatMap(); - cal.init({ - start: new Date().setFullYear(new Date().getFullYear() - 1), - range: 13, - data: '/caravel/activity_per_day', - domain: "month", - subDomain: "day", - itemName: "action", - tooltip: true + d3.json('/caravel/activity_per_day', function (json) { + var ext = d3.extent(d3.values(json)); + var cal = new CalHeatMap(); + var range = 10; + var legendBounds = []; + var step = (ext[1] - ext[0]) / (range - 1); + for (var i = 0; i< range; i++) { + legendBounds.push(i * step + ext[0]); + } + cal.init({ + start: new Date().setFullYear(new Date().getFullYear() - 1), + range: 13, + data: json, + legend: legendBounds, + legendColors: ['#D6E685', '#1E6823'], // Based on github's colors + domain: "month", + subDomain: "day", + itemName: "action", + tooltip: true + }); }); modelViewTable('#dash_table', 'DashboardModelViewAsync', 'changed_on', 'desc'); modelViewTable('#slice_table', 'SliceAsync', 'changed_on', 'desc'); diff --git a/caravel/assets/package.json b/caravel/assets/package.json index ccebcdb792d85..e6f5e0188cfd6 100644 --- a/caravel/assets/package.json +++ b/caravel/assets/package.json @@ -60,6 +60,7 @@ "jquery-ui": "^1.10.5", "less": "^2.6.1", "less-loader": "^2.2.2", + "mustache": "^2.2.1", "nvd3": "1.8.2", "react": "^0.14.7", "react-bootstrap": "^0.28.3", diff --git a/caravel/assets/stylesheets/caravel.css b/caravel/assets/stylesheets/caravel.css index 533f43a9a9976..05614ecd6365d 100644 --- a/caravel/assets/stylesheets/caravel.css +++ b/caravel/assets/stylesheets/caravel.css @@ -2,6 +2,10 @@ body { margin: 0px !important; } +.caret { + border-top: 4px solid; +} + .emph { font-weight: bold; } @@ -82,14 +86,6 @@ input[type="checkbox"] { form div { padding-top: 1px; } -.navbar-brand a { - color: white; - text-decoration: none; -} -.navbar-brand a:hover { - color: white; - text-decoration: none; -} .header span { margin-left: 5px; @@ -135,10 +131,10 @@ span.title-block { .nvtooltip table td{ font-size: 11px !important; } -.navbar { - -webkit-box-shadow: 0px 3px 3px #AAA; - -moz-box-shadow: 0px 3px 3px #AAA; - box-shadow: 0px 3px 3px #AAA; +div.navbar { + -webkit-box-shadow: 0px 2px 2px #CCC; + -moz-box-shadow: 0px 2px 2px #CCC; + box-shadow: 0px 2px 2px #ccc; z-index: 999; } .panel.panel-primary { @@ -156,36 +152,6 @@ span.title-block { img.loading { width: 40px; } -.dashboard a i { - cursor: pointer; -} -.dashboard i.drag { - cursor: move !important; -} -.dashboard .gridster .preview-holder { - z-index: 1; - position: absolute; - background-color: #AAA; - border-color: #AAA; - opacity: 0.3; -} -.gridster li.widget{ - list-style-type: none; - border-radius: 0; - margin: 5px; - border: 1px solid #ccc; - box-shadow: 2px 1px 5px -2px #aaa; - background-color: #fff; -} -.dashboard .gridster .dragging, -.dashboard .gridster .resizing { - opacity: 0.5; -} -.dashboard img.loading { - width: 20px; - margin: 5px; - position: absolute; -} img.viz-thumb-option { width: 100px; border: 1px solid gray; @@ -196,23 +162,6 @@ img.viz-thumb-option { max-height: 700px; } -.dashboard .title { - text-align: center; -} -.dashboard .slice_title { - text-align: center; - font-weight: bold; - font-size: 14px; - padding: 5px; -} -.dashboard div.slice_content { - width: 100%; - height: 100%; -} - -.dashboard div.nvtooltip { - z-index: 888; /* this lets tool tips go on top of other slices */ -} div.header { font-weight: bold; diff --git a/caravel/assets/stylesheets/dashboard.css b/caravel/assets/stylesheets/dashboard.css new file mode 100644 index 0000000000000..e9376487fd547 --- /dev/null +++ b/caravel/assets/stylesheets/dashboard.css @@ -0,0 +1,47 @@ +.dashboard a i { + cursor: pointer; +} +.dashboard i.drag { + cursor: move !important; +} +.dashboard .gridster .preview-holder { + z-index: 1; + position: absolute; + background-color: #AAA; + border-color: #AAA; + opacity: 0.3; +} +.gridster li.widget{ + list-style-type: none; + border-radius: 0; + margin: 5px; + border: 1px solid #ccc; + box-shadow: 2px 1px 5px -2px #aaa; + background-color: #fff; +} +.dashboard .gridster .dragging, +.dashboard .gridster .resizing { + opacity: 0.5; +} +.dashboard img.loading { + width: 20px; + margin: 5px; + position: absolute; +} +.dashboard .title { + text-align: center; +} +.dashboard .slice_title { + text-align: center; + font-weight: bold; + font-size: 14px; + padding: 5px; +} +.dashboard div.slice_content { + width: 100%; + height: 100%; +} + +.dashboard div.nvtooltip { + z-index: 888; /* this lets tool tips go on top of other slices */ +} diff --git a/caravel/assets/stylesheets/explore.css b/caravel/assets/stylesheets/explore.css new file mode 100644 index 0000000000000..1666f9fc4774a --- /dev/null +++ b/caravel/assets/stylesheets/explore.css @@ -0,0 +1,9 @@ +.widget { + position: relative; +} + +.slice_container { + position: absolute; + left: 0; + top: 0; +} diff --git a/caravel/assets/stylesheets/less/variables.less b/caravel/assets/stylesheets/less/variables.less index 305e9926f61f5..3d61578d4d69d 100644 --- a/caravel/assets/stylesheets/less/variables.less +++ b/caravel/assets/stylesheets/less/variables.less @@ -26,7 +26,7 @@ @gray-light: #bbb; @gray-lighter: lighten(@gray-base, 93.5%); // #eee -@brand-primary: darken(@babu, 5%); +@brand-primary: @kazan; @brand-success: darken(@lima, 15%); @brand-info: @beach; @brand-warning: @hackberry; @@ -160,8 +160,8 @@ @btn-default-bg: #fff; @btn-default-border: transparent; -@btn-primary-color: #fff; -@btn-primary-bg: @brand-primary; +@btn-primary-color: #444; +@btn-primary-bg: #eee; @btn-primary-border: transparent; @btn-success-color: #fff; @@ -385,7 +385,7 @@ @navbar-default-link-hover-color: @gray-dark; @navbar-default-link-hover-bg: transparent; @navbar-default-link-active-color: @gray-dark; -@navbar-default-link-active-bg: darken(@navbar-default-bg, 6.5%); +@navbar-default-link-active-bg: darken(@navbar-default-bg, 30%); @navbar-default-link-disabled-color: #ccc; @navbar-default-link-disabled-bg: transparent; @@ -403,12 +403,12 @@ //=== Inverted navbar // Reset inverted navbar basics @navbar-inverse-color: @gray-light; -@navbar-inverse-bg: @brand-primary; +@navbar-inverse-bg: white; @navbar-inverse-border: transparent; // Inverted navbar links -@navbar-inverse-link-color: lighten(@brand-primary, 30%); -@navbar-inverse-link-hover-color: #fff; +@navbar-inverse-link-color: #888; +@navbar-inverse-link-hover-color: #111; @navbar-inverse-link-hover-bg: transparent; @navbar-inverse-link-active-color: @navbar-inverse-link-hover-color; @navbar-inverse-link-active-bg: darken(@navbar-inverse-bg, 10%); @@ -417,7 +417,7 @@ // Inverted navbar brand label @navbar-inverse-brand-color: @navbar-inverse-link-color; -@navbar-inverse-brand-hover-color: #fff; +@navbar-inverse-brand-hover-color: @navbar-inverse-link-hover-color; @navbar-inverse-brand-hover-bg: transparent; // Inverted navbar toggle\ @@ -728,9 +728,9 @@ @panel-default-border: #ddd; @panel-default-heading-bg: #f5f5f5; -@panel-primary-text: #fff; -@panel-primary-border: @brand-primary; -@panel-primary-heading-bg: @brand-primary; +@panel-primary-text: black; +@panel-primary-border: gray; +@panel-primary-heading-bg: #eee; @panel-success-text: #fff; @panel-success-border: @state-success-border; diff --git a/caravel/assets/stylesheets/parallel_coordinates.css b/caravel/assets/stylesheets/parallel_coordinates.css new file mode 100644 index 0000000000000..3135e2cc687d7 --- /dev/null +++ b/caravel/assets/stylesheets/parallel_coordinates.css @@ -0,0 +1,7 @@ +.para div.grid { + overflow: auto; +} + +.para div.row:hover { + background-color: #CCC; +} diff --git a/caravel/assets/visualizations/big_number.js b/caravel/assets/visualizations/big_number.js index 32941cae5cf34..7351100924f71 100644 --- a/caravel/assets/visualizations/big_number.js +++ b/caravel/assets/visualizations/big_number.js @@ -72,7 +72,9 @@ function bigNumberVis(slice) { var g = svg.append('g'); var y = height / 2; //Printing big number - g.append('text') + g.append("g").attr("class", "digits") + .attr('opacity', 1) + .append('text') .attr('x', width / 2) .attr('y', y) .attr('class', 'big') @@ -159,17 +161,17 @@ function bigNumberVis(slice) { div.on('mouseover', function (d) { var div = d3.select(this); - div.select('path').transition().duration(500).attr('opacity', 1) + div.selectAll('path').transition().duration(500).attr('opacity', 1) .style('stroke-width', '2px'); - div.select('g.digits').transition().duration(500).attr('opacity', 0.1); - div.select('g.axis').transition().duration(500).attr('opacity', 1); + div.selectAll('g.digits').transition().duration(500).attr('opacity', 0.1); + div.selectAll('g.axis').transition().duration(500).attr('opacity', 1); }) .on('mouseout', function (d) { var div = d3.select(this); div.select('path').transition().duration(500).attr('opacity', 0.5) .style('stroke-width', '5px'); - div.select('g.digits').transition().duration(500).attr('opacity', 1); - div.select('g.axis').transition().duration(500).attr('opacity', 0); + div.selectAll('g.digits').transition().duration(500).attr('opacity', 1); + div.selectAll('g.axis').transition().duration(500).attr('opacity', 0); }); } slice.done(payload); diff --git a/caravel/assets/visualizations/cal_heatmap.css b/caravel/assets/visualizations/cal_heatmap.css new file mode 100644 index 0000000000000..0ab2087262571 --- /dev/null +++ b/caravel/assets/visualizations/cal_heatmap.css @@ -0,0 +1,3 @@ +.cal_heatmap .slice_container { + padding: 10px; +} diff --git a/caravel/assets/visualizations/cal_heatmap.js b/caravel/assets/visualizations/cal_heatmap.js new file mode 100644 index 0000000000000..d762cee8de8e4 --- /dev/null +++ b/caravel/assets/visualizations/cal_heatmap.js @@ -0,0 +1,58 @@ +// JS +var d3 = window.d3 || require('d3'); + +// CSS +require('./cal_heatmap.css'); +require('../node_modules/cal-heatmap/cal-heatmap.css'); + +var CalHeatMap = require('cal-heatmap'); + +function calHeatmap(slice) { + + var div = d3.select(slice.selector); + var cal = new CalHeatMap(); + + var render = function () { + d3.json(slice.jsonEndpoint(), function (error, json) { + + if (error !== null) { + slice.error(error.responseText); + return ''; + } + + div.selectAll("*").remove(); + cal = new CalHeatMap(); + + var timestamps = json.data["timestamps"], + extents = d3.extent(Object.keys(timestamps), function (key) { + return timestamps[key]; + }), + step = (extents[1] - extents[0]) / 5; + + try { + cal.init({ + start: json.data["start"], + data: timestamps, + itemSelector: slice.selector, + tooltip: true, + domain: json.data["domain"], + subDomain: json.data["subdomain"], + range: json.data["range"], + browsing: true, + legend: [extents[0], extents[0]+step, extents[0]+step*2, extents[0]+step*3] + }); + } catch (e) { + slice.error(e); + } + + slice.done(json); + }); + }; + + return { + render: render, + resize: render + }; +} + +module.exports = calHeatmap; diff --git a/caravel/assets/visualizations/directed_force.js b/caravel/assets/visualizations/directed_force.js index a0252067e6369..c9739d29c6d4f 100644 --- a/caravel/assets/visualizations/directed_force.js +++ b/caravel/assets/visualizations/directed_force.js @@ -7,13 +7,13 @@ require('./directed_force.css'); /* Modified from http://bl.ocks.org/d3noob/5141278 */ function directedForceVis(slice) { var div = d3.select(slice.selector); - var link_length = slice.data.form_data.link_length || 200; - var charge = slice.data.form_data.charge || -500; var render = function () { var width = slice.width(); var height = slice.height() - 25; d3.json(slice.jsonEndpoint(), function (error, json) { + var link_length = json.form_data.link_length || 200; + var charge = json.form_data.charge || -500; if (error !== null) { slice.error(error.responseText); diff --git a/caravel/assets/visualizations/horizon.css b/caravel/assets/visualizations/horizon.css new file mode 100644 index 0000000000000..013b3e02bd060 --- /dev/null +++ b/caravel/assets/visualizations/horizon.css @@ -0,0 +1,17 @@ +.horizon .slice_container div.horizon { + border-bottom: solid 1px #444; + border-top: 0px; + padding: 0px; + margin: 0px; +} + +.horizon span { + left: 5; + position: absolute; + color: black; + text-shadow: 1px 1px rgba(255, 255, 255, 0.75); +} + +.horizon .slice_container { + overflow: auto; +} diff --git a/caravel/assets/visualizations/horizon.js b/caravel/assets/visualizations/horizon.js new file mode 100644 index 0000000000000..c8f3e3d201413 --- /dev/null +++ b/caravel/assets/visualizations/horizon.js @@ -0,0 +1,237 @@ +// Copied and modified from +// https://github.com/kmandov/d3-horizon-chart +var d3 = require('d3'); +require('./horizon.css'); + +var horizonChart = function () { + var colors = ["#313695", "#4575b4", "#74add1", "#abd9e9", "#fee090", "#fdae61", "#f46d43", "#d73027"]; + var bands = colors.length >> 1; // number of bands in each direction (positive / negative) + var width = 1000; + var height = 30; + var offsetX = 0; + var spacing = 0; + var mode = 'offset'; + var axis = null; + var title = null; + var extent = null; // the extent is derived from the data, unless explicitly set via .extent([min, max]) + var x = null; + var y = d3.scale.linear().range([0, height]); + var canvas = null; + + var b; + + function my(data) { + + var horizon = d3.select(this); + var step = width / data.length; + + horizon.append('span') + .attr('class', 'title') + .text(title); + + horizon.append('span') + .attr('class', 'value'); + + canvas = horizon.append('canvas'); + + canvas + .attr('width', width) + .attr('height', height); + + var context = canvas.node().getContext('2d'); + context.imageSmoothingEnabled = false; + + // update the y scale, based on the data extents + var _extent = extent || d3.extent(data, function (d) { return d.y; }); + + var max = Math.max(-_extent[0], _extent[1]); + y.domain([0, max]); + + //x = d3.scaleTime().domain[]; + axis = d3.svg.axis(x).ticks(5); + + context.clearRect(0, 0, width, height); + //context.translate(0.5, 0.5); + + // the data frame currently being shown: + var startIndex = ~~ Math.max(0, -(offsetX / step)); + var endIndex = ~~ Math.min(data.length, startIndex + width / step); + + // skip drawing if there's no data to be drawn + if (startIndex > data.length) { + return; + } + + // we are drawing positive & negative bands separately to avoid mutating canvas state + // http://www.html5rocks.com/en/tutorials/canvas/performance/ + var negative = false; + // draw positive bands + var i, value, bExtents; + for (b = 0; b < bands; b++) { + context.fillStyle = colors[bands + b]; + + // Adjust the range based on the current band index. + bExtents = (b + 1 - bands) * height; + y.range([bands * height + bExtents, bExtents]); + + // only the current data frame is being drawn i.e. what's visible: + for (i = startIndex; i < endIndex; i++) { + value = data[i].y; + if (value <= 0) { negative = true; continue; } + if (value === undefined) { + continue; + } + context.fillRect(offsetX + i * step, y(value), step + 1, y(0) - y(value)); + } + } + + // draw negative bands + if (negative) { + + // mirror the negative bands, by flipping the canvas + if (mode === 'offset') { + context.translate(0, height); + context.scale(1, -1); + } + + for (b = 0; b < bands; b++) { + context.fillStyle = colors[bands - b - 1]; + + // Adjust the range based on the current band index. + bExtents = (b + 1 - bands) * height; + y.range([bands * height + bExtents, bExtents]); + + // only the current data frame is being drawn i.e. what's visible: + for (var ii = startIndex; ii < endIndex; ii++) { + value = data[ii].y; + if (value >= 0) { + continue; + } + context.fillRect(offsetX + ii * step, y(-value), step + 1, y(0) - y(-value)); + } + } + } + } + + my.axis = function (_) { + if (!arguments.length) { return axis; } + axis = _; + return my; + }; + + my.title = function (_) { + if (!arguments.length) { return title; } + title = _; + return my; + }; + + my.canvas = function (_) { + if (!arguments.length) { return canvas; } + canvas = _; + return my; + }; + + // Array of colors representing the number of bands + my.colors = function (_) { + if (!arguments.length) { + return colors; + } + colors = _; + + // update the number of bands + bands = colors.length >> 1; + + return my; + }; + + my.height = function (_) { + if (!arguments.length) { return height; } + height = _; + return my; + }; + + my.width = function (_) { + if (!arguments.length) { return width; } + width = _; + return my; + }; + + my.spacing = function (_) { + if (!arguments.length) { return spacing; } + spacing = _; + return my; + }; + + // mirror or offset + my.mode = function (_) { + if (!arguments.length) { return mode; } + mode = _; + return my; + }; + + my.extent = function (_) { + if (!arguments.length) { return extent; } + extent = _; + return my; + }; + + my.offsetX = function (_) { + if (!arguments.length) { return offsetX; } + offsetX = _; + return my; + }; + + return my; +}; + +function horizonViz(slice) { + + function refresh() { + d3.json(slice.jsonEndpoint(), function (error, payload) { + var fd = payload.form_data; + if (error) { + slice.error(error.responseText); + return ''; + } + + var div = d3.select(slice.selector); + div.selectAll('*').remove(); + var extent = null; + if (fd.horizon_color_scale === 'overall') { + var allValues = []; + payload.data.forEach(function (d) { + allValues = allValues.concat(d.values); + }); + extent = d3.extent(allValues, function (d) { return d.y; }); + } else if (fd.horizon_color_scale === 'change') { + payload.data.forEach(function (series) { + var t0y = series.values[0].y; // value at time 0 + series.values.forEach(function (d, i) { + d.y = d.y - t0y; + }); + }); + } + div.selectAll(".horizon") + .data(payload.data) + .enter() + .append('div') + .attr('class', 'horizon') + .each(function (d, i) { + horizonChart() + .height(fd.series_height) + .width(slice.width()) + .extent(extent) + .title(d.key) + .call(this, d.values, i); + }); + + slice.done(); + }); + } + return { + render: refresh, + resize: refresh + }; +} + +module.exports = horizonViz; diff --git a/caravel/assets/visualizations/iframe.js b/caravel/assets/visualizations/iframe.js index 0f9fddc8ba2fd..c38feff30d38a 100644 --- a/caravel/assets/visualizations/iframe.js +++ b/caravel/assets/visualizations/iframe.js @@ -5,10 +5,11 @@ function iframeWidget(slice) { function refresh() { $('#code').attr('rows', '15'); $.getJSON(slice.jsonEndpoint(), function (payload) { + var url = slice.render_template(payload.form_data.url); slice.container.html(''); var iframe = slice.container.find('iframe'); iframe.css('height', slice.height()); - iframe.attr('src', payload.form_data.url); + iframe.attr('src', url); slice.done(); }) .fail(function (xhr) { diff --git a/caravel/assets/visualizations/nvd3_vis.js b/caravel/assets/visualizations/nvd3_vis.js index fc63b6d03810d..71de1a0f52197 100644 --- a/caravel/assets/visualizations/nvd3_vis.js +++ b/caravel/assets/visualizations/nvd3_vis.js @@ -10,14 +10,13 @@ require('./nvd3_vis.css'); function nvd3Vis(slice) { var chart; + var colorKey = 'key'; var render = function () { $.getJSON(slice.jsonEndpoint(), function (payload) { var fd = payload.form_data; var viz_type = fd.viz_type; - var f = d3.format('.3s'); - var colorKey = 'key'; nv.addGraph(function () { if (!chart) { @@ -196,7 +195,6 @@ function nvd3Vis(slice) { chart.y2Axis.tickFormat(d3.format(fd.y_axis_format)); } } - chart.color(function (d, i) { return px.color.category21(d[colorKey]); }); diff --git a/caravel/assets/visualizations/parallel_coordinates.js b/caravel/assets/visualizations/parallel_coordinates.js index 271989b9f1bcf..b02f1eba76052 100644 --- a/caravel/assets/visualizations/parallel_coordinates.js +++ b/caravel/assets/visualizations/parallel_coordinates.js @@ -6,14 +6,27 @@ d3.divgrid = require('../vendor/parallel_coordinates/divgrid.js'); // CSS require('../vendor/parallel_coordinates/d3.parcoords.css'); +require('../stylesheets/parallel_coordinates.css'); function parallelCoordVis(slice) { function refresh() { $('#code').attr('rows', '15'); $.getJSON(slice.jsonEndpoint(), function (payload) { - var data = payload.data; var fd = payload.form_data; + var data = payload.data; + + var cols = fd.metrics; + if (fd.include_series) { + cols = [fd.series].concat(fd.metrics); + } + + var ttypes = {}; + ttypes[fd.series] = 'string'; + fd.metrics.forEach(function (v) { + ttypes[v] = 'number'; + }); + var ext = d3.extent(data, function (d) { return d[fd.secondary_metric]; }); @@ -27,6 +40,7 @@ function parallelCoordVis(slice) { return cScale(d[fd.secondary_metric]); }; var container = d3.select(slice.selector); + container.selectAll('*').remove(); var eff_height = fd.show_datatable ? (slice.height() / 2) : slice.height(); container.append('div') @@ -40,7 +54,9 @@ function parallelCoordVis(slice) { .alpha(0.5) .composite("darken") .height(eff_height) - .data(payload.data) + .data(data) + .dimensions(cols) + .types(ttypes) .render() .createAxes() .shadows() @@ -51,10 +67,10 @@ function parallelCoordVis(slice) { // create data table, row hover highlighting var grid = d3.divgrid(); container.append("div") - .datum(data.slice(0, 10)) - .attr('id', "grid") + .style('height', eff_height + 'px') + .datum(data) .call(grid) - .classed("parcoords", true) + .classed("parcoords grid", true) .selectAll(".row") .on({ mouseover: function (d) { @@ -64,8 +80,8 @@ function parallelCoordVis(slice) { }); // update data table on brush event parcoords.on("brush", function (d) { - d3.select("#grid") - .datum(d.slice(0, 10)) + d3.select(".grid") + .datum(d) .call(grid) .selectAll(".row") .on({ diff --git a/caravel/assets/visualizations/pivot_table.js b/caravel/assets/visualizations/pivot_table.js index 1df86f4725198..208a03cf10605 100644 --- a/caravel/assets/visualizations/pivot_table.js +++ b/caravel/assets/visualizations/pivot_table.js @@ -7,10 +7,10 @@ require('../node_modules/datatables-bootstrap3-plugin/media/css/datatables-boots module.exports = function (slice) { var container = slice.container; - var form_data = slice.data.form_data; function refresh() { $.getJSON(slice.jsonEndpoint(), function (json) { + var form_data = json.form_data; container.html(json.data); if (form_data.groupby.length === 1) { var table = container.find('table').DataTable({ diff --git a/caravel/assets/visualizations/sunburst.js b/caravel/assets/visualizations/sunburst.js index 6b919aea0b275..ccf3b917a155f 100644 --- a/caravel/assets/visualizations/sunburst.js +++ b/caravel/assets/visualizations/sunburst.js @@ -57,7 +57,6 @@ function sunburstVis(slice) { slice.error(error.responseText); return ''; } - createBreadcrumbs(rawData); createVisualization(rawData); @@ -299,7 +298,8 @@ function sunburstVis(slice) { name: "root", children: [] }; - for (var i = 0; i < rows.length; i++) { + + for (var i = 0; i < rows.length; i++) { // each record [groupby1val, groupby2val, ( or 0)n, m1, m2] var row = rows[i]; var m1 = Number(row[row.length - 2]); var m2 = Number(row[row.length - 1]); @@ -308,19 +308,22 @@ function sunburstVis(slice) { continue; } var currentNode = root; - for (var j = 0; j < levels.length; j++) { + for (var level = 0; level < levels.length; level++) { var children = currentNode.children || []; - var nodeName = levels[j]; + var nodeName = levels[level]; // If the next node has the name "0", it will - var isLeafNode = (j >= levels.length - 1) || levels[j+1] === 0; - var childNode; + var isLeafNode = (level >= levels.length - 1) || levels[level+1] === 0; + var childNode, currChild; if (!isLeafNode) { // Not yet at the end of the sequence; move down the tree. var foundChild = false; for (var k = 0; k < children.length; k++) { - if (children[k].name === nodeName) { - childNode = children[k]; + currChild = children[k]; + if (currChild.name === nodeName && + currChild.level === level) { // must match name AND level + + childNode = currChild; foundChild = true; break; } @@ -329,11 +332,13 @@ function sunburstVis(slice) { if (!foundChild) { childNode = { name: nodeName, - children: [] + children: [], + level: level }; children.push(childNode); } currentNode = childNode; + } else if (nodeName !== 0) { // Reached the end of the sequence; create a leaf node. childNode = { @@ -361,6 +366,7 @@ function sunburstVis(slice) { } return [node.m1, node.m2]; } + recurse(root); return root; } diff --git a/caravel/assets/visualizations/table.js b/caravel/assets/visualizations/table.js index 8987e5dac51b3..254dca7106c73 100644 --- a/caravel/assets/visualizations/table.js +++ b/caravel/assets/visualizations/table.js @@ -1,16 +1,16 @@ var $ = window.$ = require('jquery'); var jQuery = window.jQuery = $; var d3 = require('d3'); +var px = window.px || require('../javascripts/modules/caravel.js'); require('./table.css'); require('datatables.net-bs'); require('../node_modules/datatables-bootstrap3-plugin/media/css/datatables-bootstrap3.css'); function tableVis(slice) { - var data = slice.data; - var form_data = data.form_data; var f = d3.format('.3s'); var fC = d3.format('0,000'); + var timestampFormatter; function refresh() { $.getJSON(slice.jsonEndpoint(), onSuccess).fail(onError); @@ -21,12 +21,13 @@ function tableVis(slice) { function onSuccess(json) { var data = json.data; + var form_data = json.form_data; var metrics = json.form_data.metrics; function col(c) { var arr = []; for (var i = 0; i < data.records.length; i++) { - arr.push(json.data.records[i][c]); + arr.push(data.records[i][c]); } return arr; } @@ -35,7 +36,15 @@ function tableVis(slice) { maxes[metrics[i]] = d3.max(col(metrics[i])); } - var table = d3.select(slice.selector).html('').append('table') + if (json.form_data.table_timestamp_format === 'smart_date') { + timestampFormatter = px.formatDate; + } else if (json.form_data.table_timestamp_format !== undefined) { + timestampFormatter = px.timeFormatFactory(json.form_data.table_timestamp_format); + } + + var div = d3.select(slice.selector); + div.html(''); + var table = div.append('table') .classed('dataframe dataframe table table-striped table-bordered table-condensed table-hover dataTable no-footer', true) .attr('width', '100%'); @@ -54,9 +63,13 @@ function tableVis(slice) { .selectAll('td') .data(function (row, i) { return data.columns.map(function (c) { + var val = row[c]; + if (c === 'timestamp') { + val = timestampFormatter(val); + } return { col: c, - val: row[c], + val: val, isMetric: metrics.indexOf(c) >= 0 }; }); diff --git a/caravel/assets/visualizations/treemap.css b/caravel/assets/visualizations/treemap.css index 3293492939a68..c385780c82a77 100644 --- a/caravel/assets/visualizations/treemap.css +++ b/caravel/assets/visualizations/treemap.css @@ -1,15 +1,43 @@ -.node { - border: solid 1px white; - font: 10px sans-serif; - line-height: 12px; - overflow: hidden; - position: absolute; - text-indent: 2px; - padding: 0px; /* form div giving top 1px */ - box-sizing: content-box; /* otherwise inheriting border-box */ -} - -.treemap-container { - position: relative; - margin: auto; +text { + pointer-events: none; +} + +.grandparent text { + font-weight: bold; +} + +rect { + fill: none; + stroke: #fff; +} + +rect.parent, +.grandparent rect { + stroke-width: 2px; +} + +rect.parent { + pointer-events: none; +} + +.grandparent rect { + fill: #eee; +} + +.grandparent:hover rect { + fill: #aaa; +} + +.children rect.parent, +.grandparent rect { + cursor: pointer; +} + +.children rect.parent { + fill: #bbb; + fill-opacity: .5; +} + +.children:hover rect.child { + fill: #bbb; } diff --git a/caravel/assets/visualizations/treemap.js b/caravel/assets/visualizations/treemap.js index 172b78e4cee73..2be008f7ecfb8 100644 --- a/caravel/assets/visualizations/treemap.js +++ b/caravel/assets/visualizations/treemap.js @@ -5,68 +5,226 @@ var px = window.px || require('../javascripts/modules/caravel.js'); // CSS require('./treemap.css'); -/* Modified from https://bl.ocks.org/mbostock/4063582 */ +/* Modified from http://bl.ocks.org/ganeshv/6a8e9ada3ab7f2d88022 */ function treemap(slice) { var div = d3.select(slice.selector); - var _draw = function (data, eltWidth, eltHeight, includeTitle) { + var _draw = function (data, eltWidth, eltHeight, formData) { var margin = { top: 0, right: 0, bottom: 0, left: 0 }, - headerHeight = includeTitle ? 30 : 0, + navBarHeight = 36, + navBarTitleSize = navBarHeight / 3, + navBarBuffer = 10, width = eltWidth - margin.left - margin.right, - height = eltHeight - headerHeight - margin.top - margin.bottom; + height = eltHeight - navBarHeight - navBarBuffer - + margin.top - margin.bottom, + transitioning, + formatNumber = d3.format(formData.number_format); + + var x = d3.scale.linear() + .domain([0, width]) + .range([0, width]); + + var y = d3.scale.linear() + .domain([0, height]) + .range([0, height]); var treemap = d3.layout.treemap() - .size([width, height]) - .value(function (d) { return d.value; }); - - var root = div.append("div") - .classed("treemap-container", true); - - var header = root.append("div") - .style("width", (width + margin.left + margin.right) + "px") - .style("height", headerHeight + "px"); - - var container = root.append("div") - .style("position", "relative") - .style("width", (width + margin.left + margin.right) + "px") - .style("height", (height + margin.top + margin.bottom) + "px") - .style("left", margin.left + "px") - .style("top", margin.top + "px"); - - var position = function (selection) { - selection.style("left", function (d) { return d.x + "px"; }) - .style("top", function (d) { return d.y + "px"; }) - .style("width", function (d) { return Math.max(0, d.dx - 1) + "px"; }) - .style("height", function (d) { return Math.max(0, d.dy - 1) + "px"; }); + .children(function (d, depth) { return depth ? null : d._children; }) + .sort(function (a, b) { return a.value - b.value; }) + .ratio(formData.treemap_ratio) + .mode("squarify") + .round(false); + + var svg = div.append("svg") + .attr("width", eltWidth) + .attr("height", eltHeight); + + var chartContainer = svg.append("g") + .attr("transform", "translate(" + margin.left + "," + + (margin.top + navBarHeight + navBarBuffer) + ")") + .style("shape-rendering", "crispEdges"); + + var grandparent = svg.append("g") + .attr("class", "grandparent") + .attr("transform", "translate(0," + (margin.top + navBarBuffer / 2) + ")"); + + grandparent.append("rect") + .attr("width", width) + .attr("height", navBarHeight); + + grandparent.append("text") + .attr("x", width / 2) + .attr("y", navBarHeight / 2 + navBarTitleSize / 2) + .style("font-size", navBarTitleSize + "px") + .style("text-anchor", "middle"); + + var initialize = function (root) { + root.x = root.y = 0; + root.dx = width; + root.dy = height; + root.depth = 0; + }; + + // Aggregate the values for internal nodes. This is normally done by the + // treemap layout, but not here because of our custom implementation. + // We also take a snapshot of the original children (_children) to avoid + // the children being overwritten when when layout is computed. + var accumulate = function (d) { + var results; + if (d._children === d.children) { + results = d.children.reduce(function (p, v) { return p + accumulate(v); }, 0); + } else { + results = d.value; + } + return results; + }; + + // Compute the treemap layout recursively such that each group of siblings + // uses the same size (1x1) rather than the dimensions of the parent cell. + // This optimizes the layout for the current zoom state. Note that a wrapper + // object is created for the parent node for each group of siblings so that + // the parents dimensions are not discarded as we recurse. Since each group + // of sibling was laid out in 1x1, we must rescale to fit using absolute + // coordinates. This lets us use a viewport to zoom. + var layout = function (d) { + if (d._children) { + treemap.nodes({ _children: d._children }); + d._children.forEach(function (c) { + c.x = d.x + c.x * d.dx; + c.y = d.y + c.y * d.dy; + c.dx *= d.dx; + c.dy *= d.dy; + c.parent = d; + layout(c); + }); + } + }; + + var display = function (d) { + + var transition = function (d) { + if (transitioning || !d) { return; } + transitioning = true; + + var g2 = display(d), + t1 = g1.transition().duration(750), + t2 = g2.transition().duration(750); + + // Update the domain only after entering new elements. + x.domain([d.x, d.x + d.dx]); + y.domain([d.y, d.y + d.dy]); + + // Enable anti-aliasing during the transition. + chartContainer.style("shape-rendering", null); + + // Draw child nodes on top of parent nodes. + chartContainer.selectAll(".depth").sort(function (a, b) { return a.depth - b.depth; }); + + // Fade-in entering text. + g2.selectAll("text").style("fill-opacity", 0); + + // Transition to the new view. + t1.selectAll(".ptext").call(text).style("fill-opacity", 0); + t1.selectAll(".ctext").call(text2).style("fill-opacity", 0); + t2.selectAll(".ptext").call(text).style("fill-opacity", 1); + t2.selectAll(".ctext").call(text2).style("fill-opacity", 1); + t1.selectAll("rect").call(rect); + t2.selectAll("rect").call(rect); + + // Remove the old node when the transition is finished. + t1.remove().each("end", function () { + chartContainer.style("shape-rendering", "crispEdges"); + transitioning = false; + }); + }; + + grandparent + .datum(d.parent) + .on("click", transition) + .select("text") + .text(name(d)); + + var g1 = chartContainer.append("g") + .datum(d) + .attr("class", "depth"); + + var g = g1.selectAll("g") + .data(d._children) + .enter().append("g"); + + g.filter(function (d) { return d._children; }) + .classed("children", true) + .on("click", transition); + + var children = g.selectAll(".child") + .data(function (d) { return d._children || [d]; }) + .enter().append("g"); + + children.append("rect") + .attr("class", "child") + .call(rect) + .append("title") + .text(function (d) { return d.name + " (" + formatNumber(d.value) + ")"; }); + + children.append("text") + .attr("class", "ctext") + .text(function (d) { return d.name; }) + .call(text2); + + g.append("rect") + .attr("class", "parent") + .call(rect); + + var t = g.append("text") + .attr("class", "ptext") + .attr("dy", ".75em"); + + t.append("tspan") + .text(function (d) { return d.name; }); + t.append("tspan") + .attr("dy", "1.0em") + .text(function (d) { return formatNumber(d.value); }); + t.call(text); + + g.selectAll("rect") + .style("fill", function (d) { return px.color.category21(d.name); }); + + return g; + }; + + var text = function (selection) { + selection.selectAll("tspan") + .attr("x", function (d) { return x(d.x) + 6; }); + selection.attr("x", function (d) { return x(d.x) + 6; }) + .attr("y", function (d) { return y(d.y) + 6; }) + .style("opacity", function (d) { return this.getComputedTextLength() < x(d.x + d.dx) - x(d.x) ? 1 : 0; }); + }; + + var text2 = function (selection) { + selection.attr("x", function (d) { return x(d.x + d.dx) - this.getComputedTextLength() - 6; }) + .attr("y", function (d) { return y(d.y + d.dy) - 6; }) + .style("opacity", function (d) { return this.getComputedTextLength() < x(d.x + d.dx) - x(d.x) ? 1 : 0; }); + }; + + var rect = function (selection) { + selection.attr("x", function (d) { return x(d.x); }) + .attr("y", function (d) { return y(d.y); }) + .attr("width", function (d) { return x(d.x + d.dx) - x(d.x); }) + .attr("height", function (d) { return y(d.y + d.dy) - y(d.y); }); + }; + + var name = function (d) { + return d.parent + ? name(d.parent) + " / " + d.name + " (" + formatNumber(d.value) + ")" + : d.name + " (" + formatNumber(d.value) + ")"; }; - container.datum(data).selectAll(".node") - .data(treemap.nodes) - .enter().append("div") - .attr("class", "node") - .call(position) - .style("background", function (d) { - return d.children ? px.color.category21(d.name) : null; - }) - .style("color", function (d) { - // detect if our background is dark and we need a - // light text color or vice-versa - var bg = d.parent ? px.color.category21(d.parent.name) : null; - if (bg) { - return d3.hsl(bg).l < 0.35 ? '#d3d3d3' : '#111111'; - } - }) - .text(function (d) { return d.children ? null : d.name; }); - - if (includeTitle) { - // title to help with multiple metrics (if any) - header.append("span") - .style("font-size", "18px") - .style("font-weight", "bold") - .text(data.name); - } + initialize(data); + accumulate(data); + layout(data); + display(data); }; @@ -83,9 +241,8 @@ function treemap(slice) { var width = slice.width(); // facet muliple metrics (no sense in combining) var height = slice.height() / json.data.length; - var includeTitles = json.data.length > 1; for (var i = 0, l = json.data.length; i < l; i ++) { - _draw(json.data[i], width, height, includeTitles); + _draw(json.data[i], width, height, json.form_data); } slice.done(json); diff --git a/caravel/bin/caravel b/caravel/bin/caravel index 5d1e21504c097..1d6c8f93ecdf7 100755 --- a/caravel/bin/caravel +++ b/caravel/bin/caravel @@ -68,9 +68,9 @@ def version(): print(s) @manager.option( - '-s', '--sample', action='store_true', - help="Only load 1000 rows (faster, used for testing)") -def load_examples(sample): + '-t', '--load-test-data', action='store_true', + help="Load additional test data") +def load_examples(load_test_data): """Loads a set of Slices and Dashboards and a supporting dataset """ print("Loading examples into {}".format(db)) @@ -85,6 +85,13 @@ def load_examples(sample): print("Loading [Birth names]") data.load_birth_names() + print("Loading [Random time series data]") + data.load_random_time_series_data() + + if load_test_data: + print("Loading [Unicode test data]") + data.load_unicode_test_data() + @manager.command def refresh_druid(): """Refresh all druid datasources""" diff --git a/caravel/config.py b/caravel/config.py index 134127f37d5d2..e20c4ef976862 100644 --- a/caravel/config.py +++ b/caravel/config.py @@ -93,16 +93,27 @@ # { 'name': 'AOL', 'url': 'http://openid.aol.com/' }, # { 'name': 'Flickr', 'url': 'http://www.flickr.com/' }, # { 'name': 'MyOpenID', 'url': 'https://www.myopenid.com' }] + +# --------------------------------------------------- +# Roles config +# --------------------------------------------------- +# Grant public role the same set of permissions as for the GAMMA role. +# This is useful if one wants to enable anonymous users to view +# dashboards. Explicit grant on specific datasets is still required. +PUBLIC_ROLE_LIKE_GAMMA = False + # --------------------------------------------------- # Babel config for translations # --------------------------------------------------- # Setup default language BABEL_DEFAULT_LOCALE = 'en' # Your application default translation path -BABEL_DEFAULT_FOLDER = 'translations' +BABEL_DEFAULT_FOLDER = 'babel/translations' # The allowed translation for you app LANGUAGES = { 'en': {'flag': 'us', 'name': 'English'}, + # 'fr': {'flag': 'fr', 'name': 'French'}, + # 'zh': {'flag': 'cn', 'name': 'Chinese'}, } # --------------------------------------------------- # Image and file configuration @@ -130,6 +141,35 @@ VIZ_TYPE_BLACKLIST = [] +# --------------------------------------------------- +# List of data sources not to be refreshed in druid cluster +# --------------------------------------------------- + +DRUID_DATA_SOURCE_BLACKLIST = [] + +""" +1) http://docs.python-guide.org/en/latest/writing/logging/ +2) https://docs.python.org/2/library/logging.config.html +""" + +# Console Log Settings + +LOG_FORMAT = '%(asctime)s:%(levelname)s:%(name)s:%(message)s' +LOG_LEVEL = 'DEBUG' + +# --------------------------------------------------- +# Enable Time Rotate Log Handler +# --------------------------------------------------- +# LOG_LEVEL = DEBUG, INFO, WARNING, ERROR, CRITICAL + +ENABLE_TIME_ROTATE = False +TIME_ROTATE_LOG_LEVEL = 'DEBUG' +FILENAME = '/tmp/caravel.log' +ROLLOVER = 'midnight' +INTERVAL = 1 +BACKUP_COUNT = 30 + + try: from caravel_config import * # noqa except Exception: diff --git a/caravel/data/__init__.py b/caravel/data/__init__.py index 7b68670287f8a..c6586ec8b4f43 100644 --- a/caravel/data/__init__.py +++ b/caravel/data/__init__.py @@ -8,9 +8,11 @@ import json import os import textwrap +import datetime +import random import pandas as pd -from sqlalchemy import String, DateTime, Float +from sqlalchemy import String, DateTime, Date, Float from caravel import app, db, models, utils @@ -372,7 +374,7 @@ def load_world_bank_health_n_pop(): merge_slice(slc) print("Creating a World's Health Bank dashboard") - dash_name = "World's Health Bank Dashboard" + dash_name = "World's Bank Data" dash = db.session.query(Dash).filter_by(dashboard_title=dash_name).first() if not dash: @@ -808,3 +810,142 @@ def load_birth_names(): dash.slices = slices[:-1] db.session.merge(dash) db.session.commit() + + +def load_unicode_test_data(): + """Loading unicode test dataset from a csv file in the repo""" + df = pd.read_csv(os.path.join(DATA_FOLDER, 'unicode_utf8_unixnl_test.csv'), + encoding="utf-8") + # generate date/numeric data + df['date'] = datetime.datetime.now().date() + df['value'] = [random.randint(1, 100) for _ in range(len(df))] + df.to_sql( + 'unicode_test', + db.engine, + if_exists='replace', + chunksize=500, + dtype={ + 'phrase': String(500), + 'short_phrase': String(10), + 'with_missing': String(100), + 'date': Date(), + 'value': Float(), + }, + index=False) + print("Done loading table!") + print("-" * 80) + + print("Creating table reference") + obj = db.session.query(TBL).filter_by(table_name='unicode_test').first() + if not obj: + obj = TBL(table_name='unicode_test') + obj.main_dttm_col = 'date' + obj.database = get_or_create_db(db.session) + obj.is_featured = False + db.session.merge(obj) + db.session.commit() + obj.fetch_metadata() + tbl = obj + + slice_data = { + "datasource_id": "3", + "datasource_name": "unicode_test", + "datasource_type": "table", + "flt_op_1": "in", + "granularity": "date", + "groupby": [], + "metric": 'sum__value', + "row_limit": config.get("ROW_LIMIT"), + "since": "100 years ago", + "until": "now", + "where": "", + "viz_type": "word_cloud", + "size_from": "10", + "series": "short_phrase", + "size_to": "70", + "rotation": "square", + "limit": "100", + } + + print("Creating a slice") + slc = Slice( + slice_name="Unicode Cloud", + viz_type='word_cloud', + datasource_type='table', + table=tbl, + params=get_slice_json(slice_data), + ) + merge_slice(slc) + + print("Creating a dashboard") + dash = db.session.query(Dash).filter_by(dashboard_title="Unicode Test").first() + + if not dash: + dash = Dash() + pos = { + "size_y": 4, + "size_x": 4, + "col": 1, + "row": 1, + "slice_id": slc.id, + } + dash.dashboard_title = "Unicode Test" + dash.position_json = json.dumps([pos], indent=4) + dash.slug = "unicode-test" + dash.slices = [slc] + db.session.merge(dash) + db.session.commit() + + +def load_random_time_series_data(): + """Loading random time series data from a zip file in the repo""" + with gzip.open(os.path.join(DATA_FOLDER, 'random_time_series.json.gz')) as f: + pdf = pd.read_json(f) + pdf.ds = pd.to_datetime(pdf.ds, unit='s') + pdf.to_sql( + 'random_time_series', + db.engine, + if_exists='replace', + chunksize=500, + dtype={ + 'ds': DateTime, + }, + index=False) + print("Done loading table!") + print("-" * 80) + + print("Creating table reference") + obj = db.session.query(TBL).filter_by(table_name='random_time_series').first() + if not obj: + obj = TBL(table_name='random_time_series') + obj.main_dttm_col = 'ds' + obj.database = get_or_create_db(db.session) + obj.is_featured = False + db.session.merge(obj) + db.session.commit() + obj.fetch_metadata() + tbl = obj + + slice_data = { + "datasource_id": "6", + "datasource_name": "random_time_series", + "datasource_type": "table", + "granularity": "day", + "row_limit": config.get("ROW_LIMIT"), + "since": "1 year ago", + "until": "now", + "where": "", + "viz_type": "cal_heatmap", + "domain_granularity": "month", + "subdomain_granularity": "day", + } + + print("Creating a slice") + slc = Slice( + slice_name="Calendar Heatmap", + viz_type='cal_heatmap', + datasource_type='table', + table=tbl, + params=get_slice_json(slice_data), + ) + merge_slice(slc) diff --git a/caravel/data/random_time_series.json.gz b/caravel/data/random_time_series.json.gz new file mode 100644 index 0000000000000..5275d5571d5f4 Binary files /dev/null and b/caravel/data/random_time_series.json.gz differ diff --git a/caravel/data/unicode_utf8_unixnl_test.csv b/caravel/data/unicode_utf8_unixnl_test.csv new file mode 100644 index 0000000000000..9b0235b0ddd0b --- /dev/null +++ b/caravel/data/unicode_utf8_unixnl_test.csv @@ -0,0 +1,42 @@ +phrase,short_phrase,with_missing +"Под южно дърво, цъфтящо в синьо, бягаше малко пухкаво зайче.",Под южно д,Fam hx-cardiovas dis NEC +Příliš žluťoučký kůň úpěl ďábelské ódy.,Příliš žlu, +視野無限廣,窗外有藍天,視野無限廣,窗外有藍,Sparganosis +微風迎客,軟語伴茶,微風迎客,軟語伴茶,Var mgr NEC wo ntc mgr +中国智造,慧及全球,中国智造,慧及全球,Mech prob w internal org +"Quizdeltagerne spiste jordbær med fløde, mens cirkusklovnen Walther spillede på xylofon.",Quizdeltag,Corneal dystrophy NOS +Pa’s wijze lynx bezag vroom het fikse aquaduct.,Pa’s wijze,Edema in preg-unspec +Eĥoŝanĝo ĉiuĵaŭde.,Eĥoŝanĝo ĉ, +See väike mölder jõuab rongile hüpata,See väike ,Twin NOS-nonhosp +Viekas kettu punaturkki laiskan koiran takaa kurkki.,Viekas ket,Postgastric surgery synd +Voix ambiguë d’un cœur qui au zéphyr préfère les jattes de kiwis.,Voix ambig,Loose body-mult joints +Portez ce vieux whisky au juge blond qui fume.,Portez ce ,Late eff acc poisoning +Zwölf Boxkämpfer jagen Viktor quer über den großen Sylter Deich,Zwölf Boxk,Opn brain inj w/o coma +Franz jagt im komplett verwahrlosten Taxi quer durch Bayern.,Franz jagt,TB of ear-unspec +Θέλει αρετή και τόλμη η ελευθερία. (Ανδρέας Κάλβος),Θέλει αρετ,Chr peptic ulcer w perf +Ο καλύμνιος σφουγγαράς ψιθύρισε πως θα βουτήξει χωρίς να διστάζει.,Ο καλύμνιο,Cns TB NEC-cult dx +דג סקרן שט לו בים זך אך לפתע פגש חבורה נחמדה שצצה כך.,דג סקרן שט,Polyhydramnios-delivered +Árvíztűrő tükörfúrógép,Árvíztűrő ,Malign neopl scrotum +"Egy hűtlen vejét fülöncsípő, dühös mexikói úr Wesselényinél mázol Quitóban.",Egy hűtlen,Tubal/broad lig anom NOS +Saya lihat foto Hamengkubuwono XV bersama enam zebra purba cantik yang jatuh dari Al Quranmu.,Saya lihat,Ben carcinoid duodenum +"Ma la volpe, col suo balzo, ha raggiunto il quieto Fido.",Ma la volp,Ch leu un cl wo ach rmsn +いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす,いろはにほへと ちり,Mycotic arthritis-pelvis +다람쥐 헌 쳇바퀴에 타고파,다람쥐 헌 쳇바퀴에,Paral polio NEC-type 1 +Sarkanās jūrascūciņas peld pa jūru.,Sarkanās j,Fx larynx/trachea-open +En god stil må først og fremst være klar. Den må være passende. Aristoteles.,En god sti,Dermatophytosis site NOS +Pchnąć w tę łódź jeża lub ośm skrzyń fig,Pchnąć w t,Anxiety disorder oth dis +A rápida raposa castanha salta por cima do cão lento.,A rápida r,Adenoid vegetations +A ligeira raposa marrom ataca o cão preguiçoso.,A ligeira ,Consanguinity +Zebras caolhas de Java querem passar fax para moças gigantes de New York,Zebras cao,"Hypotony NOS, eye" +Agera vulpe maronie sare peste câinele cel leneş.,Agera vulp,Urethral syndrome NOS +Съешь ещё этих мягких французских булок да выпей же чаю,Съешь ещё ,Coccidioidomycosis NOS +Чешће цeђење мрeжастим џаком побољшава фертилизацију генских хибрида.,Чешће цeђе, +Češće ceđenje mrežastim džakom poboljšava fertilizaciju genskih hibrida.,Češće ceđe,Scrn-hemoglobinopath NEC +Kŕdeľ šťastných ďatľov učí pri ústí Váhu mĺkveho koňa obhrýzať kôru a žrať čerstvé mäso.,Kŕdeľ šťas, +V kožuščku hudobnega fanta stopiclja mizar in kliče 0619872345.,V kožuščku, +El veloz murciélago hindú comía feliz cardillo y kiwi. La cigüeña tocaba el saxofón detrás del palenque de paja.,El veloz m,Cervical syndrome NEC +Flygande bäckasiner söka hwila på mjuka tuvor,Flygande b,Letterer-siwe dis abdom +เป็นมนุษย์สุดประเสริฐเลิศคุณค่า กว่าบรรดาฝูงสัตว์เดรัจฉาน จงฝ่าฟันพัฒนาวิชาการ อย่าล้างผลาญฤๅเข่นฆ่าบีฑาใคร ไม่ถือโทษโกรธแช่งซัดฮึดฮัดด่า หัดอภัยเหมือนกีฬาอัชฌาสัย ปฏิบัติประพฤติกฎกำหนดใจ พูดจาให้จ๊ะ ๆ จ๋า ๆ น่าฟังเอยฯ,เป็นมนุษย์,Balantidiasis +"Pijamalı hasta, yağız şoföre çabucak güvendi",Pijamalı h,Epilepsy-delivered w p/p +زۆھرەگۈل ئابدۇۋاجىت فرانسىيەنىڭ پارىژدىكى خېلى بىشەم ئوقۇغۇچى.,زۆھرەگۈل ئ,Fit/adj non-vsc cath NEC +ئاۋۇ بىر جۈپ خوراز فرانسىيەنىڭ پارىژ شەھرىگە يېقىن تاغقا كۆچەلمىدى.,ئاۋۇ بىر ج,Sat cerv smr-no trnsfrm diff --git a/caravel/forms.py b/caravel/forms.py index 171da1f00caea..5c4e1a70bf921 100644 --- a/caravel/forms.py +++ b/caravel/forms.py @@ -6,16 +6,26 @@ from collections import OrderedDict from copy import copy +import math from wtforms import ( Form, SelectMultipleField, SelectField, TextField, TextAreaField, - BooleanField, IntegerField, HiddenField) + BooleanField, IntegerField, HiddenField, DecimalField) from wtforms import validators, widgets from caravel import app config = app.config +TIMESTAMP_CHOICES = [ + ('smart_date', 'Adaptative formating'), + ("%m/%d/%Y", '"%m/%d/%Y" | 01/14/2019'), + ("%Y-%m-%d", '"%Y-%m-%d" | 2019-01-14'), + ("%Y-%m-%d %H:%M:%S", + '"%Y-%m-%d %H:%M:%S" | 2019-01-14 01:32:10'), + ("%H:%M:%S", '"%H:%M:%S" | 01:32:10'), +] + class BetterBooleanField(BooleanField): @@ -152,6 +162,11 @@ def __init__(self, viz): "Color will be rendered based on a ratio " "of the cell against the sum of across this " "criteria")), + 'horizon_color_scale': SelectField( + 'Color Scale', choices=self.choicify([ + 'series', 'overall', 'change']), + default='series', + description="Defines how the color are attributed."), 'canvas_image_rendering': SelectField( 'Rendering', choices=( ('pixelated', 'pixelated (Sharp)'), @@ -177,6 +192,10 @@ def __init__(self, viz): 'Stacked Bars', default=False, description=""), + 'include_series': BetterBooleanField( + 'Include Series', + default=False, + description="Include series name as an axis"), 'secondary_metric': SelectField( 'Color Metric', choices=datasource.metrics_combo, default=default_metric, @@ -213,12 +232,13 @@ def __init__(self, viz): 'Y', choices=self.choicify(datasource.column_names), description="Columns to display"), - 'druid_time_origin': SelectField( + 'druid_time_origin': FreeFormSelectField( 'Origin', choices=( ('', 'default'), ('now', 'now'), ), + default='', description=( "Defines the origin where time buckets start, " "accepts natural dates as in 'now', 'sunday' or '1970-01-01'")), @@ -239,6 +259,29 @@ def __init__(self, viz): "The time granularity for the visualization. Note that you " "can type and use simple natural language as in '10 seconds', " "'1 day' or '56 weeks'")), + 'domain_granularity': SelectField( + 'Domain', default="month", + choices=self.choicify([ + 'hour', + 'day', + 'week', + 'month', + 'year', + ]), + description=( + "The time unit used for the grouping of blocks")), + 'subdomain_granularity': SelectField( + 'Subdomain', default="day", + choices=self.choicify([ + 'min', + 'hour', + 'day', + 'week', + 'month', + ]), + description=( + "The time unit for each block. Should be a smaller unit than " + "domain_granularity. Should be larger or equal to Time Grain")), 'link_length': FreeFormSelectField( 'Link Length', default="200", choices=self.choicify([ @@ -336,6 +379,26 @@ def __init__(self, viz): '9/91 percentiles', ]) ), + 'treemap_ratio': DecimalField( + 'Ratio', + default=0.5 * (1 + math.sqrt(5)), # d3 default, golden ratio + description='Target aspect ratio for treemap tiles.', + ), + 'number_format': FreeFormSelectField( + 'Number format', + default='.3s', + choices=[ + ('.3s', '".3s" | 12.3k'), + ('.3%', '".3%" | 1234543.210%'), + ('.4r', '".4r" | 12350'), + ('.3f', '".3f" | 12345.432'), + ('+,', '"+," | +12,345.4321'), + ('$,.2f', '"$,.2f" | $12,345.43'), + ], + description="D3 format syntax for numbers " + "https://github.com/mbostock/\n" + "d3/wiki/Formatting"), + 'row_limit': FreeFormSelectField( 'Row limit', @@ -386,7 +449,12 @@ def __init__(self, viz): default=default_metric, choices=datasource.metrics_combo), 'url': TextField( - 'URL', default='https://www.youtube.com/embed/JkI5rg_VcQ4',), + 'URL', + description=( + "The URL, this field is templated, so you can integrate " + "{{ width }} and/or {{ height }} in your URL string." + ), + default='https://www.youtube.com/embed/JkI5rg_VcQ4',), 'where': TextField( 'Custom WHERE clause', default='', description=( @@ -409,17 +477,20 @@ def __init__(self, viz): 'compare_suffix': TextField( 'Comparison suffix', description="Suffix to apply after the percentage display"), + 'table_timestamp_format': FreeFormSelectField( + 'Table Timestamp Format', + default='smart_date', + choices=TIMESTAMP_CHOICES, + description="Timestamp Format"), + 'series_height': FreeFormSelectField( + 'Series Height', + default=25, + choices=self.choicify([10, 25, 40, 50, 75, 100, 150, 200]), + description="Pixel height of each series"), 'x_axis_format': FreeFormSelectField( 'X axis format', default='smart_date', - choices=[ - ('smart_date', 'Adaptative formating'), - ("%m/%d/%Y", '"%m/%d/%Y" | 01/14/2019'), - ("%Y-%m-%d", '"%Y-%m-%d" | 2019-01-14'), - ("%Y-%m-%d %H:%M:%S", - '"%Y-%m-%d %H:%M:%S" | 2019-01-14 01:32:10'), - ("%H:%M:%S", '"%H:%M:%S" | 01:32:10'), - ], + choices=TIMESTAMP_CHOICES, description="D3 format syntax for y axis " "https://github.com/mbostock/\n" "d3/wiki/Formatting"), diff --git a/caravel/migrations/versions/4e6a06bad7a8_init.py b/caravel/migrations/versions/4e6a06bad7a8_init.py index d448aa79c63d3..72579f6251333 100644 --- a/caravel/migrations/versions/4e6a06bad7a8_init.py +++ b/caravel/migrations/versions/4e6a06bad7a8_init.py @@ -21,12 +21,12 @@ def upgrade(): sa.Column('changed_on', sa.DateTime(), nullable=False), sa.Column('id', sa.Integer(), nullable=False), sa.Column('cluster_name', sa.String(length=250), nullable=True), - sa.Column('coordinator_host', sa.String(length=256), nullable=True), + sa.Column('coordinator_host', sa.String(length=255), nullable=True), sa.Column('coordinator_port', sa.Integer(), nullable=True), - sa.Column('coordinator_endpoint', sa.String(length=256), nullable=True), - sa.Column('broker_host', sa.String(length=256), nullable=True), + sa.Column('coordinator_endpoint', sa.String(length=255), nullable=True), + sa.Column('broker_host', sa.String(length=255), nullable=True), sa.Column('broker_port', sa.Integer(), nullable=True), - sa.Column('broker_endpoint', sa.String(length=256), nullable=True), + sa.Column('broker_endpoint', sa.String(length=255), nullable=True), sa.Column('metadata_last_refreshed', sa.DateTime(), nullable=True), sa.Column('created_by_fk', sa.Integer(), sa.ForeignKey("ab_user.id"), nullable=True), sa.Column('changed_by_fk', sa.Integer(), sa.ForeignKey("ab_user.id"), nullable=True), @@ -58,7 +58,7 @@ def upgrade(): sa.Column('created_on', sa.DateTime(), nullable=False), sa.Column('changed_on', sa.DateTime(), nullable=False), sa.Column('id', sa.Integer(), nullable=False), - sa.Column('datasource_name', sa.String(length=256), nullable=True), + sa.Column('datasource_name', sa.String(length=255), nullable=True), sa.Column('is_featured', sa.Boolean(), nullable=True), sa.Column('is_hidden', sa.Boolean(), nullable=True), sa.Column('description', sa.Text(), nullable=True), @@ -88,7 +88,7 @@ def upgrade(): sa.Column('changed_on', sa.DateTime(), nullable=False), sa.Column('id', sa.Integer(), nullable=False), sa.Column('datasource_name', sa.String(length=250), nullable=True), - sa.Column('column_name', sa.String(length=256), sa.ForeignKey("datasources.datasource_name"), nullable=True), + sa.Column('column_name', sa.String(length=255), sa.ForeignKey("datasources.datasource_name"), nullable=True), sa.Column('is_active', sa.Boolean(), nullable=True), sa.Column('type', sa.String(length=32), nullable=True), sa.Column('groupby', sa.Boolean(), nullable=True), @@ -147,7 +147,7 @@ def upgrade(): sa.Column('changed_on', sa.DateTime(), nullable=False), sa.Column('id', sa.Integer(), nullable=False), sa.Column('table_id', sa.Integer(), sa.ForeignKey("tables.id"), nullable=True), - sa.Column('column_name', sa.String(length=256), nullable=True), + sa.Column('column_name', sa.String(length=255), nullable=True), sa.Column('is_dttm', sa.Boolean(), nullable=True), sa.Column('is_active', sa.Boolean(), nullable=True), sa.Column('type', sa.String(length=32), nullable=True), diff --git a/caravel/migrations/versions/4fa88fe24e94_owners_many_to_many.py b/caravel/migrations/versions/4fa88fe24e94_owners_many_to_many.py new file mode 100644 index 0000000000000..8cd1123097f8e --- /dev/null +++ b/caravel/migrations/versions/4fa88fe24e94_owners_many_to_many.py @@ -0,0 +1,38 @@ +"""owners_many_to_many + +Revision ID: 4fa88fe24e94 +Revises: b4456560d4f3 +Create Date: 2016-04-15 17:58:33.842012 + +""" + +# revision identifiers, used by Alembic. +revision = '4fa88fe24e94' +down_revision = 'b4456560d4f3' + +from alembic import op +import sqlalchemy as sa + + +def upgrade(): + op.create_table('dashboard_user', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user_id', sa.Integer(), nullable=True), + sa.Column('dashboard_id', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['dashboard_id'], [u'dashboards.id'], ), + sa.ForeignKeyConstraint(['user_id'], [u'ab_user.id'], ), + sa.PrimaryKeyConstraint('id'), + ) + op.create_table('slice_user', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user_id', sa.Integer(), nullable=True), + sa.Column('slice_id', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['slice_id'], [u'slices.id'], ), + sa.ForeignKeyConstraint(['user_id'], [u'ab_user.id'], ), + sa.PrimaryKeyConstraint('id'), + ) + + +def downgrade(): + op.drop_table('slice_user') + op.drop_table('dashboard_user') diff --git a/caravel/migrations/versions/956a063c52b3_adjusting_key_length.py b/caravel/migrations/versions/956a063c52b3_adjusting_key_length.py new file mode 100644 index 0000000000000..d83f63212846d --- /dev/null +++ b/caravel/migrations/versions/956a063c52b3_adjusting_key_length.py @@ -0,0 +1,102 @@ +"""adjusting key length + +Revision ID: 956a063c52b3 +Revises: f0fbf6129e13 +Create Date: 2016-05-11 17:28:32.407340 + +""" + +# revision identifiers, used by Alembic. +revision = '956a063c52b3' +down_revision = 'f0fbf6129e13' + +from alembic import op +import sqlalchemy as sa + + +def upgrade(): + with op.batch_alter_table('clusters', schema=None) as batch_op: + batch_op.alter_column('broker_endpoint', + existing_type=sa.VARCHAR(length=256), + type_=sa.String(length=255), + existing_nullable=True) + batch_op.alter_column('broker_host', + existing_type=sa.VARCHAR(length=256), + type_=sa.String(length=255), + existing_nullable=True) + batch_op.alter_column('coordinator_endpoint', + existing_type=sa.VARCHAR(length=256), + type_=sa.String(length=255), + existing_nullable=True) + batch_op.alter_column('coordinator_host', + existing_type=sa.VARCHAR(length=256), + type_=sa.String(length=255), + existing_nullable=True) + + with op.batch_alter_table('columns', schema=None) as batch_op: + batch_op.alter_column('column_name', + existing_type=sa.VARCHAR(length=256), + type_=sa.String(length=255), + existing_nullable=True) + + with op.batch_alter_table('datasources', schema=None) as batch_op: + batch_op.alter_column('datasource_name', + existing_type=sa.VARCHAR(length=256), + type_=sa.String(length=255), + existing_nullable=True) + + with op.batch_alter_table('table_columns', schema=None) as batch_op: + batch_op.alter_column('column_name', + existing_type=sa.VARCHAR(length=256), + type_=sa.String(length=255), + existing_nullable=True) + + with op.batch_alter_table('tables', schema=None) as batch_op: + batch_op.alter_column('schema', + existing_type=sa.VARCHAR(length=256), + type_=sa.String(length=255), + existing_nullable=True) + + +def downgrade(): + with op.batch_alter_table('tables', schema=None) as batch_op: + batch_op.alter_column('schema', + existing_type=sa.String(length=255), + type_=sa.VARCHAR(length=256), + existing_nullable=True) + + with op.batch_alter_table('table_columns', schema=None) as batch_op: + batch_op.alter_column('column_name', + existing_type=sa.String(length=255), + type_=sa.VARCHAR(length=256), + existing_nullable=True) + + with op.batch_alter_table('datasources', schema=None) as batch_op: + batch_op.alter_column('datasource_name', + existing_type=sa.String(length=255), + type_=sa.VARCHAR(length=256), + existing_nullable=True) + + with op.batch_alter_table('columns', schema=None) as batch_op: + batch_op.alter_column('column_name', + existing_type=sa.String(length=255), + type_=sa.VARCHAR(length=256), + existing_nullable=True) + + with op.batch_alter_table('clusters', schema=None) as batch_op: + batch_op.alter_column('coordinator_host', + existing_type=sa.String(length=255), + type_=sa.VARCHAR(length=256), + existing_nullable=True) + batch_op.alter_column('coordinator_endpoint', + existing_type=sa.String(length=255), + type_=sa.VARCHAR(length=256), + existing_nullable=True) + batch_op.alter_column('broker_host', + existing_type=sa.String(length=255), + type_=sa.VARCHAR(length=256), + existing_nullable=True) + batch_op.alter_column('broker_endpoint', + existing_type=sa.String(length=255), + type_=sa.VARCHAR(length=256), + existing_nullable=True) diff --git a/caravel/migrations/versions/bb51420eaf83_add_schema_to_table_model.py b/caravel/migrations/versions/bb51420eaf83_add_schema_to_table_model.py index f86e332300ff5..5e5d231111cc5 100644 --- a/caravel/migrations/versions/bb51420eaf83_add_schema_to_table_model.py +++ b/caravel/migrations/versions/bb51420eaf83_add_schema_to_table_model.py @@ -15,7 +15,7 @@ def upgrade(): - op.add_column('tables', sa.Column('schema', sa.String(length=256), nullable=True)) + op.add_column('tables', sa.Column('schema', sa.String(length=255), nullable=True)) def downgrade(): diff --git a/caravel/migrations/versions/c3a8f8611885_materializing_permission.py b/caravel/migrations/versions/c3a8f8611885_materializing_permission.py new file mode 100644 index 0000000000000..1d65a172a4fa6 --- /dev/null +++ b/caravel/migrations/versions/c3a8f8611885_materializing_permission.py @@ -0,0 +1,35 @@ +"""Materializing permission + +Revision ID: c3a8f8611885 +Revises: 4fa88fe24e94 +Create Date: 2016-04-25 08:54:04.303859 + +""" + +# revision identifiers, used by Alembic. +revision = 'c3a8f8611885' +down_revision = '4fa88fe24e94' + +from alembic import op +import sqlalchemy as sa +from caravel import db +from caravel import models + + +def upgrade(): + bind = op.get_bind() + op.add_column('slices', sa.Column('perm', sa.String(length=2000), nullable=True)) + session = db.Session(bind=bind) + + for slc in session.query(models.Slice).all(): + if slc.datasource: + slc.perm = slc.datasource.perm + session.merge(slc) + session.commit() + db.session.close() + + +def downgrade(): + # Use batch_alter_table because dropping columns is not supported in SQLite + with op.batch_alter_table('slices') as batch_op: + batch_op.drop_column('perm') diff --git a/caravel/migrations/versions/f0fbf6129e13_adding_verbose_name_to_tablecolumn.py b/caravel/migrations/versions/f0fbf6129e13_adding_verbose_name_to_tablecolumn.py new file mode 100644 index 0000000000000..51f4923b9cedf --- /dev/null +++ b/caravel/migrations/versions/f0fbf6129e13_adding_verbose_name_to_tablecolumn.py @@ -0,0 +1,25 @@ +"""Adding verbose_name to tablecolumn + +Revision ID: f0fbf6129e13 +Revises: c3a8f8611885 +Create Date: 2016-05-01 12:21:18.331191 + +""" + +# revision identifiers, used by Alembic. +revision = 'f0fbf6129e13' +down_revision = 'c3a8f8611885' + +from alembic import op +import sqlalchemy as sa + + +def upgrade(): + op.add_column( + 'table_columns', + sa.Column('verbose_name', sa.String(length=1024), + nullable=True)) + + +def downgrade(): + op.drop_column('table_columns', 'verbose_name') diff --git a/caravel/models.py b/caravel/models.py index 6bf8f88247012..cb9577bf7a1ee 100644 --- a/caravel/models.py +++ b/caravel/models.py @@ -18,11 +18,16 @@ import sqlalchemy as sqla import sqlparse from dateutil.parser import parse + from flask import request, g from flask.ext.appbuilder import Model from flask.ext.appbuilder.models.mixins import AuditMixin +from flask.ext.appbuilder.models.decorators import renders +from flask.ext.babelpkg import gettext as _ + from pydruid.client import PyDruid from pydruid.utils.filters import Dimension, Filter +from pydruid.utils.postaggregator import Postaggregator from six import string_types from sqlalchemy import ( Column, Integer, String, ForeignKey, Text, Boolean, DateTime, Date, @@ -31,7 +36,6 @@ from sqlalchemy.ext.declarative import declared_attr from sqlalchemy.orm import relationship from sqlalchemy.sql import table, literal_column, text, column -from sqlalchemy.sql.elements import ColumnClause from sqlalchemy_utils import EncryptedType from caravel import app, db, get_session, utils @@ -43,6 +47,17 @@ QueryResult = namedtuple('namedtuple', ['df', 'query', 'duration']) +class JavascriptPostAggregator(Postaggregator): + def __init__(self, name, field_names, function): + self.post_aggregator = { + 'type': 'javascript', + 'fieldNames': field_names, + 'name': name, + 'function': function, + } + self.name = name + + class AuditMixinNullable(AuditMixin): """Altering the AuditMixin to use nullable fields @@ -66,15 +81,19 @@ def changed_by_fk(cls): # noqa Integer, ForeignKey('ab_user.id'), default=cls.get_user_id, onupdate=cls.get_user_id, nullable=True) - @property - def created_by_(self): # noqa + @renders('created_by') + def creator(self): # noqa return '{}'.format(self.created_by or '') - @property # noqa + @renders('changed_by') def changed_by_(self): return '{}'.format(self.changed_by or '') - @property + @renders('changed_on') + def changed_on_(self): + return '{}'.format(self.changed_on) + + @renders('changed_on') def modified(self): s = humanize.naturaltime(datetime.now() - self.changed_on) return '{}'.format(s) @@ -110,6 +129,13 @@ class CssTemplate(Model, AuditMixinNullable): css = Column(Text, default='') +slice_user = Table('slice_user', Model.metadata, + Column('id', Integer, primary_key=True), + Column('user_id', Integer, ForeignKey('ab_user.id')), + Column('slice_id', Integer, ForeignKey('slices.id')) +) + + class Slice(Model, AuditMixinNullable): """A slice is essentially a report or a view on data""" @@ -125,11 +151,13 @@ class Slice(Model, AuditMixinNullable): params = Column(Text) description = Column(Text) cache_timeout = Column(Integer) + perm = Column(String(2000)) table = relationship( 'SqlaTable', foreign_keys=[table_id], backref='slices') druid_datasource = relationship( 'DruidDatasource', foreign_keys=[druid_datasource_id], backref='slices') + owners = relationship("User", secondary=slice_user) def __repr__(self): return self.slice_name @@ -211,6 +239,20 @@ def slice_link(self): url=url, obj=self) +def set_perm(mapper, connection, target): # noqa + if target.table_id: + src_class = SqlaTable + id_ = target.table_id + elif target.druid_datasource_id: + src_class = DruidDatasource + id_ = target.druid_datasource_id + ds = db.session.query(src_class).filter_by(id=int(id_)).first() + target.perm = ds.perm + +sqla.event.listen(Slice, 'before_insert', set_perm) +sqla.event.listen(Slice, 'before_update', set_perm) + + dashboard_slices = Table( 'dashboard_slices', Model.metadata, Column('id', Integer, primary_key=True), @@ -218,6 +260,13 @@ def slice_link(self): Column('slice_id', Integer, ForeignKey('slices.id')), ) +dashboard_user = Table( + 'dashboard_user', Model.metadata, + Column('id', Integer, primary_key=True), + Column('user_id', Integer, ForeignKey('ab_user.id')), + Column('dashboard_id', Integer, ForeignKey('dashboards.id')) +) + class Dashboard(Model, AuditMixinNullable): @@ -233,6 +282,7 @@ class Dashboard(Model, AuditMixinNullable): slug = Column(String(255), unique=True) slices = relationship( 'Slice', secondary=dashboard_slices, backref='dashboards') + owners = relationship("User", secondary=dashboard_user) def __repr__(self): return self.dashboard_title @@ -287,6 +337,18 @@ def filterable_column_names(self): def dttm_cols(self): return [] + @property + def url(self): + return '/{}/edit/{}'.format(self.baselink, self.id) + + @property + def explore_url(self): + if self.default_endpoint: + return self.default_endpoint + else: + return "/caravel/explore/{obj.type}/{obj.id}/".format(obj=self) + + class Database(Model, AuditMixinNullable): @@ -344,8 +406,16 @@ def grains(self): Grain("month", "DATE(DATE_SUB({col}, " "INTERVAL DAYOFMONTH({col}) - 1 DAY))"), ), + 'sqlite': ( + Grain('Time Column', '{col}'), + Grain('day', 'DATE({col})'), + Grain("week", "DATE({col}, -strftime('%w', {col}) || ' days')"), + Grain("month", "DATE({col}, -strftime('%d', {col}) || ' days')"), + ), 'postgresql': ( Grain("Time Column", "{col}"), + Grain("second", "DATE_TRUNC('second', {col})"), + Grain("minute", "DATE_TRUNC('minute', {col})"), Grain("hour", "DATE_TRUNC('hour', {col})"), Grain("day", "DATE_TRUNC('day', {col})"), Grain("week", "DATE_TRUNC('week', {col})"), @@ -358,6 +428,24 @@ def grains(self): if self.sqlalchemy_uri.startswith(db_type): return grains + def dttm_converter(self, dttm): + """Returns a string that the database flavor understands as a date""" + default = "'{}'".format(dttm.strftime('%Y-%m-%d %H:%M:%S.%f')) + iso = dttm.isoformat() + d = { + 'mssql': "CONVERT(DATETIME, '{}', 126)".format(iso), #untested + 'mysql': default, + 'oracle': + """TO_TIMESTAMP('{}', 'YYYY-MM-DD"T"HH24:MI:SS.ff6')""".format( + dttm.isoformat()), + 'presto': default, + 'sqlite': default, + } + for k, v in d.items(): + if self.sqlalchemy_uri.startswith(k): + return v + return default + def grains_dict(self): return {grain.name: grain for grain in self.grains()} @@ -419,7 +507,7 @@ class SqlaTable(Model, Queryable, AuditMixinNullable): 'Database', backref='tables', foreign_keys=[database_id]) offset = Column(Integer, default=0) cache_timeout = Column(Integer) - schema = Column(String(256)) + schema = Column(String(255)) baselink = "tablemodelview" @@ -435,10 +523,6 @@ def __repr__(self): def description_markeddown(self): return utils.markdown(self.description) - @property - def url(self): - return '/tablemodelview/edit/{}'.format(self.id) - @property def link(self): return '{self.table_name}'.format(**locals()) @@ -481,13 +565,6 @@ def html(self): def name(self): return self.table_name - @property - def explore_url(self): - if self.default_endpoint: - return self.default_endpoint - else: - return "/caravel/explore/{obj.type}/{obj.id}/".format(obj=self) - @property def table_link(self): return '{obj.table_name}'.format(obj=self) @@ -527,20 +604,20 @@ def query( # sqla qry_start_dttm = datetime.now() if not granularity and is_timeseries: - raise Exception( + raise Exception(_( "Datetime column not provided as part table configuration " - "and is required by this type of chart") + "and is required by this type of chart")) metrics_exprs = [ - literal_column(m.expression).label(m.metric_name) + m.sqla_col for m in self.metrics if m.metric_name in metrics] if metrics: - main_metric_expr = literal_column([ - m.expression for m in self.metrics - if m.metric_name == metrics[0]][0]) + main_metric_expr = [ + m.sqla_col for m in self.metrics + if m.metric_name == metrics[0]][0] else: - main_metric_expr = literal_column("COUNT(*)") + main_metric_expr = literal_column("COUNT(*)").label("ccount") select_exprs = [] groupby_exprs = [] @@ -551,13 +628,8 @@ def query( # sqla inner_groupby_exprs = [] for s in groupby: col = cols[s] - expr = col.expression - if expr: - outer = literal_column(expr).label(s) - inner = literal_column(expr).label('__' + s) - else: - outer = column(s).label(s) - inner = column(s).label('__' + s) + outer = col.sqla_col + inner = col.sqla_col.label('__' + col.column_name) groupby_exprs.append(outer) select_exprs.append(outer) @@ -565,12 +637,12 @@ def query( # sqla inner_select_exprs.append(inner) elif columns: for s in columns: - select_exprs.append(s) + select_exprs.append(cols[s].sqla_col) metrics_exprs = [] if granularity: - dttm_expr = cols[granularity].expression or granularity - timestamp = literal_column(dttm_expr).label('timestamp') + dttm_expr = cols[granularity].sqla_col.label('timestamp') + timestamp = dttm_expr # Transforming time grain into an expression based on configuration time_grain_sqla = extras.get('time_grain_sqla') @@ -587,14 +659,16 @@ def query( # sqla tf = '%Y-%m-%d %H:%M:%S.%f' time_filter = [ - timestamp >= from_dttm.strftime(tf), - timestamp <= to_dttm.strftime(tf), + timestamp >= text(self.database.dttm_converter(from_dttm)), + timestamp <= text(self.database.dttm_converter(to_dttm)), ] inner_time_filter = copy(time_filter) if inner_from_dttm: - inner_time_filter[0] = timestamp >= inner_from_dttm.strftime(tf) + inner_time_filter[0] = timestamp >= text( + self.database.dttm_converter(inner_from_dttm)) if inner_to_dttm: - inner_time_filter[1] = timestamp <= inner_to_dttm.strftime(tf) + inner_time_filter[1] = timestamp <= text( + self.database.dttm_converter(inner_to_dttm)) else: inner_time_filter = [] @@ -614,11 +688,7 @@ def query( # sqla col_obj = cols[col] if op in ('in', 'not in'): values = eq.split(",") - if col_obj.expression: - cond = ColumnClause( - col_obj.expression, is_literal=True).in_(values) - else: - cond = column(col).in_(values) + cond = col_obj.sqla_col.in_(values) if op == 'not in': cond = ~cond where_clause_and.append(cond) @@ -653,7 +723,10 @@ def query( # sqla engine = self.database.get_sqla_engine() sql = "{}".format( - qry.compile(engine, compile_kwargs={"literal_binds": True})) + qry.compile( + engine, compile_kwargs={"literal_binds": True},), + ) + print(sql) df = pd.read_sql_query( sql=sql, con=engine @@ -779,6 +852,11 @@ class SqlMetric(Model, AuditMixinNullable): expression = Column(Text) description = Column(Text) + @property + def sqla_col(self): + name = self.metric_name + return literal_column(self.expression).label(name) + class TableColumn(Model, AuditMixinNullable): @@ -789,7 +867,8 @@ class TableColumn(Model, AuditMixinNullable): table_id = Column(Integer, ForeignKey('tables.id')) table = relationship( 'SqlaTable', backref='columns', foreign_keys=[table_id]) - column_name = Column(String(256)) + column_name = Column(String(255)) + verbose_name = Column(String(1024)) is_dttm = Column(Boolean, default=False) is_active = Column(Boolean, default=True) type = Column(String(32), default='') @@ -810,6 +889,15 @@ def isnum(self): types = ('LONG', 'DOUBLE', 'FLOAT', 'BIGINT', 'INT') return any([t in self.type.upper() for t in types]) + @property + def sqla_col(self): + name = self.column_name + if not self.expression: + col = column(self.column_name).label(name) + else: + col = literal_column(self.expression).label(name) + return col + class DruidCluster(Model, AuditMixinNullable): @@ -818,13 +906,13 @@ class DruidCluster(Model, AuditMixinNullable): __tablename__ = 'clusters' id = Column(Integer, primary_key=True) cluster_name = Column(String(250), unique=True) - coordinator_host = Column(String(256)) + coordinator_host = Column(String(255)) coordinator_port = Column(Integer) coordinator_endpoint = Column( - String(256), default='druid/coordinator/v1/metadata') - broker_host = Column(String(256)) + String(255), default='druid/coordinator/v1/metadata') + broker_host = Column(String(255)) broker_port = Column(Integer) - broker_endpoint = Column(String(256), default='druid/v2') + broker_endpoint = Column(String(255), default='druid/v2') metadata_last_refreshed = Column(DateTime) def __repr__(self): @@ -846,7 +934,8 @@ def get_datasources(self): def refresh_datasources(self): for datasource in self.get_datasources(): - DruidDatasource.sync_to_db(datasource, self) + if datasource not in config.get('DRUID_DATA_SOURCE_BLACKLIST'): + DruidDatasource.sync_to_db(datasource, self) class DruidDatasource(Model, AuditMixinNullable, Queryable): @@ -855,11 +944,11 @@ class DruidDatasource(Model, AuditMixinNullable, Queryable): type = "druid" - baselink = "datasourcemodelview" + baselink = "druiddatasourcemodelview" __tablename__ = 'datasources' id = Column(Integer, primary_key=True) - datasource_name = Column(String(256), unique=True) + datasource_name = Column(String(255), unique=True) is_featured = Column(Boolean, default=False) is_hidden = Column(Boolean, default=False) description = Column(Text) @@ -889,10 +978,6 @@ def perm(self): "[{obj.cluster_name}].[{obj.datasource_name}]" "(id:{obj.id})").format(obj=self) - @property - def url(self): - return '/datasourcemodelview/edit/{}'.format(self.id) - @property def link(self): return ( @@ -956,6 +1041,7 @@ def sync_to_db(cls, name, cluster): flasher("Adding new datasource [{}]".format(name), "success") else: flasher("Refreshing datasource [{}]".format(name), "info") + session.flush() datasource.cluster = cluster cols = datasource.latest_metadata() @@ -977,8 +1063,10 @@ def sync_to_db(cls, name, cluster): col_obj.filterable = True if col_obj: col_obj.type = cols[col]['type'] + session.flush() col_obj.datasource = datasource col_obj.generate_metrics() + session.flush() def query( # druid self, groupby, metrics, @@ -1006,9 +1094,44 @@ def query( # druid to_dttm = to_dttm.replace(tzinfo=config.get("DRUID_TZ")) query_str = "" + metrics_dict = {m.metric_name: m for m in self.metrics} + all_metrics = [] + post_aggs = {} + + def recursive_get_fields(_conf): + _fields = _conf.get('fields', []) + field_names = [] + for _f in _fields: + _type = _f.get('type') + if _type in ['fieldAccess', 'hyperUniqueCardinality']: + field_names.append(_f.get('fieldName')) + elif _type == 'arithmetic': + field_names += recursive_get_fields(_f) + + return list(set(field_names)) + + for metric_name in metrics: + metric = metrics_dict[metric_name] + if metric.metric_type != 'postagg': + all_metrics.append(metric_name) + else: + conf = metric.json_obj + all_metrics += recursive_get_fields(conf) + all_metrics += conf.get('fieldNames', []) + if conf.get('type') == 'javascript': + post_aggs[metric_name] = JavascriptPostAggregator( + name=conf.get('name'), + field_names=conf.get('fieldNames'), + function=conf.get('function')) + else: + post_aggs[metric_name] = Postaggregator( + conf.get('fn', "/"), + conf.get('fields', []), + conf.get('name', '')) aggregations = { m.metric_name: m.json_obj - for m in self.metrics if m.metric_name in metrics + for m in self.metrics + if m.metric_name in all_metrics } granularity = granularity or "all" if granularity != "all": @@ -1026,6 +1149,7 @@ def query( # druid dimensions=groupby, aggregations=aggregations, granularity=granularity, + post_aggregations=post_aggs, intervals=from_dttm.isoformat() + '/' + to_dttm.isoformat(), ) filters = None @@ -1083,7 +1207,7 @@ def query( # druid if df is not None and not df.empty: dims = qry['dimensions'] filters = [] - for _, row in df.iterrows(): + for unused, row in df.iterrows(): fields = [] for dim in dims: f = Filter.build_filter(Dimension(dim) == row[dim]) @@ -1116,7 +1240,7 @@ def query( # druid query_str += json.dumps(client.query_dict, indent=2) df = client.export_pandas() if df is None or df.size == 0: - raise Exception("No data was returned.") + raise Exception(_("No data was returned.")) if ( not is_timeseries and @@ -1130,7 +1254,6 @@ def query( # druid cols += ['timestamp'] cols += [col for col in groupby if col in df.columns] cols += [col for col in metrics if col in df.columns] - cols += [col for col in df.columns if col not in cols] df = df[cols] return QueryResult( df=df, @@ -1162,14 +1285,16 @@ def log_this(cls, f): def wrapper(*args, **kwargs): user_id = None if g.user: - user_id = g.user.id + user_id = g.user.get_id() d = request.args.to_dict() d.update(kwargs) + slice_id = d.get('slice_id', 0) + slice_id = int(slice_id) if slice_id else 0 log = cls( action=f.__name__, json=json.dumps(d), dashboard_id=d.get('dashboard_id') or None, - slice_id=d.get('slice_id') or None, + slice_id=slice_id, user_id=user_id) db.session.add(log) db.session.commit() @@ -1216,7 +1341,7 @@ class DruidColumn(Model, AuditMixinNullable): # Setting enable_typechecks=False disables polymorphic inheritance. datasource = relationship('DruidDatasource', backref='columns', enable_typechecks=False) - column_name = Column(String(256)) + column_name = Column(String(255)) is_active = Column(Boolean, default=True) type = Column(String(32)) groupby = Column(Boolean, default=False) @@ -1304,7 +1429,7 @@ def generate_metrics(self): metric.datasource_name = self.datasource_name if not m: session.add(metric) - session.commit() + session.flush() class FavStar(Model): diff --git a/caravel/templates/appbuilder/navbar.html b/caravel/templates/appbuilder/navbar.html index c4283b74d3810..90cd397497d9e 100644 --- a/caravel/templates/appbuilder/navbar.html +++ b/caravel/templates/appbuilder/navbar.html @@ -13,9 +13,7 @@ - {{ appbuilder.app_name }} -