{"id":13813988,"url":"https://github.com/djaodjin/djaodjin-saas","last_synced_at":"2025-05-14T15:03:38.336Z","repository":{"id":8341132,"uuid":"9898720","full_name":"djaodjin/djaodjin-saas","owner":"djaodjin","description":"Django application for software-as-service and subscription businesses","archived":false,"fork":false,"pushed_at":"2025-04-09T21:07:59.000Z","size":6814,"stargazers_count":585,"open_issues_count":16,"forks_count":129,"subscribers_count":23,"default_branch":"main","last_synced_at":"2025-04-09T22:21:31.178Z","etag":null,"topics":["django","plans","razorpay","saas","stripe","subscriptions"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/djaodjin.png","metadata":{"files":{"readme":"README.md","changelog":"changelog","contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"docs/security.rst","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2013-05-06T22:43:32.000Z","updated_at":"2025-04-09T21:08:03.000Z","dependencies_parsed_at":"2024-03-19T17:51:18.376Z","dependency_job_id":"47b194fc-a03b-41da-8a3a-fc440c1b84f7","html_url":"https://github.com/djaodjin/djaodjin-saas","commit_stats":{"total_commits":1521,"total_committers":10,"mean_commits":152.1,"dds":0.2859960552268245,"last_synced_commit":"e50ad91ae9f0b59732b2fffcbc537c4485431d1e"},"previous_names":[],"tags_count":72,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/djaodjin%2Fdjaodjin-saas","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/djaodjin%2Fdjaodjin-saas/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/djaodjin%2Fdjaodjin-saas/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/djaodjin%2Fdjaodjin-saas/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/djaodjin","download_url":"https://codeload.github.com/djaodjin/djaodjin-saas/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248676320,"owners_count":21143906,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["django","plans","razorpay","saas","stripe","subscriptions"],"created_at":"2024-08-04T04:01:39.198Z","updated_at":"2025-04-13T07:21:22.515Z","avatar_url":"https://github.com/djaodjin.png","language":"Python","funding_links":[],"categories":["Python"],"sub_categories":[],"readme":"DjaoDjin-SaaS\n=============\n\n[![Documentation Status](https://readthedocs.org/projects/djaodjin-saas/badge/?version=latest)](https://djaodjin-saas.readthedocs.io/en/latest/?badge=latest)\n[![PyPI version](https://badge.fury.io/py/djaodjin-saas.svg)](https://badge.fury.io/py/djaodjin-saas)\n\ndjaodjin-saas is a Django application that implements the logic to support\nsubscription-based Software-as-a-Service businesses.\n\nMajor Features:\n\n- Separate billing profiles and authenticated users\n- Double entry book keeping ledger\n- Flexible security framework\n\nThis project contains bare bone templates which are compatible with Django\nand Jinja2 template engines. To see djaodjin-saas in action as part\nof a full-fledged subscription-based session proxy, take a look\nat [djaoapp](https://github.com/djaodjin/djaoapp/).\n\nFull documentation for the project is available at\n[Read-the-Docs](http://djaodjin-saas.readthedocs.org/)\n\n\nDevelopment\n===========\n\nAfter cloning the repository, create a virtualenv environment and install\nthe prerequisites:\n\n\u003cpre\u003e\u003ccode\u003e\n    $ python -m venv .venv\n    $ source .venv/bin/activate\n    $ pip install -r testsite/requirements.txt\n\n    # Installs Javascript prerequisites to run in the browser\n    $ make vendor-assets-prerequisites\n\n\u003c/code\u003e\u003c/pre\u003e\n\nTo use the testsite, you will need to add the payment processor keys\n(see [Processor Backends](http://djaodjin-saas.readthedocs.io/en/latest/backends.html))\nand Django secret key into a credentials file. Example with\n[Stripe](https://stripe.com/):\n\n\u003cpre\u003e\u003ccode\u003e\n    $ cat ./credentials\n\n    SECRET_KEY = \"\u003cem\u003eenough_random_data\u003c/em\u003e\"\n    STRIPE_PUB_KEY = \"\u003cem\u003eyour_stripe_public_api_key\u003c/em\u003e\"\n    STRIPE_PRIV_KEY = \"\u003cem\u003eyour_stripe_private_api_key\u003c/em\u003e\"\n\n\u003c/code\u003e\u003c/pre\u003e\n\nIt remains to create and [populate the database with required objects](https://djaodjin-saas.readthedocs.io/en/latest/getting-started.html#setting-up-a-software-as-a-service-site).\n\n    $ python ./manage.py migrate --run-syncdb --noinput\n    $ python ./manage.py loaddata testsite/fixtures/initial_data.json\n    $ python ./manage.py createsuperuser\n\nYou can further generate a set of dummy data data to populate the site.\n\n    $ python ./manage.py load_test_transactions\n\nSide note: If create your own fixtures file (ex: testsite/fixtures/test_data.json)\nand attempt to load them with a Django version *before* 2 while the Python\nexecutable was linked with a SQLite version *after* 3.25, you might stumble upon\nthe well-known [SQLite 3.26 breaks database migration ForeignKey constraint, leaving \u003ctable_name\u003e__old in db schema](http://djaodjin.com/blog/django-2-2-with-sqlite-3-on-centos-7.blog.html#sqlite-django-compatibility) bug.\nYour best bet is to use Django2+ or delete the migrations/ directory.\n\nIf all is well then, you are ready to run the server and browse the testsite.\n\n    $ python manage.py runserver\n\n    # Browse http://localhost:8000/\n\n\nImplementation Notes\n--------------------\n\nThe latest versions of django-restframework (\u003e=3.0) implement paginators\ndisconnected from parameters in  views (i.e. no more paginate_by). You will\nthus need to define ``PAGE_SIZE`` in your settings.py\n\n    $ diff testsite/settings.py\n    +REST_FRAMEWORK = {\n    +    'PAGE_SIZE': 25,\n    +    'DEFAULT_PAGINATION_CLASS':\n    +        'rest_framework.pagination.PageNumberPagination',\n    +}\n\nThis Django App does not send notification e-mails itself. All major\nupdates that would result in a e-mail sent trigger signals though. It is\nstraightforward to send e-mails on a signal trigger in the main\nDjango project. We provide sample e-mail templates here in the\nsaas/templates/notification/ directory.\n\n\nRelease Notes\n=============\n\nTested with\n\n- **Python:** 3.10, **Django:** 4.2 ([LTS](https://www.djangoproject.com/download/))\n- **Python:** 3.12, **Django:** 5.1 (next)\n- **Python:** 3.7, **Django:** 3.2 (legacy)\n\n1.1.1\n\n  * handles edge cases when DEFAULT_FROM_EMAIL is empty or None\n  * reworks profile redirect view workflow in the presence of various roles\n  * matches `DELETE /api/cart` for cookies and db\n  * defines Stripe platform keys vs. Stripe broker keys explicitely\n  * passes request in context of `product_url`\n\n[previous release notes](changelog)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdjaodjin%2Fdjaodjin-saas","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdjaodjin%2Fdjaodjin-saas","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdjaodjin%2Fdjaodjin-saas/lists"}