{"id":48664314,"url":"https://github.com/appsembler/figures","last_synced_at":"2026-04-10T10:34:28.068Z","repository":{"id":31827834,"uuid":"110147400","full_name":"appsembler/figures","owner":"appsembler","description":"Reporting and data retrieval app for Open edX","archived":false,"fork":false,"pushed_at":"2024-04-10T00:25:37.000Z","size":21673,"stargazers_count":44,"open_issues_count":58,"forks_count":38,"subscribers_count":12,"default_branch":"main","last_synced_at":"2026-02-15T10:23:46.587Z","etag":null,"topics":["analytics-cdp","openedx"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/appsembler.png","metadata":{"files":{"readme":"README.rst","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-11-09T17:44:47.000Z","updated_at":"2025-06-23T15:18:17.000Z","dependencies_parsed_at":"2023-11-14T04:24:22.031Z","dependency_job_id":"b447d041-7ee8-4bc8-a1dd-ed49349b97fc","html_url":"https://github.com/appsembler/figures","commit_stats":{"total_commits":976,"total_committers":14,"mean_commits":69.71428571428571,"dds":0.3831967213114754,"last_synced_commit":"6f3202845a54c1f1310dc715f4400de0d66d1e00"},"previous_names":[],"tags_count":54,"template":false,"template_full_name":null,"purl":"pkg:github/appsembler/figures","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appsembler%2Ffigures","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appsembler%2Ffigures/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appsembler%2Ffigures/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appsembler%2Ffigures/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/appsembler","download_url":"https://codeload.github.com/appsembler/figures/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appsembler%2Ffigures/sbom","scorecard":{"id":204104,"data":{"date":"2025-08-11","repo":{"name":"github.com/appsembler/figures","commit":"30fc4ec25aa504e0dee3e1814345c5fc754a7c01"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.3,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":10,"reason":"all changesets reviewed","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/codeql-analysis.yml:1","Warn: no topLevel permission defined: .github/workflows/python-publish.yml:1","Warn: no topLevel permission defined: .github/workflows/tests.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Pinned-Dependencies","score":1,"reason":"dependency not pinned by hash detected -- score normalized to 1","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/appsembler/figures/codeql-analysis.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:41: update your workflow using https://app.stepsecurity.io/secureworkflow/appsembler/figures/codeql-analysis.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:48: update your workflow using https://app.stepsecurity.io/secureworkflow/appsembler/figures/codeql-analysis.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:62: update your workflow using https://app.stepsecurity.io/secureworkflow/appsembler/figures/codeql-analysis.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/python-publish.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/appsembler/figures/python-publish.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/python-publish.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/appsembler/figures/python-publish.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/python-publish.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/appsembler/figures/python-publish.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tests.yml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/appsembler/figures/tests.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tests.yml:33: update your workflow using https://app.stepsecurity.io/secureworkflow/appsembler/figures/tests.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tests.yml:40: update your workflow using https://app.stepsecurity.io/secureworkflow/appsembler/figures/tests.yml/main?enable=pin","Warn: npmCommand not pinned by hash: .github/workflows/python-publish.yml:24","Warn: pipCommand not pinned by hash: .github/workflows/python-publish.yml:33","Warn: pipCommand not pinned by hash: .github/workflows/python-publish.yml:34","Warn: pipCommand not pinned by hash: .github/workflows/tests.yml:38","Warn: npmCommand not pinned by hash: .github/workflows/tests.yml:44","Info:   0 out of  10 GitHub-owned GitHubAction dependencies pinned","Info:   1 out of   1 third-party GitHubAction dependencies pinned","Info:   0 out of   2 npmCommand dependencies pinned","Info:   0 out of   3 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"SAST","score":7,"reason":"SAST tool detected but not run on all commits","details":["Info: SAST configuration detected: CodeQL","Warn: 0 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"98 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92","Warn: Project is vulnerable to: GHSA-6chw-6frg-f759","Warn: Project is vulnerable to: GHSA-v88g-cgmw-v5xw","Warn: Project is vulnerable to: GHSA-whgm-jr23-g3j9","Warn: Project is vulnerable to: GHSA-93q8-gq69-wqmw","Warn: Project is vulnerable to: GHSA-qwcr-r2fm-qrc7","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-cwfw-4gq5-mrqx","Warn: Project is vulnerable to: GHSA-g95f-p29q-9xw4","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-x9w5-v3q2-3rhw","Warn: Project is vulnerable to: GHSA-pxg6-pf52-xh8x","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-36jr-mh4h-2g58","Warn: Project is vulnerable to: GHSA-gxpj-cx7g-858c","Warn: Project is vulnerable to: GHSA-w573-4hg7-7wgq","Warn: Project is vulnerable to: GHSA-434g-2637-qmqr","Warn: Project is vulnerable to: GHSA-49q7-c7j4-3p7m","Warn: Project is vulnerable to: GHSA-977x-g7h5-7qgw","Warn: Project is vulnerable to: GHSA-f7q4-pwc6-w24p","Warn: Project is vulnerable to: GHSA-fc9h-whq2-v747","Warn: Project is vulnerable to: GHSA-vjh7-7g9h-fjfh","Warn: Project is vulnerable to: GHSA-4gmj-3p3h-gm8h","Warn: Project is vulnerable to: GHSA-6h5x-7c5m-7cr7","Warn: Project is vulnerable to: GHSA-rv95-896h-c2vc","Warn: Project is vulnerable to: GHSA-qw6h-vgh9-j6wx","Warn: Project is vulnerable to: GHSA-jchw-25xp-jwwc","Warn: Project is vulnerable to: GHSA-cxjh-pqwp-8mfp","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-8r6j-v8pm-fqw3","Warn: Project is vulnerable to: MAL-2023-462","Warn: Project is vulnerable to: GHSA-pfrx-2q88-qq97","Warn: Project is vulnerable to: GHSA-pfq8-rq6v-vf5m","Warn: Project is vulnerable to: GHSA-c7qv-q95q-8v27","Warn: Project is vulnerable to: GHSA-qqgx-2p2h-9c37","Warn: Project is vulnerable to: GHSA-78xj-cgh5-2h22","Warn: Project is vulnerable to: GHSA-2p57-rm9w-gvfp","Warn: Project is vulnerable to: GHSA-896r-f27r-55mw","Warn: Project is vulnerable to: GHSA-9c47-m6qq-7p4h","Warn: Project is vulnerable to: GHSA-6c8f-qphg-qjgp","Warn: Project is vulnerable to: GHSA-76p3-8jx3-jpfq","Warn: Project is vulnerable to: GHSA-3rfm-jhwj-7488","Warn: Project is vulnerable to: GHSA-hhq3-ff78-jv3g","Warn: Project is vulnerable to: GHSA-35jh-r3h4-6jhm","Warn: Project is vulnerable to: GHSA-4xcv-9jjx-gfj3","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-f8q6-p94x-37v3","Warn: Project is vulnerable to: GHSA-r683-j2x4-v87g","Warn: Project is vulnerable to: GHSA-92xj-mqp7-vmcj","Warn: Project is vulnerable to: GHSA-wxgw-qj99-44c2","Warn: Project is vulnerable to: GHSA-5rrq-pxf6-6jx5","Warn: Project is vulnerable to: GHSA-8fr3-hfg3-gpgp","Warn: Project is vulnerable to: GHSA-gf8q-jrpm-jvxq","Warn: Project is vulnerable to: GHSA-2r2c-g63r-vccr","Warn: Project is vulnerable to: GHSA-cfm4-qjh2-4765","Warn: Project is vulnerable to: GHSA-x4jg-mjrx-434g","Warn: Project is vulnerable to: GHSA-5fw9-fq32-wv5p","Warn: Project is vulnerable to: GHSA-r8f7-9pfq-mjmv","Warn: Project is vulnerable to: GHSA-rp65-9cf3-cjxr","Warn: Project is vulnerable to: GHSA-76c9-3jph-rj3q","Warn: Project is vulnerable to: GHSA-hj48-42vr-x3v9","Warn: Project is vulnerable to: GHSA-9wv6-86v2-598j","Warn: Project is vulnerable to: GHSA-rhx6-c78j-4q9w","Warn: Project is vulnerable to: GHSA-h7cp-r72f-jxh6","Warn: Project is vulnerable to: GHSA-v62p-rq8g-8h59","Warn: Project is vulnerable to: GHSA-566m-qj78-rww5","Warn: Project is vulnerable to: GHSA-7fh5-64p2-3v2j","Warn: Project is vulnerable to: GHSA-hwj9-h5mp-3pm3","Warn: Project is vulnerable to: GHSA-hrpp-h998-j3pp","Warn: Project is vulnerable to: GHSA-5q6m-3h65-w53x","Warn: Project is vulnerable to: GHSA-p8p7-x288-28g6","Warn: Project is vulnerable to: GHSA-7mwh-4pqv-wmr8","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-m6fv-jmcg-4jfg","Warn: Project is vulnerable to: GHSA-cm22-4g7w-348p","Warn: Project is vulnerable to: GHSA-g4rg-993r-mgx7","Warn: Project is vulnerable to: GHSA-c9g6-9335-x697","Warn: Project is vulnerable to: GHSA-3jfq-g458-7qm9","Warn: Project is vulnerable to: GHSA-5955-9wpr-37jh","Warn: Project is vulnerable to: GHSA-f5x3-32g6-xq36","Warn: Project is vulnerable to: GHSA-r628-mhmh-qjhw","Warn: Project is vulnerable to: GHSA-9r2w-394v-53qc","Warn: Project is vulnerable to: GHSA-qq89-hq3f-393p","Warn: Project is vulnerable to: GHSA-52f5-9888-hmc6","Warn: Project is vulnerable to: GHSA-jgrx-mgxx-jf9v","Warn: Project is vulnerable to: GHSA-72xf-g2v4-qvf3","Warn: Project is vulnerable to: GHSA-7p7h-4mm5-852v","Warn: Project is vulnerable to: GHSA-fhg7-m89q-25r3","Warn: Project is vulnerable to: GHSA-wr3j-pwj9-hqq6","Warn: Project is vulnerable to: GHSA-cf66-xwfp-gvc4","Warn: Project is vulnerable to: GHSA-4v9v-hfq4-rm2v","Warn: Project is vulnerable to: GHSA-9jgg-88mc-972h","Warn: Project is vulnerable to: GHSA-3h5v-q93c-6h6q","Warn: Project is vulnerable to: GHSA-p9pc-299p-vxgp","Warn: Project is vulnerable to: GHSA-vh95-rmgr-6w4m","Warn: Project is vulnerable to: GHSA-xvch-5gv4-984h","Warn: Project is vulnerable to: GHSA-c4w7-xm78-47vh"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-16T23:20:08.794Z","repository_id":31827834,"created_at":"2025-08-16T23:20:08.795Z","updated_at":"2025-08-16T23:20:08.795Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31638664,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-10T07:40:12.752Z","status":"ssl_error","status_checked_at":"2026-04-10T07:40:11.664Z","response_time":98,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["analytics-cdp","openedx"],"created_at":"2026-04-10T10:34:23.709Z","updated_at":"2026-04-10T10:34:28.041Z","avatar_url":"https://github.com/appsembler.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"=======\nFigures\n=======\n\n|travis-badge| |codecov-badge|\n\nReporting and data retrieval app for `Open edX \u003chttps://open.edx.org/\u003e`__.\n\n.. _notice_section:\n\n`Figures is on PyPI \u003chttps://pypi.org/project/Figures/\u003e`__\n\n\nOct 13, 2022 - Figures release 0.4.4\n====================================\nThis release includes a performance fix for the site-monthly-metric API.\n\nAug 15, 2022 - Figures release 0.4.3\n====================================\n\nThis release includes bug fixes. Of note:\n\n* `Fix tasks for standalone and fix average progress validation error \u003chttps://github.com/appsembler/figures/pull/463\u003e`__\n* `Enable daily metrics models backfill of historical data in platform, but not progress \u003chttps://github.com/appsembler/figures/pull/452\u003e`__\n* `Update SDM historic course count calculation \u003chttps://github.com/appsembler/figures/pull/458\u003e`__\n* `Enrollment data handling fixes \u003chttps://github.com/appsembler/figures/pull/449\u003e`__\n* `Fix broken devsite data seeding \u003chttps://github.com/appsembler/figures/pull/460\u003e`__\n* Front end package dependency updates\n\nAlso includes a foundational update for MAU 2:\n\n* `MAU 2 - Add Monthly Active Enrollment Model \u003chttps://github.com/appsembler/figures/pull/446\u003e`__\n\nMar 3, 2022 - Figures release 0.4.2\n===================================\n\nThis release adds an optionan new pipeline workflow\n\nFor details, `please read here \u003chttps://github.com/appsembler/figures/issues/428\u003e`__\n\nTo enable this feature, you need to update the LMS settings (aka 'server-vars.yml') as follows:\n\nserver-vars.yml::\n\n  FIGURES: \n    DAILY_TASK: 'figures.tasks.populate_daily_metrics_next'\n\nIn Django settigs, you would check the var here::\n\n  from django.conf import settings\n  settings.ENV_TOKENS['FIGURES'].get('DAILY_TASK')\n\nPR about the workflow update:\n\n* Pipeline improvement prerequisites \n\n  * https://github.com/appsembler/figures/pull/427\n\n* Figures pipeline performance improvement \n\n  * https://github.com/appsembler/figures/pull/429\n\n* Fix enrollment data backfill Django management command\n\n  * https://github.com/appsembler/figures/pull/432\n\nOther PRs\n\n* Revert devsite 'courseware' app namepace back to originial\n\n  * https://github.com/appsembler/figures/pull/434\n\n* Bump url-parse from 1.5.1 to 1.5.10 in /frontend\n\n  * https://github.com/appsembler/figures/pull/431\n\n* Bump urijs from 1.19.6 to 1.19.8 in /frontend\n\n  * https://github.com/appsembler/figures/pull/430\n\n\nFeb 4, 2022 - Main Branch\n=========================\n\n`main` is the new default branch\n\n\nJan 28, 2022 - Figures release 0.4.1\n====================================\n\nFigures 0.4.1 is finally here. After several development releases, we realized it was time to just move to production releases.\n\n\n\n\nFigures 0.4.x release series supports Open edX Juniper, Hawthorn, and Ginkgo\n\n\nPlease visit Figures `releases page \u003chttps://github.com/appsembler/figures/releases\u003e`__ for details on specific releases.\n\n\n30 Oct 2020 - Figures release 0.3.19\n====================================\n\n* Fix the comparison showing N/A when comparing to zero\n\n  * https://github.com/appsembler/figures/pull/277\n\n* Fix Figures devsite settings\n\n  * https://github.com/appsembler/figures/pull/278\n\n\n26 Oct 2020 - Figures release 0.3.18\n====================================\n\n* FIX - Removed dependency on 'packaging.versions'\n\n  * https://github.com/appsembler/figures/pull/272\n  * NOTE: This PR updates a previous commit that required the `packaging` package\n\n\n16 Oct 2020 - Figures release 0.3.17\n====================================\n\n* Reworked SiteMonthlyMetrics registered users metric. This was causing the `/figures/api/site-monthly-metrics/registered_users` endpoint to timeout with a 500 error\n\n  * https://github.com/appsembler/figures/pull/268\n\n* Fixed Ginkgo (Django Filter 0.11.0) Backward compatibility issues\n\n  * https://github.com/appsembler/figures/pull/266\n  * https://github.com/appsembler/figures/pull/269\n\n* UI Bug fix: Add success feedback to csv export dialog\n\n  * https://github.com/appsembler/figures/pull/265\n\n* Bump http-proxy from 1.18.0 to 1.18.1 in /frontend\n\n  * https://github.com/appsembler/figures/pull/254\n\n\n28 Sep 2020 - Figures release 0.3.16\n====================================\n\n* Add Learners Progress Overview to main menu\n\n  * https://github.com/appsembler/figures/pull/256\n\n* Performance and test improvement for LearnerMetricsViewSet\n\n  * https://github.com/appsembler/figures/pull/260\n\n* Fix code that doesn't work on Ginkgo (Django 1.8)\n\n  * https://github.com/appsembler/figures/pull/261\n\n\n11 Sep 2020 - Figures release 0.3.15\n====================================\n\n* Learner progress overview UI improvements\n\n  * https://github.com/appsembler/figures/pull/255\n\n\n24 Aug 2020 - Figures release 0.3.14\n====================================\n\n* Added multi-course filtering to the `learner-metrics` API endpoint\n\n  * https://github.com/appsembler/figures/pull/248\n\n* Small cosmetic issues in new Learners Progress Overview page\n\n  * https://github.com/appsembler/figures/pull/247\n\n\n14 Aug 2020 - Figures release 0.3.13\n====================================\n\n* Learner metrics Prerelease API and UI\n\n  * https://github.com/appsembler/figures/pull/239\n  * https://github.com/appsembler/figures/pull/240\n\n* Improve logging for monthly metrics pipeline and set default to run the monthly metrics pipeline task\n\n  * https://github.com/appsembler/figures/pull/242\n\n* Bug fix: Site level certificate metrics\n\n  * https://github.com/appsembler/figures/pull/244\n\n\n15 Jul 2020 - Figures release 0.3.12\n====================================\n\n* Adds enrollment metrics API endpoint\n\n  * https://github.com/appsembler/figures/pull/233\n\n* Site monthly metrics API performance improvement\n\n  * https://github.com/appsembler/figures/pull/234\n\n* Initial implementation of Celery support for Figures devsite\n\n  * https://github.com/appsembler/figures/pull/215\n\n\n29 Jun 2020 - Figures release 0.3.11\n====================================\n\n* Fixes incorrect site monthly metrics course completion data\n\n  * https://github.com/appsembler/figures/pull/219\n\n* Fixes CourseDailyMetricsSerializer when average_progress is 1.00\n\n  * https://github.com/appsembler/figures/pull/230\n\n* Updates pipeline enrollment metrics queries to improve performance\n\n  * https://github.com/appsembler/figures/pull/226\n\n* Added site pipeline progress indicator to logging\n\n  * https://github.com/appsembler/figures/pull/228\n\n* Bump devsite Django 1.11 to version 1.11.29\n\n  * https://github.com/appsembler/figures/pull/227\n\n* Bump websocket-extensions from 0.1.3 to 0.1.4 in /frontend\n\n  * https://github.com/appsembler/figures/pull/222\n\n\n21 May 2020 - Figures release 0.3.10\n====================================\n\n* Improved daily metrics pipeline performance\n\n  * https://github.com/appsembler/figures/pull/214\n\n* Bug fixes\n\n  * https://github.com/appsembler/figures/pull/213\n\n\n24 Apr 2020 - Figures release 0.3.9\n===================================\n\n* Updated UI, MAU fix, style fixes, label changes\n* Added site monthly metrics scheduled tasks to fill last month's MAU\n* Added Django Debug Toolbar to devsite\n\n\n10 Apr 2020 - Figures release 0.3.8\n===================================\n\n* Performance improvement to \"Site Monthly Metrics\" active users endpoint\n\n\n8 Apr 2020 - Figures release 0.3.7\n==================================\n\n* Updated UI to improve performance and usability\n* Added \"Course Monthly Metrics\" set of API endpoints\n\n\n16 Feb 2020 - Figures release 0.3.6\n===================================\n\n* Updated UI to address performance issues\n* Added missing `organizations` to devsite settings `INSTALLED_APPS`\n\n\n20 Feb 2020 - Figures release 0.3.5\n====================================\n\nClient (UI and API) facing updates\n\n* Site Monthly Metrics pipeline and new API endpoints\n* Added Course MAU metrics API endpoint and pipeline\n* Added user email address to general user data\n* Bug fix - URL pattern fix for `figures/`\n\nDeveloper facing updates\n\n* Updated Django micro version to Figures devsite\n* Added missing `.env` file for Makefile support\n* Added Pylint to testing\n* Refactored permissions module\n\n\n29 Jan 2020 - Figures release 0.3.4\n====================================\n\n* Hawthorn support since release 0.3.0\n* This release includes bug fixes, UI improvements, and backport support for Ginkgo\n* Includes a standalone development mode. See the `developer quickstart guide \u003c./DEVELOPER-QUICKSTART.md/\u003e`__\n\n\n--------\nOverview\n--------\n\nFigures is a reporting and data retrieval app. It plugs into the edx-platform LMS app server. Its goal is to provide site-wide and cross-course analytics that compliment Open edX's traditional course-centric analytics.\n\nTo evolve Figures to meet community needs, we are keeping in mind as principles the following features, which Jill Vogel outlined in her `lightweight analytics \u003chttps://edxchange.opencraft.com/t/analytics-lighter-faster-cheaper/202\u003e`__ post on ed Xchange:\n\n* Real time (or near real time) updates\n* Lightweight deployment\n* Flexible reporting\n* Simpler contributions\n\nPlease refer to the Figures `design document \u003chttps://docs.google.com/document/d/16orj6Ag1R158-J-zSBfiY31RKQ5FuSu1O5F-zpSKOg4/\u003e`__ for more details on goals and architecture.\n\n------------\nRequirements\n------------\n\nFor all Open edX releases:\n\n* Python (2.7)\n\nFor Hawthorn:\n\n* Django (1.11)\n\nFor Ginkgo:\n\n* Django (1.8)\n\n\n\n.. _installation:\n\n------------\nInstallation\n------------\n\n*NOTICE: Installation instructions are out of date and backlogged for update*\n\n\nDevstack\n========\n\nGo `here \u003cdocs/source/devstack.rst\u003e`__ for instructions to install and run Figures in devstack.\n\nProduction\n==========\n\nGo `here \u003cdocs/source/install.rst\u003e`__ for instructions to install Figures in production.\n\n--------------------\nProject Architecture\n--------------------\n\nFront-end\n=========\n\nThe Figures user interface is a JavaScript Single Page Application (SPA) built with React and uses the `create-react-app \u003chttps://github.com/facebook/create-react-app\u003e`_ build scaffolding generator.\n\nBack-end\n========\n\nThe Figures back-end is a reusable Django app. It contains a set of REST API endpoints that serve a dual purpose of providing data to the front-end and to remote clients.\n\n-------\nTesting\n-------\n\n*TODO: Improve the testing instructions*\n\nThe unit tests **should** be able to run on any OS that supports Python 2.7.x\n\nClone the repo:\n\n::\n\n \tgit@github.com:appsembler/figures.git\n\nGo to the project directory:\n\n::\n\n\tcd figures\n\nCreate a `virtualenv \u003chttps://virtualenv.pypa.io/en/stable/\u003e`__ for Python 2.7.x.\n\nInstall required Python packages:\n\n::\n\n\tpip install -r devsite/requirements.txt\n\nFrom the `figures` repository root directory:\n\n::\n\n\tpy.test\n\nIf all goes well, the Figures unit tests will all complete succesfully\n\n\n-------------\nConfiguration\n-------------\n\nFigures can be configured via Django settings' ``FIGURES`` key. Open edX reads configuration from\nthe ``/edx/etc/lms.yml`` file both in devstack and production servers. In releases before Juniper it\nwas the ``lms.env.json`` file.\n\nA Figures configuration may look like the following:\n\n\n::\n\n\tFEATURES:  # The standard Open edX feature flags\n\t\t# ... other features goes here ...\n\t\tFIGURES_IS_MULTISITE: True\n\t\t# ... more features goes there ...\n\n\tFIGURES:  # Other Figures configurations\n\t\tSITES_BACKEND: 'openedx.core.djangoapps.appsembler.sites.utils:get_active_sites'\n\t\tREQUESTED_SITE_BACKEND: 'tahoe_figures_plugins.sites:get_current_site_or_by_uuid'\n\t\tFIGURES_PIPELINE_TASKS_ROUTING_KEY: 'edx.lms.core.high'\n\t\tDAILY_METRICS_IMPORT_HOUR: 13\n\t\tDAILY_METRICS_IMPORT_MINUTE: 0\n\n\nSettings like ``SITES_BACKEND`` require a path to a Python function or class. The path is consists of two parts:\na Python module e.g. ``my_plugin_package.helpers`` and an object e.g ``my_helper`` separated by a colon e.g.\n``my_plugin_package.helpers:my_helper``.\n\nThis object would be imported by the ``import_from_path`` helper in the\n`figures/helpers.py \u003chttps://github.com/appsembler/figures/blob/932eeab84c469a34dfcb94232bbe6f7c08146b3f/figures/helpers.py#L84-L98\u003e`__ module.\n\n.....................\nConfiguration options\n.....................\n\n\n* ``FEATURES.FIGURES_IS_MULTISITE`` (default ``False``): Boolean feature flag to run Figures in a single-site mode by\n  default (when set to ``False``) most popular Open edX installation option.\n  The multisite mode requires a custom ``edx-organizations`` fork that is used for\n  Appsembler Tahoe clusters.\n\n* ``FIGURES.SITES_BACKEND`` (default ``None``): A Python path to function to list figures sites.\n  For example, this is useful to customize which sites are processed and which are considered inactive.\n  By default (when ``None`` is used) all sites are listed in the multi-site mode.\n\n* ``REQUESTED_SITE_BACKEND`` (default ``None``): Python path to a function that gets the current site.\n  For example it can be used for API purposes to pass a Site ID to get a different site.\n  By default (when ``None`` is used) the Django's ``get_current_site()`` helper is used.\n\n\n**TBD:** Document ``FIGURES_PIPELINE_TASKS_ROUTING_KEY``, ``DAILY_METRICS_IMPORT_HOUR`` and ``DAILY_METRICS_IMPORT_MINUTE``.\n\n------\nFuture\n------\n\n* Open edX \"Hawthorn\" will provide a plug-in architecture. This will hopefully simplify Figures installation even more\n* Downloadable report files\n* Plugin architecture to extend Figures for custom data sources\n\n\n-----------------\nHow to Contribute\n-----------------\n\n\nTODO: Add details here or separate `CONTRIBUTING` file to the root of the repo\n\n\n.. _reporting_issues:\n\n----------------\nReporting Issues\n----------------\n\nIf you find bugs or run into issues, please submit an issue ticket to the `Figures issue tracker \u003chttps://github.com/appsembler/figures/issues\u003e`__ on Github.\n\n.. _reporting_security_issues:\n\nReporting Security Issues\n=========================\n\nPlease do not report security issues in public. Please email security@appsembler.com.\n\n\n.. |travis-badge| image:: https://travis-ci.org/appsembler/figures.svg?branch=master\n    :target: https://travis-ci.org/appsembler/figures/\n    :alt: Travis\n\n.. |codecov-badge| image:: http://codecov.io/github/appsembler/figures/coverage.svg?branch=master\n    :target: http://codecov.io/github/appsembler/figures?branch=master\n    :alt: Codecov\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fappsembler%2Ffigures","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fappsembler%2Ffigures","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fappsembler%2Ffigures/lists"}