django-salestrack


Namedjango-salestrack JSON
Version 1.0.5 PyPI version JSON
download
home_pagehttps://github.com/sortstring/django-salestrack
SummaryA Django app for tracking sales personnel, distributors, and retailers with Google Maps integration
upload_time2025-10-27 00:29:55
maintainerNone
docs_urlNone
authorParijat Srivastava
requires_python>=3.8
licenseMIT 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"
}
        
Elapsed time: 2.24291s