| Name | django-salestrack JSON |
| Version |
1.0.5
JSON |
| download |
| home_page | https://github.com/sortstring/django-salestrack |
| Summary | A Django app for tracking sales personnel, distributors, and retailers with Google Maps integration |
| upload_time | 2025-10-27 00:29:55 |
| maintainer | None |
| docs_url | None |
| author | Parijat Srivastava |
| requires_python | >=3.8 |
| license | MIT License
Copyright (c) 2025 SalesTrack Contributors
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
sales
tracking
maps
google-maps
distributor
retailer
|
| VCS |
 |
| bugtrack_url |
|
| requirements |
No requirements were recorded.
|
| Travis-CI |
No Travis.
|
| coveralls test coverage |
No coveralls.
|
# Django SalesTrack
A comprehensive Django app for tracking sales personnel, distributors, and retailers with Google Maps integration and advanced filtering capabilities.
## Features
- **Multi-tier Tracking**: Track employees, distributors, and retailers with hierarchical relationships
- **Google Maps Integration**: Interactive map visualization with custom markers and clustering
- **Advanced Filtering**: Dynamic filter controls with individual marker counts
- **Performance Optimized**: Bulk database queries and efficient data loading for large datasets
- **Activity Tracking**: Log and visualize sales activities and visits
- **GeoJSON Support**: Export tracking data in GeoJSON format
- **Responsive UI**: Mobile-friendly interface with dynamic control states
## Installation
### 1. Install the package
**Basic installation:**
```bash
pip install django-salestrack
```
**With MySQL support:**
```bash
pip install django-salestrack[mysql]
```
**With REST API support:**
```bash
pip install django-salestrack[api]
```
**Full installation:**
```bash
pip install django-salestrack[mysql,api]
```
### 2. Add to Django settings
Add `'salestrack'` to your `INSTALLED_APPS` in `settings.py`:
```python
INSTALLED_APPS = [
...
'salestrack',
...
]
```
### 3. Configure URLs
Include the salestrack URLs in your main `urls.py`:
```python
from django.urls import path, include
urlpatterns = [
...
path('salestrack/', include('salestrack.urls')),
...
]
```
### 4. Database Setup
This app requires specific database models. Make sure you have models similar to:
- `SpUsers` - User/Employee model
- `SpVisits` - Visit tracking model
- `SpUserVisits` - User visit relationships
- `SpActivityLogs` - Activity logging model
- `SpUserTracking` - Tracking Related model
- `SpBeatPlan` - Beat Plan Related model
## Configuration
### Required Settings
Add these settings to your Django `settings.py`:
```python
# Google Maps API Key (required)
GOOGLE_MAPS_API_KEY = 'your-google-maps-api-key'
# Database configuration (MySQL recommended)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'your_database_name',
'USER': 'your_database_user',
'PASSWORD': 'your_database_password',
'HOST': 'localhost',
'PORT': '3306',
'OPTIONS': {
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"
}
}
}
```
### Optional Settings
```python
# Customize marker clustering (optional)
SALESTRACK_CLUSTER_MARKERS = True
SALESTRACK_MAX_MARKERS_PER_REQUEST = 1000
# Performance settings (optional)
SALESTRACK_BATCH_SIZE = 500
SALESTRACK_CACHE_TIMEOUT = 300 # seconds
```
## Usage
### Basic Setup
1. **Access the tracking interface**:
Navigate to `/salestrack/` in your application
2. **API Endpoints**:
- `/salestrack/user-markers/` - Get marker data
- `/salestrack/tracks.geo` - Get GeoJSON track data
### Model Requirements
Your models should follow this structure:
```python
# Example model structure (adapt to your needs)
class SpUsers(AbstractBaseUser):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
emp_sap_id = models.CharField(max_length=50)
store_name = models.CharField(max_length=255, blank=True, null=True)
latitude = models.CharField(max_length=100, blank=True, null=True)
longitude = models.CharField(max_length=100, blank=True, null=True)
created_at = models.DateTimeField(auto_now_add=True)
reporting_to_id = models.IntegerField()
class SpVisits(models.Model):
user = models.ForeignKey('SpUsers', on_delete=models.SET_NULL, blank=True, null=True)
outlet_id = models.IntegerField()
beat_id = models.IntegerField()
checkin_datetime = models.DateTimeField()
checkout_datetime = models.DateTimeField(blank=True, null=True)
visit_status = models.IntegerField()
quotation_status = models.IntegerField()
reason_id = models.IntegerField(blank=True, null=True)
reason_remark = models.CharField(max_length=250, blank=True, null=True)
total_retail_time = models.TimeField(blank=True, null=True)
no_order = models.IntegerField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class SpUserVisits(models.Model):
user = models.ForeignKey(
SpUsers,
on_delete=models.CASCADE,
related_name="distributor_visits",
null=True,
blank=True
)
employee = models.ForeignKey(
SpUsers,
on_delete=models.CASCADE,
related_name="employee_visits",
null=True,
blank=True
)
checkin_datetime = models.DateTimeField()
checkout_datetime = models.DateTimeField(blank=True, null=True)
visit_status = models.IntegerField()
latitude = models.CharField(max_length=100, blank=True, null=True)
longitude = models.CharField(max_length=100, blank=True, null=True)
reason_remark = models.CharField(max_length=250, blank=True, null=True)
total_retail_time = models.TimeField(blank=True, null=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class SpActivityLogs(models.Model):
module = models.CharField(max_length=100, blank=True, null=True)
sub_module = models.CharField(max_length=100, blank=True, null=True)
heading = models.TextField()
activity = models.TextField()
user = models.ForeignKey('SpUsers', on_delete=models.CASCADE, related_name='activity_logs')
user_name = models.CharField(max_length=150)
icon = models.CharField(max_length=100, blank=True, null=True)
platform = models.CharField(max_length=50)
status = models.IntegerField(default=1)
platform_icon = models.CharField(max_length=100)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
latitude = models.CharField(max_length=100, blank=True, null=True)
longitude = models.CharField(max_length=100, blank=True, null=True)
class SpUserTracking(models.Model):
user = models.ForeignKey('SpUsers', on_delete=models.CASCADE, related_name="tracks")
latitude = models.CharField(max_length=25, blank=True, null=True)
longitude = models.CharField(max_length=25, blank=True, null=True)
accuracy = models.FloatField(blank=True, null=True)
velocity = models.FloatField(blank=True, null=True)
distance_travelled = models.FloatField(blank=True, null=True)
sync_date_time = models.DateTimeField(blank=True, null=True)
flag = models.IntegerField(default=0, blank=True, null=True)
travel_charges = models.FloatField(blank=True, null=True)
message = models.CharField(max_length=222, blank=True, null=True)
status = models.CharField(max_length=45, blank=True, null=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
battery_percentage = models.IntegerField(blank=True, null=True)
class SpBeatPlan(models.Model):
user_id = models.IntegerField()
activity_type_id = models.IntegerField()
activity_type_name = models.CharField(max_length=70)
distributor_id = models.IntegerField()
distributor_name = models.CharField(max_length=60)
store_name = models.CharField(max_length=60,null=True,blank=True)
employee_id = models.IntegerField(default=0)
beat_id = models.IntegerField()
beat_name = models.CharField(max_length=70)
scheduled_beat_date = models.DateTimeField()
remark = models.CharField(max_length=250, blank=True, null=True)
beat_status = models.IntegerField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
```
### Frontend Integration
The app includes a complete Google Maps interface with:
- Dynamic marker loading and filtering
- Marker type toggles with individual counts
- Performance optimizations for large datasets
- Automatic control state management during API calls
## API Reference
### GET /user-markers/
Returns marker data for map visualization.
**Parameters:**
- `date` (optional): Filter by specific date (YYYY-MM-DD format)
**Response:**
```json
{
"employees": [...],
"distributors": [...],
"retailers": [...],
"activities": [...]
}
```
### GET /tracks.geo
Returns GeoJSON formatted tracking data.
**Parameters:**
- `date` (optional): Filter by specific date
**Response:**
```json
{
"type": "FeatureCollection",
"features": [...]
}
```
## Performance Considerations
- The app is optimized for datasets with 7,000+ markers
- Uses bulk database queries to minimize N+1 problems
- Implements client-side batching for large marker sets
- Includes control disable/enable during API calls
## Dependencies
**Core dependencies:**
- Django >= 3.2 (compatible with Django 3.2, 4.x, and 5.x)
- requests >= 2.20.0
- python-dateutil >= 2.7.0
**Optional dependencies:**
- mysqlclient >= 2.0.0 (install with `[mysql]`)
- django-mysql >= 4.5.0 (install with `[mysql]`)
- djangorestframework >= 3.13.0 (install with `[api]`)
## Browser Support
- Chrome 60+
- Firefox 60+
- Safari 12+
- Edge 79+
## License
MIT License
## Contributing
1. Fork the repository
2. Create your feature branch (`git checkout -b feature/amazing-feature`)
3. Commit your changes (`git commit -m 'Add some amazing feature'`)
4. Push to the branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request
## Support
For support, please open an issue in the GitHub repository or contact the maintainers.
Raw data
{
"_id": null,
"home_page": "https://github.com/sortstring/django-salestrack",
"name": "django-salestrack",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "django, sales, tracking, maps, google-maps, distributor, retailer",
"author": "Parijat Srivastava",
"author_email": "Parijat Srivastava <parijat.shrivastava@sortstring.com>",
"download_url": "https://files.pythonhosted.org/packages/36/f2/8b1d06ea08c7ff4e4ac77c05ae216904b5413da6628bc31ed0eb476fabbd/django_salestrack-1.0.5.tar.gz",
"platform": null,
"description": "# Django SalesTrack\n\nA comprehensive Django app for tracking sales personnel, distributors, and retailers with Google Maps integration and advanced filtering capabilities.\n\n## Features\n\n- **Multi-tier Tracking**: Track employees, distributors, and retailers with hierarchical relationships\n- **Google Maps Integration**: Interactive map visualization with custom markers and clustering\n- **Advanced Filtering**: Dynamic filter controls with individual marker counts\n- **Performance Optimized**: Bulk database queries and efficient data loading for large datasets\n- **Activity Tracking**: Log and visualize sales activities and visits\n- **GeoJSON Support**: Export tracking data in GeoJSON format\n- **Responsive UI**: Mobile-friendly interface with dynamic control states\n\n## Installation\n\n### 1. Install the package\n\n**Basic installation:**\n```bash\npip install django-salestrack\n```\n\n**With MySQL support:**\n```bash\npip install django-salestrack[mysql]\n```\n\n**With REST API support:**\n```bash\npip install django-salestrack[api]\n```\n\n**Full installation:**\n```bash\npip install django-salestrack[mysql,api]\n```\n\n### 2. Add to Django settings\n\nAdd `'salestrack'` to your `INSTALLED_APPS` in `settings.py`:\n\n```python\nINSTALLED_APPS = [\n ...\n 'salestrack',\n ...\n]\n```\n\n### 3. Configure URLs\n\nInclude the salestrack URLs in your main `urls.py`:\n\n```python\nfrom django.urls import path, include\n\nurlpatterns = [\n ...\n path('salestrack/', include('salestrack.urls')),\n ...\n]\n```\n\n### 4. Database Setup\n\nThis app requires specific database models. Make sure you have models similar to:\n\n- `SpUsers` - User/Employee model\n- `SpVisits` - Visit tracking model\n- `SpUserVisits` - User visit relationships\n- `SpActivityLogs` - Activity logging model\n- `SpUserTracking` - Tracking Related model\n- `SpBeatPlan` - Beat Plan Related model\n\n\n\n## Configuration\n\n### Required Settings\n\nAdd these settings to your Django `settings.py`:\n\n```python\n# Google Maps API Key (required)\nGOOGLE_MAPS_API_KEY = 'your-google-maps-api-key'\n\n# Database configuration (MySQL recommended)\nDATABASES = {\n 'default': {\n 'ENGINE': 'django.db.backends.mysql',\n 'NAME': 'your_database_name',\n 'USER': 'your_database_user',\n 'PASSWORD': 'your_database_password',\n 'HOST': 'localhost',\n 'PORT': '3306',\n 'OPTIONS': {\n 'init_command': \"SET sql_mode='STRICT_TRANS_TABLES'\"\n }\n }\n}\n```\n\n### Optional Settings\n\n```python\n# Customize marker clustering (optional)\nSALESTRACK_CLUSTER_MARKERS = True\nSALESTRACK_MAX_MARKERS_PER_REQUEST = 1000\n\n# Performance settings (optional)\nSALESTRACK_BATCH_SIZE = 500\nSALESTRACK_CACHE_TIMEOUT = 300 # seconds\n```\n\n## Usage\n\n### Basic Setup\n\n1. **Access the tracking interface**:\n Navigate to `/salestrack/` in your application\n\n2. **API Endpoints**:\n - `/salestrack/user-markers/` - Get marker data\n - `/salestrack/tracks.geo` - Get GeoJSON track data\n\n### Model Requirements\n\nYour models should follow this structure:\n\n```python\n# Example model structure (adapt to your needs)\nclass SpUsers(AbstractBaseUser):\n first_name = models.CharField(max_length=50)\n last_name = models.CharField(max_length=50)\n emp_sap_id = models.CharField(max_length=50)\n store_name = models.CharField(max_length=255, blank=True, null=True)\n latitude = models.CharField(max_length=100, blank=True, null=True)\n longitude = models.CharField(max_length=100, blank=True, null=True)\n created_at = models.DateTimeField(auto_now_add=True)\n reporting_to_id = models.IntegerField()\n\n\n\nclass SpVisits(models.Model):\n user = models.ForeignKey('SpUsers', on_delete=models.SET_NULL, blank=True, null=True)\n outlet_id = models.IntegerField()\n beat_id = models.IntegerField()\n checkin_datetime = models.DateTimeField()\n checkout_datetime = models.DateTimeField(blank=True, null=True)\n visit_status = models.IntegerField()\n quotation_status = models.IntegerField()\n reason_id = models.IntegerField(blank=True, null=True)\n reason_remark = models.CharField(max_length=250, blank=True, null=True)\n total_retail_time = models.TimeField(blank=True, null=True)\n no_order = models.IntegerField()\n created_at = models.DateTimeField(auto_now_add=True)\n updated_at = models.DateTimeField(auto_now=True)\n\n\nclass SpUserVisits(models.Model):\n user = models.ForeignKey(\n SpUsers,\n on_delete=models.CASCADE,\n related_name=\"distributor_visits\",\n null=True,\n blank=True\n )\n\n employee = models.ForeignKey(\n SpUsers,\n on_delete=models.CASCADE,\n related_name=\"employee_visits\",\n null=True,\n blank=True\n )\n checkin_datetime = models.DateTimeField()\n checkout_datetime = models.DateTimeField(blank=True, null=True)\n visit_status = models.IntegerField()\n latitude = models.CharField(max_length=100, blank=True, null=True)\n longitude = models.CharField(max_length=100, blank=True, null=True)\n reason_remark = models.CharField(max_length=250, blank=True, null=True)\n total_retail_time = models.TimeField(blank=True, null=True)\n created_at = models.DateTimeField(auto_now_add=True)\n updated_at = models.DateTimeField(auto_now=True)\n\nclass SpActivityLogs(models.Model):\n module = models.CharField(max_length=100, blank=True, null=True)\n sub_module = models.CharField(max_length=100, blank=True, null=True)\n heading = models.TextField()\n activity = models.TextField()\n user = models.ForeignKey('SpUsers', on_delete=models.CASCADE, related_name='activity_logs')\n user_name = models.CharField(max_length=150)\n icon = models.CharField(max_length=100, blank=True, null=True)\n platform = models.CharField(max_length=50)\n status = models.IntegerField(default=1)\n platform_icon = models.CharField(max_length=100)\n created_at = models.DateTimeField(auto_now_add=True)\n updated_at = models.DateTimeField(auto_now=True)\n latitude = models.CharField(max_length=100, blank=True, null=True)\n longitude = models.CharField(max_length=100, blank=True, null=True)\n\nclass SpUserTracking(models.Model):\n user = models.ForeignKey('SpUsers', on_delete=models.CASCADE, related_name=\"tracks\")\n latitude = models.CharField(max_length=25, blank=True, null=True)\n longitude = models.CharField(max_length=25, blank=True, null=True)\n accuracy = models.FloatField(blank=True, null=True)\n velocity = models.FloatField(blank=True, null=True)\n distance_travelled = models.FloatField(blank=True, null=True)\n sync_date_time = models.DateTimeField(blank=True, null=True)\n flag = models.IntegerField(default=0, blank=True, null=True)\n travel_charges = models.FloatField(blank=True, null=True)\n message = models.CharField(max_length=222, blank=True, null=True)\n status = models.CharField(max_length=45, blank=True, null=True)\n created_at = models.DateTimeField(auto_now_add=True)\n updated_at = models.DateTimeField(auto_now=True)\n battery_percentage = models.IntegerField(blank=True, null=True)\n\nclass SpBeatPlan(models.Model):\n user_id = models.IntegerField()\n activity_type_id = models.IntegerField()\n activity_type_name = models.CharField(max_length=70)\n distributor_id = models.IntegerField()\n distributor_name = models.CharField(max_length=60)\n store_name = models.CharField(max_length=60,null=True,blank=True)\n employee_id = models.IntegerField(default=0)\n beat_id = models.IntegerField()\n beat_name = models.CharField(max_length=70)\n scheduled_beat_date = models.DateTimeField()\n remark = models.CharField(max_length=250, blank=True, null=True)\n beat_status = models.IntegerField()\n created_at = models.DateTimeField(auto_now_add=True)\n updated_at = models.DateTimeField(auto_now=True)\n```\n\n### Frontend Integration\n\nThe app includes a complete Google Maps interface with:\n\n- Dynamic marker loading and filtering\n- Marker type toggles with individual counts\n- Performance optimizations for large datasets\n- Automatic control state management during API calls\n\n## API Reference\n\n### GET /user-markers/\n\nReturns marker data for map visualization.\n\n**Parameters:**\n- `date` (optional): Filter by specific date (YYYY-MM-DD format)\n\n**Response:**\n```json\n{\n \"employees\": [...],\n \"distributors\": [...],\n \"retailers\": [...],\n \"activities\": [...]\n}\n```\n\n### GET /tracks.geo\n\nReturns GeoJSON formatted tracking data.\n\n**Parameters:**\n- `date` (optional): Filter by specific date\n\n**Response:**\n```json\n{\n \"type\": \"FeatureCollection\",\n \"features\": [...]\n}\n```\n\n## Performance Considerations\n\n- The app is optimized for datasets with 7,000+ markers\n- Uses bulk database queries to minimize N+1 problems\n- Implements client-side batching for large marker sets\n- Includes control disable/enable during API calls\n\n## Dependencies\n\n**Core dependencies:**\n- Django >= 3.2 (compatible with Django 3.2, 4.x, and 5.x)\n- requests >= 2.20.0\n- python-dateutil >= 2.7.0\n\n**Optional dependencies:**\n- mysqlclient >= 2.0.0 (install with `[mysql]`)\n- django-mysql >= 4.5.0 (install with `[mysql]`)\n- djangorestframework >= 3.13.0 (install with `[api]`)\n\n## Browser Support\n\n- Chrome 60+\n- Firefox 60+\n- Safari 12+\n- Edge 79+\n\n## License\n\nMIT License\n\n## Contributing\n\n1. Fork the repository\n2. Create your feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -m 'Add some amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n## Support\n\nFor support, please open an issue in the GitHub repository or contact the maintainers.\n",
"bugtrack_url": null,
"license": "MIT License\n \n Copyright (c) 2025 SalesTrack Contributors\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.",
"summary": "A Django app for tracking sales personnel, distributors, and retailers with Google Maps integration",
"version": "1.0.5",
"project_urls": {
"Bug Tracker": "https://github.com/yourusername/django-salestrack/issues",
"Documentation": "https://github.com/yourusername/django-salestrack#readme",
"Homepage": "https://github.com/yourusername/django-salestrack",
"Repository": "https://github.com/yourusername/django-salestrack.git"
},
"split_keywords": [
"django",
" sales",
" tracking",
" maps",
" google-maps",
" distributor",
" retailer"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "c5d59d41032e82df269103ff276d03daafbfcaf068842d20fe86d9e707c755d1",
"md5": "61ab8af4c4f240ac6afaf625cf29eea5",
"sha256": "d34b6f8ed3fe82288da05d19d1c88996095f9672b87f8dc3c0d352639caf0c86"
},
"downloads": -1,
"filename": "django_salestrack-1.0.5-py3-none-any.whl",
"has_sig": false,
"md5_digest": "61ab8af4c4f240ac6afaf625cf29eea5",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 31943,
"upload_time": "2025-10-27T00:29:53",
"upload_time_iso_8601": "2025-10-27T00:29:53.956004Z",
"url": "https://files.pythonhosted.org/packages/c5/d5/9d41032e82df269103ff276d03daafbfcaf068842d20fe86d9e707c755d1/django_salestrack-1.0.5-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "36f28b1d06ea08c7ff4e4ac77c05ae216904b5413da6628bc31ed0eb476fabbd",
"md5": "8feb903ccdc6d2ea8b66a02950a52da8",
"sha256": "08ee90155add38a3b1411e0ff5f7269f94bc8174c59f99c1dafc28f9df1656df"
},
"downloads": -1,
"filename": "django_salestrack-1.0.5.tar.gz",
"has_sig": false,
"md5_digest": "8feb903ccdc6d2ea8b66a02950a52da8",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 30855,
"upload_time": "2025-10-27T00:29:55",
"upload_time_iso_8601": "2025-10-27T00:29:55.787062Z",
"url": "https://files.pythonhosted.org/packages/36/f2/8b1d06ea08c7ff4e4ac77c05ae216904b5413da6628bc31ed0eb476fabbd/django_salestrack-1.0.5.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-10-27 00:29:55",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "sortstring",
"github_project": "django-salestrack",
"github_not_found": true,
"lcname": "django-salestrack"
}