This package aims to give and easy pluggable module to provide authentication and user maintennance in a Pyramid web application.
It relies the Pyramid+SQLAlchemy+Mako stack. Implementation for other template languages is on the roadmap.
# Installation and setup
## Install the package
Install the package with:
```sh
pip install ppss_auth
```
or put ppss_auth in your app dependencies (setup.py, in the install_requires list of packages)
To activate the package, in your main *\_\_init\_\_.py* file, inside the main function, add this line:
```python
config.include('ppss_auth')
```
in your models include the ppss_auth's models with this line:
```python
from ppss_auth.models import *
```
## Configure the database
This can be a zero-db-conf module:
run the app with _ppss_auth.initdb_ set to True (that is the default for the params, so you can even leave it blank: see configuration, below). You are done with this, unless you need more in-depth initialization (follow reading)
### You want to do it yourself
To init the Tables manually, in the initialization script (usually in *scripts/intializedb.py*), add this row:
```python
from ppss_auth import (models as ppssmodels)
```
and while creating the default data (in the "with transaction.manager" block of code), use something like:
```python
ppssmodels.initdb(dbsession,createdefault=False)
```
This creates the tables and, if *createdefault* evaulates to True, it create a default admin/admin user with the admin permission.
Please change the password to avoid secuirity issues.
You can create some data as well. Refer to [models] section, below, for more info.
## Requirements
When a user login, *essionauthpolicy* is used to store her informations (userid and user groups).
## ini file configuration
ppss_auth use these info from the ini file:
*default user*
- ppss_auth.adminname - the name of a sueruser. Deafult to "admin"
- ppss_auth.adminpass - the corresponding password. If not provided the admin is not allowed to log in (with the ini credentials. It may exist in database)
*predefined permissions, groups, users*
- ppss_auth.permission_list - list of permission, one on each indented row
- ppss_auth.group_list
- ppss_auth.user_list
- ppss_auth.default_password
An example is as follow:
```python
ppss_auth.permission_list =
permision1
permision2
permision3
ppss_auth.group_list =
group1=permision1,permision2
group2=permision1
group3=permision2
ppss_auth.user_list=
user1=group1,group2
iser2=group3
ppss_auth.default_password = temp0r4ryPassword->changeme!
```
*db stuff*
- ppss_auth.initdb [True] - true/false value, tells the lib to init db automatically on first run.
*routes*
- ppss_auth.login_url [/login] - url for login.
- ppss_auth.logout_url [/logout]- url for logout.
*where to land after succesfull login/logout*
- ppss_auth.post_login_follow - try to redirect the browser back to where it came from after successful login (use true case insensitive to activate it). It's useful if combined with the forbidden pattern
- ppss_auth.post_login_route [home] - name of the route where to send the browser after user logged in. Ignored if ppss_auth.post_login_follow is set to true AND there is a referer to go to.
- ppss_auth.post_logout_route - name of the route where to send the browser after log out. Defaults to home
*templates stuff*
You can override all this values and even provide a mako-free environment. This can be a litlle tricky, but there is no hard-coded dependency to mako, just the defaults.
- ppss_auth.logintemplate - name of the login template. It defaults to the internal template: "ppss_auth:/templates/login.mako"
- ppss_auth.changepasswordtemplate - name of the change password template. Defaults to: ppss_auth:/templates/change.mako
- ppss_auth.modifyusertemplate - Defaults to: ppss_auth:/templates/modifyuser.mako
- ppss_auth.listusertemplate - Defaults to: ppss_auth:/templates/listuser.mako
- ppss_auth.logintemplateinherit - Defaults to: ppss_auth:/templates/layout.mako
*look and feel*
- ppss_auth.bootstrapversion - Should 3 or 4, accordind to the the version of bootstrap that the hosting site uses. Defaults to 4
# Things to know (devs only)
## database
Thi package provide the creation and usage of 3 main tables (and the other tables required for ER consistency):
- ppss_user - containing basic information about the users (username, hashed password and related data )
- ppss_group - user groups to allow for easier handling of user groups and permissions
- ppss_permission - a list of permissions (just an id and a name)
## models
### PPSsuser
This represents the user of your application.
She has a _username_, a _password_ and relation to her _groups_. She also has a _enabled_ property and some timestamps (creation times, and similar times).
Use the _setPassword(password)_ method on PPSsuser instances to change the password, providing the new password.
_todict(self)_ is a commodity method to get a dict of the main properties.
### PPSsgroup
This class represnts the groups of your users. It's a many-to-many relation: each user can belong to many groups, and each group can gather many users.
Other than a _name_ and the _enabled_ flag (integer with 1 for enabled), its main user is the many-to-many relation to permissions. This means that all users in the same group share (at least) all the permissions given to the group.
### PPSspermission
This class represents the permissions of the application. You can create new permissions and link them to group. You can use those permissions in the _permission_ attribute of the _view\_config_ decorator to restrict usage of some methods using ACL, or you can check it whenever needed.
# Integrating with existing alembic
- enp.py file
add the following row among the imports:
```python
from ppss_auth.ppss_auth_utils.db import exclude_ppss_auth_tables
```
and use it *run_migrations_offline* function substituting context with:
```python
context.configure(url=settings['sqlalchemy.url'],**exclude_ppss_auth_tables(config))
```
and in *run_migrations_online* substituting context with:
```python
context.configure(
connection=connection,
target_metadata=target_metadata,**exclude_ppss_auth_tables(config)
)
```
add the following to your .ini file, below *alembic* section:
```ini
[alembic:exclude]
tables = module_db_version
pattern = ppss*
*auth*
```
This package aims to give and easy pluggable module to provide authentication and user maintennance in a Pyramid web application.
It relies the Pyramid+SQLAlchemy+Mako stack. Implementation for other template languages is on the roadmap.
# Installation and setup
## Install the package
Install the package with:
```sh
pip install ppss_auth
```
or put ppss_auth in your app dependencies (setup.py, in the install_requires list of packages)
To activate the package, in your main *\_\_init\_\_.py* file, inside the main function, add this line:
```python
config.include('ppss_auth')
```
in your models include the ppss_auth's models with this line:
```python
from ppss_auth.models import *
```
## Configure the database
This can be a zero-db-conf module:
run the app with _ppss_auth.initdb_ set to True (that is the default for the params, so you can even leave it blank: see configuration, below). You are done with this, unless you need more in-depth initialization (follow reading)
### You want to do it yourself
To init the Tables manually, in the initialization script (usually in *scripts/intializedb.py*), add this row:
```python
from ppss_auth import (models as ppssmodels)
```
and while creating the default data (in the "with transaction.manager" block of code), use something like:
```python
ppssmodels.initdb(dbsession,createdefault=False)
```
This creates the tables and, if *createdefault* evaulates to True, it create a default admin/admin user with the admin permission.
Please change the password to avoid secuirity issues.
You can create some data as well. Refer to [models] section, below, for more info.
## Requirements
When a user login, *essionauthpolicy* is used to store her informations (userid and user groups).
## ini file configuration
ppss_auth use these info from the ini file:
*default user*
- ppss_auth.adminname - the name of a sueruser. Deafult to "admin"
- ppss_auth.adminpass - the corresponding password. If not provided the admin is not allowed to log in (with the ini credentials. It may exist in database)
*predefined permissions, groups, users*
- ppss_auth.permission_list - list of permission, one on each indented row
- ppss_auth.group_list
- ppss_auth.user_list
- ppss_auth.default_password
An example is as follow:
```python
ppss_auth.permission_list =
permision1
permision2
permision3
ppss_auth.group_list =
group1=permision1,permision2
group2=permision1
group3=permision2
ppss_auth.user_list=
user1=group1,group2
iser2=group3
ppss_auth.default_password = temp0r4ryPassword->changeme!
```
*db stuff*
- ppss_auth.initdb [True] - true/false value, tells the lib to init db automatically on first run.
*routes*
- ppss_auth.login_url [/login] - url for login.
- ppss_auth.logout_url [/logout]- url for logout.
*where to land after succesfull login/logout*
- ppss_auth.post_login_follow - try to redirect the browser back to where it came from after successful login (use true case insensitive to activate it). It's useful if combined with the forbidden pattern
- ppss_auth.post_login_route [home] - name of the route where to send the browser after user logged in. Ignored if ppss_auth.post_login_follow is set to true AND there is a referer to go to.
- ppss_auth.post_logout_route - name of the route where to send the browser after log out. Defaults to home
*templates stuff*
You can override all this values and even provide a mako-free environment. This can be a litlle tricky, but there is no hard-coded dependency to mako, just the defaults.
- ppss_auth.logintemplate - name of the login template. It defaults to the internal template: "ppss_auth:/templates/login.mako"
- ppss_auth.changepasswordtemplate - name of the change password template. Defaults to: ppss_auth:/templates/change.mako
- ppss_auth.modifyusertemplate - Defaults to: ppss_auth:/templates/modifyuser.mako
- ppss_auth.listusertemplate - Defaults to: ppss_auth:/templates/listuser.mako
- ppss_auth.logintemplateinherit - Defaults to: ppss_auth:/templates/layout.mako
*look and feel*
- ppss_auth.bootstrapversion - Should 3 or 4, accordind to the the version of bootstrap that the hosting site uses. Defaults to 4
# Things to know (devs only)
## database
Thi package provide the creation and usage of 3 main tables (and the other tables required for ER consistency):
- ppss_user - containing basic information about the users (username, hashed password and related data )
- ppss_group - user groups to allow for easier handling of user groups and permissions
- ppss_permission - a list of permissions (just an id and a name)
## models
### PPSsuser
This represents the user of your application.
She has a _username_, a _password_ and relation to her _groups_. She also has a _enabled_ property and some timestamps (creation times, and similar times).
Use the _setPassword(password)_ method on PPSsuser instances to change the password, providing the new password.
_todict(self)_ is a commodity method to get a dict of the main properties.
### PPSsgroup
This class represnts the groups of your users. It's a many-to-many relation: each user can belong to many groups, and each group can gather many users.
Other than a _name_ and the _enabled_ flag (integer with 1 for enabled), its main user is the many-to-many relation to permissions. This means that all users in the same group share (at least) all the permissions given to the group.
### PPSspermission
This class represents the permissions of the application. You can create new permissions and link them to group. You can use those permissions in the _permission_ attribute of the _view\_config_ decorator to restrict usage of some methods using ACL, or you can check it whenever needed.
# Integrating with existing alembic
- enp.py file
add the following row among the imports:
```python
from ppss_auth.ppss_auth_utils.db import exclude_ppss_auth_tables
```
and use it *run_migrations_offline* function substituting context with:
```python
context.configure(url=settings['sqlalchemy.url'],**exclude_ppss_auth_tables(config))
```
and in *run_migrations_online* substituting context with:
```python
context.configure(
connection=connection,
target_metadata=target_metadata,**exclude_ppss_auth_tables(config)
)
```
add the following to your .ini file, below *alembic* section:
```ini
[alembic:exclude]
tables = module_db_version
pattern = ppss*
*auth*
```
Raw data
{
"_id": null,
"home_page": "https://bitbucket.org/pingpongstars/ppss_auth/src/master/",
"name": "ppss-auth",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.6",
"maintainer_email": null,
"keywords": "pyramid module authentication accelerator",
"author": "pdepmcp",
"author_email": "d.cariboni@pingpongstars.it",
"download_url": "https://files.pythonhosted.org/packages/0a/fc/f71cbbfa0e2542966ba76c5666d2b2fdb650086e483ee0f379ef6a7c341c/ppss_auth-0.11.2.0.tar.gz",
"platform": null,
"description": "This package aims to give and easy pluggable module to provide authentication and user maintennance in a Pyramid web application.\nIt relies the Pyramid+SQLAlchemy+Mako stack. Implementation for other template languages is on the roadmap.\n\n\n# Installation and setup\n\n## Install the package\nInstall the package with:\n```sh\n pip install ppss_auth\n```\nor put ppss_auth in your app dependencies (setup.py, in the install_requires list of packages)\n\n\n\nTo activate the package, in your main *\\_\\_init\\_\\_.py* file, inside the main function, add this line: \n```python\n config.include('ppss_auth')\n```\n\nin your models include the ppss_auth's models with this line:\n```python\nfrom ppss_auth.models import *\n```\n\n\n\n## Configure the database\nThis can be a zero-db-conf module:\nrun the app with _ppss_auth.initdb_ set to True (that is the default for the params, so you can even leave it blank: see configuration, below). You are done with this, unless you need more in-depth initialization (follow reading)\n\n\n### You want to do it yourself\n\nTo init the Tables manually, in the initialization script (usually in *scripts/intializedb.py*), add this row:\n```python\n from ppss_auth import (models as ppssmodels)\n```\n\nand while creating the default data (in the \"with transaction.manager\" block of code), use something like:\n```python\n ppssmodels.initdb(dbsession,createdefault=False)\n```\nThis creates the tables and, if *createdefault* evaulates to True, it create a default admin/admin user with the admin permission. \nPlease change the password to avoid secuirity issues.\n\n\nYou can create some data as well. Refer to [models] section, below, for more info.\n\n## Requirements\nWhen a user login, *essionauthpolicy* is used to store her informations (userid and user groups). \n\n\n## ini file configuration \nppss_auth use these info from the ini file:\n\n*default user*\n- ppss_auth.adminname - the name of a sueruser. Deafult to \"admin\"\n- ppss_auth.adminpass - the corresponding password. If not provided the admin is not allowed to log in (with the ini credentials. It may exist in database)\n\n*predefined permissions, groups, users*\n\n- ppss_auth.permission_list - list of permission, one on each indented row\n- ppss_auth.group_list\n- ppss_auth.user_list\n- ppss_auth.default_password\n\nAn example is as follow: \n\n```python\n ppss_auth.permission_list =\n permision1\n permision2\n permision3\n ppss_auth.group_list =\n group1=permision1,permision2\n group2=permision1\n group3=permision2\n ppss_auth.user_list=\n user1=group1,group2\n iser2=group3\n ppss_auth.default_password = temp0r4ryPassword->changeme!\n```\n\n\n*db stuff*\n- ppss_auth.initdb [True] - true/false value, tells the lib to init db automatically on first run.\n\n\n*routes*\n- ppss_auth.login_url [/login] - url for login.\n- ppss_auth.logout_url [/logout]- url for logout.\n\n*where to land after succesfull login/logout*\n- ppss_auth.post_login_follow - try to redirect the browser back to where it came from after successful login (use true case insensitive to activate it). It's useful if combined with the forbidden pattern\n- ppss_auth.post_login_route [home] - name of the route where to send the browser after user logged in. Ignored if ppss_auth.post_login_follow is set to true AND there is a referer to go to.\n- ppss_auth.post_logout_route - name of the route where to send the browser after log out. Defaults to home\n\n*templates stuff*\nYou can override all this values and even provide a mako-free environment. This can be a litlle tricky, but there is no hard-coded dependency to mako, just the defaults.\n\n- ppss_auth.logintemplate - name of the login template. It defaults to the internal template: \"ppss_auth:/templates/login.mako\"\n- ppss_auth.changepasswordtemplate - name of the change password template. Defaults to: ppss_auth:/templates/change.mako\n- ppss_auth.modifyusertemplate - Defaults to: ppss_auth:/templates/modifyuser.mako\n- ppss_auth.listusertemplate - Defaults to: ppss_auth:/templates/listuser.mako\n- ppss_auth.logintemplateinherit - Defaults to: ppss_auth:/templates/layout.mako\n\n\n*look and feel*\n\n- ppss_auth.bootstrapversion - Should 3 or 4, accordind to the the version of bootstrap that the hosting site uses. Defaults to 4\n\n# Things to know (devs only)\n\n## database\nThi package provide the creation and usage of 3 main tables (and the other tables required for ER consistency):\n- ppss_user - containing basic information about the users (username, hashed password and related data )\n- ppss_group - user groups to allow for easier handling of user groups and permissions\n- ppss_permission - a list of permissions (just an id and a name)\n\n## models\n\n### PPSsuser\n\nThis represents the user of your application.\nShe has a _username_, a _password_ and relation to her _groups_. She also has a _enabled_ property and some timestamps (creation times, and similar times).\n\nUse the _setPassword(password)_ method on PPSsuser instances to change the password, providing the new password.\n\n_todict(self)_ is a commodity method to get a dict of the main properties.\n\n### PPSsgroup\n\nThis class represnts the groups of your users. It's a many-to-many relation: each user can belong to many groups, and each group can gather many users.\nOther than a _name_ and the _enabled_ flag (integer with 1 for enabled), its main user is the many-to-many relation to permissions. This means that all users in the same group share (at least) all the permissions given to the group.\n\n### PPSspermission\n\nThis class represents the permissions of the application. You can create new permissions and link them to group. You can use those permissions in the _permission_ attribute of the _view\\_config_ decorator to restrict usage of some methods using ACL, or you can check it whenever needed.\n\n\n\n# Integrating with existing alembic\n\n- enp.py file\nadd the following row among the imports:\n```python\nfrom ppss_auth.ppss_auth_utils.db import exclude_ppss_auth_tables\n```\n\nand use it *run_migrations_offline* function substituting context with:\n\n```python\ncontext.configure(url=settings['sqlalchemy.url'],**exclude_ppss_auth_tables(config))\n```\n\nand in *run_migrations_online* substituting context with:\n\n```python\ncontext.configure(\n connection=connection,\n target_metadata=target_metadata,**exclude_ppss_auth_tables(config)\n)\n```\n\nadd the following to your .ini file, below *alembic* section:\n\n```ini\n[alembic:exclude]\ntables = module_db_version\npattern = ppss*\n *auth*\n```\n\n\nThis package aims to give and easy pluggable module to provide authentication and user maintennance in a Pyramid web application.\nIt relies the Pyramid+SQLAlchemy+Mako stack. Implementation for other template languages is on the roadmap.\n\n\n# Installation and setup\n\n## Install the package\nInstall the package with:\n```sh\n pip install ppss_auth\n```\nor put ppss_auth in your app dependencies (setup.py, in the install_requires list of packages)\n\n\n\nTo activate the package, in your main *\\_\\_init\\_\\_.py* file, inside the main function, add this line: \n```python\n config.include('ppss_auth')\n```\n\nin your models include the ppss_auth's models with this line:\n```python\nfrom ppss_auth.models import *\n```\n\n\n\n## Configure the database\nThis can be a zero-db-conf module:\nrun the app with _ppss_auth.initdb_ set to True (that is the default for the params, so you can even leave it blank: see configuration, below). You are done with this, unless you need more in-depth initialization (follow reading)\n\n\n### You want to do it yourself\n\nTo init the Tables manually, in the initialization script (usually in *scripts/intializedb.py*), add this row:\n```python\n from ppss_auth import (models as ppssmodels)\n```\n\nand while creating the default data (in the \"with transaction.manager\" block of code), use something like:\n```python\n ppssmodels.initdb(dbsession,createdefault=False)\n```\nThis creates the tables and, if *createdefault* evaulates to True, it create a default admin/admin user with the admin permission. \nPlease change the password to avoid secuirity issues.\n\n\nYou can create some data as well. Refer to [models] section, below, for more info.\n\n## Requirements\nWhen a user login, *essionauthpolicy* is used to store her informations (userid and user groups). \n\n\n## ini file configuration \nppss_auth use these info from the ini file:\n\n*default user*\n- ppss_auth.adminname - the name of a sueruser. Deafult to \"admin\"\n- ppss_auth.adminpass - the corresponding password. If not provided the admin is not allowed to log in (with the ini credentials. It may exist in database)\n\n*predefined permissions, groups, users*\n\n- ppss_auth.permission_list - list of permission, one on each indented row\n- ppss_auth.group_list\n- ppss_auth.user_list\n- ppss_auth.default_password\n\nAn example is as follow: \n\n```python\n ppss_auth.permission_list =\n permision1\n permision2\n permision3\n ppss_auth.group_list =\n group1=permision1,permision2\n group2=permision1\n group3=permision2\n ppss_auth.user_list=\n user1=group1,group2\n iser2=group3\n ppss_auth.default_password = temp0r4ryPassword->changeme!\n```\n\n\n*db stuff*\n- ppss_auth.initdb [True] - true/false value, tells the lib to init db automatically on first run.\n\n\n*routes*\n- ppss_auth.login_url [/login] - url for login.\n- ppss_auth.logout_url [/logout]- url for logout.\n\n*where to land after succesfull login/logout*\n- ppss_auth.post_login_follow - try to redirect the browser back to where it came from after successful login (use true case insensitive to activate it). It's useful if combined with the forbidden pattern\n- ppss_auth.post_login_route [home] - name of the route where to send the browser after user logged in. Ignored if ppss_auth.post_login_follow is set to true AND there is a referer to go to.\n- ppss_auth.post_logout_route - name of the route where to send the browser after log out. Defaults to home\n\n*templates stuff*\nYou can override all this values and even provide a mako-free environment. This can be a litlle tricky, but there is no hard-coded dependency to mako, just the defaults.\n\n- ppss_auth.logintemplate - name of the login template. It defaults to the internal template: \"ppss_auth:/templates/login.mako\"\n- ppss_auth.changepasswordtemplate - name of the change password template. Defaults to: ppss_auth:/templates/change.mako\n- ppss_auth.modifyusertemplate - Defaults to: ppss_auth:/templates/modifyuser.mako\n- ppss_auth.listusertemplate - Defaults to: ppss_auth:/templates/listuser.mako\n- ppss_auth.logintemplateinherit - Defaults to: ppss_auth:/templates/layout.mako\n\n\n*look and feel*\n\n- ppss_auth.bootstrapversion - Should 3 or 4, accordind to the the version of bootstrap that the hosting site uses. Defaults to 4\n\n# Things to know (devs only)\n\n## database\nThi package provide the creation and usage of 3 main tables (and the other tables required for ER consistency):\n- ppss_user - containing basic information about the users (username, hashed password and related data )\n- ppss_group - user groups to allow for easier handling of user groups and permissions\n- ppss_permission - a list of permissions (just an id and a name)\n\n## models\n\n### PPSsuser\n\nThis represents the user of your application.\nShe has a _username_, a _password_ and relation to her _groups_. She also has a _enabled_ property and some timestamps (creation times, and similar times).\n\nUse the _setPassword(password)_ method on PPSsuser instances to change the password, providing the new password.\n\n_todict(self)_ is a commodity method to get a dict of the main properties.\n\n### PPSsgroup\n\nThis class represnts the groups of your users. It's a many-to-many relation: each user can belong to many groups, and each group can gather many users.\nOther than a _name_ and the _enabled_ flag (integer with 1 for enabled), its main user is the many-to-many relation to permissions. This means that all users in the same group share (at least) all the permissions given to the group.\n\n### PPSspermission\n\nThis class represents the permissions of the application. You can create new permissions and link them to group. You can use those permissions in the _permission_ attribute of the _view\\_config_ decorator to restrict usage of some methods using ACL, or you can check it whenever needed.\n\n\n\n# Integrating with existing alembic\n\n- enp.py file\nadd the following row among the imports:\n```python\nfrom ppss_auth.ppss_auth_utils.db import exclude_ppss_auth_tables\n```\n\nand use it *run_migrations_offline* function substituting context with:\n\n```python\ncontext.configure(url=settings['sqlalchemy.url'],**exclude_ppss_auth_tables(config))\n```\n\nand in *run_migrations_online* substituting context with:\n\n```python\ncontext.configure(\n connection=connection,\n target_metadata=target_metadata,**exclude_ppss_auth_tables(config)\n)\n```\n\nadd the following to your .ini file, below *alembic* section:\n\n```ini\n[alembic:exclude]\ntables = module_db_version\npattern = ppss*\n *auth*\n```\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "simple auth scheme for pyramid, based on Mako template and sqlalchemy backend",
"version": "0.11.2.0",
"project_urls": {
"Homepage": "https://bitbucket.org/pingpongstars/ppss_auth/src/master/"
},
"split_keywords": [
"pyramid",
"module",
"authentication",
"accelerator"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "0afcf71cbbfa0e2542966ba76c5666d2b2fdb650086e483ee0f379ef6a7c341c",
"md5": "2663e688dc9615eaf97abbc46b1be6cb",
"sha256": "16afdc1bbb59ce7d56b1cdaba3d9cd7bd82ed9665e9b7665002e769690f6933e"
},
"downloads": -1,
"filename": "ppss_auth-0.11.2.0.tar.gz",
"has_sig": false,
"md5_digest": "2663e688dc9615eaf97abbc46b1be6cb",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.6",
"size": 52423,
"upload_time": "2024-05-17T08:47:06",
"upload_time_iso_8601": "2024-05-17T08:47:06.850872Z",
"url": "https://files.pythonhosted.org/packages/0a/fc/f71cbbfa0e2542966ba76c5666d2b2fdb650086e483ee0f379ef6a7c341c/ppss_auth-0.11.2.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-05-17 08:47:06",
"github": false,
"gitlab": false,
"bitbucket": true,
"codeberg": false,
"bitbucket_user": "pingpongstars",
"bitbucket_project": "ppss_auth",
"lcname": "ppss-auth"
}