{"id":1062,"name":"Terraso","description":"Develop an open source technology platform to help local community leaders practice Integrated Landscape Management.","url":"https://github.com/techmatters/terraso-backend","last_synced_at":"2026-05-14T21:03:12.388Z","repository":{"id":38172595,"uuid":"428864575","full_name":"techmatters/terraso-backend","owner":"techmatters","description":"A Django project that powers the backend of Terraso platform.","archived":false,"fork":false,"pushed_at":"2026-05-11T19:57:21.000Z","size":5927,"stargazers_count":20,"open_issues_count":90,"forks_count":4,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-05-12T20:08:58.601Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/techmatters.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2021-11-17T01:04:13.000Z","updated_at":"2026-04-27T16:58:16.000Z","dependencies_parsed_at":"2024-01-22T19:34:21.538Z","dependency_job_id":"832569fa-c95a-430f-910c-87b20859958d","html_url":"https://github.com/techmatters/terraso-backend","commit_stats":{"total_commits":1091,"total_committers":16,"mean_commits":68.1875,"dds":0.4207149404216315,"last_synced_commit":"74fc2fc640d86729ecacc74d6d450e0e5657173a"},"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/techmatters/terraso-backend","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/techmatters%2Fterraso-backend","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/techmatters%2Fterraso-backend/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/techmatters%2Fterraso-backend/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/techmatters%2Fterraso-backend/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/techmatters","download_url":"https://codeload.github.com/techmatters/terraso-backend/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/techmatters%2Fterraso-backend/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33043249,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-13T13:14:54.681Z","status":"online","status_checked_at":"2026-05-14T02:00:06.663Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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"}},"owner":{"login":"techmatters","name":"Tech Matters","uuid":"53062258","kind":"organization","description":"We help social change leaders understand what tech can and can’t do, and build the tech solutions behind solving a social problem.","email":null,"website":"https://techmatters.org/","location":null,"twitter":"techmatters","company":null,"icon_url":"https://avatars.githubusercontent.com/u/53062258?v=4","repositories_count":31,"last_synced_at":"2024-04-28T03:07:07.876Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/techmatters","funding_links":[],"total_stars":63,"followers":39,"following":0,"created_at":"2022-11-14T09:02:18.450Z","updated_at":"2024-04-28T03:07:12.190Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/techmatters","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/techmatters/repositories"},"packages":[],"commits":{"id":1254581,"full_name":"techmatters/terraso-backend","default_branch":"main","total_commits":1470,"total_committers":17,"total_bot_commits":909,"total_bot_committers":1,"mean_commits":86.47058823529412,"dds":0.3816326530612245,"past_year_total_commits":257,"past_year_total_committers":6,"past_year_total_bot_commits":209,"past_year_total_bot_committers":1,"past_year_mean_commits":42.833333333333336,"past_year_dds":0.1867704280155642,"last_synced_at":"2026-05-14T11:51:07.278Z","last_synced_commit":"03efb5909b5ce6e20c2609f0f85187af6c800abf","created_at":"2023-03-27T11:49:52.256Z","updated_at":"2026-05-14T11:50:54.719Z","committers":[{"name":"dependabot[bot]","email":"49699333+dependabot[bot]","login":"dependabot[bot]","count":909},{"name":"Paul Schreiber","email":"paul@techmatters.org","login":"paulschreiber","count":231},{"name":"Caio Carrara","email":"cacarrara","login":"cacarrara","count":104},{"name":"Jose Buitron","email":"jose.buitron@gmail.com","login":"josebui","count":62},{"name":"David Code Howard","email":"david@techmatters.org","login":"david-code","count":50},{"name":"garo (they/them)","email":"3411715+shrouxm","login":"shrouxm","count":42},{"name":"Johannes","email":"89488492+johannesparty","login":"johannesparty","count":17},{"name":"Carissa Knipe","email":"carissa@techmatters.org","login":"knipec","count":16},{"name":"Jodie Zhu","email":"82774370+jodiezhuu","login":"jodiezhuu","count":14},{"name":"garo (they/them)","email":"3411715+garobrik","login":"garobrik","count":5},{"name":"Jeancarlo Barrios","email":"JeancarloBarrios","login":"JeancarloBarrios","count":5},{"name":"tm-ruxandra","email":"ruxandra@techmatters.org","login":"tm-ruxandra","count":4},{"name":"ajabeckett","email":"31599074+ajabeckett","login":"ajabeckett","count":4},{"name":"Paul Schreiber","email":"paul@technmatters.org","login":null,"count":2},{"name":"Andrew Carter","email":"68627532+plentydone","login":"plentydone","count":2},{"name":"Caio Carrara","email":"caio@techmatters.org","login":"caiocarrara","count":2},{"name":"Robert Bo Davis","email":"bo@interrobang.consulting","login":"robert-bo-davis","count":1}],"past_year_committers":[{"name":"dependabot[bot]","email":"49699333+dependabot[bot]","login":"dependabot[bot]","count":209},{"name":"Johannes","email":"89488492+johannesparty","login":"johannesparty","count":17},{"name":"Paul Schreiber","email":"paul@techmatters.org","login":"paulschreiber","count":15},{"name":"Carissa Knipe","email":"carissa@techmatters.org","login":"knipec","count":8},{"name":"garo (they/them)","email":"3411715+garobrik","login":"garobrik","count":5},{"name":"Jose Buitron","email":"jose.buitron@gmail.com","login":"josebui","count":3}],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/techmatters%2Fterraso-backend/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-05-14T00:00:09.630Z","repositories_count":6234140,"commits_count":894394003,"contributors_count":34893968,"owners_count":1153005,"icon_url":"https://github.com/github.png","host_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories"}},"issues_stats":{"full_name":"techmatters/terraso-backend","html_url":"https://github.com/techmatters/terraso-backend","last_synced_at":"2026-05-12T20:05:42.238Z","status":"active","issues_count":243,"pull_requests_count":2108,"avg_time_to_close_issue":7386416.198895028,"avg_time_to_close_pull_request":325181.0010422095,"issues_closed_count":181,"pull_requests_closed_count":1919,"pull_request_authors_count":15,"issue_authors_count":14,"avg_comments_per_issue":0.8353909465020576,"avg_comments_per_pull_request":0.2357685009487666,"merged_pull_requests_count":1624,"bot_issues_count":11,"bot_pull_requests_count":1382,"past_year_issues_count":8,"past_year_pull_requests_count":289,"past_year_avg_time_to_close_issue":5607708.2,"past_year_avg_time_to_close_pull_request":379833.82702702703,"past_year_issues_closed_count":5,"past_year_pull_requests_closed_count":185,"past_year_pull_request_authors_count":7,"past_year_issue_authors_count":4,"past_year_avg_comments_per_issue":2.25,"past_year_avg_comments_per_pull_request":0.13494809688581316,"past_year_bot_issues_count":2,"past_year_bot_pull_requests_count":241,"past_year_merged_pull_requests_count":150,"created_at":"2023-05-09T10:35:03.667Z","updated_at":"2026-05-12T20:05:42.239Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/techmatters%2Fterraso-backend","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/techmatters%2Fterraso-backend/issues","issue_labels_count":{"landpks":58,"Engineering":47,"tech-debt":31,"slim MVP":24,"High":17,"enhancement":12,"dependencies":11,"python":11,"Medium":10,"site creation":10,"project management":7,"1000L":6,"profiles":6,"good first issue":6,"audit log":5,"bug":4,"Low":3,"stale":1,"testing":1,"needs triage":1,"Research":1,"blocked":1,"Capri MVP":1,"kobotoolbox":1},"pull_request_labels_count":{"dependencies":1382,"python":1248,"blocked":71,"github_actions":12,"Engineering":1},"issue_author_associations_count":{"CONTRIBUTOR":105,"MEMBER":84,"NONE":42,"COLLABORATOR":12},"pull_request_author_associations_count":{"CONTRIBUTOR":1655,"MEMBER":395,"COLLABORATOR":52,"NONE":6},"issue_authors":{"david-code":64,"paulschreiber":40,"shrouxm":39,"ltseng":28,"caiocarrara":20,"josebui":13,"DerekCaelin":12,"dependabot[bot]":11,"garobrik":5,"knipec":4,"JeancarloBarrios":3,"Hanal-code":2,"tm-ruxandra":1,"robert-bo-davis":1},"pull_request_authors":{"dependabot[bot]":1382,"paulschreiber":323,"caiocarrara":114,"josebui":83,"shrouxm":66,"david-code":59,"knipec":28,"jodiezhuu":12,"JeancarloBarrios":9,"johannesparty":7,"tm-ruxandra":7,"garobrik":6,"ajabeckett":6,"robert-bo-davis":4,"plentydone":2},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-05-14T00:00:12.120Z","repositories_count":14598795,"issues_count":34282570,"pull_requests_count":112203435,"authors_count":11261671,"icon_url":"https://github.com/github.png","host_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories","owners_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/owners","authors_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors"},"past_year_issue_labels_count":{"Engineering":6,"dependencies":2,"python":2,"blocked":1,"tech-debt":1},"past_year_pull_request_labels_count":{"dependencies":241,"python":235,"blocked":7,"github_actions":6},"past_year_issue_author_associations_count":{"CONTRIBUTOR":5,"NONE":2,"MEMBER":1},"past_year_pull_request_author_associations_count":{"CONTRIBUTOR":262,"MEMBER":25},"past_year_issue_authors":{"knipec":3,"dependabot[bot]":2,"DerekCaelin":2,"garobrik":1},"past_year_pull_request_authors":{"dependabot[bot]":241,"paulschreiber":20,"knipec":12,"johannesparty":7,"garobrik":5,"josebui":2},"maintainers":[{"login":"paulschreiber","count":363,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/paulschreiber"},{"login":"shrouxm","count":105,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/shrouxm"},{"login":"josebui","count":64,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/josebui"},{"login":"garobrik","count":11,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/garobrik"}],"active_maintainers":[{"login":"paulschreiber","count":20,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/paulschreiber"},{"login":"garobrik","count":6,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/garobrik"}]},"events":{"total":{"DeleteEvent":294,"PullRequestEvent":678,"ForkEvent":1,"IssuesEvent":52,"WatchEvent":1,"IssueCommentEvent":100,"PushEvent":526,"PullRequestReviewCommentEvent":104,"PullRequestReviewEvent":331,"CreateEvent":310},"last_year":{"DeleteEvent":162,"PullRequestEvent":405,"ForkEvent":1,"IssuesEvent":31,"IssueCommentEvent":69,"PushEvent":303,"PullRequestReviewCommentEvent":70,"PullRequestReviewEvent":209,"CreateEvent":178}},"keywords":[],"dependencies":[{"ecosystem":"actions","filepath":".github/workflows/build.yml","sha":null,"kind":"manifest","created_at":"2023-02-16T09:31:35.630Z","updated_at":"2023-02-16T09:31:35.630Z","repository_link":"https://github.com/techmatters/terraso-backend/blob/main/.github/workflows/build.yml","dependencies":[{"id":7709940349,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v3","direct":true,"kind":"composite","optional":false},{"id":7709940350,"package_name":"actions/setup-python","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/check-commits.yml","sha":null,"kind":"manifest","created_at":"2023-02-16T09:31:35.906Z","updated_at":"2023-02-16T09:31:35.906Z","repository_link":"https://github.com/techmatters/terraso-backend/blob/main/.github/workflows/check-commits.yml","dependencies":[{"id":7709944877,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v3","direct":true,"kind":"composite","optional":false},{"id":7709944878,"package_name":"agenthunt/conventional-commit-checker-action","ecosystem":"actions","requirements":"v1.0.0","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"docker","filepath":"Dockerfile","sha":null,"kind":"manifest","created_at":"2023-02-16T09:31:36.025Z","updated_at":"2023-02-16T09:31:36.025Z","repository_link":"https://github.com/techmatters/terraso-backend/blob/main/Dockerfile","dependencies":[{"id":7709946309,"package_name":"python","ecosystem":"docker","requirements":"3.11.1-slim-bullseye","direct":true,"kind":"build","optional":false}]},{"ecosystem":"pypi","filepath":"requirements/base.in","sha":null,"kind":"manifest","created_at":"2023-02-16T09:31:36.236Z","updated_at":"2023-02-16T09:31:36.236Z","repository_link":"https://github.com/techmatters/terraso-backend/blob/main/requirements/base.in","dependencies":[{"id":7709948061,"package_name":"graphene-django","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":7709948062,"package_name":"httpx","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":7709948063,"package_name":"django","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":7709948064,"package_name":"django-cors-headers","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":7709948065,"package_name":"django-filter","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":7709948066,"package_name":"django-oauth-toolkit","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":7709948103,"package_name":"django-safedelete","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":7709948104,"package_name":"django-storages","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":7709948105,"package_name":"django-structlog","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":7709948106,"package_name":"django-dirtyfields","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":7709948107,"package_name":"dj-database-url","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":7709948108,"package_name":"prettyconf","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":7709948109,"package_name":"psycopg2","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":7709948110,"package_name":"pyjwt","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":7709948111,"package_name":"python-magic","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":7709948112,"package_name":"rules","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":7709948113,"package_name":"boto3","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":7709948114,"package_name":"pyproj","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":7709948115,"package_name":"shapely","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":7709948116,"package_name":"geopandas","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false}]},{"ecosystem":"pypi","filepath":"requirements/deploy.in","sha":null,"kind":"manifest","created_at":"2023-02-16T09:31:36.429Z","updated_at":"2023-02-16T09:31:36.429Z","repository_link":"https://github.com/techmatters/terraso-backend/blob/main/requirements/deploy.in","dependencies":[{"id":7709950395,"package_name":"ddtrace","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":7709950429,"package_name":"gunicorn","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false}]},{"ecosystem":"pypi","filepath":"requirements/dev.in","sha":null,"kind":"manifest","created_at":"2023-02-16T09:31:36.486Z","updated_at":"2023-02-16T09:31:36.486Z","repository_link":"https://github.com/techmatters/terraso-backend/blob/main/requirements/dev.in","dependencies":[{"id":7709951392,"package_name":"black","ecosystem":"pypi","requirements":"*","direct":true,"kind":"development","optional":false},{"id":7709951393,"package_name":"flake8","ecosystem":"pypi","requirements":"*","direct":true,"kind":"development","optional":false},{"id":7709951394,"package_name":"freezegun","ecosystem":"pypi","requirements":"*","direct":true,"kind":"development","optional":false},{"id":7709951395,"package_name":"ipdb","ecosystem":"pypi","requirements":"*","direct":true,"kind":"development","optional":false},{"id":7709951396,"package_name":"isort","ecosystem":"pypi","requirements":"*","direct":true,"kind":"development","optional":false},{"id":7709951397,"package_name":"mixer","ecosystem":"pypi","requirements":"*","direct":true,"kind":"development","optional":false},{"id":7709951419,"package_name":"moto","ecosystem":"pypi","requirements":"*","direct":true,"kind":"development","optional":false},{"id":7709951420,"package_name":"pytest","ecosystem":"pypi","requirements":"*","direct":true,"kind":"development","optional":false},{"id":7709951421,"package_name":"pytest-cov","ecosystem":"pypi","requirements":"*","direct":true,"kind":"development","optional":false},{"id":7709951422,"package_name":"pytest-django","ecosystem":"pypi","requirements":"*","direct":true,"kind":"development","optional":false},{"id":7709951423,"package_name":"respx","ecosystem":"pypi","requirements":"*","direct":true,"kind":"development","optional":false}]},{"ecosystem":"pypi","filepath":"requirements-dev.txt","sha":null,"kind":"manifest","created_at":"2023-02-16T09:31:36.575Z","updated_at":"2023-02-16T09:31:36.575Z","repository_link":"https://github.com/techmatters/terraso-backend/blob/main/requirements-dev.txt","dependencies":[{"id":7709951515,"package_name":"anyio","ecosystem":"pypi","requirements":"==3.6.2","direct":true,"kind":"development","optional":false},{"id":7709951516,"package_name":"appnope","ecosystem":"pypi","requirements":"==0.1.3","direct":true,"kind":"development","optional":false},{"id":7709951517,"package_name":"asttokens","ecosystem":"pypi","requirements":"==2.2.1","direct":true,"kind":"development","optional":false},{"id":7709951518,"package_name":"attrs","ecosystem":"pypi","requirements":"==22.2.0","direct":true,"kind":"development","optional":false},{"id":7709951519,"package_name":"backcall","ecosystem":"pypi","requirements":"==0.2.0","direct":true,"kind":"development","optional":false},{"id":7709951520,"package_name":"black","ecosystem":"pypi","requirements":"==23.1.0","direct":true,"kind":"development","optional":false},{"id":7709951521,"package_name":"boto3","ecosystem":"pypi","requirements":"==1.26.64","direct":true,"kind":"development","optional":false},{"id":7709951522,"package_name":"botocore","ecosystem":"pypi","requirements":"==1.29.69","direct":true,"kind":"development","optional":false},{"id":7709951523,"package_name":"certifi","ecosystem":"pypi","requirements":"==2022.12.7","direct":true,"kind":"development","optional":false},{"id":7709951524,"package_name":"cffi","ecosystem":"pypi","requirements":"==1.15.1","direct":true,"kind":"development","optional":false},{"id":7709951525,"package_name":"charset-normalizer","ecosystem":"pypi","requirements":"==3.0.1","direct":true,"kind":"development","optional":false},{"id":7709951526,"package_name":"click","ecosystem":"pypi","requirements":"==8.1.3","direct":true,"kind":"development","optional":false},{"id":7709951527,"package_name":"coverage","ecosystem":"pypi","requirements":"==7.1.0","direct":true,"kind":"development","optional":false},{"id":7709951528,"package_name":"cryptography","ecosystem":"pypi","requirements":"==39.0.1","direct":true,"kind":"development","optional":false},{"id":7709951529,"package_name":"decorator","ecosystem":"pypi","requirements":"==5.1.1","direct":true,"kind":"development","optional":false},{"id":7709951530,"package_name":"exceptiongroup","ecosystem":"pypi","requirements":"==1.1.0","direct":true,"kind":"development","optional":false},{"id":7709951531,"package_name":"executing","ecosystem":"pypi","requirements":"==1.2.0","direct":true,"kind":"development","optional":false},{"id":7709951532,"package_name":"faker","ecosystem":"pypi","requirements":"==12.0.1","direct":true,"kind":"development","optional":false},{"id":7709951533,"package_name":"flake8","ecosystem":"pypi","requirements":"==6.0.0","direct":true,"kind":"development","optional":false},{"id":7709951534,"package_name":"freezegun","ecosystem":"pypi","requirements":"==1.2.2","direct":true,"kind":"development","optional":false},{"id":7709951535,"package_name":"h11","ecosystem":"pypi","requirements":"==0.14.0","direct":true,"kind":"development","optional":false},{"id":7709951536,"package_name":"httpcore","ecosystem":"pypi","requirements":"==0.16.3","direct":true,"kind":"development","optional":false},{"id":7709951537,"package_name":"httpx","ecosystem":"pypi","requirements":"==0.23.3","direct":true,"kind":"development","optional":false},{"id":7709951538,"package_name":"idna","ecosystem":"pypi","requirements":"==3.4","direct":true,"kind":"development","optional":false},{"id":7709951539,"package_name":"iniconfig","ecosystem":"pypi","requirements":"==2.0.0","direct":true,"kind":"development","optional":false},{"id":7709951540,"package_name":"ipdb","ecosystem":"pypi","requirements":"==0.13.11","direct":true,"kind":"development","optional":false},{"id":7709951541,"package_name":"ipython","ecosystem":"pypi","requirements":"==8.10.0","direct":true,"kind":"development","optional":false},{"id":7709951542,"package_name":"isort","ecosystem":"pypi","requirements":"==5.12.0","direct":true,"kind":"development","optional":false},{"id":7709951543,"package_name":"jedi","ecosystem":"pypi","requirements":"==0.18.2","direct":true,"kind":"development","optional":false},{"id":7709951544,"package_name":"jinja2","ecosystem":"pypi","requirements":"==3.1.2","direct":true,"kind":"development","optional":false},{"id":7709951545,"package_name":"jmespath","ecosystem":"pypi","requirements":"==1.0.1","direct":true,"kind":"development","optional":false},{"id":7709951546,"package_name":"markupsafe","ecosystem":"pypi","requirements":"==2.1.2","direct":true,"kind":"development","optional":false},{"id":7709951547,"package_name":"matplotlib-inline","ecosystem":"pypi","requirements":"==0.1.6","direct":true,"kind":"development","optional":false},{"id":7709951548,"package_name":"mccabe","ecosystem":"pypi","requirements":"==0.7.0","direct":true,"kind":"development","optional":false},{"id":7709951549,"package_name":"mixer","ecosystem":"pypi","requirements":"==7.2.2","direct":true,"kind":"development","optional":false},{"id":7709951550,"package_name":"moto","ecosystem":"pypi","requirements":"==4.1.2","direct":true,"kind":"development","optional":false},{"id":7709951551,"package_name":"mypy-extensions","ecosystem":"pypi","requirements":"==1.0.0","direct":true,"kind":"development","optional":false},{"id":7709951552,"package_name":"packaging","ecosystem":"pypi","requirements":"==23.0","direct":true,"kind":"development","optional":false},{"id":7709951553,"package_name":"parso","ecosystem":"pypi","requirements":"==0.8.3","direct":true,"kind":"development","optional":false},{"id":7709951554,"package_name":"pathspec","ecosystem":"pypi","requirements":"==0.11.0","direct":true,"kind":"development","optional":false},{"id":7709951555,"package_name":"pexpect","ecosystem":"pypi","requirements":"==4.8.0","direct":true,"kind":"development","optional":false},{"id":7709951556,"package_name":"pickleshare","ecosystem":"pypi","requirements":"==0.7.5","direct":true,"kind":"development","optional":false},{"id":7709951557,"package_name":"platformdirs","ecosystem":"pypi","requirements":"==3.0.0","direct":true,"kind":"development","optional":false},{"id":7709951558,"package_name":"pluggy","ecosystem":"pypi","requirements":"==1.0.0","direct":true,"kind":"development","optional":false},{"id":7709951559,"package_name":"prompt-toolkit","ecosystem":"pypi","requirements":"==3.0.36","direct":true,"kind":"development","optional":false},{"id":7709951560,"package_name":"ptyprocess","ecosystem":"pypi","requirements":"==0.7.0","direct":true,"kind":"development","optional":false},{"id":7709951561,"package_name":"pure-eval","ecosystem":"pypi","requirements":"==0.2.2","direct":true,"kind":"development","optional":false},{"id":7709951562,"package_name":"pycodestyle","ecosystem":"pypi","requirements":"==2.10.0","direct":true,"kind":"development","optional":false},{"id":7709951563,"package_name":"pycparser","ecosystem":"pypi","requirements":"==2.21","direct":true,"kind":"development","optional":false},{"id":7709951564,"package_name":"pyflakes","ecosystem":"pypi","requirements":"==3.0.1","direct":true,"kind":"development","optional":false},{"id":7709951565,"package_name":"pygments","ecosystem":"pypi","requirements":"==2.14.0","direct":true,"kind":"development","optional":false},{"id":7709951566,"package_name":"pytest","ecosystem":"pypi","requirements":"==7.2.1","direct":true,"kind":"development","optional":false},{"id":7709951567,"package_name":"pytest-cov","ecosystem":"pypi","requirements":"==4.0.0","direct":true,"kind":"development","optional":false},{"id":7709951568,"package_name":"pytest-django","ecosystem":"pypi","requirements":"==4.5.2","direct":true,"kind":"development","optional":false},{"id":7709951569,"package_name":"python-dateutil","ecosystem":"pypi","requirements":"==2.8.2","direct":true,"kind":"development","optional":false},{"id":7709951570,"package_name":"requests","ecosystem":"pypi","requirements":"==2.28.2","direct":true,"kind":"development","optional":false},{"id":7709951571,"package_name":"responses","ecosystem":"pypi","requirements":"==0.22.0","direct":true,"kind":"development","optional":false},{"id":7709951572,"package_name":"respx","ecosystem":"pypi","requirements":"==0.20.1","direct":true,"kind":"development","optional":false},{"id":7709951573,"package_name":"rfc3986","ecosystem":"pypi","requirements":"==1.5.0","direct":true,"kind":"development","optional":false},{"id":7709951574,"package_name":"s3transfer","ecosystem":"pypi","requirements":"==0.6.0","direct":true,"kind":"development","optional":false},{"id":7709951575,"package_name":"six","ecosystem":"pypi","requirements":"==1.16.0","direct":true,"kind":"development","optional":false},{"id":7709951576,"package_name":"sniffio","ecosystem":"pypi","requirements":"==1.3.0","direct":true,"kind":"development","optional":false},{"id":7709951577,"package_name":"stack-data","ecosystem":"pypi","requirements":"==0.6.2","direct":true,"kind":"development","optional":false},{"id":7709951578,"package_name":"toml","ecosystem":"pypi","requirements":"==0.10.2","direct":true,"kind":"development","optional":false},{"id":7709951579,"package_name":"tomli","ecosystem":"pypi","requirements":"==2.0.1","direct":true,"kind":"development","optional":false},{"id":7709951580,"package_name":"traitlets","ecosystem":"pypi","requirements":"==5.9.0","direct":true,"kind":"development","optional":false},{"id":7709951581,"package_name":"types-toml","ecosystem":"pypi","requirements":"==0.10.8.3","direct":true,"kind":"development","optional":false},{"id":7709951582,"package_name":"urllib3","ecosystem":"pypi","requirements":"==1.26.14","direct":true,"kind":"development","optional":false},{"id":7709951583,"package_name":"wcwidth","ecosystem":"pypi","requirements":"==0.2.6","direct":true,"kind":"development","optional":false},{"id":7709951584,"package_name":"werkzeug","ecosystem":"pypi","requirements":"==2.2.3","direct":true,"kind":"development","optional":false},{"id":7709951585,"package_name":"xmltodict","ecosystem":"pypi","requirements":"==0.13.0","direct":true,"kind":"development","optional":false}]},{"ecosystem":"pypi","filepath":"requirements.txt","sha":null,"kind":"lockfile","created_at":"2023-02-16T09:31:36.661Z","updated_at":"2023-02-16T09:31:36.661Z","repository_link":"https://github.com/techmatters/terraso-backend/blob/main/requirements.txt","dependencies":[{"id":7709951605,"package_name":"aniso8601","ecosystem":"pypi","requirements":"==9.0.1","direct":false,"kind":"runtime","optional":false},{"id":7709951606,"package_name":"anyio","ecosystem":"pypi","requirements":"==3.6.2","direct":false,"kind":"runtime","optional":false},{"id":7709951607,"package_name":"asgiref","ecosystem":"pypi","requirements":"==3.6.0","direct":false,"kind":"runtime","optional":false},{"id":7709951608,"package_name":"attrs","ecosystem":"pypi","requirements":"==22.2.0","direct":false,"kind":"runtime","optional":false},{"id":7709951609,"package_name":"boto3","ecosystem":"pypi","requirements":"==1.26.64","direct":false,"kind":"runtime","optional":false},{"id":7709951610,"package_name":"botocore","ecosystem":"pypi","requirements":"==1.29.69","direct":false,"kind":"runtime","optional":false},{"id":7709951611,"package_name":"bytecode","ecosystem":"pypi","requirements":"==0.14.0","direct":false,"kind":"runtime","optional":false},{"id":7709951612,"package_name":"cattrs","ecosystem":"pypi","requirements":"==22.2.0","direct":false,"kind":"runtime","optional":false},{"id":7709951613,"package_name":"certifi","ecosystem":"pypi","requirements":"==2022.12.7","direct":false,"kind":"runtime","optional":false},{"id":7709951614,"package_name":"cffi","ecosystem":"pypi","requirements":"==1.15.1","direct":false,"kind":"runtime","optional":false},{"id":7709951615,"package_name":"charset-normalizer","ecosystem":"pypi","requirements":"==3.0.1","direct":false,"kind":"runtime","optional":false},{"id":7709951616,"package_name":"click","ecosystem":"pypi","requirements":"==8.1.3","direct":false,"kind":"runtime","optional":false},{"id":7709951617,"package_name":"click-plugins","ecosystem":"pypi","requirements":"==1.1.1","direct":false,"kind":"runtime","optional":false},{"id":7709951618,"package_name":"cligj","ecosystem":"pypi","requirements":"==0.7.2","direct":false,"kind":"runtime","optional":false},{"id":7709951619,"package_name":"cryptography","ecosystem":"pypi","requirements":"==39.0.1","direct":false,"kind":"runtime","optional":false},{"id":7709951620,"package_name":"ddsketch","ecosystem":"pypi","requirements":"==2.0.4","direct":false,"kind":"runtime","optional":false},{"id":7709951621,"package_name":"ddtrace","ecosystem":"pypi","requirements":"==1.7.5","direct":false,"kind":"runtime","optional":false},{"id":7709951622,"package_name":"deprecated","ecosystem":"pypi","requirements":"==1.2.13","direct":false,"kind":"runtime","optional":false},{"id":7709951623,"package_name":"dj-database-url","ecosystem":"pypi","requirements":"==1.2.0","direct":false,"kind":"runtime","optional":false},{"id":7709951624,"package_name":"django","ecosystem":"pypi","requirements":"==4.1.7","direct":false,"kind":"runtime","optional":false},{"id":7709951625,"package_name":"django-cors-headers","ecosystem":"pypi","requirements":"==3.13.0","direct":false,"kind":"runtime","optional":false},{"id":7709951626,"package_name":"django-dirtyfields","ecosystem":"pypi","requirements":"==1.9.1","direct":false,"kind":"runtime","optional":false},{"id":7709951627,"package_name":"django-filter","ecosystem":"pypi","requirements":"==22.1","direct":false,"kind":"runtime","optional":false},{"id":7709951628,"package_name":"django-ipware","ecosystem":"pypi","requirements":"==4.0.2","direct":false,"kind":"runtime","optional":false},{"id":7709951629,"package_name":"django-oauth-toolkit","ecosystem":"pypi","requirements":"==2.2.0","direct":false,"kind":"runtime","optional":false},{"id":7709951630,"package_name":"django-safedelete","ecosystem":"pypi","requirements":"==1.3.1","direct":false,"kind":"runtime","optional":false},{"id":7709951631,"package_name":"django-storages","ecosystem":"pypi","requirements":"==1.13.2","direct":false,"kind":"runtime","optional":false},{"id":7709951632,"package_name":"django-structlog","ecosystem":"pypi","requirements":"==4.1.0","direct":false,"kind":"runtime","optional":false},{"id":7709951633,"package_name":"envier","ecosystem":"pypi","requirements":"==0.4.0","direct":false,"kind":"runtime","optional":false},{"id":7709951634,"package_name":"exceptiongroup","ecosystem":"pypi","requirements":"==1.1.0","direct":false,"kind":"runtime","optional":false},{"id":7709951635,"package_name":"fiona","ecosystem":"pypi","requirements":"==1.9.0","direct":false,"kind":"runtime","optional":false},{"id":7709951636,"package_name":"geopandas","ecosystem":"pypi","requirements":"==0.12.2","direct":false,"kind":"runtime","optional":false},{"id":7709951637,"package_name":"graphene","ecosystem":"pypi","requirements":"==3.2.1","direct":false,"kind":"runtime","optional":false},{"id":7709951642,"package_name":"graphene-django","ecosystem":"pypi","requirements":"==3.0.0","direct":false,"kind":"runtime","optional":false},{"id":7709951643,"package_name":"graphql-core","ecosystem":"pypi","requirements":"==3.2.3","direct":false,"kind":"runtime","optional":false},{"id":7709951644,"package_name":"graphql-relay","ecosystem":"pypi","requirements":"==3.2.0","direct":false,"kind":"runtime","optional":false},{"id":7709951645,"package_name":"gunicorn","ecosystem":"pypi","requirements":"==20.1.0","direct":false,"kind":"runtime","optional":false},{"id":7709951646,"package_name":"h11","ecosystem":"pypi","requirements":"==0.14.0","direct":false,"kind":"runtime","optional":false},{"id":7709951647,"package_name":"httpcore","ecosystem":"pypi","requirements":"==0.16.3","direct":false,"kind":"runtime","optional":false},{"id":7709951648,"package_name":"httpx","ecosystem":"pypi","requirements":"==0.23.3","direct":false,"kind":"runtime","optional":false},{"id":7709951649,"package_name":"idna","ecosystem":"pypi","requirements":"==3.4","direct":false,"kind":"runtime","optional":false},{"id":7709951650,"package_name":"jmespath","ecosystem":"pypi","requirements":"==1.0.1","direct":false,"kind":"runtime","optional":false},{"id":7709951651,"package_name":"jsonschema","ecosystem":"pypi","requirements":"==4.17.3","direct":false,"kind":"runtime","optional":false},{"id":7709951652,"package_name":"jwcrypto","ecosystem":"pypi","requirements":"==1.4.2","direct":false,"kind":"runtime","optional":false},{"id":7709951653,"package_name":"munch","ecosystem":"pypi","requirements":"==2.5.0","direct":false,"kind":"runtime","optional":false},{"id":7709951654,"package_name":"numpy","ecosystem":"pypi","requirements":"==1.24.2","direct":false,"kind":"runtime","optional":false},{"id":7709951655,"package_name":"oauthlib","ecosystem":"pypi","requirements":"==3.2.2","direct":false,"kind":"runtime","optional":false},{"id":7709951656,"package_name":"packaging","ecosystem":"pypi","requirements":"==23.0","direct":false,"kind":"runtime","optional":false},{"id":7709951657,"package_name":"pandas","ecosystem":"pypi","requirements":"==1.5.3","direct":false,"kind":"runtime","optional":false},{"id":7709951658,"package_name":"prettyconf","ecosystem":"pypi","requirements":"==2.2.1","direct":false,"kind":"runtime","optional":false},{"id":7709951659,"package_name":"promise","ecosystem":"pypi","requirements":"==2.3","direct":false,"kind":"runtime","optional":false},{"id":7709951660,"package_name":"protobuf","ecosystem":"pypi","requirements":"==4.21.12","direct":false,"kind":"runtime","optional":false},{"id":7709951661,"package_name":"psycopg2","ecosystem":"pypi","requirements":"==2.9.5","direct":false,"kind":"runtime","optional":false},{"id":7709951662,"package_name":"pycparser","ecosystem":"pypi","requirements":"==2.21","direct":false,"kind":"runtime","optional":false},{"id":7709951663,"package_name":"pyjwt","ecosystem":"pypi","requirements":"==2.6.0","direct":false,"kind":"runtime","optional":false},{"id":7709951664,"package_name":"pyproj","ecosystem":"pypi","requirements":"==3.4.1","direct":false,"kind":"runtime","optional":false},{"id":7709951665,"package_name":"pyrsistent","ecosystem":"pypi","requirements":"==0.19.3","direct":false,"kind":"runtime","optional":false},{"id":7709951666,"package_name":"python-dateutil","ecosystem":"pypi","requirements":"==2.8.2","direct":false,"kind":"runtime","optional":false},{"id":7709951667,"package_name":"python-magic","ecosystem":"pypi","requirements":"==0.4.27","direct":false,"kind":"runtime","optional":false},{"id":7709951668,"package_name":"pytz","ecosystem":"pypi","requirements":"==2022.7.1","direct":false,"kind":"runtime","optional":false},{"id":7709951669,"package_name":"requests","ecosystem":"pypi","requirements":"==2.28.2","direct":false,"kind":"runtime","optional":false},{"id":7709951670,"package_name":"rfc3986","ecosystem":"pypi","requirements":"==1.5.0","direct":false,"kind":"runtime","optional":false},{"id":7709951671,"package_name":"rules","ecosystem":"pypi","requirements":"==3.3","direct":false,"kind":"runtime","optional":false},{"id":7709951672,"package_name":"s3transfer","ecosystem":"pypi","requirements":"==0.6.0","direct":false,"kind":"runtime","optional":false},{"id":7709951673,"package_name":"shapely","ecosystem":"pypi","requirements":"==2.0.1","direct":false,"kind":"runtime","optional":false},{"id":7709951674,"package_name":"six","ecosystem":"pypi","requirements":"==1.16.0","direct":false,"kind":"runtime","optional":false},{"id":7709951675,"package_name":"sniffio","ecosystem":"pypi","requirements":"==1.3.0","direct":false,"kind":"runtime","optional":false},{"id":7709951676,"package_name":"sqlparse","ecosystem":"pypi","requirements":"==0.4.3","direct":false,"kind":"runtime","optional":false},{"id":7709951677,"package_name":"structlog","ecosystem":"pypi","requirements":"==22.3.0","direct":false,"kind":"runtime","optional":false},{"id":7709951678,"package_name":"tenacity","ecosystem":"pypi","requirements":"==8.1.0","direct":false,"kind":"runtime","optional":false},{"id":7709951679,"package_name":"text-unidecode","ecosystem":"pypi","requirements":"==1.3","direct":false,"kind":"runtime","optional":false},{"id":7709951680,"package_name":"typing-extensions","ecosystem":"pypi","requirements":"==4.4.0","direct":false,"kind":"runtime","optional":false},{"id":7709951681,"package_name":"urllib3","ecosystem":"pypi","requirements":"==1.26.14","direct":false,"kind":"runtime","optional":false},{"id":7709951682,"package_name":"wrapt","ecosystem":"pypi","requirements":"==1.14.1","direct":false,"kind":"runtime","optional":false},{"id":7709951683,"package_name":"xmltodict","ecosystem":"pypi","requirements":"==0.13.0","direct":false,"kind":"runtime","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/codeql.yml","sha":null,"kind":"manifest","created_at":"2023-09-21T19:46:38.992Z","updated_at":"2023-09-21T19:46:38.992Z","repository_link":"https://github.com/techmatters/terraso-backend/blob/main/.github/workflows/codeql.yml","dependencies":[{"id":13856896092,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false},{"id":13856896093,"package_name":"github/codeql-action/init","ecosystem":"actions","requirements":"v2","direct":true,"kind":"composite","optional":false},{"id":13856896094,"package_name":"github/codeql-action/autobuild","ecosystem":"actions","requirements":"v2","direct":true,"kind":"composite","optional":false},{"id":13856896095,"package_name":"github/codeql-action/analyze","ecosystem":"actions","requirements":"v2","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"docker","filepath":"docker-compose.base.yml","sha":null,"kind":"manifest","created_at":"2023-09-21T19:46:39.874Z","updated_at":"2023-09-21T19:46:39.874Z","repository_link":"https://github.com/techmatters/terraso-backend/blob/main/docker-compose.base.yml","dependencies":[{"id":13856896313,"package_name":"techmatters/terraso_backend","ecosystem":"docker","requirements":"latest","direct":true,"kind":"runtime","optional":false},{"id":13856896314,"package_name":"postgis/postgis","ecosystem":"docker","requirements":"14-master","direct":true,"kind":"runtime","optional":false}]},{"ecosystem":"docker","filepath":"docker-compose.ci.yml","sha":null,"kind":"manifest","created_at":"2023-09-21T19:46:41.081Z","updated_at":"2023-09-21T19:46:41.081Z","repository_link":"https://github.com/techmatters/terraso-backend/blob/main/docker-compose.ci.yml","dependencies":[]},{"ecosystem":"docker","filepath":"docker-compose.dev.yml","sha":null,"kind":"manifest","created_at":"2023-09-21T19:46:41.590Z","updated_at":"2023-09-21T19:46:41.590Z","repository_link":"https://github.com/techmatters/terraso-backend/blob/main/docker-compose.dev.yml","dependencies":[]},{"ecosystem":"npm","filepath":"package.json","sha":null,"kind":"manifest","created_at":"2023-09-21T19:46:42.004Z","updated_at":"2023-09-21T19:46:42.004Z","repository_link":"https://github.com/techmatters/terraso-backend/blob/main/package.json","dependencies":[]},{"ecosystem":"pypi","filepath":"pyproject.toml","sha":null,"kind":"manifest","created_at":"2023-09-21T19:46:42.606Z","updated_at":"2023-09-21T19:46:42.606Z","repository_link":"https://github.com/techmatters/terraso-backend/blob/main/pyproject.toml","dependencies":[]},{"ecosystem":"actions","filepath":".github/workflows/auto-approve.yml","sha":null,"kind":"manifest","created_at":"2023-12-20T12:09:26.772Z","updated_at":"2023-12-20T12:09:26.772Z","repository_link":"https://github.com/techmatters/terraso-backend/blob/main/.github/workflows/auto-approve.yml","dependencies":[{"id":15188559448,"package_name":"hmarr/auto-approve-action","ecosystem":"actions","requirements":"v3","direct":true,"kind":"composite","optional":false}]}],"score":7.533693709848633,"created_at":"2023-09-11T11:54:36.798Z","updated_at":"2026-05-14T21:03:12.398Z","avatar_url":"https://github.com/techmatters.png","language":"Python","category":"Natural Resources","sub_category":"Soil and Land","monthly_downloads":0,"total_dependent_repos":0,"total_dependent_packages":0,"readme":"# Terraso Backend\n\nTerraso backend is a Django project that powers the backend of the Terraso\nplatform.\n\n## Requirements\n\n-   Docker: version 24 or better\n-   Python: 3.12 or better\n\n## Running locally with Docker\n\nSet up your environment file outside the repo (so AI assistants and other\ntools browsing the project can't read it incidentally):\n\n```sh\n$ mkdir -p ~/secrets/terraso-backend\n$ cp .env.sample ~/secrets/terraso-backend/.env\n```\n\nThe Makefile and `docker-compose.base.yml` resolve `env_file:` paths\nagainst `$HOME/secrets/terraso-backend/.env`. Override the location by\nsetting `ENV_FILE=/some/other/path` before invoking `make`.\n\nIn the env file\n\n-   set values for `GOOGLE_CLIENT_ID` and `GOOGLE_CLIENT_SECRET`based on what you have set up in console.cloud.google.com \u003e APIs \u0026 Services \u003e Credentials.\n\n-   set values for `APPLE_CLIENT_ID`, `APPLE_KEY_ID`, `APPLE_TEAM_ID`, `APPLE_PRIVATE_KEY` and based on what you have set up on developer.apple.com \u003e Certificates, Identifiers \u0026 Profiles \u003e Keys.\n\n-   set values for `MICROSOFT_CLIENT_ID` and either `MICROSOFT_CLIENT_SECRET` (less secure) or both `MICROSOFT_PRIVATE_KEY` and `MICROSOFT_CERTIFICATE_THUMBPRINT` based on what you have set up on portal.azure.com \u003e App Registrations \u003e [App Name] \u003e Certificates \u0026 Secrets\n\nStart building the Docker images (make sure there's `requirements.txt`\nfile created before building the images):\n\n```sh\n$ make build\n```\n\nRun the database migrations before the first run:\n\n```sh\n$ make migrate\n```\n\nThan the run command can be executed:\n\n```sh\n$ make run\n```\n\nIf you want to have a user to access the admin panel, you need to create\nit:\n\n```sh\n$ make bash\n# (inside the web container)\n$ python terraso_backend/manage.py createsuperuser\n$ exit\n```\n\n## Running with gunicorn (production-like)\n\n`make run` uses Django's single-threaded development server. To test with\nproduction-like concurrency, use:\n\n```sh\n$ make run-gunicorn\n```\n\nThis launches gunicorn inside Docker, reading its configuration from `.env`:\n\n- `WEB_CONCURRENCY` — number of worker processes (OS-level parallelism, ~350MB each)\n- `GUNICORN_CMD_ARGS` — extra flags, e.g. `--worker-class gthread --threads 8`\n\nWith `WEB_CONCURRENCY=2` and `--threads 8`, you get 2 workers x 8 threads = 16\nconcurrent requests. Workers provide true parallelism; threads within a worker\nshare memory and take turns on CPU (Python GIL) but can all wait on I/O (database\nqueries, HTTP calls) simultaneously.\n\nThese are the same env vars used on Render, so you can test locally with the exact\nvalues you plan to deploy.\n\nNote: gunicorn does not support hot-reload — code changes require a manual restart.\nFor day-to-day development, use `make run` which auto-reloads on save. Use\n`make run-gunicorn` when you need to test concurrency or production-like behavior.\n\n## Debugging locally with Docker\n\nTo debug while running tests, just use regular Python `breakpoint()` and\nrun the tests normally. Pytest will stop properly on break point giving\nyou access to the Python debugger.\n\nTo debug while using the application locally, it's also possible to use\nPython `breakpoint()`. To have access to the Python debugger, you'll\nneed to attach to the application running container.\n\nSo, assuming that the application is running with `make run`:\n\nList the running containers\n\n```sh\n$ docker ps\n```\n\nGet the id of the web container before next step\n\n```sh\n$ docker attach \u003cweb-container-id\u003e\n```\n\nThis will give you access to the web running container\n\nMake the application request call that will pass on breakpoint, like\ncalling an API or clicking in some button. As soon as the process get to\nthe break point, the attached shell should open the Python debugger. To\ncontinue the application request processing, just release the debugger.\n\n# Interacting with the database\n\n## Connect to the database\n\nWhile the database is running (e.g. via `make run`), use:\n\n```sh\nmake connect_db\n```\n\n## Run or rollback a specific migration\n\nYou can tell the database to migrate a specific app to a specific number with:\n\n```sh\nAPP_MIGRATION_NAME=\"{app_name} {migration_number}\" make migrate\n```\n\nSo to e.g. rollback migration `0014` of the `soil_id` app, you could run:\n\n```sh\nAPP_MIGRATION_NAME=\"soil_id 0014\" make migrate\n```\n\n## Loading sample data\n\nImport sample landscape data (names, descriptions, links):\n\n```sh\n$ python terraso_backend/manage.py loaddata sampledata.json\n```\n\nImport landscape boundaries geodata:\n\n```sh\n$ python terraso_backend/manage.py load_landscapes_geojson --airtable_api_key xxxxx\n```\n\nDownload Soil ID data:\n\n```sh\n$ make download-soil-data\n```\n\n## Reset the database\n\nYou can reset the database back to its default state:\n\n```sh\n$ python terraso_backend/manage.py flush\n```\n\n## Backup the database\n\nThe contents of the database can be dumped to a JSON file for backup. Optionally, they can also be uploaded to a S3 bucket. This can be activated to be triggered from a button in the Django admin console. See the relevant [README.md](terraso_backend/apps/core/management/README.md) for more details.\n\n## Print migration SQL\n\nYou can view the SQL commands that a migration will issue by running\n\n```sh\n$ python terraso_backend/manage.py sqlmigrate {app_name} {migration_name}\n```\n\nor in Docker using the `make` command\n\n```sh\n$ APP_MIGRATION_NAME=\"{app_name} {migration_name}\" make print_migration_sql\n```\n\nFor example:\n\n```sh\n$ APP_MIGRATION_NAME=\"story_map 0001_initial\" make print_migration_sql\n```\n\n# Contributing\n\nBefore contributing to the project, it's recommended that you set up\nyour local git running the following command:\n\n```sh\n$ make setup-git-hooks\n```\n\nThis will activate two git hooks to automatically check Python code\nstyle and commit message structure before each commit.\n\n# Dealing with dependencies\n\nIt is possible to lock the dependencies to run the project with the\nfollowing command\n\n```sh\n$ make lock\n```\n\nIt is also possible to lock development dependencies with:\n\n```sh\n$ make lock-dev\n```\n\nThe lock process creates/updates the files `requirements.txt` and\n`requirements-dev.txt`. With these files in place it's possible to\ninstall dependencies running:\n\n```sh\n$ make install\n```\n\nTo install development dependencies run:\n\n```sh\n$ make install-dev\n```\n\n# Local development\n\nYour local machine needs:\n\n-   Docker\n-   Python\n\n`make lock` requires GDAL and Cython:\n\n```sh\n$ brew install gdal\n```\n\n```sh\n$ apt install gdal\n```\n\n### cython\n\n```sh\n$ pip3 install cython\n```\n\n# Generating GraphQL public documentation\n\nThe API docs are generated by\n[SpectaQL](https://github.com/anvilco/spectaql). So, make sure you\nfollowed their README to have it installed before proceding. Run the\nfollowing command to generate the documentation:\n\n```sh\n$ make api_doc\n```\n\nEnjoy! `;-)`\n","funding_links":[],"readme_doi_urls":[],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":["optimize","archiving","measur","transforms","observation","conversion","animals","compose","projection","generic"],"project_url":"https://ost.ecosyste.ms/api/v1/projects/1062","html_url":"https://ost.ecosyste.ms/projects/1062"}