{"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-04-15T06:30:31.651Z","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-02-26T17:45:12.000Z","size":5958,"stargazers_count":20,"open_issues_count":83,"forks_count":4,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-03-02T11:33:51.554Z","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-02-26T17:45: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":0,"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":30078306,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-04T08:01:56.766Z","status":"ssl_error","status_checked_at":"2026-03-04T08:00:42.919Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: 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"}},"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":1464,"total_committers":17,"total_bot_commits":909,"total_bot_committers":1,"mean_commits":86.11764705882354,"dds":0.37909836065573765,"past_year_total_commits":277,"past_year_total_committers":6,"past_year_total_bot_commits":229,"past_year_total_bot_committers":1,"past_year_mean_commits":46.166666666666664,"past_year_dds":0.1732851985559567,"last_synced_at":"2026-03-16T13:38:46.795Z","last_synced_commit":"1af6f3f6d64f836e0bed6e7dec93dfdbb5a8c367","created_at":"2023-03-27T11:49:52.256Z","updated_at":"2026-03-16T13:38:40.568Z","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":"Carissa Knipe","email":"carissa@techmatters.org","login":"knipec","count":15},{"name":"Jodie Zhu","email":"82774370+jodiezhuu","login":"jodiezhuu","count":14},{"name":"Johannes","email":"89488492+johannesparty","login":"johannesparty","count":12},{"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":229},{"name":"Paul Schreiber","email":"paul@techmatters.org","login":"paulschreiber","count":21},{"name":"Johannes","email":"89488492+johannesparty","login":"johannesparty","count":12},{"name":"Carissa Knipe","email":"carissa@techmatters.org","login":"knipec","count":7},{"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-03-16T00:00:25.424Z","repositories_count":6203998,"commits_count":934851486,"contributors_count":36183170,"owners_count":1149320,"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-03-11T00:00:22.042Z","status":null,"issues_count":243,"pull_requests_count":2106,"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.2355175688509022,"merged_pull_requests_count":1624,"bot_issues_count":11,"bot_pull_requests_count":1382,"past_year_issues_count":8,"past_year_pull_requests_count":350,"past_year_avg_time_to_close_issue":5607708.2,"past_year_avg_time_to_close_pull_request":351657.48245614034,"past_year_issues_closed_count":5,"past_year_pull_requests_closed_count":228,"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.12285714285714286,"past_year_bot_issues_count":2,"past_year_bot_pull_requests_count":289,"past_year_merged_pull_requests_count":182,"created_at":"2023-05-09T10:35:03.667Z","updated_at":"2026-03-11T00:00:22.070Z","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,"site creation":10,"Medium":10,"project management":7,"good first issue":6,"profiles":6,"1000L":6,"audit log":5,"bug":4,"Low":3,"blocked":1,"Research":1,"Capri MVP":1,"stale":1,"needs triage":1,"testing":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":1653,"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":27,"jodiezhuu":12,"JeancarloBarrios":9,"tm-ruxandra":7,"johannesparty":6,"garobrik":6,"ajabeckett":6,"robert-bo-davis":4,"plentydone":2},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-03-16T00:00:25.224Z","repositories_count":13761409,"issues_count":34677418,"pull_requests_count":113243529,"authors_count":11205473,"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,"tech-debt":1,"blocked":1},"past_year_pull_request_labels_count":{"dependencies":289,"python":281,"blocked":12,"github_actions":8},"past_year_issue_author_associations_count":{"CONTRIBUTOR":5,"NONE":2,"MEMBER":1},"past_year_pull_request_author_associations_count":{"CONTRIBUTOR":308,"MEMBER":42},"past_year_issue_authors":{"knipec":3,"dependabot[bot]":2,"DerekCaelin":2,"garobrik":1},"past_year_pull_request_authors":{"dependabot[bot]":289,"paulschreiber":35,"knipec":11,"garobrik":6,"johannesparty":6,"josebui":2,"shrouxm":1},"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":35,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/paulschreiber"},{"login":"garobrik","count":7,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/garobrik"},{"login":"shrouxm","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/shrouxm"}]},"events":{"total":{"DeleteEvent":290,"PullRequestEvent":677,"ForkEvent":1,"IssuesEvent":51,"WatchEvent":1,"IssueCommentEvent":99,"PushEvent":514,"PullRequestReviewCommentEvent":97,"PullRequestReviewEvent":324,"CreateEvent":309},"last_year":{"DeleteEvent":188,"PullRequestEvent":462,"ForkEvent":1,"IssuesEvent":30,"IssueCommentEvent":74,"PushEvent":319,"PullRequestReviewCommentEvent":63,"PullRequestReviewEvent":222,"CreateEvent":206}},"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.467942332285852,"created_at":"2023-09-11T11:54:36.798Z","updated_at":"2026-04-15T06:30:31.669Z","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\n\n```sh\n$ cp .env.sample .env\n```\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## 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"}