sysnet-gov-django 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. sysnet_gov_django-0.1.0/PKG-INFO +9 -0
  2. sysnet_gov_django-0.1.0/README.md +46 -0
  3. sysnet_gov_django-0.1.0/VERSION +1 -0
  4. sysnet_gov_django-0.1.0/docs/COMPONENTS.md +64 -0
  5. sysnet_gov_django-0.1.0/pyproject.toml +20 -0
  6. sysnet_gov_django-0.1.0/scripts/sync_ui.py +43 -0
  7. sysnet_gov_django-0.1.0/sysnet_gov_django/apps.py +6 -0
  8. sysnet_gov_django-0.1.0/sysnet_gov_django/components/button/button.html +6 -0
  9. sysnet_gov_django-0.1.0/sysnet_gov_django/components/button/button.py +14 -0
  10. sysnet_gov_django-0.1.0/sysnet_gov_django/components/card/card.html +18 -0
  11. sysnet_gov_django-0.1.0/sysnet_gov_django/components/card/card.py +11 -0
  12. sysnet_gov_django-0.1.0/sysnet_gov_django/components/field/field.html +22 -0
  13. sysnet_gov_django-0.1.0/sysnet_gov_django/components/field/field.py +15 -0
  14. sysnet_gov_django-0.1.0/sysnet_gov_django/components/form/layout.html +34 -0
  15. sysnet_gov_django-0.1.0/sysnet_gov_django/components/form/layout.py +10 -0
  16. sysnet_gov_django-0.1.0/sysnet_gov_django/components/sidebar/sidebar.html +16 -0
  17. sysnet_gov_django-0.1.0/sysnet_gov_django/components/sidebar/sidebar.py +11 -0
  18. sysnet_gov_django-0.1.0/sysnet_gov_django/components/table/table.html +24 -0
  19. sysnet_gov_django-0.1.0/sysnet_gov_django/components/table/table.py +14 -0
  20. sysnet_gov_django-0.1.0/sysnet_gov_django/forms.py +19 -0
  21. sysnet_gov_django-0.1.0/sysnet_gov_django/static/gov_django/css/components.css +1 -0
  22. sysnet_gov_django-0.1.0/sysnet_gov_django/static/gov_django/css/tokens.css +36 -0
  23. sysnet_gov_django-0.1.0/sysnet_gov_django/static/gov_django/js/main.js +1 -0
  24. sysnet_gov_django-0.1.0/sysnet_gov_django/templates/gov_django/components/button.html +6 -0
  25. sysnet_gov_django-0.1.0/sysnet_gov_django/templatetags/gov_tags.py +22 -0
  26. sysnet_gov_django-0.1.0/uv.lock +242 -0
@@ -0,0 +1,9 @@
1
+ Metadata-Version: 2.4
2
+ Name: sysnet-gov-django
3
+ Version: 0.1.0
4
+ Summary: Django UI library for Gov.cz projects based on GDS 4 tokens
5
+ Author-email: Radim Jäger <rjaeger@sysnet.cz>
6
+ Requires-Python: >=3.12
7
+ Requires-Dist: django-components>=0.100
8
+ Requires-Dist: django-htmx>=1.17.0
9
+ Requires-Dist: django>=5.0
@@ -0,0 +1,46 @@
1
+ # sysnet-gov-django
2
+
3
+ Django UI knihovna založená na **Gov.cz Design Systému (v4)**.
4
+ Tato knihovna neimplementuje business logiku, ale poskytuje Django Template Tags a šablony pro rychlou tvorbu GDS compliant rozhraní přímo v Django šablonách (SSR).
5
+
6
+ Vychází z designových tokenů definovaných v [sysnet-gov-ui](../sysnet-gov-ui/).
7
+
8
+ ## Instalace
9
+ ```bash
10
+ pip install sysnet-gov-django
11
+ ```
12
+
13
+ ## Použití
14
+ V `settings.py`:
15
+ ```python
16
+ INSTALLED_APPS = [
17
+ ...,
18
+ "django_components",
19
+ "sysnet_gov_django",
20
+ ]
21
+
22
+ # Pro django-components v settings.py
23
+ COMPONENTS = {
24
+ "libraries": [
25
+ "sysnet_gov_django.components.button.button",
26
+ "sysnet_gov_django.components.card.card",
27
+ "sysnet_gov_django.components.form.layout",
28
+ "sysnet_gov_django.components.sidebar.sidebar",
29
+ "sysnet_gov_django.components.field.field",
30
+ "sysnet_gov_django.components.table.table",
31
+ ],
32
+ }
33
+ ```
34
+
35
+ V šabloně:
36
+ ```html
37
+ {% load gov_tags %}
38
+
39
+ {% gov_alert text="Systém je v údržbě" type="warning" title="Pozor" %}
40
+ {% gov_button text="Uložit data" type="primary" %}
41
+ ```
42
+
43
+ ## Obsah
44
+ - `sysnet_gov_django/templatetags/` — Template tagy mapované na GDS komponenty.
45
+ - `sysnet_gov_django/templates/gov_django/` — HTML šablony komponent.
46
+ - `sysnet_gov_django/static/gov_django/` — CSS/JS (vygenerované ze sysnet-gov-ui).
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,64 @@
1
+ # sysnet-gov-django: Dokumentace UI knihovny
2
+
3
+ Knihovna implementuje **Gov.cz Design System (v4)** pro prostředí **Django SSR** pomocí frameworku `django-components`.
4
+
5
+ ## Architektura
6
+ Projekt je postaven na komponentovém přístupu:
7
+ - Každý prvek je zapouzdřen do třídy `Component` pod `sysnet_gov_django/components/`.
8
+ - Podpora **slotů** umožňuje vkládání libovolného obsahu do komponent.
9
+ - Integrace s **Django Forms** skrze `GovFormMixin`.
10
+
11
+ ## Komponenty
12
+
13
+ ### 1. GovLayout (`{% component "gov_layout" %}`)
14
+ Základní master template. Definujte v něm strukturu celé aplikace.
15
+ **Sloty:** `head`, `header`, `content`, `footer`, `scripts`.
16
+
17
+ ### 2. GovSidebar (`{% component "gov_sidebar" %}`)
18
+ Postranní navigace se slotem pro libovolný obsah menu.
19
+ ```html
20
+ {% component "gov_sidebar" menu_items=menu %}
21
+ {% fill "content" %}
22
+ <!-- Vlastní HTML menu v případě potřeby -->
23
+ {% endfill %}
24
+ {% endcomponent %}
25
+ ```
26
+
27
+ ### 3. GovField (`{% component "gov_field" %}`)
28
+ Obal formulářového prvku s labelem, help textem a validací.
29
+ ```html
30
+ {% component "gov_field" label="Jméno" name="first_name" required=True %}
31
+ {% fill "input" %}
32
+ <input type="text" name="first_name" id="id_first_name" class="gov-input">
33
+ {% endfill %}
34
+ {% endcomponent %}
35
+ ```
36
+
37
+ ### 4. GovCard (`{% component "gov_card" %}`)
38
+ Strukturovaný box.
39
+ **Sloty:** `header_actions`, `content`, `footer`.
40
+
41
+ ## Integrace s Django Forms
42
+ Použijte `GovFormMixin` ve svých třídách formulářů:
43
+ ```python
44
+ from sysnet_gov_django.forms import GovFormMixin
45
+ from django import forms
46
+
47
+ class MyForm(GovFormMixin, forms.Form):
48
+ name = forms.CharField(label="Jméno")
49
+ ```
50
+ Při renderování v šabloně:
51
+ ```html
52
+ <form method="post">
53
+ {% csrf_token %}
54
+ {{ form.as_p }} <!-- Alternativně renderujte pole přes gov_field -->
55
+ </form>
56
+ ```
57
+
58
+ ## Statické soubory
59
+ Knihovna očekává existenci následujících souborů ve složce `static/gov_django/`:
60
+ - `tokens.css`: Designové tokeny (barvy, spacing).
61
+ - `components.css`: Styly komponent.
62
+ - `main.js`: Interaktivita.
63
+
64
+ Tyto soubory jsou sdíleny s projektem `sysnet-gov-ui`.
@@ -0,0 +1,20 @@
1
+ [project]
2
+ name = "sysnet-gov-django"
3
+ version = "0.1.0"
4
+ description = "Django UI library for Gov.cz projects based on GDS 4 tokens"
5
+ authors = [
6
+ { name = "Radim Jäger", email = "rjaeger@sysnet.cz" }
7
+ ]
8
+ requires-python = ">=3.12"
9
+ dependencies = [
10
+ "django>=5.0",
11
+ "django-components>=0.100",
12
+ "django-htmx>=1.17.0",
13
+ ]
14
+
15
+ [build-system]
16
+ requires = ["hatchling"]
17
+ build-backend = "hatchling.build"
18
+
19
+ [tool.hatch.build.targets.wheel]
20
+ packages = ["sysnet_gov_django"]
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env python3
2
+ import shutil
3
+ from pathlib import Path
4
+
5
+ # Cesty k projektům
6
+ PROJECT_ROOT = Path(__file__).resolve().parent.parent
7
+ UI_PROJECT = PROJECT_ROOT.parent / "sysnet-gov-ui"
8
+ STATIC_ROOT = PROJECT_ROOT / "sysnet_gov_django" / "static" / "gov_django"
9
+
10
+ def sync_assets():
11
+ print(f"🔄 Synchronizace assetů z sysnet-gov-ui...")
12
+
13
+ if not UI_PROJECT.exists():
14
+ print(f"❌ Chyba: Projekt sysnet-gov-ui nebyl nalezen v {UI_PROJECT}")
15
+ return
16
+
17
+ # Mapování souborů: (zdroj v UI -> cíl v Django lib)
18
+ # Předpoklad: UI projekt má buildované CSS/JS nebo linkujeme na zdrojové tokeny
19
+ mapping = {
20
+ UI_PROJECT / "src" / "assets" / "css" / "tokens.css": STATIC_ROOT / "css" / "tokens.css",
21
+ # Sem přidáme další soubory po buildu UI (dist/assets/...)
22
+ }
23
+
24
+ STATIC_ROOT.mkdir(parents=True, exist_ok=True)
25
+ (STATIC_ROOT / "css").mkdir(exist_ok=True)
26
+ (STATIC_ROOT / "js").mkdir(exist_ok=True)
27
+
28
+ for src, dst in mapping.items():
29
+ if src.exists():
30
+ shutil.copy2(src, dst)
31
+ print(f"✅ Zkopírováno: {src.name} -> {dst}")
32
+ else:
33
+ print(f"⚠️ Varování: Soubor {src} neexistuje.")
34
+
35
+ # Vytvoření placeholderů pro chybějící soubory, aby build neselhal
36
+ for missing in ["css/components.css", "js/main.js"]:
37
+ f = STATIC_ROOT / missing
38
+ if not f.exists():
39
+ f.write_text("/* Placeholder */")
40
+ print(f"📝 Vytvořen placeholder: {missing}")
41
+
42
+ if __name__ == "__main__":
43
+ sync_assets()
@@ -0,0 +1,6 @@
1
+ from django.apps import AppConfig
2
+
3
+ class SysnetGovDjangoConfig(AppConfig):
4
+ default_auto_field = 'django.db.models.BigAutoField'
5
+ name = 'sysnet_gov_django'
6
+ verbose_name = 'Sysnet Gov Django UI'
@@ -0,0 +1,6 @@
1
+ <button
2
+ class="gov-button gov-button--{{ type }} gov-button--{{ size }}"
3
+ {% if disabled %}disabled{% endif %}
4
+ {% for key, value in attrs.items %}{{ key }}="{{ value }}" {% endfor %}>
5
+ {{ text }}
6
+ </button>
@@ -0,0 +1,14 @@
1
+ from django_components import component
2
+
3
+ @component.register("gov_button")
4
+ class GovButton(component.Component):
5
+ template_name = "button/button.html"
6
+
7
+ def get_context_data(self, text, type="primary", size="md", disabled=False, **kwargs):
8
+ return {
9
+ "text": text,
10
+ "type": type,
11
+ "size": size,
12
+ "disabled": disabled,
13
+ "attrs": kwargs
14
+ }
@@ -0,0 +1,18 @@
1
+ <div class="gov-card" {% for key, value in attrs.items %}{{ key }}="{{ value }}" {% endfor %}>
2
+ {% if title %}
3
+ <div class="gov-card__header">
4
+ <h3 class="gov-card__title">{{ title }}</h3>
5
+ {% if_slot "header_actions" %}
6
+ <div class="gov-card__actions">{% slot "header_actions" %}{% endslot %}</div>
7
+ {% endif_slot %}
8
+ </div>
9
+ {% endif %}
10
+ <div class="gov-card__content">
11
+ {% slot "content" %}{% endslot %}
12
+ </div>
13
+ {% if_slot "footer" %}
14
+ <div class="gov-card__footer">
15
+ {% slot "footer" %}{% endslot %}
16
+ </div>
17
+ {% endif_slot %}
18
+ </div>
@@ -0,0 +1,11 @@
1
+ from django_components import component
2
+
3
+ @component.register("gov_card")
4
+ class GovCard(component.Component):
5
+ template_name = "card/card.html"
6
+
7
+ def get_context_data(self, title=None, **kwargs):
8
+ return {
9
+ "title": title,
10
+ "attrs": kwargs
11
+ }
@@ -0,0 +1,22 @@
1
+ <div class="gov-form-field {% if errors %}gov-form-field--error{% endif %}" {% for key, value in attrs.items %}{{ key }}="{{ value }}" {% endfor %}>
2
+ <label for="id_{{ name }}" class="gov-form-field__label">
3
+ {{ label }}
4
+ {% if required %}<span class="gov-form-field__required">*</span>{% endif %}
5
+ </label>
6
+
7
+ <div class="gov-form-field__control">
8
+ {% slot "input" %}{% endslot %}
9
+ </div>
10
+
11
+ {% if help_text %}
12
+ <p class="gov-form-field__help">{{ help_text }}</p>
13
+ {% endif %}
14
+
15
+ {% if errors %}
16
+ <ul class="gov-form-field__errors">
17
+ {% for error in errors %}
18
+ <li class="gov-form-field__error-item">{{ error }}</li>
19
+ {% endfor %}
20
+ </ul>
21
+ {% endif %}
22
+ </div>
@@ -0,0 +1,15 @@
1
+ from django_components import component
2
+
3
+ @component.register("gov_field")
4
+ class GovField(component.Component):
5
+ template_name = "field/field.html"
6
+
7
+ def get_context_data(self, label, name, help_text=None, errors=None, required=False, **kwargs):
8
+ return {
9
+ "label": label,
10
+ "name": name,
11
+ "help_text": help_text,
12
+ "errors": errors,
13
+ "required": required,
14
+ "attrs": kwargs
15
+ }
@@ -0,0 +1,34 @@
1
+ <!DOCTYPE html>
2
+ <html lang="cs">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>{{ page_title }}</title>
7
+ <link rel="stylesheet" href="{% static 'gov_django/tokens.css' %}">
8
+ <link rel="stylesheet" href="{% static 'gov_django/components.css' %}">
9
+ {% slot "head" %}{% endslot %}
10
+ </head>
11
+ <body class="gov-body">
12
+ <header class="gov-header">
13
+ {% slot "header" %}
14
+ <div class="gov-container">
15
+ <span class="gov-brand">{{ page_title }}</span>
16
+ </div>
17
+ {% endslot %}
18
+ </header>
19
+
20
+ <main class="gov-main gov-container">
21
+ {% slot "content" %}{% endslot %}
22
+ </main>
23
+
24
+ <footer class="gov-footer">
25
+ <div class="gov-container">
26
+ {% slot "footer" %}&copy; {% now "Y" %} SYSNET s.r.o.{% endslot %}
27
+ </div>
28
+ </footer>
29
+
30
+ <script src="https://unpkg.com/htmx.org@1.9.10"></script>
31
+ <script src="{% static 'gov_django/main.js' %}"></script>
32
+ {% slot "scripts" %}{% endslot %}
33
+ </body>
34
+ </html>
@@ -0,0 +1,10 @@
1
+ from django_components import component
2
+
3
+ @component.register("gov_layout")
4
+ class GovLayout(component.Component):
5
+ template_name = "form/layout.html" # Dočasně v form/ dokud neudělám layout/
6
+
7
+ def get_context_data(self, page_title="Gov Project", **kwargs):
8
+ return {
9
+ "page_title": page_title,
10
+ }
@@ -0,0 +1,16 @@
1
+ <aside class="gov-sidebar" {% for key, value in attrs.items %}{{ key }}="{{ value }}" {% endfor %}>
2
+ <nav class="gov-sidebar__nav">
3
+ {% slot "content" %}
4
+ <ul class="gov-sidebar__list">
5
+ {% for item in menu_items %}
6
+ <li class="gov-sidebar__item">
7
+ <a href="{{ item.url }}" class="gov-sidebar__link {% if item.active %}gov-sidebar__link--active{% endif %}">
8
+ {% if item.icon %}<i class="gov-icon gov-icon--{{ item.icon }}"></i>{% endif %}
9
+ <span class="gov-sidebar__text">{{ item.label }}</span>
10
+ </a>
11
+ </li>
12
+ {% endfor %}
13
+ </ul>
14
+ {% endslot %}
15
+ </nav>
16
+ </aside>
@@ -0,0 +1,11 @@
1
+ from django_components import component
2
+
3
+ @component.register("gov_sidebar")
4
+ class GovSidebar(component.Component):
5
+ template_name = "sidebar/sidebar.html"
6
+
7
+ def get_context_data(self, menu_items=None, **kwargs):
8
+ return {
9
+ "menu_items": menu_items or [],
10
+ "attrs": kwargs
11
+ }
@@ -0,0 +1,24 @@
1
+ <div class="gov-table-container" {% if hx_target %}hx-target="{{ hx_target }}"{% endif %} {% if hx_url %}hx-get="{{ hx_url }}" hx-trigger="load delay:100ms" {% endif %}>
2
+ <table class="gov-table" {% for key, value in attrs.items %}{{ key }}="{{ value }}" {% endfor %}>
3
+ <thead class="gov-table__head">
4
+ <tr class="gov-table__row">
5
+ {% for header in headers %}
6
+ <th class="gov-table__cell gov-table__cell--header">{{ header }}</th>
7
+ {% endfor %}
8
+ </tr>
9
+ </thead>
10
+ <tbody class="gov-table__body">
11
+ {% for row in rows %}
12
+ <tr class="gov-table__row">
13
+ {% for cell in row %}
14
+ <td class="gov-table__cell">{{ cell }}</td>
15
+ {% endfor %}
16
+ </tr>
17
+ {% empty %}
18
+ <tr class="gov-table__row">
19
+ <td class="gov-table__cell" colspan="{{ headers|length }}">Žádná data k dispozici.</td>
20
+ </tr>
21
+ {% endfor %}
22
+ </tbody>
23
+ </table>
24
+ </div>
@@ -0,0 +1,14 @@
1
+ from django_components import component
2
+
3
+ @component.register("gov_data_table")
4
+ class GovDataTable(component.Component):
5
+ template_name = "table/table.html"
6
+
7
+ def get_context_data(self, headers, rows, hx_target=None, hx_url=None, **kwargs):
8
+ return {
9
+ "headers": headers,
10
+ "rows": rows,
11
+ "hx_target": hx_target,
12
+ "hx_url": hx_url,
13
+ "attrs": kwargs
14
+ }
@@ -0,0 +1,19 @@
1
+ from django import forms
2
+
3
+ class GovInputWidget(forms.TextInput):
4
+ template_name = "gov_django/widgets/input.html"
5
+
6
+ def __init__(self, attrs=None):
7
+ default_attrs = {'class': 'gov-form-control'}
8
+ if attrs:
9
+ default_attrs.update(attrs)
10
+ super().__init__(default_attrs)
11
+
12
+ class GovFormMixin:
13
+ """Mixin přidávající GDS stylování k Django formulářům."""
14
+ def __init__(self, *args, **kwargs):
15
+ super().__init__(*args, **kwargs)
16
+ for field_name, field in self.fields.items():
17
+ field.widget.attrs.update({'class': 'gov-form-control'})
18
+ if field.required:
19
+ field.widget.attrs.update({'aria-required': 'true'})
@@ -0,0 +1,36 @@
1
+ @theme {
2
+ --color-gov-blue-primary: #00469b;
3
+ --color-gov-blue-dark: #0c1838;
4
+ --color-gov-blue-light: #9ec8e9;
5
+ --color-gov-blue-hover: #0e3e86;
6
+
7
+ --color-gov-error: #d70c0f;
8
+ --color-gov-success: #2e7d32;
9
+ --color-gov-warning: #eaad08;
10
+
11
+ --color-gov-bg-gray: #f2f6fc;
12
+ --color-gov-border: #d1d1d1;
13
+ --color-gov-text: #262626;
14
+
15
+ --font-roboto: "Roboto", sans-serif;
16
+ }
17
+
18
+ @layer base {
19
+ :root {
20
+ --color-surface: white;
21
+ --color-on-surface: var(--color-gov-text);
22
+ }
23
+
24
+ @media (prefers-color-scheme: dark) {
25
+ :root {
26
+ --color-surface: #1a1a1a;
27
+ --color-on-surface: #f6f6f6;
28
+ }
29
+ }
30
+
31
+ body {
32
+ font-family: var(--font-roboto);
33
+ color: var(--color-on-surface);
34
+ background-color: var(--color-surface);
35
+ }
36
+ }
@@ -0,0 +1,6 @@
1
+ <button
2
+ class="gov-button gov-button--{{ type }} gov-button--{{ size }} {{ extra_classes }}"
3
+ {% if id %}id="{{ id }}"{% endif %}
4
+ {% if disabled %}disabled{% endif %}>
5
+ {{ text }}
6
+ </button>
@@ -0,0 +1,22 @@
1
+ from django import template
2
+
3
+ register = template.Library()
4
+
5
+ @register.inclusion_tag('gov_django/components/button.html')
6
+ def gov_button(text, type='primary', size='md', disabled=False, **kwargs):
7
+ return {
8
+ 'text': text,
9
+ 'type': type,
10
+ 'size': size,
11
+ 'disabled': disabled,
12
+ 'extra_classes': kwargs.get('class', ''),
13
+ 'id': kwargs.get('id', '')
14
+ }
15
+
16
+ @register.inclusion_tag('gov_django/components/alert.html')
17
+ def gov_alert(text, type='info', title=None):
18
+ return {
19
+ 'text': text,
20
+ 'type': type,
21
+ 'title': title
22
+ }
@@ -0,0 +1,242 @@
1
+ version = 1
2
+ revision = 3
3
+ requires-python = ">=3.12"
4
+
5
+ [[package]]
6
+ name = "annotated-types"
7
+ version = "0.7.0"
8
+ source = { registry = "https://pypi.org/simple" }
9
+ sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" }
10
+ wheels = [
11
+ { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" },
12
+ ]
13
+
14
+ [[package]]
15
+ name = "asgiref"
16
+ version = "3.11.1"
17
+ source = { registry = "https://pypi.org/simple" }
18
+ sdist = { url = "https://files.pythonhosted.org/packages/63/40/f03da1264ae8f7cfdbf9146542e5e7e8100a4c66ab48e791df9a03d3f6c0/asgiref-3.11.1.tar.gz", hash = "sha256:5f184dc43b7e763efe848065441eac62229c9f7b0475f41f80e207a114eda4ce", size = 38550, upload-time = "2026-02-03T13:30:14.33Z" }
19
+ wheels = [
20
+ { url = "https://files.pythonhosted.org/packages/5c/0a/a72d10ed65068e115044937873362e6e32fab1b7dce0046aeb224682c989/asgiref-3.11.1-py3-none-any.whl", hash = "sha256:e8667a091e69529631969fd45dc268fa79b99c92c5fcdda727757e52146ec133", size = 24345, upload-time = "2026-02-03T13:30:13.039Z" },
21
+ ]
22
+
23
+ [[package]]
24
+ name = "django"
25
+ version = "5.1.4"
26
+ source = { registry = "https://pypi.org/simple" }
27
+ dependencies = [
28
+ { name = "asgiref" },
29
+ { name = "sqlparse" },
30
+ { name = "tzdata", marker = "sys_platform == 'win32'" },
31
+ ]
32
+ sdist = { url = "https://files.pythonhosted.org/packages/d3/e8/536555596dbb79f6e77418aeb40bdc1758c26725aba31919ba449e6d5e6a/Django-5.1.4.tar.gz", hash = "sha256:de450c09e91879fa5a307f696e57c851955c910a438a35e6b4c895e86bedc82a", size = 10716397, upload-time = "2024-12-04T15:09:06.648Z" }
33
+ wheels = [
34
+ { url = "https://files.pythonhosted.org/packages/58/0b/8a4ab2c02982df4ed41e29f28f189459a7eba37899438e6bea7f39db793b/Django-5.1.4-py3-none-any.whl", hash = "sha256:236e023f021f5ce7dee5779de7b286565fdea5f4ab86bae5338e3f7b69896cf0", size = 8276471, upload-time = "2024-12-04T15:09:01.608Z" },
35
+ ]
36
+
37
+ [[package]]
38
+ name = "django-cors-headers"
39
+ version = "4.6.0"
40
+ source = { registry = "https://pypi.org/simple" }
41
+ dependencies = [
42
+ { name = "asgiref" },
43
+ { name = "django" },
44
+ ]
45
+ sdist = { url = "https://files.pythonhosted.org/packages/c6/e5/3b67fc05b9c02b926411436dfc553829bc00843706ce7f99752433017f47/django_cors_headers-4.6.0.tar.gz", hash = "sha256:14d76b4b4c8d39375baeddd89e4f08899051eeaf177cb02a29bd6eae8cf63aa8", size = 20961, upload-time = "2024-10-29T10:38:15.281Z" }
46
+ wheels = [
47
+ { url = "https://files.pythonhosted.org/packages/52/73/689532cf164ab10ed1521d825ea156656520cec98886c8d2ac1ce8829220/django_cors_headers-4.6.0-py3-none-any.whl", hash = "sha256:8edbc0497e611c24d5150e0055d3b178c6534b8ed826fb6f53b21c63f5d48ba3", size = 12791, upload-time = "2024-10-29T10:38:13.784Z" },
48
+ ]
49
+
50
+ [[package]]
51
+ name = "django-environ"
52
+ version = "0.11.2"
53
+ source = { registry = "https://pypi.org/simple" }
54
+ sdist = { url = "https://files.pythonhosted.org/packages/d6/0b/f2c024529ee4bbf8b95176eebeb86c6e695192a9ce0e91059cb83a33c1d3/django-environ-0.11.2.tar.gz", hash = "sha256:f32a87aa0899894c27d4e1776fa6b477e8164ed7f6b3e410a62a6d72caaf64be", size = 54326, upload-time = "2023-09-01T21:03:02.435Z" }
55
+ wheels = [
56
+ { url = "https://files.pythonhosted.org/packages/c4/f1/468b49cccba3b42dda571063a14c668bb0b53a1d5712426d18e36663bd53/django_environ-0.11.2-py2.py3-none-any.whl", hash = "sha256:0ff95ab4344bfeff693836aa978e6840abef2e2f1145adff7735892711590c05", size = 19141, upload-time = "2023-09-01T21:02:59.88Z" },
57
+ ]
58
+
59
+ [[package]]
60
+ name = "django-extensions"
61
+ version = "3.2.3"
62
+ source = { registry = "https://pypi.org/simple" }
63
+ dependencies = [
64
+ { name = "django" },
65
+ ]
66
+ sdist = { url = "https://files.pythonhosted.org/packages/8a/f1/318684c9466968bf9a9c221663128206e460c1a67f595055be4b284cde8a/django-extensions-3.2.3.tar.gz", hash = "sha256:44d27919d04e23b3f40231c4ab7af4e61ce832ef46d610cc650d53e68328410a", size = 277216, upload-time = "2023-06-05T17:09:01.447Z" }
67
+ wheels = [
68
+ { url = "https://files.pythonhosted.org/packages/a7/7e/ba12b9660642663f5273141018d2bec0a1cae1711f4f6d1093920e157946/django_extensions-3.2.3-py3-none-any.whl", hash = "sha256:9600b7562f79a92cbf1fde6403c04fee314608fefbb595502e34383ae8203401", size = 229868, upload-time = "2023-06-05T17:08:58.197Z" },
69
+ ]
70
+
71
+ [[package]]
72
+ name = "gunicorn"
73
+ version = "23.0.0"
74
+ source = { registry = "https://pypi.org/simple" }
75
+ dependencies = [
76
+ { name = "packaging" },
77
+ ]
78
+ sdist = { url = "https://files.pythonhosted.org/packages/34/72/9614c465dc206155d93eff0ca20d42e1e35afc533971379482de953521a4/gunicorn-23.0.0.tar.gz", hash = "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec", size = 375031, upload-time = "2024-08-10T20:25:27.378Z" }
79
+ wheels = [
80
+ { url = "https://files.pythonhosted.org/packages/cb/7d/6dac2a6e1eba33ee43f318edbed4ff29151a49b5d37f080aad1e6469bca4/gunicorn-23.0.0-py3-none-any.whl", hash = "sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d", size = 85029, upload-time = "2024-08-10T20:25:24.996Z" },
81
+ ]
82
+
83
+ [[package]]
84
+ name = "packaging"
85
+ version = "26.2"
86
+ source = { registry = "https://pypi.org/simple" }
87
+ sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" }
88
+ wheels = [
89
+ { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" },
90
+ ]
91
+
92
+ [[package]]
93
+ name = "psycopg"
94
+ version = "3.2.3"
95
+ source = { registry = "https://pypi.org/simple" }
96
+ dependencies = [
97
+ { name = "typing-extensions", marker = "python_full_version < '3.13'" },
98
+ { name = "tzdata", marker = "sys_platform == 'win32'" },
99
+ ]
100
+ sdist = { url = "https://files.pythonhosted.org/packages/d1/ad/7ce016ae63e231575df0498d2395d15f005f05e32d3a2d439038e1bd0851/psycopg-3.2.3.tar.gz", hash = "sha256:a5764f67c27bec8bfac85764d23c534af2c27b893550377e37ce59c12aac47a2", size = 155550, upload-time = "2024-09-29T21:27:25.456Z" }
101
+ wheels = [
102
+ { url = "https://files.pythonhosted.org/packages/ce/21/534b8f5bd9734b7a2fcd3a16b1ee82ef6cad81a4796e95ebf4e0c6a24119/psycopg-3.2.3-py3-none-any.whl", hash = "sha256:644d3973fe26908c73d4be746074f6e5224b03c1101d302d9a53bf565ad64907", size = 197934, upload-time = "2024-09-29T21:21:19.623Z" },
103
+ ]
104
+
105
+ [package.optional-dependencies]
106
+ binary = [
107
+ { name = "psycopg-binary", marker = "implementation_name != 'pypy'" },
108
+ ]
109
+
110
+ [[package]]
111
+ name = "psycopg-binary"
112
+ version = "3.2.3"
113
+ source = { registry = "https://pypi.org/simple" }
114
+ wheels = [
115
+ { url = "https://files.pythonhosted.org/packages/55/6b/9805a5c743c1d54dcd035bd5c069202fde21b4cf69857ca40c2a55e69f8c/psycopg_binary-3.2.3-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:48f8ca6ee8939bab760225b2ab82934d54330eec10afe4394a92d3f2a0c37dd6", size = 3363376, upload-time = "2024-09-29T21:23:30.049Z" },
116
+ { url = "https://files.pythonhosted.org/packages/a8/82/45ac156b20e08e8f556a323c9568a011c71cf6e734e49667a398719ce0e4/psycopg_binary-3.2.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:5361ea13c241d4f0ec3f95e0bf976c15e2e451e9cc7ef2e5ccfc9d170b197a40", size = 3506449, upload-time = "2024-09-29T21:23:34.254Z" },
117
+ { url = "https://files.pythonhosted.org/packages/e4/be/760cef50e1adfbc87dab2b05b30f544d7297040cce495835df9016556517/psycopg_binary-3.2.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb987f14af7da7c24f803111dbc7392f5070fd350146af3345103f76ea82e339", size = 4445757, upload-time = "2024-09-29T21:23:38.732Z" },
118
+ { url = "https://files.pythonhosted.org/packages/b4/9c/bae6a9c6949aac577cc93f58705f649b50c62827038903bd75ff8956e63e/psycopg_binary-3.2.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0463a11b1cace5a6aeffaf167920707b912b8986a9c7920341c75e3686277920", size = 4248376, upload-time = "2024-09-29T21:23:43.951Z" },
119
+ { url = "https://files.pythonhosted.org/packages/e5/0e/9db06ef94e4a156f3ed06043ee4f370e21866b0e3b7959691c8c4abfb698/psycopg_binary-3.2.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8b7be9a6c06518967b641fb15032b1ed682fd3b0443f64078899c61034a0bca6", size = 4487765, upload-time = "2024-09-29T21:23:50.999Z" },
120
+ { url = "https://files.pythonhosted.org/packages/9f/5f/8afc32b60ee8bc5c4af51e7cf6c42d93a989a09609524d0a393106e300cd/psycopg_binary-3.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64a607e630d9f4b2797f641884e52b9f8e239d35943f51bef817a384ec1678fe", size = 4188374, upload-time = "2024-09-29T21:24:00.191Z" },
121
+ { url = "https://files.pythonhosted.org/packages/ed/5d/210cb75aff0296dc5c09bcf67babf8679905412d7a11357b983f0d877360/psycopg_binary-3.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:fa33ead69ed133210d96af0c63448b1385df48b9c0247eda735c5896b9e6dbbf", size = 3113180, upload-time = "2024-09-29T21:24:06.433Z" },
122
+ { url = "https://files.pythonhosted.org/packages/40/ec/46b1a5cdb2fe995b8ec0376f0695003e97fed9ac077e090a3165ea15f735/psycopg_binary-3.2.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:1f8b0d0e99d8e19923e6e07379fa00570be5182c201a8c0b5aaa9a4d4a4ea20b", size = 3099455, upload-time = "2024-09-29T21:24:10.933Z" },
123
+ { url = "https://files.pythonhosted.org/packages/11/68/eaf85b3421b3f01b638dd6b16f4e9bc8de42eb1d000da62964fb29f8c823/psycopg_binary-3.2.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:709447bd7203b0b2debab1acec23123eb80b386f6c29e7604a5d4326a11e5bd6", size = 3189977, upload-time = "2024-09-29T21:24:15.708Z" },
124
+ { url = "https://files.pythonhosted.org/packages/83/5a/cf94c3ba87ea6c8331aa0aba36a18a837a3231764457780661968804673e/psycopg_binary-3.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5e37d5027e297a627da3551a1e962316d0f88ee4ada74c768f6c9234e26346d9", size = 3232263, upload-time = "2024-09-29T21:24:20.237Z" },
125
+ { url = "https://files.pythonhosted.org/packages/0e/3a/9d912b16059e87b04e3eb4fca457f079d78d6468f627d5622fbda80e9378/psycopg_binary-3.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:261f0031ee6074765096a19b27ed0f75498a8338c3dcd7f4f0d831e38adf12d1", size = 2912530, upload-time = "2024-09-29T21:24:25.079Z" },
126
+ { url = "https://files.pythonhosted.org/packages/c6/bf/717c5e51c68e2498b60a6e9f1476cc47953013275a54bf8e23fd5082a72d/psycopg_binary-3.2.3-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:41fdec0182efac66b27478ac15ef54c9ebcecf0e26ed467eb7d6f262a913318b", size = 3360874, upload-time = "2024-09-29T21:24:30.796Z" },
127
+ { url = "https://files.pythonhosted.org/packages/31/d5/6f9ad6fe5ef80ca9172bc3d028ebae8e9a1ee8aebd917c95c747a5efd85f/psycopg_binary-3.2.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:07d019a786eb020c0f984691aa1b994cb79430061065a694cf6f94056c603d26", size = 3502320, upload-time = "2024-09-29T21:24:36.694Z" },
128
+ { url = "https://files.pythonhosted.org/packages/fb/7b/c58dd26c27fe7a491141ca765c103e702872ff1c174ebd669d73d7fb0b5d/psycopg_binary-3.2.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c57615791a337378fe5381143259a6c432cdcbb1d3e6428bfb7ce59fff3fb5c", size = 4446950, upload-time = "2024-09-29T21:24:43.028Z" },
129
+ { url = "https://files.pythonhosted.org/packages/ed/75/acf6a81c788007b7bc0a43b02c22eff7cb19a6ace9e84c32838e86083a3f/psycopg_binary-3.2.3-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8eb9a4e394926b93ad919cad1b0a918e9b4c846609e8c1cfb6b743683f64da0", size = 4252409, upload-time = "2024-09-29T21:24:47.768Z" },
130
+ { url = "https://files.pythonhosted.org/packages/83/a5/8a01b923fe42acd185d53f24fb98ead717725ede76a4cd183ff293daf1f1/psycopg_binary-3.2.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5905729668ef1418bd36fbe876322dcb0f90b46811bba96d505af89e6fbdce2f", size = 4488121, upload-time = "2024-09-29T21:24:54.244Z" },
131
+ { url = "https://files.pythonhosted.org/packages/14/8f/b00e65e204340ab1259ecc8d4cc4c1f72c386be5ca7bfb90ae898a058d68/psycopg_binary-3.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd65774ed7d65101b314808b6893e1a75b7664f680c3ef18d2e5c84d570fa393", size = 4190653, upload-time = "2024-09-29T21:25:02.336Z" },
132
+ { url = "https://files.pythonhosted.org/packages/ce/fc/ba830fc6c9b02b66d1e2fb420736df4d78369760144169a9046f04d72ac6/psycopg_binary-3.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:700679c02f9348a0d0a2adcd33a0275717cd0d0aee9d4482b47d935023629505", size = 3118074, upload-time = "2024-09-29T21:25:07.755Z" },
133
+ { url = "https://files.pythonhosted.org/packages/b8/75/b62d06930a615435e909e05de126aa3d49f6ec2993d1aa6a99e7faab5570/psycopg_binary-3.2.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:96334bb64d054e36fed346c50c4190bad9d7c586376204f50bede21a913bf942", size = 3100457, upload-time = "2024-09-29T21:25:13.002Z" },
134
+ { url = "https://files.pythonhosted.org/packages/57/e5/32dc7518325d0010813853a87b19c784d8b11fdb17f5c0e0c148c5ac77af/psycopg_binary-3.2.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:9099e443d4cc24ac6872e6a05f93205ba1a231b1a8917317b07c9ef2b955f1f4", size = 3192788, upload-time = "2024-09-29T21:25:18.815Z" },
135
+ { url = "https://files.pythonhosted.org/packages/23/a3/d1aa04329253c024a2323051774446770d47b43073874a3de8cca797ed8e/psycopg_binary-3.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1985ab05e9abebfbdf3163a16ebb37fbc5d49aff2bf5b3d7375ff0920bbb54cd", size = 3234247, upload-time = "2024-09-29T21:25:24.005Z" },
136
+ { url = "https://files.pythonhosted.org/packages/03/20/b675af723b9a61d48abd6a3d64cbb9797697d330255d1f8105713d54ed8e/psycopg_binary-3.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:e90352d7b610b4693fad0feea48549d4315d10f1eba5605421c92bb834e90170", size = 2913413, upload-time = "2024-09-29T21:25:28.151Z" },
137
+ ]
138
+
139
+ [[package]]
140
+ name = "pydantic"
141
+ version = "2.10.3"
142
+ source = { registry = "https://pypi.org/simple" }
143
+ dependencies = [
144
+ { name = "annotated-types" },
145
+ { name = "pydantic-core" },
146
+ { name = "typing-extensions" },
147
+ ]
148
+ sdist = { url = "https://files.pythonhosted.org/packages/45/0f/27908242621b14e649a84e62b133de45f84c255eecb350ab02979844a788/pydantic-2.10.3.tar.gz", hash = "sha256:cb5ac360ce894ceacd69c403187900a02c4b20b693a9dd1d643e1effab9eadf9", size = 786486, upload-time = "2024-12-03T15:59:02.347Z" }
149
+ wheels = [
150
+ { url = "https://files.pythonhosted.org/packages/62/51/72c18c55cf2f46ff4f91ebcc8f75aa30f7305f3d726be3f4ebffb4ae972b/pydantic-2.10.3-py3-none-any.whl", hash = "sha256:be04d85bbc7b65651c5f8e6b9976ed9c6f41782a55524cef079a34a0bb82144d", size = 456997, upload-time = "2024-12-03T15:58:59.867Z" },
151
+ ]
152
+
153
+ [[package]]
154
+ name = "pydantic-core"
155
+ version = "2.27.1"
156
+ source = { registry = "https://pypi.org/simple" }
157
+ dependencies = [
158
+ { name = "typing-extensions" },
159
+ ]
160
+ sdist = { url = "https://files.pythonhosted.org/packages/a6/9f/7de1f19b6aea45aeb441838782d68352e71bfa98ee6fa048d5041991b33e/pydantic_core-2.27.1.tar.gz", hash = "sha256:62a763352879b84aa31058fc931884055fd75089cccbd9d58bb6afd01141b235", size = 412785, upload-time = "2024-11-22T00:24:49.865Z" }
161
+ wheels = [
162
+ { url = "https://files.pythonhosted.org/packages/be/51/2e9b3788feb2aebff2aa9dfbf060ec739b38c05c46847601134cc1fed2ea/pydantic_core-2.27.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9cbd94fc661d2bab2bc702cddd2d3370bbdcc4cd0f8f57488a81bcce90c7a54f", size = 1895239, upload-time = "2024-11-22T00:22:13.775Z" },
163
+ { url = "https://files.pythonhosted.org/packages/7b/9e/f8063952e4a7d0127f5d1181addef9377505dcce3be224263b25c4f0bfd9/pydantic_core-2.27.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5f8c4718cd44ec1580e180cb739713ecda2bdee1341084c1467802a417fe0f02", size = 1805070, upload-time = "2024-11-22T00:22:15.438Z" },
164
+ { url = "https://files.pythonhosted.org/packages/2c/9d/e1d6c4561d262b52e41b17a7ef8301e2ba80b61e32e94520271029feb5d8/pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15aae984e46de8d376df515f00450d1522077254ef6b7ce189b38ecee7c9677c", size = 1828096, upload-time = "2024-11-22T00:22:17.892Z" },
165
+ { url = "https://files.pythonhosted.org/packages/be/65/80ff46de4266560baa4332ae3181fffc4488ea7d37282da1a62d10ab89a4/pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1ba5e3963344ff25fc8c40da90f44b0afca8cfd89d12964feb79ac1411a260ac", size = 1857708, upload-time = "2024-11-22T00:22:19.412Z" },
166
+ { url = "https://files.pythonhosted.org/packages/d5/ca/3370074ad758b04d9562b12ecdb088597f4d9d13893a48a583fb47682cdf/pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:992cea5f4f3b29d6b4f7f1726ed8ee46c8331c6b4eed6db5b40134c6fe1768bb", size = 2037751, upload-time = "2024-11-22T00:22:20.979Z" },
167
+ { url = "https://files.pythonhosted.org/packages/b1/e2/4ab72d93367194317b99d051947c071aef6e3eb95f7553eaa4208ecf9ba4/pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0325336f348dbee6550d129b1627cb8f5351a9dc91aad141ffb96d4937bd9529", size = 2733863, upload-time = "2024-11-22T00:22:22.951Z" },
168
+ { url = "https://files.pythonhosted.org/packages/8a/c6/8ae0831bf77f356bb73127ce5a95fe115b10f820ea480abbd72d3cc7ccf3/pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7597c07fbd11515f654d6ece3d0e4e5093edc30a436c63142d9a4b8e22f19c35", size = 2161161, upload-time = "2024-11-22T00:22:24.785Z" },
169
+ { url = "https://files.pythonhosted.org/packages/f1/f4/b2fe73241da2429400fc27ddeaa43e35562f96cf5b67499b2de52b528cad/pydantic_core-2.27.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3bbd5d8cc692616d5ef6fbbbd50dbec142c7e6ad9beb66b78a96e9c16729b089", size = 1993294, upload-time = "2024-11-22T00:22:27.076Z" },
170
+ { url = "https://files.pythonhosted.org/packages/77/29/4bb008823a7f4cc05828198153f9753b3bd4c104d93b8e0b1bfe4e187540/pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:dc61505e73298a84a2f317255fcc72b710b72980f3a1f670447a21efc88f8381", size = 2001468, upload-time = "2024-11-22T00:22:29.346Z" },
171
+ { url = "https://files.pythonhosted.org/packages/f2/a9/0eaceeba41b9fad851a4107e0cf999a34ae8f0d0d1f829e2574f3d8897b0/pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:e1f735dc43da318cad19b4173dd1ffce1d84aafd6c9b782b3abc04a0d5a6f5bb", size = 2091413, upload-time = "2024-11-22T00:22:30.984Z" },
172
+ { url = "https://files.pythonhosted.org/packages/d8/36/eb8697729725bc610fd73940f0d860d791dc2ad557faaefcbb3edbd2b349/pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f4e5658dbffe8843a0f12366a4c2d1c316dbe09bb4dfbdc9d2d9cd6031de8aae", size = 2154735, upload-time = "2024-11-22T00:22:32.616Z" },
173
+ { url = "https://files.pythonhosted.org/packages/52/e5/4f0fbd5c5995cc70d3afed1b5c754055bb67908f55b5cb8000f7112749bf/pydantic_core-2.27.1-cp312-none-win32.whl", hash = "sha256:672ebbe820bb37988c4d136eca2652ee114992d5d41c7e4858cdd90ea94ffe5c", size = 1833633, upload-time = "2024-11-22T00:22:35.027Z" },
174
+ { url = "https://files.pythonhosted.org/packages/ee/f2/c61486eee27cae5ac781305658779b4a6b45f9cc9d02c90cb21b940e82cc/pydantic_core-2.27.1-cp312-none-win_amd64.whl", hash = "sha256:66ff044fd0bb1768688aecbe28b6190f6e799349221fb0de0e6f4048eca14c16", size = 1986973, upload-time = "2024-11-22T00:22:37.502Z" },
175
+ { url = "https://files.pythonhosted.org/packages/df/a6/e3f12ff25f250b02f7c51be89a294689d175ac76e1096c32bf278f29ca1e/pydantic_core-2.27.1-cp312-none-win_arm64.whl", hash = "sha256:9a3b0793b1bbfd4146304e23d90045f2a9b5fd5823aa682665fbdaf2a6c28f3e", size = 1883215, upload-time = "2024-11-22T00:22:39.186Z" },
176
+ { url = "https://files.pythonhosted.org/packages/0f/d6/91cb99a3c59d7b072bded9959fbeab0a9613d5a4935773c0801f1764c156/pydantic_core-2.27.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f216dbce0e60e4d03e0c4353c7023b202d95cbaeff12e5fd2e82ea0a66905073", size = 1895033, upload-time = "2024-11-22T00:22:41.087Z" },
177
+ { url = "https://files.pythonhosted.org/packages/07/42/d35033f81a28b27dedcade9e967e8a40981a765795c9ebae2045bcef05d3/pydantic_core-2.27.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a2e02889071850bbfd36b56fd6bc98945e23670773bc7a76657e90e6b6603c08", size = 1807542, upload-time = "2024-11-22T00:22:43.341Z" },
178
+ { url = "https://files.pythonhosted.org/packages/41/c2/491b59e222ec7e72236e512108ecad532c7f4391a14e971c963f624f7569/pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42b0e23f119b2b456d07ca91b307ae167cc3f6c846a7b169fca5326e32fdc6cf", size = 1827854, upload-time = "2024-11-22T00:22:44.96Z" },
179
+ { url = "https://files.pythonhosted.org/packages/e3/f3/363652651779113189cefdbbb619b7b07b7a67ebb6840325117cc8cc3460/pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:764be71193f87d460a03f1f7385a82e226639732214b402f9aa61f0d025f0737", size = 1857389, upload-time = "2024-11-22T00:22:47.305Z" },
180
+ { url = "https://files.pythonhosted.org/packages/5f/97/be804aed6b479af5a945daec7538d8bf358d668bdadde4c7888a2506bdfb/pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c00666a3bd2f84920a4e94434f5974d7bbc57e461318d6bb34ce9cdbbc1f6b2", size = 2037934, upload-time = "2024-11-22T00:22:49.093Z" },
181
+ { url = "https://files.pythonhosted.org/packages/42/01/295f0bd4abf58902917e342ddfe5f76cf66ffabfc57c2e23c7681a1a1197/pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ccaa88b24eebc0f849ce0a4d09e8a408ec5a94afff395eb69baf868f5183107", size = 2735176, upload-time = "2024-11-22T00:22:50.822Z" },
182
+ { url = "https://files.pythonhosted.org/packages/9d/a0/cd8e9c940ead89cc37812a1a9f310fef59ba2f0b22b4e417d84ab09fa970/pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c65af9088ac534313e1963443d0ec360bb2b9cba6c2909478d22c2e363d98a51", size = 2160720, upload-time = "2024-11-22T00:22:52.638Z" },
183
+ { url = "https://files.pythonhosted.org/packages/73/ae/9d0980e286627e0aeca4c352a60bd760331622c12d576e5ea4441ac7e15e/pydantic_core-2.27.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:206b5cf6f0c513baffaeae7bd817717140770c74528f3e4c3e1cec7871ddd61a", size = 1992972, upload-time = "2024-11-22T00:22:54.31Z" },
184
+ { url = "https://files.pythonhosted.org/packages/bf/ba/ae4480bc0292d54b85cfb954e9d6bd226982949f8316338677d56541b85f/pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:062f60e512fc7fff8b8a9d680ff0ddaaef0193dba9fa83e679c0c5f5fbd018bc", size = 2001477, upload-time = "2024-11-22T00:22:56.451Z" },
185
+ { url = "https://files.pythonhosted.org/packages/55/b7/e26adf48c2f943092ce54ae14c3c08d0d221ad34ce80b18a50de8ed2cba8/pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:a0697803ed7d4af5e4c1adf1670af078f8fcab7a86350e969f454daf598c4960", size = 2091186, upload-time = "2024-11-22T00:22:58.226Z" },
186
+ { url = "https://files.pythonhosted.org/packages/ba/cc/8491fff5b608b3862eb36e7d29d36a1af1c945463ca4c5040bf46cc73f40/pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:58ca98a950171f3151c603aeea9303ef6c235f692fe555e883591103da709b23", size = 2154429, upload-time = "2024-11-22T00:22:59.985Z" },
187
+ { url = "https://files.pythonhosted.org/packages/78/d8/c080592d80edd3441ab7f88f865f51dae94a157fc64283c680e9f32cf6da/pydantic_core-2.27.1-cp313-none-win32.whl", hash = "sha256:8065914ff79f7eab1599bd80406681f0ad08f8e47c880f17b416c9f8f7a26d05", size = 1833713, upload-time = "2024-11-22T00:23:01.715Z" },
188
+ { url = "https://files.pythonhosted.org/packages/83/84/5ab82a9ee2538ac95a66e51f6838d6aba6e0a03a42aa185ad2fe404a4e8f/pydantic_core-2.27.1-cp313-none-win_amd64.whl", hash = "sha256:ba630d5e3db74c79300d9a5bdaaf6200172b107f263c98a0539eeecb857b2337", size = 1987897, upload-time = "2024-11-22T00:23:03.497Z" },
189
+ { url = "https://files.pythonhosted.org/packages/df/c3/b15fb833926d91d982fde29c0624c9f225da743c7af801dace0d4e187e71/pydantic_core-2.27.1-cp313-none-win_arm64.whl", hash = "sha256:45cf8588c066860b623cd11c4ba687f8d7175d5f7ef65f7129df8a394c502de5", size = 1882983, upload-time = "2024-11-22T00:23:05.983Z" },
190
+ ]
191
+
192
+ [[package]]
193
+ name = "sqlparse"
194
+ version = "0.5.5"
195
+ source = { registry = "https://pypi.org/simple" }
196
+ sdist = { url = "https://files.pythonhosted.org/packages/90/76/437d71068094df0726366574cf3432a4ed754217b436eb7429415cf2d480/sqlparse-0.5.5.tar.gz", hash = "sha256:e20d4a9b0b8585fdf63b10d30066c7c94c5d7a7ec47c889a2d83a3caa93ff28e", size = 120815, upload-time = "2025-12-19T07:17:45.073Z" }
197
+ wheels = [
198
+ { url = "https://files.pythonhosted.org/packages/49/4b/359f28a903c13438ef59ebeee215fb25da53066db67b305c125f1c6d2a25/sqlparse-0.5.5-py3-none-any.whl", hash = "sha256:12a08b3bf3eec877c519589833aed092e2444e68240a3577e8e26148acc7b1ba", size = 46138, upload-time = "2025-12-19T07:17:46.573Z" },
199
+ ]
200
+
201
+ [[package]]
202
+ name = "sysnet-gov-django"
203
+ version = "0.1.0"
204
+ source = { virtual = "." }
205
+ dependencies = [
206
+ { name = "django" },
207
+ { name = "django-cors-headers" },
208
+ { name = "django-environ" },
209
+ { name = "django-extensions" },
210
+ { name = "gunicorn" },
211
+ { name = "psycopg", extra = ["binary"] },
212
+ { name = "pydantic" },
213
+ ]
214
+
215
+ [package.metadata]
216
+ requires-dist = [
217
+ { name = "django", specifier = "==5.1.4" },
218
+ { name = "django-cors-headers", specifier = "==4.6.0" },
219
+ { name = "django-environ", specifier = "==0.11.2" },
220
+ { name = "django-extensions", specifier = "==3.2.3" },
221
+ { name = "gunicorn", specifier = "==23.0.0" },
222
+ { name = "psycopg", extras = ["binary"], specifier = "==3.2.3" },
223
+ { name = "pydantic", specifier = "==2.10.3" },
224
+ ]
225
+
226
+ [[package]]
227
+ name = "typing-extensions"
228
+ version = "4.15.0"
229
+ source = { registry = "https://pypi.org/simple" }
230
+ sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" }
231
+ wheels = [
232
+ { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" },
233
+ ]
234
+
235
+ [[package]]
236
+ name = "tzdata"
237
+ version = "2026.2"
238
+ source = { registry = "https://pypi.org/simple" }
239
+ sdist = { url = "https://files.pythonhosted.org/packages/ba/19/1b9b0e29f30c6d35cb345486df41110984ea67ae69dddbc0e8a100999493/tzdata-2026.2.tar.gz", hash = "sha256:9173fde7d80d9018e02a662e168e5a2d04f87c41ea174b139fbef642eda62d10", size = 198254, upload-time = "2026-04-24T15:22:08.651Z" }
240
+ wheels = [
241
+ { url = "https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl", hash = "sha256:bbe9af844f658da81a5f95019480da3a89415801f6cc966806612cc7169bffe7", size = 349321, upload-time = "2026-04-24T15:22:05.876Z" },
242
+ ]