Django-BulkSMS-BD


NameDjango-BulkSMS-BD JSON
Version 0.1.0 PyPI version JSON
download
home_pagehttps://github.com/sharf-shawon/django-bulksms-bd
SummaryA Django package for integrating with BulkSMSBD.net SMS API
upload_time2025-06-22 21:29:48
maintainerNone
docs_urlNone
authorSharfuddin Shawon
requires_python>=3.8
licenseMIT License Copyright (c) 2025 Sharfuddin Shawon Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
keywords django sms bulksms bangladesh api messaging verification notifications otp
VCS
bugtrack_url
requirements Django requests urllib3
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Django BulkSMS BD

A comprehensive Django package for integrating with the BulkSMSBD.net API to send SMS messages easily and reliably.

## Features

- **Easy Integration**: Simple setup with Django settings
- **Multiple SMS Types**: Support for single SMS, bulk SMS, and OTP messages
- **Robust Error Handling**: Comprehensive exception handling with meaningful error messages
- **Retry Mechanism**: Built-in retry logic with exponential backoff
- **Request Logging**: Optional logging of all API requests and responses
- **Phone Number Validation**: Automatic validation and formatting of Bangladesh phone numbers
- **Cost Estimation**: Estimate SMS costs before sending
- **Database Tracking**: Optional database models to track SMS history
- **Management Commands**: Django management commands for testing
- **Comprehensive Testing**: Full test suite with mocking support

## Installation

### 1. Install the Package

```bash
pip install django-bulksms-bd
```

### 2. Add to Django Settings

Add the app to your `INSTALLED_APPS` in `settings.py`:

```python
INSTALLED_APPS = [
    # ... your other apps
    'bulksms',
]
```

### 3. Configure API Credentials

Add your BulkSMS BD credentials to your Django settings:

```python
# Method 1: Individual settings
BULKSMS_API_KEY = 'your_api_key_here'
BULKSMS_SENDER_ID = 'your_sender_id'

# Method 2: Dictionary configuration
BULKSMS = {
    'API_KEY': 'your_api_key_here',
    'SENDER_ID': 'your_sender_id',
    'TIMEOUT': 30,
    'MAX_RETRIES': 3,
    'VERIFY_SSL': False,
}
```

### 4. Run Migrations (Optional)

If you want to use the database tracking features:

```bash
python manage.py migrate
```

## Quick Start

### Basic SMS Sending

```python
from bulksms.client import BulkSMSClient

# Initialize client (uses settings from Django configuration)
client = BulkSMSClient()

# Send a single SMS
response = client.send_sms(
    phone_numbers='01712345678',
    message='Hello from Django BulkSMS BD!'
)

print(f"SMS sent successfully: {response}")
```

### Bulk SMS Sending

```python
# Send to multiple recipients with the same message
response = client.send_sms(
    phone_numbers=['01712345678', '01812345678', '01912345678'],
    message='Hello everyone!'
)

# Send different messages to different recipients
messages = [
    {'to': '01712345678', 'message': 'Hello John!'},
    {'to': '01812345678', 'message': 'Hello Jane!'},
    {'to': '01912345678', 'message': 'Hello Bob!'},
]

response = client.send_bulk_sms(messages)
```

### OTP Messages

```python
# Send OTP with proper formatting
response = client.send_otp(
    phone_number='01712345678',
    otp_code='123456',
    brand_name='Your Company'
)
# This sends: "Your Your Company OTP is 123456"
```

### Check Account Balance

```python
balance_info = client.get_balance()
print(f"Account balance: {balance_info}")
```

## Configuration Options

| Setting | Description | Default |
|---------|-------------|---------|
| `BULKSMS_API_KEY` | Your BulkSMS BD API key | Required |
| `BULKSMS_SENDER_ID` | Your approved sender ID | Required |
| `BULKSMS_TIMEOUT` | Request timeout in seconds | 30 |
| `BULKSMS_MAX_RETRIES` | Maximum retry attempts | 3 |
| `BULKSMS_BACKOFF_FACTOR` | Retry backoff factor | 0.5 |
| `BULKSMS_VERIFY_SSL` | Verify SSL certificates | False |
| `BULKSMS_BASE_COST_PER_SMS` | Cost per SMS for estimation | 0.50 |
| `BULKSMS_LOG_REQUESTS` | Log API requests | True |
| `BULKSMS_SAVE_TO_DATABASE` | Save SMS to database | True |

## Error Handling

The package provides comprehensive error handling with specific exception types:

```python
from bulksms.exceptions import (
    BulkSMSAPIError,
    BulkSMSValidationError,
    BulkSMSNetworkError,
    BulkSMSConfigurationError,
)

try:
    response = client.send_sms('01712345678', 'Test message')
except BulkSMSValidationError as e:
    print(f"Validation error: {e}")
except BulkSMSAPIError as e:
    print(f"API error: {e} (Code: {e.error_code})")
except BulkSMSNetworkError as e:
    print(f"Network error: {e}")
except BulkSMSConfigurationError as e:
    print(f"Configuration error: {e}")
```

## Management Commands

### Test SMS Functionality

```bash
# Test connection
python manage.py test_sms --test-connection

# Check balance
python manage.py test_sms --balance

# Send test SMS
python manage.py test_sms --phone 01712345678 --message "Test message"

# Send test OTP
python manage.py test_sms --phone 01712345678 --otp 123456
```

## Django Integration Examples

### In Django Views

```python
from django.shortcuts import render
from django.contrib import messages
from bulksms.client import BulkSMSClient
from bulksms.exceptions import BulkSMSError

def send_notification(request):
    if request.method == 'POST':
        phone = request.POST.get('phone')
        message = request.POST.get('message')
        
        try:
            client = BulkSMSClient()
            response = client.send_sms(phone, message)
            messages.success(request, 'SMS sent successfully!')
        except BulkSMSError as e:
            messages.error(request, f'Failed to send SMS: {e}')
    
    return render(request, 'send_sms.html')
```

### In Django Signals

```python
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth.models import User
from bulksms.client import BulkSMSClient

@receiver(post_save, sender=User)
def send_welcome_sms(sender, instance, created, **kwargs):
    if created and instance.profile.phone_number:
        try:
            client = BulkSMSClient()
            client.send_sms(
                instance.profile.phone_number,
                f'Welcome to our platform, {instance.first_name}!'
            )
        except Exception as e:
            # Log error but don't fail user creation
            import logging
            logger = logging.getLogger(__name__)
            logger.error(f"Failed to send welcome SMS: {e}")
```

### With Celery (Async)

```python
from celery import shared_task
from bulksms.client import BulkSMSClient

@shared_task
def send_sms_async(phone_numbers, message):
    """Send SMS asynchronously using Celery."""
    try:
        client = BulkSMSClient()
        response = client.send_sms(phone_numbers, message)
        return {'success': True, 'response': response}
    except Exception as e:
        return {'success': False, 'error': str(e)}

# Usage
send_sms_async.delay(['01712345678'], 'Your order has been confirmed!')
```

## Database Models

The package includes optional Django models for tracking SMS history:

- `SMSMessage`: Track individual SMS messages
- `BulkSMSBatch`: Track bulk SMS batches
- `SMSTemplate`: Store reusable SMS templates
- `APIUsageLog`: Log API usage for monitoring
- `SMSBlacklist`: Manage blacklisted phone numbers

### Using SMS Templates

```python
from bulksms.models import SMSTemplate

# Create a template
template = SMSTemplate.objects.create(
    name='welcome_message',
    template_type='welcome',
    content='Welcome {name}! Your account has been created successfully.'
)

# Use the template
message = template.render(name='John Doe')
client.send_sms('01712345678', message)
```

## Testing

The package includes comprehensive tests. Run them with:

```bash
# Install development dependencies
pip install -e ".[dev]"

# Run tests
python -m pytest

# Run tests with coverage
python -m pytest --cov=bulksms
```

## API Reference

### BulkSMSClient

#### Methods

- `send_sms(phone_numbers, message, sender_id=None)`: Send SMS to one or more recipients
- `send_bulk_sms(messages, sender_id=None)`: Send different messages to different recipients
- `send_otp(phone_number, otp_code, brand_name, sender_id=None)`: Send OTP message
- `get_balance()`: Check account balance
- `test_connection()`: Test API connectivity

#### Error Codes

The API returns various error codes. The package handles these automatically:

| Code | Meaning |
|------|---------|
| 202 | SMS Submitted Successfully |
| 1001 | Invalid Number |
| 1002 | Sender ID not correct/disabled |
| 1007 | Balance Insufficient |
| 1011 | User ID not found |
| 1032 | IP Not whitelisted |

## Contributing

1. Fork the repository
2. Create a feature branch
3. Make your changes
4. Add tests for new functionality
5. Run the test suite
6. Submit a pull request

## License

This project is licensed under the MIT License - see the LICENSE file for details.

## Support

For support and questions:

- Create an issue on GitHub
- Check the documentation
- Review the examples in the `examples/` directory

## Changelog

### Version 1.0.0
- Initial release
- Basic SMS sending functionality
- Bulk SMS support
- OTP message support
- Error handling and retry logic
- Django integration
- Database models for tracking
- Management commands
- Comprehensive test suite

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/sharf-shawon/django-bulksms-bd",
    "name": "Django-BulkSMS-BD",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": "Sharfuddin Shawon <sharf@shawon.me>",
    "keywords": "django, sms, bulksms, bangladesh, api, messaging, verification, notifications, OTP",
    "author": "Sharfuddin Shawon",
    "author_email": "Sharfuddin Shawon <sharf@shawon.me>",
    "download_url": "https://files.pythonhosted.org/packages/f3/34/78a6a5a637a5b8081276c820d554c8cabb19a06328518a03e674d03e9d0e/django_bulksms_bd-0.1.0.tar.gz",
    "platform": null,
    "description": "# Django BulkSMS BD\n\nA comprehensive Django package for integrating with the BulkSMSBD.net API to send SMS messages easily and reliably.\n\n## Features\n\n- **Easy Integration**: Simple setup with Django settings\n- **Multiple SMS Types**: Support for single SMS, bulk SMS, and OTP messages\n- **Robust Error Handling**: Comprehensive exception handling with meaningful error messages\n- **Retry Mechanism**: Built-in retry logic with exponential backoff\n- **Request Logging**: Optional logging of all API requests and responses\n- **Phone Number Validation**: Automatic validation and formatting of Bangladesh phone numbers\n- **Cost Estimation**: Estimate SMS costs before sending\n- **Database Tracking**: Optional database models to track SMS history\n- **Management Commands**: Django management commands for testing\n- **Comprehensive Testing**: Full test suite with mocking support\n\n## Installation\n\n### 1. Install the Package\n\n```bash\npip install django-bulksms-bd\n```\n\n### 2. Add to Django Settings\n\nAdd the app to your `INSTALLED_APPS` in `settings.py`:\n\n```python\nINSTALLED_APPS = [\n    # ... your other apps\n    'bulksms',\n]\n```\n\n### 3. Configure API Credentials\n\nAdd your BulkSMS BD credentials to your Django settings:\n\n```python\n# Method 1: Individual settings\nBULKSMS_API_KEY = 'your_api_key_here'\nBULKSMS_SENDER_ID = 'your_sender_id'\n\n# Method 2: Dictionary configuration\nBULKSMS = {\n    'API_KEY': 'your_api_key_here',\n    'SENDER_ID': 'your_sender_id',\n    'TIMEOUT': 30,\n    'MAX_RETRIES': 3,\n    'VERIFY_SSL': False,\n}\n```\n\n### 4. Run Migrations (Optional)\n\nIf you want to use the database tracking features:\n\n```bash\npython manage.py migrate\n```\n\n## Quick Start\n\n### Basic SMS Sending\n\n```python\nfrom bulksms.client import BulkSMSClient\n\n# Initialize client (uses settings from Django configuration)\nclient = BulkSMSClient()\n\n# Send a single SMS\nresponse = client.send_sms(\n    phone_numbers='01712345678',\n    message='Hello from Django BulkSMS BD!'\n)\n\nprint(f\"SMS sent successfully: {response}\")\n```\n\n### Bulk SMS Sending\n\n```python\n# Send to multiple recipients with the same message\nresponse = client.send_sms(\n    phone_numbers=['01712345678', '01812345678', '01912345678'],\n    message='Hello everyone!'\n)\n\n# Send different messages to different recipients\nmessages = [\n    {'to': '01712345678', 'message': 'Hello John!'},\n    {'to': '01812345678', 'message': 'Hello Jane!'},\n    {'to': '01912345678', 'message': 'Hello Bob!'},\n]\n\nresponse = client.send_bulk_sms(messages)\n```\n\n### OTP Messages\n\n```python\n# Send OTP with proper formatting\nresponse = client.send_otp(\n    phone_number='01712345678',\n    otp_code='123456',\n    brand_name='Your Company'\n)\n# This sends: \"Your Your Company OTP is 123456\"\n```\n\n### Check Account Balance\n\n```python\nbalance_info = client.get_balance()\nprint(f\"Account balance: {balance_info}\")\n```\n\n## Configuration Options\n\n| Setting | Description | Default |\n|---------|-------------|---------|\n| `BULKSMS_API_KEY` | Your BulkSMS BD API key | Required |\n| `BULKSMS_SENDER_ID` | Your approved sender ID | Required |\n| `BULKSMS_TIMEOUT` | Request timeout in seconds | 30 |\n| `BULKSMS_MAX_RETRIES` | Maximum retry attempts | 3 |\n| `BULKSMS_BACKOFF_FACTOR` | Retry backoff factor | 0.5 |\n| `BULKSMS_VERIFY_SSL` | Verify SSL certificates | False |\n| `BULKSMS_BASE_COST_PER_SMS` | Cost per SMS for estimation | 0.50 |\n| `BULKSMS_LOG_REQUESTS` | Log API requests | True |\n| `BULKSMS_SAVE_TO_DATABASE` | Save SMS to database | True |\n\n## Error Handling\n\nThe package provides comprehensive error handling with specific exception types:\n\n```python\nfrom bulksms.exceptions import (\n    BulkSMSAPIError,\n    BulkSMSValidationError,\n    BulkSMSNetworkError,\n    BulkSMSConfigurationError,\n)\n\ntry:\n    response = client.send_sms('01712345678', 'Test message')\nexcept BulkSMSValidationError as e:\n    print(f\"Validation error: {e}\")\nexcept BulkSMSAPIError as e:\n    print(f\"API error: {e} (Code: {e.error_code})\")\nexcept BulkSMSNetworkError as e:\n    print(f\"Network error: {e}\")\nexcept BulkSMSConfigurationError as e:\n    print(f\"Configuration error: {e}\")\n```\n\n## Management Commands\n\n### Test SMS Functionality\n\n```bash\n# Test connection\npython manage.py test_sms --test-connection\n\n# Check balance\npython manage.py test_sms --balance\n\n# Send test SMS\npython manage.py test_sms --phone 01712345678 --message \"Test message\"\n\n# Send test OTP\npython manage.py test_sms --phone 01712345678 --otp 123456\n```\n\n## Django Integration Examples\n\n### In Django Views\n\n```python\nfrom django.shortcuts import render\nfrom django.contrib import messages\nfrom bulksms.client import BulkSMSClient\nfrom bulksms.exceptions import BulkSMSError\n\ndef send_notification(request):\n    if request.method == 'POST':\n        phone = request.POST.get('phone')\n        message = request.POST.get('message')\n        \n        try:\n            client = BulkSMSClient()\n            response = client.send_sms(phone, message)\n            messages.success(request, 'SMS sent successfully!')\n        except BulkSMSError as e:\n            messages.error(request, f'Failed to send SMS: {e}')\n    \n    return render(request, 'send_sms.html')\n```\n\n### In Django Signals\n\n```python\nfrom django.db.models.signals import post_save\nfrom django.dispatch import receiver\nfrom django.contrib.auth.models import User\nfrom bulksms.client import BulkSMSClient\n\n@receiver(post_save, sender=User)\ndef send_welcome_sms(sender, instance, created, **kwargs):\n    if created and instance.profile.phone_number:\n        try:\n            client = BulkSMSClient()\n            client.send_sms(\n                instance.profile.phone_number,\n                f'Welcome to our platform, {instance.first_name}!'\n            )\n        except Exception as e:\n            # Log error but don't fail user creation\n            import logging\n            logger = logging.getLogger(__name__)\n            logger.error(f\"Failed to send welcome SMS: {e}\")\n```\n\n### With Celery (Async)\n\n```python\nfrom celery import shared_task\nfrom bulksms.client import BulkSMSClient\n\n@shared_task\ndef send_sms_async(phone_numbers, message):\n    \"\"\"Send SMS asynchronously using Celery.\"\"\"\n    try:\n        client = BulkSMSClient()\n        response = client.send_sms(phone_numbers, message)\n        return {'success': True, 'response': response}\n    except Exception as e:\n        return {'success': False, 'error': str(e)}\n\n# Usage\nsend_sms_async.delay(['01712345678'], 'Your order has been confirmed!')\n```\n\n## Database Models\n\nThe package includes optional Django models for tracking SMS history:\n\n- `SMSMessage`: Track individual SMS messages\n- `BulkSMSBatch`: Track bulk SMS batches\n- `SMSTemplate`: Store reusable SMS templates\n- `APIUsageLog`: Log API usage for monitoring\n- `SMSBlacklist`: Manage blacklisted phone numbers\n\n### Using SMS Templates\n\n```python\nfrom bulksms.models import SMSTemplate\n\n# Create a template\ntemplate = SMSTemplate.objects.create(\n    name='welcome_message',\n    template_type='welcome',\n    content='Welcome {name}! Your account has been created successfully.'\n)\n\n# Use the template\nmessage = template.render(name='John Doe')\nclient.send_sms('01712345678', message)\n```\n\n## Testing\n\nThe package includes comprehensive tests. Run them with:\n\n```bash\n# Install development dependencies\npip install -e \".[dev]\"\n\n# Run tests\npython -m pytest\n\n# Run tests with coverage\npython -m pytest --cov=bulksms\n```\n\n## API Reference\n\n### BulkSMSClient\n\n#### Methods\n\n- `send_sms(phone_numbers, message, sender_id=None)`: Send SMS to one or more recipients\n- `send_bulk_sms(messages, sender_id=None)`: Send different messages to different recipients\n- `send_otp(phone_number, otp_code, brand_name, sender_id=None)`: Send OTP message\n- `get_balance()`: Check account balance\n- `test_connection()`: Test API connectivity\n\n#### Error Codes\n\nThe API returns various error codes. The package handles these automatically:\n\n| Code | Meaning |\n|------|---------|\n| 202 | SMS Submitted Successfully |\n| 1001 | Invalid Number |\n| 1002 | Sender ID not correct/disabled |\n| 1007 | Balance Insufficient |\n| 1011 | User ID not found |\n| 1032 | IP Not whitelisted |\n\n## Contributing\n\n1. Fork the repository\n2. Create a feature branch\n3. Make your changes\n4. Add tests for new functionality\n5. Run the test suite\n6. Submit a pull request\n\n## License\n\nThis project is licensed under the MIT License - see the LICENSE file for details.\n\n## Support\n\nFor support and questions:\n\n- Create an issue on GitHub\n- Check the documentation\n- Review the examples in the `examples/` directory\n\n## Changelog\n\n### Version 1.0.0\n- Initial release\n- Basic SMS sending functionality\n- Bulk SMS support\n- OTP message support\n- Error handling and retry logic\n- Django integration\n- Database models for tracking\n- Management commands\n- Comprehensive test suite\n",
    "bugtrack_url": null,
    "license": "MIT License\n        \n        Copyright (c) 2025 Sharfuddin Shawon\n        \n        Permission is hereby granted, free of charge, to any person obtaining a copy\n        of this software and associated documentation files (the \"Software\"), to deal\n        in the Software without restriction, including without limitation the rights\n        to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n        copies of the Software, and to permit persons to whom the Software is\n        furnished to do so, subject to the following conditions:\n        \n        The above copyright notice and this permission notice shall be included in all\n        copies or substantial portions of the Software.\n        \n        THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n        IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n        FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n        AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n        LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n        OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n        SOFTWARE.\n        ",
    "summary": "A Django package for integrating with BulkSMSBD.net SMS API",
    "version": "0.1.0",
    "project_urls": {
        "Bug Tracker": "https://github.com/sharf-shawon/django-bulksms-bd/issues",
        "Changelog": "https://github.com/sharf-shawon/django-bulksms-bd/blob/main/CHANGELOG.md",
        "Homepage": "https://github.com/sharf-shawon/django-bulksms-bd",
        "Repository": "https://github.com/sharf-shawon/django-bulksms-bd.git"
    },
    "split_keywords": [
        "django",
        " sms",
        " bulksms",
        " bangladesh",
        " api",
        " messaging",
        " verification",
        " notifications",
        " otp"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "87644ac95493281ce08d9ca49454f46cac146b017a34c875618fe34520b17d76",
                "md5": "b82dc9678ed7b4dd906d3ad1ffba95da",
                "sha256": "b2126021e478749c57b2926db8026a31fd20af10eded80a53a706b8db96a08d4"
            },
            "downloads": -1,
            "filename": "django_bulksms_bd-0.1.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "b82dc9678ed7b4dd906d3ad1ffba95da",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 18779,
            "upload_time": "2025-06-22T21:29:47",
            "upload_time_iso_8601": "2025-06-22T21:29:47.086159Z",
            "url": "https://files.pythonhosted.org/packages/87/64/4ac95493281ce08d9ca49454f46cac146b017a34c875618fe34520b17d76/django_bulksms_bd-0.1.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f33478a6a5a637a5b8081276c820d554c8cabb19a06328518a03e674d03e9d0e",
                "md5": "2f7a681669ca4919ec8fa7873cbf97cf",
                "sha256": "b2f3e47bec686fb9feca1089eec0c9e069ed55e0b3240f0f5b0da43a701be334"
            },
            "downloads": -1,
            "filename": "django_bulksms_bd-0.1.0.tar.gz",
            "has_sig": false,
            "md5_digest": "2f7a681669ca4919ec8fa7873cbf97cf",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 26675,
            "upload_time": "2025-06-22T21:29:48",
            "upload_time_iso_8601": "2025-06-22T21:29:48.596000Z",
            "url": "https://files.pythonhosted.org/packages/f3/34/78a6a5a637a5b8081276c820d554c8cabb19a06328518a03e674d03e9d0e/django_bulksms_bd-0.1.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-06-22 21:29:48",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "sharf-shawon",
    "github_project": "django-bulksms-bd",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [
        {
            "name": "Django",
            "specs": [
                [
                    ">=",
                    "3.2"
                ]
            ]
        },
        {
            "name": "requests",
            "specs": [
                [
                    ">=",
                    "2.25.0"
                ]
            ]
        },
        {
            "name": "urllib3",
            "specs": [
                [
                    ">=",
                    "1.26.0"
                ]
            ]
        }
    ],
    "lcname": "django-bulksms-bd"
}
        
Elapsed time: 1.41589s