graphify add
This commit is contained in:
1 parent
f19d8ee6a7
commit
91768be145
20 files changed
+21700
-1
No files matched your search
@@ -0,0 +1,21 @@
|
||||
---
|
||||
description: graphify knowledge graph context
|
||||
alwaysApply: true
|
||||
---
|
||||
|
||||
This project has a graphify knowledge graph at graphify-out/.
|
||||
|
||||
**MANDATORY: Before using Read, Grep, Glob, or Bash to explore the codebase, you MUST run graphify first:**
|
||||
- `graphify query "<question>"` — scoped subgraph for any codebase or architecture question
|
||||
- `graphify path "<A>" "<B>"` — dependency path between two symbols
|
||||
- `graphify explain "<concept>"` — all nodes related to a concept
|
||||
|
||||
This applies to YOU and to every subagent you spawn. Include this rule explicitly in every subagent prompt that involves code exploration. Do not skip graphify because files are "already known" or because you are executing a plan — the graph surfaces cross-file dependencies and INFERRED edges that grep and Read cannot find.
|
||||
|
||||
Only use Read/Grep/Glob directly when:
|
||||
1. graphify has already oriented you and you need to modify or debug specific lines
|
||||
2. `graphify-out/graph.json` does not exist yet
|
||||
|
||||
- If `graphify-out/wiki/index.md` exists, navigate it instead of reading raw files
|
||||
- Read `graphify-out/GRAPH_REPORT.md` only for broad architecture review when query/path/explain do not surface enough context
|
||||
- After modifying code files, run `graphify update .` to keep the graph current (AST-only, no API cost)
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"hooks": {
|
||||
"BeforeTool": [
|
||||
{
|
||||
"matcher": "read_file|list_directory",
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "C:/Users/javad/.local/bin/graphify.EXE hook-guard gemini"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
## graphify
|
||||
|
||||
For any question about this repo's architecture, structure, components, or how to add/modify/find
|
||||
code, your first action should be `graphify query "<question>"` when `graphify-out/graph.json`
|
||||
exists. Use `graphify path "<A>" "<B>"` for relationship questions and `graphify explain "<concept>"`
|
||||
for focused-concept questions. These return a scoped subgraph, usually much smaller than the full
|
||||
report or raw grep output.
|
||||
|
||||
Triggers: "how do I…", "where is…", "what does … do", "add/modify a <component>",
|
||||
"explain the architecture", or anything that depends on how files or classes relate.
|
||||
|
||||
If `graphify-out/wiki/index.md` exists, use it for broad navigation. Read `graphify-out/GRAPH_REPORT.md`
|
||||
only for broad architecture review or when query/path/explain do not surface enough context. Only read
|
||||
source files when (a) modifying/debugging specific code, (b) the graph lacks the needed detail, or
|
||||
(c) the graph is missing or stale.
|
||||
|
||||
Type `/graphify` in Copilot Chat to build or update the graph.
|
||||
+5
-1
@@ -5,4 +5,8 @@ data
|
||||
data/*.sqlite3
|
||||
*.sqlite3
|
||||
*.zip
|
||||
data9
|
||||
data9
|
||||
|
||||
# graphify: ignore regenerable cache and dated backups, keep the graph itself
|
||||
graphify-out/cache/
|
||||
graphify-out/2026-*/
|
||||
@@ -0,0 +1,22 @@
|
||||
# graphify ignore rules for the khatibi project
|
||||
|
||||
# Third-party static assets (DataTables, jQuery, pdfmake, JSZip, fonts, icons...)
|
||||
admin_panel/static/
|
||||
static/
|
||||
*.min.js
|
||||
*.min.css
|
||||
|
||||
# Generated / data artifacts
|
||||
graphify-out/
|
||||
data9/
|
||||
*.zip
|
||||
khatibi.zip
|
||||
db.json
|
||||
|
||||
# Python caches
|
||||
__pycache__/
|
||||
*.pyc
|
||||
|
||||
# Backups and scratch copies
|
||||
admin_panel/views - Copy.py
|
||||
admin_panel/viewsBK.py
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"plugin": [
|
||||
".opencode/plugins/graphify.js"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
// graphify OpenCode plugin
|
||||
// Injects a knowledge graph reminder before bash tool calls when the graph exists.
|
||||
//
|
||||
// IMPORTANT: keep the reminder string free of backticks and $(...) constructs.
|
||||
// The hook prepends `echo "<reminder>" && <cmd>` to the user's bash command;
|
||||
// backticks inside the double-quoted echo trigger bash command substitution,
|
||||
// which both corrupts tool output and silently executes the very graphify
|
||||
// command we are only suggesting. Plain words render fine in opencode's TUI.
|
||||
import { existsSync } from "fs";
|
||||
import { join } from "path";
|
||||
|
||||
export const GraphifyPlugin = async ({ directory }) => {
|
||||
let reminded = false;
|
||||
|
||||
return {
|
||||
"tool.execute.before": async (input, output) => {
|
||||
if (reminded) return;
|
||||
if (!existsSync(join(directory, "graphify-out", "graph.json"))) return;
|
||||
|
||||
if (input.tool === "bash") {
|
||||
// ';' not '&&' — Windows PowerShell 5.1 rejects '&&' as a statement
|
||||
// separator, breaking the first bash command of the session (#1646).
|
||||
output.args.command =
|
||||
'echo "[graphify] knowledge graph at graphify-out/. For focused questions, run graphify query with your question (scoped subgraph, usually much smaller than GRAPH_REPORT.md) instead of grepping raw files. Read GRAPH_REPORT.md only for broad architecture context." ; ' +
|
||||
output.args.command;
|
||||
reminded = true;
|
||||
}
|
||||
},
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,81 @@
|
||||
# Project Operating & Agent Guidelines
|
||||
|
||||
## 1. Codebase Navigation & Analysis (Ripwire vs. Graphify)
|
||||
|
||||
> **Rule of Thumb:** Default to **Ripwire** for all hands-on coding, AST, edits, call graphs, and tests. Reserve **Graphify** strictly for high-level architectural understanding, cross-artifact relations, and non-code assets.
|
||||
|
||||
CLI-only (never use MCP). Route strictly by question and artifact type. Never query both tools for the same sub-task; never execute in parallel. Always prefer `--expand` over reading entire files.
|
||||
|
||||
| Metric / Dimension | **Ripwire** (Deterministic AST) | **Graphify** (Semantic KG) |
|
||||
|---|---|---|
|
||||
| **Primary Scope** | Local source code AST, symbol graphs, in-repo text | Cross-artifact: Code + Docs + PDFs + Media + SQL Schema |
|
||||
| **Best at** | Callers, callees, impact, tests, quality delta, `--arch`, `--doc-drift` | Conceptual "How A relates to B", ADR/RFC context, schemas |
|
||||
| **Primary CLI** | `ripwire . --for="…"`, `--callers=SYM`, `--impact=SYM`, `--test-gate` | `graphify query "…"`, `graphify path "A" "B"`, `graphify explain "node"` |
|
||||
| **Boundary** | Prose meaning, non-code files, cross-asset concepts | Exact symbol references, impact analysis, code test gates |
|
||||
|
||||
### Routing Gate & Pipeline
|
||||
1. **Trivial edits (≤1 file, no exported symbols):** Modify directly without querying either tool.
|
||||
2. **Execution routing:**
|
||||
- Hands-on coding, symbols, AST, usages, impact, and tests → **Ripwire**.
|
||||
- Architecture discovery, cross-artifact concepts (PDF, media, docs, ADR/RFC), and SQL schemas → **Graphify**. (Note: `.sql` symbols use Ripwire; schema semantics use Graphify).
|
||||
- Ambiguous/Mixed tasks → Run `ripwire . --help-task="task"` to classify, then route by artifact.
|
||||
3. **Graphify query rules (when selected):**
|
||||
- Requires `graphify-out/graph.json`; if absent, route code questions to Ripwire.
|
||||
- **Bilingual alignment:** Match terms directly against `graphify-out/graph.json` vocabulary. Prioritize English code identifiers; include Persian terms only when verified in graph documentation/requirements. Never rely on internal translation or stemming.
|
||||
- **Traversal selection:** Use BFS for broad relationships, DFS for dependency traces, `path` for shortest linkage, and `explain` for node neighbors.
|
||||
- Always cross-verify critical graph findings against source code before editing.
|
||||
4. **Pre-edit impact gate:** Before any non-trivial code change, inspect the target symbol with both `ripwire . --impact=SYM` and `ripwire . --uses=SYM`; if either query refuses or is ambiguous, resolve the symbol using the CLI guidance before editing.
|
||||
5. **Post-edit pipeline:** Run `ripwire . --test-gate` followed by `ripwire . --quality-delta`.
|
||||
|
||||
---
|
||||
|
||||
## 2. Dynamic Help, Self-Correction & Staleness
|
||||
|
||||
Never stall on tool errors or hallucinate flags. Dynamic CLI help always takes precedence over memorized parameters.
|
||||
|
||||
- **Help Precedence:** Before using an unfamiliar or ambiguous capability, inspect `ripwire --help` or `ripwire --help=--FLAG`; if any instruction or remembered syntax conflicts with that output, the CLI help is authoritative.
|
||||
- **Dynamic Inspection (on error or flag confusion):**
|
||||
- Ripwire: `ripwire --help`, `ripwire --help=--FLAG`, `ripwire . --doctor`, `ripwire . --help-task="task"`
|
||||
- Graphify: `graphify --help`, `graphify <cmd> --help`
|
||||
- **Fallback & Retries (Cap at 1):**
|
||||
- If a command fails or rejects flags: inspect its `--help` and retry once.
|
||||
- If a tool returns empty results or an explicit refusal: try the alternative tool once; if still unresolved, report to user.
|
||||
- If data is suspected to be stale: run `graphify update .` or `ripwire . --no-cache` and retry once.
|
||||
- If a tool binary is missing (`command -v` check fails): state missing dependency clearly; do not guess syntax.
|
||||
|
||||
---
|
||||
|
||||
## 3. Git Operations & Safety
|
||||
|
||||
- **Read-only (Agent allowed):** `git status`, `git diff`, `git log`.
|
||||
- **Human-gated (User execution only):** `git add`, `commit`, `push`, `checkout`, `merge`, `rebase`, and branch management. If needed, request user action and pause.
|
||||
- **Exception:** `graphify hook install` is permitted (read-side only).
|
||||
|
||||
---
|
||||
|
||||
## 4. Development Server Lifecycle
|
||||
|
||||
- **Binding:** Always bind Django to `0.0.0.0:8000` (LAN accessible). Never use `127.0.0.1` unless explicitly requested.
|
||||
- **Process Management:** Before launching, inspect port `8000`. Terminate previous project server instances and their child process trees cleanly.
|
||||
- **Health Verification:** Confirm exactly one process listens on `0.0.0.0:8000`, then fetch `127.0.0.1:8000` locally to verify health.
|
||||
- **Asset Confirmation:** When checking frontend changes, verify the served content on the live server before suggesting browser cache issues to the user.
|
||||
|
||||
---
|
||||
|
||||
## 5. Environment, Frontend & PWA Safety
|
||||
|
||||
- **Python virtual environment:** Use the repository `.venv` for all Python and Django commands during development, tests, dependency management, and server startup. From WSL, run `.venv/Scripts/python.exe`; from Windows, run `.venv\Scripts\python.exe`. Run pip with `<venv-python> -m pip` and Django with `<venv-python> manage.py ...`. Do not use system Python or pip or create a second environment unless the user requests it.
|
||||
- **PyPI Mirror:** Use Liara's mirror: `https://package-mirror.liara.ir/repository/pypi/simple`. Use user-level pip configuration. Report downtime before falling back to public PyPI.
|
||||
- **Asset Versioning:** All locally served frontend assets must include `static_asset_version` in their URLs.
|
||||
- **PWA Lifecycle:** Keep the service worker registration URL versioned with `updateViaCache: 'none'`.
|
||||
- **Cache Regression Gate:** Changes to frontend caching or PWA code must pass assertions in `tests/test_views.py` and `tests/e2e/test_pwa_versioning.py`.
|
||||
|
||||
---
|
||||
|
||||
## 6. End-to-End Browser Tests (Playwright)
|
||||
|
||||
- **Organization:** Place tests in `tests/e2e/`, mark with `e2e`, and run against Django's transactional `live_server`.
|
||||
- **Scope & Lifecycle:** Use managed Chromium and BrowserContext from `tests/e2e/conftest.py`. Keep Playwright function-scoped to prevent event loop deadlocks with Django's synchronous database setup.
|
||||
- **Page Objects:** Encapsulate interactions inside `tests/e2e/pages/`. Tests must assert user-visible outcomes only.
|
||||
- **Synchronization:** Never use hardcoded sleeps. Rely on Playwright locators, `expect`, navigation, and state-change assertions.
|
||||
- **Diagnostics:** Maintain automatic screenshot/trace capture on failure. PWA scenarios must enable service workers and use the `pwa` marker.
|
||||
@@ -0,0 +1,9 @@
|
||||
## graphify
|
||||
|
||||
This project has a knowledge graph at graphify-out/ with god nodes, community structure, and cross-file relationships.
|
||||
|
||||
Rules:
|
||||
- For codebase questions, first run `graphify query "<question>"` when graphify-out/graph.json exists. Use `graphify path "<A>" "<B>"` for relationships and `graphify explain "<concept>"` for focused concepts. These return a scoped subgraph, usually much smaller than GRAPH_REPORT.md or raw grep output.
|
||||
- If graphify-out/wiki/index.md exists, use it for broad navigation instead of raw source browsing.
|
||||
- Read graphify-out/GRAPH_REPORT.md only for broad architecture review or when query/path/explain do not surface enough context.
|
||||
- After modifying code, run `graphify update .` to keep the graph current (AST-only, no API cost).
|
||||
@@ -0,0 +1,488 @@
|
||||
Project Root: khatibi
|
||||
Generated At: 2026-10-09T13:46:35+00:00
|
||||
Python Files: 95
|
||||
Django Files: 13
|
||||
JavaScript/TypeScript Files: 14
|
||||
HTML Files: 50
|
||||
Total Files: 412
|
||||
Total Directories: 66
|
||||
|
||||
khatibi
|
||||
├── .cursor
|
||||
│ └── rules
|
||||
│ └── graphify.mdc
|
||||
├── .gemini
|
||||
│ └── settings.json
|
||||
├── .github
|
||||
│ └── copilot-instructions.md
|
||||
├── .opencode
|
||||
│ ├── plugins
|
||||
│ │ └── graphify.js
|
||||
│ └── opencode.json
|
||||
├── admin
|
||||
│ ├── migrations
|
||||
│ │ └── __init__.py
|
||||
│ ├── __init__.py
|
||||
│ ├── admin.py
|
||||
│ ├── apps.py
|
||||
│ ├── models.py
|
||||
│ ├── tests.py
|
||||
│ ├── urls.py
|
||||
│ └── views.py
|
||||
├── admin_panel
|
||||
│ ├── management
|
||||
│ │ ├── commands
|
||||
│ │ │ ├── __init__.py
|
||||
│ │ │ ├── gt_esh.py
|
||||
│ │ │ ├── send_daily_report.py
|
||||
│ │ │ └── sqlite_db_backup.py
|
||||
│ │ └── __init__.py
|
||||
│ ├── migrations
|
||||
│ │ ├── 0001_initial.py
|
||||
│ │ ├── 0002_auto_20220114_1616.py
|
||||
│ │ ├── 0003_auto_20220115_1401.py
|
||||
│ │ ├── 0004_factor_paytype.py
|
||||
│ │ ├── 0005_auto_20220121_2054.py
|
||||
│ │ ├── 0006_auto_20220121_2100.py
|
||||
│ │ ├── 0007_productinstore_factor.py
|
||||
│ │ ├── 0008_storeroom_user.py
|
||||
│ │ ├── 0009_remove_storeroom_user.py
|
||||
│ │ ├── 0010_auto_20220122_1546.py
|
||||
│ │ ├── 0011_storeroom_user.py
|
||||
│ │ ├── 0012_visitqueue_user.py
|
||||
│ │ ├── 0013_alter_factor_options.py
|
||||
│ │ ├── 0014_auto_20220123_1348.py
|
||||
│ │ ├── 0015_auto_20220124_0858.py
|
||||
│ │ ├── 0016_factor_user.py
|
||||
│ │ ├── 0017_factoriteam_garantyesh.py
|
||||
│ │ ├── 0018_alter_factoriteam_product.py
|
||||
│ │ ├── 0019_article_articletype.py
|
||||
│ │ ├── 0020_auto_20220126_1532.py
|
||||
│ │ ├── 0021_alter_article_type.py
|
||||
│ │ ├── 0022_article_typepy.py
|
||||
│ │ ├── 0023_alter_article_typepy.py
|
||||
│ │ ├── 0024_action.py
|
||||
│ │ ├── 0025_action_actiontype.py
|
||||
│ │ ├── 0026_auto_20220209_1924.py
|
||||
│ │ ├── 0027_alter_action_nazar.py
|
||||
│ │ ├── 0028_action_grade.py
|
||||
│ │ ├── 0029_alter_article_options.py
|
||||
│ │ ├── 0030_auto_20220414_1047.py
|
||||
│ │ ├── 0031_article_sarresid.py
|
||||
│ │ ├── 0032_article_paystatus.py
|
||||
│ │ ├── 0033_article_nahvepardakht.py
|
||||
│ │ ├── 0034_alter_article_sarresid.py
|
||||
│ │ ├── 0035_alter_article_sarresid.py
|
||||
│ │ ├── 0036_sarresid.py
|
||||
│ │ ├── 0037_sarresid_sarresiddt.py
|
||||
│ │ ├── 0038_auto_20240213_1735.py
|
||||
│ │ ├── 0039_customer_last_bazdid_dt.py
|
||||
│ │ ├── 0040_customer_laghv_bazdid.py
|
||||
│ │ ├── 0041_auto_20240216_1607.py
|
||||
│ │ ├── 0042_article_user.py
|
||||
│ │ ├── 0043_sarresid_user.py
|
||||
│ │ ├── 0044_sarresid_desc.py
|
||||
│ │ ├── 0045_auto_20260610_1421.py
|
||||
│ │ ├── 0046_auto_20260624_1818.py
|
||||
│ │ ├── 0047_alter_productinstore_movement_type.py
|
||||
│ │ ├── 0048_alter_productinstore_options.py
|
||||
│ │ ├── 0049_alter_productinstore_options.py
|
||||
│ │ ├── 0050_storetransferrequest.py
|
||||
│ │ ├── 0051_auto_20260705_1356.py
|
||||
│ │ ├── 0052_storeroomowner.py
|
||||
│ │ ├── 0053_storeroom_owners.py
|
||||
│ │ ├── 0054_auto_20260715_2250.py
|
||||
│ │ ├── 0055_action_nextnazardt.py
|
||||
│ │ ├── 0056_auto_20260731_1824.py
|
||||
│ │ └── __init__.py
|
||||
│ ├── static
|
||||
│ │ └── admin_panel
|
||||
│ │ ├── DataTables
|
||||
│ │ │ ├── AutoFill-2.3.7
|
||||
│ │ │ │ ├── css
|
||||
│ │ │ │ └── js
|
||||
│ │ │ ├── Buttons-2.1.1
|
||||
│ │ │ │ ├── css
|
||||
│ │ │ │ └── js
|
||||
│ │ │ ├── DataTables-1.11.3
|
||||
│ │ │ │ ├── css
|
||||
│ │ │ │ ├── images
|
||||
│ │ │ │ └── js
|
||||
│ │ │ ├── FixedColumns-4.0.1
|
||||
│ │ │ │ ├── css
|
||||
│ │ │ │ └── js
|
||||
│ │ │ ├── FixedHeader-3.2.1
|
||||
│ │ │ │ ├── css
|
||||
│ │ │ │ └── js
|
||||
│ │ │ ├── jQuery-3.6.0
|
||||
│ │ │ │ ├── jquery-3.6.0.js
|
||||
│ │ │ │ └── jquery-3.6.0.min.js
|
||||
│ │ │ ├── JSZip-2.5.0
|
||||
│ │ │ │ ├── jszip.js
|
||||
│ │ │ │ └── jszip.min.js
|
||||
│ │ │ ├── pdfmake-0.1.36
|
||||
│ │ │ │ ├── pdfmake.js
|
||||
│ │ │ │ ├── pdfmake.min.js
|
||||
│ │ │ │ └── vfs_fonts.js
|
||||
│ │ │ ├── Responsive-2.2.9
|
||||
│ │ │ │ ├── css
|
||||
│ │ │ │ └── js
|
||||
│ │ │ ├── SearchBuilder-1.3.0
|
||||
│ │ │ │ ├── css
|
||||
│ │ │ │ └── js
|
||||
│ │ │ ├── SearchPanes-1.4.0
|
||||
│ │ │ │ ├── css
|
||||
│ │ │ │ └── js
|
||||
│ │ │ ├── Select-1.3.4
|
||||
│ │ │ │ ├── css
|
||||
│ │ │ │ └── js
|
||||
│ │ │ ├── datatables.css
|
||||
│ │ │ ├── datatables.js
|
||||
│ │ │ ├── datatables.min.css
|
||||
│ │ │ └── datatables.min.js
|
||||
│ │ ├── fonts
|
||||
│ │ │ ├── woff
|
||||
│ │ │ │ ├── IRANSansX-Bold.woff
|
||||
│ │ │ │ ├── IRANSansX-Regular.woff
|
||||
│ │ │ │ ├── IRANSansXFaNum-Bold.woff
|
||||
│ │ │ │ └── IRANSansXFaNum-Regular.woff
|
||||
│ │ │ └── woff2
|
||||
│ │ │ ├── IRANSansX-Bold.woff2
|
||||
│ │ │ ├── IRANSansX-Regular.woff2
|
||||
│ │ │ ├── IRANSansXFaNum-Bold.woff2
|
||||
│ │ │ └── IRANSansXFaNum-Regular.woff2
|
||||
│ │ ├── icons
|
||||
│ │ │ ├── add.png
|
||||
│ │ │ ├── cancell.png
|
||||
│ │ │ ├── check.png
|
||||
│ │ │ ├── check1.png
|
||||
│ │ │ ├── check2.png
|
||||
│ │ │ ├── check3.png
|
||||
│ │ │ ├── check43.png
|
||||
│ │ │ ├── delet.png
|
||||
│ │ │ ├── edit.png
|
||||
│ │ │ ├── icons8-checked-checkbox-64.png
|
||||
│ │ │ ├── time1.png
|
||||
│ │ │ └── time2.png
|
||||
│ │ ├── bulma-rtl.min.css
|
||||
│ │ ├── bulma.min.css
|
||||
│ │ ├── fontiran.css
|
||||
│ │ ├── kamadatepicker.holidays.js
|
||||
│ │ ├── kamadatepicker.min.css
|
||||
│ │ ├── kamadatepicker.min.js
|
||||
│ │ ├── persian-date.min.js
|
||||
│ │ ├── persian-datepicker.min.css
|
||||
│ │ ├── persian-datepicker.min.js
|
||||
│ │ └── style.css
|
||||
│ ├── templates
|
||||
│ │ └── admin_panel
|
||||
│ │ ├── customer
|
||||
│ │ │ ├── customerNazarInc.html
|
||||
│ │ │ └── nazar.html
|
||||
│ │ ├── ActionList.html
|
||||
│ │ ├── base.html
|
||||
│ │ ├── baseHesabdari.html
|
||||
│ │ ├── baseStore.html
|
||||
│ │ ├── bedehi.html
|
||||
│ │ ├── bedehiBK.html
|
||||
│ │ ├── customerAction.html
|
||||
│ │ ├── customerActionInc.html
|
||||
│ │ ├── customerBase.html
|
||||
│ │ ├── customerBaseNew.html
|
||||
│ │ ├── customerFactor.html
|
||||
│ │ ├── customerFactorBackup.html
|
||||
│ │ ├── customerHesabDari.html
|
||||
│ │ ├── customerID.html
|
||||
│ │ ├── customerIDBackup.html
|
||||
│ │ ├── customerIDFactor.html
|
||||
│ │ ├── customerIDFactorBackup.html
|
||||
│ │ ├── customerNew.html
|
||||
│ │ ├── customerNew2.html
|
||||
│ │ ├── customerNewBackup.html
|
||||
│ │ ├── customerRezayat.html
|
||||
│ │ ├── customerRezayatinc.html
|
||||
│ │ ├── customers.html
|
||||
│ │ ├── customerSarresid.html
|
||||
│ │ ├── customersBK.html
|
||||
│ │ ├── entezar.html
|
||||
│ │ ├── entezarBK.html
|
||||
│ │ ├── financial_dashboard.html
|
||||
│ │ ├── hesabdari.html
|
||||
│ │ ├── hesabdariCheckPass.html
|
||||
│ │ ├── hesabdariCheckPassFail.html
|
||||
│ │ ├── hesabdariResidNashode.html
|
||||
│ │ ├── index.html
|
||||
│ │ ├── login.html
|
||||
│ │ ├── newOperation.html
|
||||
│ │ ├── operations.html
|
||||
│ │ ├── operationsBK.html
|
||||
│ │ ├── report.html
|
||||
│ │ ├── report_debtors_no_vosol.html
|
||||
│ │ ├── report_inventory_movements.html
|
||||
│ │ ├── report_rezayat.html
|
||||
│ │ ├── reportCheckNesiye.html
|
||||
│ │ ├── rezayat.html
|
||||
│ │ ├── store.html
|
||||
│ │ ├── store_transfers.html
|
||||
│ │ ├── storeBK1.html
|
||||
│ │ └── stores.html
|
||||
│ ├── templatetags
|
||||
│ │ ├── __init__.py
|
||||
│ │ ├── custom_tags.py
|
||||
│ │ └── remove_q_p.py
|
||||
│ ├── __init__.py
|
||||
│ ├── admin.py
|
||||
│ ├── apps.py
|
||||
│ ├── context_processor.py
|
||||
│ ├── models.py
|
||||
│ ├── services.py
|
||||
│ ├── tests.py
|
||||
│ ├── urls.py
|
||||
│ ├── views - Copy.py
|
||||
│ ├── views.py
|
||||
│ └── viewsBK.py
|
||||
├── data9
|
||||
│ ├── db2 (2).sqlite32
|
||||
│ ├── db2.sqlite32
|
||||
│ ├── db222.sqlite3
|
||||
│ └── kt.sqlite3
|
||||
├── graphify-out
|
||||
│ ├── 2026-10-09
|
||||
│ │ ├── .graphify_analysis.json
|
||||
│ │ ├── .graphify_labels.json
|
||||
│ │ ├── .graphify_semantic_marker
|
||||
│ │ ├── graph.json
|
||||
│ │ ├── GRAPH_REPORT.md
|
||||
│ │ └── manifest.json
|
||||
│ ├── cache
|
||||
│ │ ├── ast
|
||||
│ │ │ └── v0.9.82-s7
|
||||
│ │ │ ├── 0075bdcd95747f7c750eba8757614aab71d4d8c77bd6764e4c5a98fe18dc8997.json
|
||||
│ │ │ ├── 03c6fb41770a9293658a5db5af36f7e4afe64ae04b3ce8cc6c5874320706fd22.json
|
||||
│ │ │ ├── 0442dd7e8445ba796e02aaefde16760c8ed37f63359d4319498be512f60266bd.json
|
||||
│ │ │ ├── 056f0cb55bfd5a1ddf744c7c824c342048c1db47f3bb350030a1533ab56bf8d7.json
|
||||
│ │ │ ├── 0b8f8e3b6e4d84256e784dabb96f5646fa6e7295adbd20648c235e7821b4ca1d.json
|
||||
│ │ │ ├── 0e6bfa570caca1f79f549f5cdc37f8bdf9c9b43a023ca28a8fcb83351389b399.json
|
||||
│ │ │ ├── 128b2b616c097fbfbcbc3fddafc224df0919ba261bb5ded7bcafa8b445fe118b.json
|
||||
│ │ │ ├── 12d922593c75865b8068057f9244ad61a5ee573b7f3f38a16c31fa83abb9d668.json
|
||||
│ │ │ ├── 13ca1f37c3eea3c07228d2d98d47f7db6a9c1d8468b259651f3fea5419651569.json
|
||||
│ │ │ ├── 15be5091a5bfbf8f48c3f3ae344a980be5452eab00f054c001958aae96557514.json
|
||||
│ │ │ ├── 174e406c2649f2384921581cbf912945a95d54aab73707b9aa45752aaa7c54d7.json
|
||||
│ │ │ ├── 183467d5c1ee7daac78dfb428bd335c17e17272bd4510358f38fc5924140c816.json
|
||||
│ │ │ ├── 1893253c5245ae073f9de9168d537384ab764b79d7b1631c785cd7335aab791b.json
|
||||
│ │ │ ├── 1dd0c6958a307a1e4e59c24f20225292277585dd8652b35537ede94fc04807ee.json
|
||||
│ │ │ ├── 21af53aa7322868a25b47458e59f339a8f6e58b7914fbe8e3389ab86e0b0b643.json
|
||||
│ │ │ ├── 22310d4d49f2beee611c83915933ea06e80ec562fd92c170345c556cd3772561.json
|
||||
│ │ │ ├── 2356cb9f067d43739312459bad2cb6d9ecbacac703e7e40a282d5b89d64332b3.json
|
||||
│ │ │ ├── 23f4e3a62e03a38743659d94dd1350d17775da8be9175846e4ff3f38fa87c515.json
|
||||
│ │ │ ├── 2501a9885d6fa5292276ee8cc7db63a9a3c08605f38d199d425d33f650dac35e.json
|
||||
│ │ │ ├── 294e2d390f56acc0445564d428d90c641d76496cbc457bcfb09876382e9d87ab.json
|
||||
│ │ │ ├── 3614ae46baf3e1b6efa17011c37407a5d2931aba1886d8f8bdf8e4e154ab6c3f.json
|
||||
│ │ │ ├── 3ff644065147b53af40ea703202c0fd832114936fe67e6c9a30d15e3da915455.json
|
||||
│ │ │ ├── 40e7fbe5e765171201ab8016acce76a28304e1339d9aeb5a9cc18da87c5604d2.json
|
||||
│ │ │ ├── 41952e7c846da15fe658603ff001dafdb0e12d3372a7f0306adfa3a71de8bee7.json
|
||||
│ │ │ ├── 458c1b9a3ce257e789f75305939ab2e79029c557657102eebf2082e50a47a0e5.json
|
||||
│ │ │ ├── 45f7e59ef3f291171180b6763e8da408d8b7579bb7cb96dd4ca859e48aa5ce14.json
|
||||
│ │ │ ├── 52608b276c6f0a2f190186e5bac578715ad888ff5ba3c10ff30879c3baf9d9ce.json
|
||||
│ │ │ ├── 5316515ee7fc3e1038e676b361d9028edc735993c3d34791a77a14503deb064d.json
|
||||
│ │ │ ├── 5730d72cc177474584197921cce656696e3177780028c4629950f5514b530c6d.json
|
||||
│ │ │ ├── 57a18b5350b4a567305ca01b2951efee6eeb3b289b5ffbbf390c3962ff29d61c.json
|
||||
│ │ │ ├── 58ad02e0930221b4f44603dbcf01d3b5d07d9da2772edafe48a94a9894ea148a.json
|
||||
│ │ │ ├── 58bfae9cf8467d2bb9363884d517e98cae38a934f4c474e9e02aed520fdaab95.json
|
||||
│ │ │ ├── 5901400fc36893a9ad85acd97eb73b691cb4b8d1440047c5f85c1534a2c7e492.json
|
||||
│ │ │ ├── 5d5b6249e3cfa0aeee94ba2053fc73b4b7b5b8fa1d21df09d40bda7c90ef273d.json
|
||||
│ │ │ ├── 60002a01d6fc22147e2994d1a1a447d5e577c02aed2443789af20571ec2d2a19.json
|
||||
│ │ │ ├── 60e00560038df059b1696e54dcf055cd658677d6e1201570a8500531addc0ac6.json
|
||||
│ │ │ ├── 63c38f2a8abe98c0d1e9cb5b7d9fd0451e1e46c2bcbf1d2c3b241b263ac0a9cd.json
|
||||
│ │ │ ├── 6448d65fdcfe330b5d4278c8d1540e7b075238672b8101f9d2e1c4052f7c9c49.json
|
||||
│ │ │ ├── 64fc04d8c553b2121a71955d48257160a40f6dd34258e3287945873f02d897dc.json
|
||||
│ │ │ ├── 65d5139792e0ee840c5b1710d7659ecfb5dbdcadbd02d205f7517a6a3a374211.json
|
||||
│ │ │ ├── 6876f75a9cb4a5f5857c47e3b0d6b38e51941aff76bc6d92cb1b4eef1c51071e.json
|
||||
│ │ │ ├── 6d4d7d7f829f13e46e4898aceb760d66d2255dc838eab0933f9a92d720f420a7.json
|
||||
│ │ │ ├── 6df9c1e88224e95c55dee4238fa91358360231ee47362294e884bc6e24d73612.json
|
||||
│ │ │ ├── 6e2ed39911a83c75e432ffd0dab22fd095ce8c5bb186d6ab22d594375f3b32bc.json
|
||||
│ │ │ ├── 71a07328d56403d55714d76cefc05db3e68c6498719e629e4e76889a1940efc2.json
|
||||
│ │ │ ├── 73a129efd08cc38274f3c56503c234eef17f58faf74dadbdbbe475efcbfc2777.json
|
||||
│ │ │ ├── 7483cdf00a2d7de8809278d9dcdf2f2330354b02117952da4b9452d4bbd6b81e.json
|
||||
│ │ │ ├── 74efb913c62b374d818cfc5af6d7ee9bb46966eb2bce0e26e0bba461683b98a7.json
|
||||
│ │ │ ├── 75d0862c4a7be01c37a92f0baf858c27367f6b242254080cccc5888a758dd0ff.json
|
||||
│ │ │ ├── 760b5e6a8ce6ddc3b34aae59a11c57c36471f9eb93f8d2e24c7a030c8ad02dbc.json
|
||||
│ │ │ ├── 761cb648c1272d981720580035fca3a501c423ab819648863f223b83292b4e58.json
|
||||
│ │ │ ├── 780977bca042ffdde1cca2811a3a46c36bd3fcff2723c94ac527428113131c64.json
|
||||
│ │ │ ├── 7be7f428e6acfe4c99370707cc7de9253f801feff1564088f2584d5dc8c42a89.json
|
||||
│ │ │ ├── 8055bf9fe36a9fa183d0c5dc152684e65410d58c5634e544e8f38f6c9216f6ad.json
|
||||
│ │ │ ├── 82833f6235cb6559bad38e93372d42284eb4e9097e90519337266113da2495bf.json
|
||||
│ │ │ ├── 828dacee98d6f71fcf53c8a051b3bf1bfc9d94c272a79ed8539801e3fb90b3df.json
|
||||
│ │ │ ├── 846ba1087a1ee6b5cda2ebdf22d0bc61ad9175b21aba29783429277288dbfaaf.json
|
||||
│ │ │ ├── 86e57806cd08cf765ce1f56f0638dd321e93c653bb6613aa35d7ad375808433c.json
|
||||
│ │ │ ├── 88e349e879d601e1f5c75f3b019ffb4958e90639317ba893c54f82b0cc9066c2.json
|
||||
│ │ │ ├── 8ffb83ce6f13d2f97d0197c7381748e9b66956c13f0158bc519350b7dd1b9ad0.json
|
||||
│ │ │ ├── 957f37be1d5d6a5207f90ad07704f8423c915c5bcdfcd130acc85a388fc89d19.json
|
||||
│ │ │ ├── 96c3ba545db191ae5811d5dfdde74e7c6396a932b759513c94160cb7b7c81fc8.json
|
||||
│ │ │ ├── 9cfb6e4f7b08a863675af032e7823c0523170f5201e686c5ef72b39c04b07a12.json
|
||||
│ │ │ ├── 9eabdb0cacba38c8fb6b3e777932e06bd82172cdc0bcccf2fc0bfc23b5bd4974.json
|
||||
│ │ │ ├── a31ab0e36b30049a602cc060d77c0715187f7c3838db91b8c20bfaa802f49899.json
|
||||
│ │ │ ├── a823c9c28027c8d525714e6571bc3f3ca38f3bd0420aaf4f4921067cf0672475.json
|
||||
│ │ │ ├── a8311f6e51027ea4606e35bf14d50edc1795e71b2d63cddeae8c7bb7ece215b8.json
|
||||
│ │ │ ├── aeaae7b60339b1283cab517b4ab42806c64933c272d007a68431988ba8e0edb5.json
|
||||
│ │ │ ├── b26e251bde84a040dbb2d1a4f700ebcd761f51a124a98a104704e82537e320eb.json
|
||||
│ │ │ ├── b59999c2fd322c241c7bd37e6ed0a95c9124cbb79f8424f1fa7cb2e92fe63817.json
|
||||
│ │ │ ├── b82d5f6840b4930eb62fdb1c7b3a58124fff805e529ede7684516a65322fcae0.json
|
||||
│ │ │ ├── bb140cfe12cfb3e32dc9815393035fc33c7649c2faeeccb82cdee56a930ea635.json
|
||||
│ │ │ ├── bcea7c584e5031a9c5734144f8169d016ef1ed316e6f4827609509ba2a79d3eb.json
|
||||
│ │ │ ├── bd6e156d8e427b14676b4707710f2b340026e679cb7bd29b22b247a4b637e7bd.json
|
||||
│ │ │ ├── be1200d7c9b2881ba54c7fa95daf5f3e2ce993619b974c7760a9d44a416e00c0.json
|
||||
│ │ │ ├── c46ad3fc8fd3db1315ab2e40add760b44e8f98c24c79e334c342c6a411fc671c.json
|
||||
│ │ │ ├── c52300dce4cf464158f8db56df5030359a501a81bbe4a5f36e50c8c38a5ac48c.json
|
||||
│ │ │ ├── c5c93ccc7715c31fc7538bcd9327c8fb7c1e495bd17d6444b384ec426b7a231f.json
|
||||
│ │ │ ├── c72226544540cc75217ba02f1d09d989eb810d879409ac086c76245f27220cfa.json
|
||||
│ │ │ ├── c795f43bd1f10cf666ff987d18af538b2164c1683629ac689f0a54cb875118be.json
|
||||
│ │ │ ├── c7eb97fa16701c6d9ee531fa032479a7c771292f3e9d8921d3ea12a4897fd43a.json
|
||||
│ │ │ ├── cf6668c54cd4f65d268a17df44f100e1cb77f91eae90dd2dc052564731b2f195.json
|
||||
│ │ │ ├── d3456cd690135f9630e6b0bb79fef5d205804c7acabffc61cbd5ac4032b17bc7.json
|
||||
│ │ │ ├── d88e1e365cafd5d26ce47c2a0fe1f067dc3bfe5ceed1f75a21393fae950be939.json
|
||||
│ │ │ ├── db68b8db5217e2295eb1195760d7352960627da044a4c4f8f6b89c67ad2f8f57.json
|
||||
│ │ │ ├── dc0344515d1b3ffe8643560516b88418be0b306fba56101b8a630ed73d48db46.json
|
||||
│ │ │ ├── e16f78807ff202fa2c81867b321acfacede2d24cc785856eef0633d8d352796b.json
|
||||
│ │ │ ├── e1a7be59904a3dc503c5b12bddc7604c6783b02462c8ec76834c65c5610c3bda.json
|
||||
│ │ │ ├── e3ee8d9942c74a74be83ca00d5438e4a1e1cb5b23f55d95d308a42954e4757f0.json
|
||||
│ │ │ ├── e9e14d581ed59799b2d83c67402e8555b5b59e7d49425950ec490422bd0307d9.json
|
||||
│ │ │ ├── ec07e022005d3513838eee7e6618ff060e25d914cab7745aa6172f22d4089497.json
|
||||
│ │ │ ├── ecd9c1dbfa0a72e253adb680ae7088eff24c26360e53a65862b274ea1281ceae.json
|
||||
│ │ │ ├── ee557c6ed214858651cd3ebceb5e0fd00999354a4c54bb379f26c64b48b509ab.json
|
||||
│ │ │ ├── efd113025c3fb3c0becaecd8090e8494b13d92ff3c49220d54665b3a8af586af.json
|
||||
│ │ │ ├── f1af209a02f2ec5c5a344e3fa7dd8ad7d443e0479e55f5465449c0a2eed314a1.json
|
||||
│ │ │ ├── f3a6285dcf9eb39df500bc0b76b03b5941103e8b90c06ffaeab1b3129f18fedc.json
|
||||
│ │ │ ├── f537b36e2ee33d1303c10e950a6910cc7fd954c7fce3220be2c95d75d70dfd40.json
|
||||
│ │ │ ├── f76726d2898f2a3ba7168d3fb77c21087432eb9c200631b664ecb3b1837aaf17.json
|
||||
│ │ │ └── fc6ae63ae2639372c4ae4fbe9718feca814261dda099ba58bb780d14c69086cd.json
|
||||
│ │ ├── semantic
|
||||
│ │ │ └── p5e80268fecd6
|
||||
│ │ │ ├── 0c4f87b180cd5b0576b197ff5cb0e9cc5dfd8d82d97d618036df00c7955fdbac.json
|
||||
│ │ │ ├── 14e03f8f9b4ebd7cf018188e2351ca859aa4e27d02d5dbfc7b1f8b932d282d16.json
|
||||
│ │ │ ├── 2679b1fb1647af24f007334e6560733c957ca3cf3831eb02a9c8fb7a7ae44d62.json
|
||||
│ │ │ ├── 296d532aced4658e74a296977efe4fd8a2ec3cf02a997ce3837f59ce36e61343.json
|
||||
│ │ │ ├── 2a13d2bb6f18a81d9511481df0edcdb1a8779e1ec03e919991693cae7e84c8e0.json
|
||||
│ │ │ ├── 2d3b8c0bb7eea6a50a24093abfc3457c0938079b0771b2568498060f6f3a4a74.json
|
||||
│ │ │ ├── 40373bd2bcd76ed8ed27031299e541005d4c8c0c7df312a9312f390b173d7248.json
|
||||
│ │ │ ├── 42a95a4a8f651dbebe297ce92beca376cb19eab99d6ef6b5d10a16d79d1842e4.json
|
||||
│ │ │ ├── 4f53e6b5fc48381f8afe6052371989c4df69347c84c2ec65a46b73cd1c464b5f.json
|
||||
│ │ │ ├── 538cdc2fb71798c581f20d37d52a1484c2ef21691d2e01ee79edcf253ba06394.json
|
||||
│ │ │ ├── 569db52f8b9229dc3cd5cbde156a4ac012ab711d32bdeb4175b60ba863ac8cd0.json
|
||||
│ │ │ ├── 57dba5c2a37beb12ccc107807b7544f687d6d8ba6394c8977c3c59b433d2dab4.json
|
||||
│ │ │ ├── 5ad5f87fc2eb132405e3aab9ef8a84e41f76c958fbcb188873c86abd4fbc12fd.json
|
||||
│ │ │ ├── 6aaa93a769a41eb1d37a91608cd6f98b9252c2a5598bd859a130986429d1d53f.json
|
||||
│ │ │ ├── 7b504b4173cb8d683a7021270372c5c65f078ac3e3e1351601bedfec9c585632.json
|
||||
│ │ │ ├── 7edbffbd4455d071df034927a69faaf76f8e8bbf6495921ce2b70eea1abe8e4f.json
|
||||
│ │ │ ├── 8a79c80fca0ed04957e7b4df749ab80b5d0f4ce3d0ae032a47d51d4a2fbfcd82.json
|
||||
│ │ │ ├── 8f60bda631cbe7457886d1d574b2e3d2850034f469592a3e8c333f0623a2d3c6.json
|
||||
│ │ │ ├── 9897fa1997a41e155ed8de922722238e1f684f5c77a7f56405c8ac7cd1aa376f.json
|
||||
│ │ │ ├── 9b674bec71dfe6e133af9fb4e35a421fa56cecd230544008ed83a44e6eaae3bf.json
|
||||
│ │ │ ├── aa41b77ce8563f4b4bee015be5ffa598f1c98d4f2854ec9a465f271e8c3f974b.json
|
||||
│ │ │ ├── b5f6ef338a857f51d581abe7c50f57f41757aa6900bf94f6ed8fc2ad442f6019.json
|
||||
│ │ │ ├── be1200d7c9b2881ba54c7fa95daf5f3e2ce993619b974c7760a9d44a416e00c0.json
|
||||
│ │ │ ├── c1d9e0aa5d7450242681eebd003d4f502744a3624112b10ab091011a50820ce3.json
|
||||
│ │ │ ├── c97d49fed39b9aca8dea35a49c3e031a641420e4452e61d1ea2a912e899f6dd9.json
|
||||
│ │ │ ├── cacf6773249daafca21d21004106209d86aa215140de071c64363aff4d9e5431.json
|
||||
│ │ │ ├── cfb57017bc764ee7e9011b52f1e44ad2f41b2670778af73232ecfc309b406a0d.json
|
||||
│ │ │ ├── dc89fcddf8c6f20bc9f52ae15e5cc8b226320d2776dc8f27be16894e53165013.json
|
||||
│ │ │ ├── dd78862d0f7862653c702e86f7acfabfe33ec5d85d40ba764138c0d1784f7b06.json
|
||||
│ │ │ ├── de67f63e3f49d4ee32811dd67676da33a1e584f671d396fca130f3681d54bd76.json
|
||||
│ │ │ ├── e0a52ba8204140f195e8d30847dda00d3de5439cf903c576b77fac1ec852b5fb.json
|
||||
│ │ │ ├── f71a50c524a31da468cf7c0c08d929d4d31bf17e77473db59b5830f4c583ce25.json
|
||||
│ │ │ ├── f7fdf480e35ed096b57529bfcafd8695aff9a98851050be1f00e4a736ad79719.json
|
||||
│ │ │ └── fb1977d392a5009580c7a608fd403ac2ae96c72f6f2835ba6e49cf662dd0bf6d.json
|
||||
│ │ ├── semantic-deep
|
||||
│ │ │ └── pd68e17f4cee0
|
||||
│ │ │ ├── 0c4f87b180cd5b0576b197ff5cb0e9cc5dfd8d82d97d618036df00c7955fdbac.json
|
||||
│ │ │ ├── 13fa2da33c99b59f959d42f291dbd55c0d607fcab30d71775c9eac516d8d50d8.json
|
||||
│ │ │ ├── 14e03f8f9b4ebd7cf018188e2351ca859aa4e27d02d5dbfc7b1f8b932d282d16.json
|
||||
│ │ │ ├── 24288109cc2c5a8ccae2a63e9174bb373f133d8ce9400865caf81bd04fb5a2ce.json
|
||||
│ │ │ ├── 2679b1fb1647af24f007334e6560733c957ca3cf3831eb02a9c8fb7a7ae44d62.json
|
||||
│ │ │ ├── 296d532aced4658e74a296977efe4fd8a2ec3cf02a997ce3837f59ce36e61343.json
|
||||
│ │ │ ├── 2a13d2bb6f18a81d9511481df0edcdb1a8779e1ec03e919991693cae7e84c8e0.json
|
||||
│ │ │ ├── 2d3b8c0bb7eea6a50a24093abfc3457c0938079b0771b2568498060f6f3a4a74.json
|
||||
│ │ │ ├── 32267f72ce9ef01cd2e804d43c6828549af8eb6f868c76e7d1619502a953f14d.json
|
||||
│ │ │ ├── 40373bd2bcd76ed8ed27031299e541005d4c8c0c7df312a9312f390b173d7248.json
|
||||
│ │ │ ├── 40a84c5465882009ab69d2874adbb9aaed373cd706d70c92e9e1f4c35640472e.json
|
||||
│ │ │ ├── 4280dd1094314da773fe73ba1ffb91f58f22eea26281bd5cb51f5e9a201c95f6.json
|
||||
│ │ │ ├── 42a95a4a8f651dbebe297ce92beca376cb19eab99d6ef6b5d10a16d79d1842e4.json
|
||||
│ │ │ ├── 4b8f3b6c0ccb3b5494fb2af8c0f9892b6b198a8d503f53498bd1fe2548ef112a.json
|
||||
│ │ │ ├── 4f53e6b5fc48381f8afe6052371989c4df69347c84c2ec65a46b73cd1c464b5f.json
|
||||
│ │ │ ├── 538cdc2fb71798c581f20d37d52a1484c2ef21691d2e01ee79edcf253ba06394.json
|
||||
│ │ │ ├── 569db52f8b9229dc3cd5cbde156a4ac012ab711d32bdeb4175b60ba863ac8cd0.json
|
||||
│ │ │ ├── 57dba5c2a37beb12ccc107807b7544f687d6d8ba6394c8977c3c59b433d2dab4.json
|
||||
│ │ │ ├── 5ad5f87fc2eb132405e3aab9ef8a84e41f76c958fbcb188873c86abd4fbc12fd.json
|
||||
│ │ │ ├── 60002a01d6fc22147e2994d1a1a447d5e577c02aed2443789af20571ec2d2a19.json
|
||||
│ │ │ ├── 6aaa93a769a41eb1d37a91608cd6f98b9252c2a5598bd859a130986429d1d53f.json
|
||||
│ │ │ ├── 7101777f271bbc6bce9a2a4fd3bcf487bb62a846a2436bc8c70008bfb23ce33b.json
|
||||
│ │ │ ├── 7b504b4173cb8d683a7021270372c5c65f078ac3e3e1351601bedfec9c585632.json
|
||||
│ │ │ ├── 7db83b9e384d80a1584b152f9fbc781e0ae5a7524dac0a57ce98bb4d3432bfae.json
|
||||
│ │ │ ├── 7edbffbd4455d071df034927a69faaf76f8e8bbf6495921ce2b70eea1abe8e4f.json
|
||||
│ │ │ ├── 8a79c80fca0ed04957e7b4df749ab80b5d0f4ce3d0ae032a47d51d4a2fbfcd82.json
|
||||
│ │ │ ├── 8f60bda631cbe7457886d1d574b2e3d2850034f469592a3e8c333f0623a2d3c6.json
|
||||
│ │ │ ├── 92e1d82ed4571249c09163413ceae360dd4d7d03c162c554f3b5a47e94474cf1.json
|
||||
│ │ │ ├── 9897fa1997a41e155ed8de922722238e1f684f5c77a7f56405c8ac7cd1aa376f.json
|
||||
│ │ │ ├── 9b674bec71dfe6e133af9fb4e35a421fa56cecd230544008ed83a44e6eaae3bf.json
|
||||
│ │ │ ├── a3f1dac3e797de04ab83d263a12eda947904d8e5015b77363db2d29aba8b4928.json
|
||||
│ │ │ ├── aa41b77ce8563f4b4bee015be5ffa598f1c98d4f2854ec9a465f271e8c3f974b.json
|
||||
│ │ │ ├── b205a6dda565ed51a38a6b75c509f41589425f0c2006aad838978f5dc6810b91.json
|
||||
│ │ │ ├── b425db4362cb5940736764d1db891a2a92493f65e908c61b5315c051c8c806f2.json
|
||||
│ │ │ ├── b5f6ef338a857f51d581abe7c50f57f41757aa6900bf94f6ed8fc2ad442f6019.json
|
||||
│ │ │ ├── b60e18af0bc21c2c0c8a3be7f6291eb06de84c200a12cfdbecc64cf843a44099.json
|
||||
│ │ │ ├── be1200d7c9b2881ba54c7fa95daf5f3e2ce993619b974c7760a9d44a416e00c0.json
|
||||
│ │ │ ├── c16ecf9a717a43b849867c613092f411b6468249ea9d9220133743397ec47bd9.json
|
||||
│ │ │ ├── c1d9e0aa5d7450242681eebd003d4f502744a3624112b10ab091011a50820ce3.json
|
||||
│ │ │ ├── c97d49fed39b9aca8dea35a49c3e031a641420e4452e61d1ea2a912e899f6dd9.json
|
||||
│ │ │ ├── cacf6773249daafca21d21004106209d86aa215140de071c64363aff4d9e5431.json
|
||||
│ │ │ ├── cfb57017bc764ee7e9011b52f1e44ad2f41b2670778af73232ecfc309b406a0d.json
|
||||
│ │ │ ├── dc89fcddf8c6f20bc9f52ae15e5cc8b226320d2776dc8f27be16894e53165013.json
|
||||
│ │ │ ├── dd78862d0f7862653c702e86f7acfabfe33ec5d85d40ba764138c0d1784f7b06.json
|
||||
│ │ │ ├── de67f63e3f49d4ee32811dd67676da33a1e584f671d396fca130f3681d54bd76.json
|
||||
│ │ │ ├── e0a52ba8204140f195e8d30847dda00d3de5439cf903c576b77fac1ec852b5fb.json
|
||||
│ │ │ ├── e13320e9716b0be66b7cc677a64b44cf3127f7317f35cfa3b849dfbaa9c1f367.json
|
||||
│ │ │ ├── e1c07127e4cef79fe0bfc63a0ab904e5d1b0d9c4be5278b553b6e48d39753b4d.json
|
||||
│ │ │ ├── f0478454ef37ecdc5128db97c18d0ffd92005c1d1db586b6750d985e30a25d76.json
|
||||
│ │ │ ├── f71a50c524a31da468cf7c0c08d929d4d31bf17e77473db59b5830f4c583ce25.json
|
||||
│ │ │ ├── f7fdf480e35ed096b57529bfcafd8695aff9a98851050be1f00e4a736ad79719.json
|
||||
│ │ │ ├── fb1977d392a5009580c7a608fd403ac2ae96c72f6f2835ba6e49cf662dd0bf6d.json
|
||||
│ │ │ └── fb9193d41dc162bc3899036e6f38f0f746acc863e37f2d9f166a5ca79ec008c0.json
|
||||
│ │ ├── last_query_stamp
|
||||
│ │ └── stat-index.json
|
||||
│ ├── .graphify_analysis.json
|
||||
│ ├── .graphify_labels.json
|
||||
│ ├── .graphify_labels.json.sig
|
||||
│ ├── .graphify_root
|
||||
│ ├── .graphify_semantic_marker
|
||||
│ ├── graph.html
|
||||
│ ├── graph.json
|
||||
│ ├── GRAPH_REPORT.md
|
||||
│ └── manifest.json
|
||||
├── khatibi
|
||||
│ ├── __init__.py
|
||||
│ ├── asgi.py
|
||||
│ ├── production_settings.py
|
||||
│ ├── settings.py
|
||||
│ ├── urls.py
|
||||
│ └── wsgi.py
|
||||
├── static
|
||||
│ └── .gitkeep
|
||||
├── .dockerignore
|
||||
├── .gitignore
|
||||
├── .graphifyignore
|
||||
├── AGENTS.md
|
||||
├── check_finance.py
|
||||
├── db.json
|
||||
├── Dockerfile
|
||||
├── entrypoint.sh
|
||||
├── financial_audit_20260816_151225.csv
|
||||
├── GEMINI.md
|
||||
├── ghost_hunter.py
|
||||
├── khatibi.zip
|
||||
├── local.env
|
||||
├── manage.py
|
||||
├── production.env
|
||||
├── project_tree.py
|
||||
├── reconciliation_tool.py
|
||||
├── requirements.txt
|
||||
└── requirements2.txt
|
||||
@@ -0,0 +1,999 @@
|
||||
{
|
||||
"communities": {
|
||||
"0": [
|
||||
"abstractbaseuser",
|
||||
"admin_panel_models",
|
||||
"admin_panel_models_articletype",
|
||||
"admin_panel_models_cachetable",
|
||||
"admin_panel_models_cachetable_str",
|
||||
"admin_panel_models_phonenumber",
|
||||
"admin_panel_models_phonenumber_str",
|
||||
"admin_panel_models_product",
|
||||
"admin_panel_models_product_meta",
|
||||
"admin_panel_models_product_str",
|
||||
"admin_panel_models_productstockhistory",
|
||||
"admin_panel_models_productstockhistory_meta",
|
||||
"admin_panel_models_productstockhistory_str",
|
||||
"admin_panel_models_rationale_97",
|
||||
"admin_panel_models_storeroomowner",
|
||||
"admin_panel_models_storetransferrequest",
|
||||
"admin_panel_models_storetransferrequest_clean",
|
||||
"admin_panel_models_storetransferrequest_meta",
|
||||
"admin_panel_models_storetransferrequest_status",
|
||||
"admin_panel_models_storetransferrequest_str",
|
||||
"admin_panel_models_userprofile",
|
||||
"admin_panel_models_userprofile_str",
|
||||
"admin_panel_models_visitqueue",
|
||||
"admin_panel_services",
|
||||
"admin_panel_services_approve_transfer_request",
|
||||
"admin_panel_services_cancel_transfer_request",
|
||||
"admin_panel_services_check_source_store_permission",
|
||||
"admin_panel_services_check_target_store_permission",
|
||||
"admin_panel_services_create_transfer_request",
|
||||
"admin_panel_services_get_product_current_stock",
|
||||
"admin_panel_services_rationale_160",
|
||||
"admin_panel_services_rationale_187",
|
||||
"admin_panel_services_rationale_20",
|
||||
"admin_panel_services_rationale_30",
|
||||
"admin_panel_services_rationale_40",
|
||||
"admin_panel_services_rationale_64",
|
||||
"admin_panel_services_rationale_99",
|
||||
"admin_panel_services_reject_transfer_request",
|
||||
"admin_panel_views_process_transfer_action",
|
||||
"admin_panel_views_rationale_1320",
|
||||
"atomic",
|
||||
"django_contrib_auth",
|
||||
"django_contrib_auth_models",
|
||||
"django_core_exceptions",
|
||||
"django_db_models",
|
||||
"django_dispatch",
|
||||
"django_utils_translation",
|
||||
"typing"
|
||||
],
|
||||
"1": [
|
||||
"admin_panel_context_processor",
|
||||
"admin_panel_context_processor_dashboxdata",
|
||||
"admin_panel_management_commands_send_daily_report",
|
||||
"admin_panel_management_commands_send_daily_report_command",
|
||||
"admin_panel_management_commands_send_daily_report_command_handle",
|
||||
"admin_panel_management_commands_send_daily_report_py_basecommand",
|
||||
"admin_panel_models_article",
|
||||
"admin_panel_models_article_meta",
|
||||
"admin_panel_models_customer",
|
||||
"admin_panel_models_customer_delete",
|
||||
"admin_panel_models_customer_meta",
|
||||
"admin_panel_models_customer_str",
|
||||
"admin_panel_models_factor",
|
||||
"admin_panel_models_factor_delete",
|
||||
"admin_panel_models_factor_meta",
|
||||
"admin_panel_models_factoriteam",
|
||||
"admin_panel_models_sarresid",
|
||||
"admin_panel_templatetags_custom_tags",
|
||||
"admin_panel_templatetags_custom_tags_has_group",
|
||||
"admin_panel_templatetags_custom_tags_tojalali",
|
||||
"admin_panel_templatetags_remove_q_p",
|
||||
"admin_panel_templatetags_remove_q_p_rationale_7",
|
||||
"admin_panel_templatetags_remove_q_p_remove_query_param",
|
||||
"admin_panel_views_customerhesabdariadd",
|
||||
"admin_panel_views_customersadd",
|
||||
"admin_panel_views_newfactor",
|
||||
"check_finance",
|
||||
"check_finance_check_financial_discrepancy",
|
||||
"csv",
|
||||
"datetime",
|
||||
"django",
|
||||
"django_core_asgi",
|
||||
"django_core_wsgi",
|
||||
"django_db_models_functions",
|
||||
"django_utils",
|
||||
"filter",
|
||||
"ghost_hunter",
|
||||
"ghost_hunter_run_360_audit",
|
||||
"khatibi_asgi",
|
||||
"khatibi_asgi_rationale_1",
|
||||
"khatibi_wsgi",
|
||||
"khatibi_wsgi_rationale_1",
|
||||
"os",
|
||||
"persiantools_jdatetime",
|
||||
"reconciliation_tool",
|
||||
"reconciliation_tool_run_audit",
|
||||
"requests"
|
||||
],
|
||||
"2": [
|
||||
"admin_panel_management_commands_gt_esh",
|
||||
"admin_panel_management_commands_gt_esh_command",
|
||||
"admin_panel_management_commands_gt_esh_command_add_arguments",
|
||||
"admin_panel_management_commands_gt_esh_command_execute_by_immediate_chunks",
|
||||
"admin_panel_management_commands_gt_esh_command_execute_hybrid_migration",
|
||||
"admin_panel_management_commands_gt_esh_command_handle",
|
||||
"admin_panel_management_commands_gt_esh_command_process_single_chunk",
|
||||
"admin_panel_management_commands_gt_esh_py_basecommand",
|
||||
"admin_panel_management_commands_gt_esh_rationale_115",
|
||||
"admin_panel_management_commands_gt_esh_rationale_123",
|
||||
"admin_panel_management_commands_gt_esh_rationale_89",
|
||||
"admin_panel_management_commands_sqlite_db_backup",
|
||||
"admin_panel_management_commands_sqlite_db_backup_command",
|
||||
"admin_panel_management_commands_sqlite_db_backup_command_cleanup_resources",
|
||||
"admin_panel_management_commands_sqlite_db_backup_command_handle",
|
||||
"admin_panel_management_commands_sqlite_db_backup_command_handle_critical_failure",
|
||||
"admin_panel_management_commands_sqlite_db_backup_command_handle_progress_callback",
|
||||
"admin_panel_management_commands_sqlite_db_backup_command_init",
|
||||
"admin_panel_management_commands_sqlite_db_backup_command_signal_handler",
|
||||
"admin_panel_management_commands_sqlite_db_backup_py_basecommand",
|
||||
"admin_panel_management_commands_sqlite_db_backup_rationale_158",
|
||||
"admin_panel_management_commands_sqlite_db_backup_rationale_30",
|
||||
"boto3",
|
||||
"botocore_config",
|
||||
"botocore_exceptions",
|
||||
"contextlib",
|
||||
"django_core_management_base",
|
||||
"fcntl",
|
||||
"khatibi_production_settings",
|
||||
"khatibi_settings",
|
||||
"khatibi_settings_rationale_1",
|
||||
"logging",
|
||||
"pathlib",
|
||||
"shutil",
|
||||
"signal",
|
||||
"sqlite3",
|
||||
"time"
|
||||
],
|
||||
"3": [
|
||||
"admin_panel_migrations_0004_factor_paytype",
|
||||
"admin_panel_migrations_0004_factor_paytype_migration",
|
||||
"admin_panel_migrations_0013_alter_factor_options",
|
||||
"admin_panel_migrations_0013_alter_factor_options_migration",
|
||||
"admin_panel_migrations_0014_auto_20220123_1348",
|
||||
"admin_panel_migrations_0014_auto_20220123_1348_migration",
|
||||
"admin_panel_migrations_0017_factoriteam_garantyesh",
|
||||
"admin_panel_migrations_0017_factoriteam_garantyesh_migration",
|
||||
"admin_panel_migrations_0020_auto_20220126_1532",
|
||||
"admin_panel_migrations_0020_auto_20220126_1532_migration",
|
||||
"admin_panel_migrations_0021_alter_article_type",
|
||||
"admin_panel_migrations_0021_alter_article_type_migration",
|
||||
"admin_panel_migrations_0022_article_typepy",
|
||||
"admin_panel_migrations_0022_article_typepy_migration",
|
||||
"admin_panel_migrations_0023_alter_article_typepy",
|
||||
"admin_panel_migrations_0023_alter_article_typepy_migration",
|
||||
"admin_panel_migrations_0027_alter_action_nazar",
|
||||
"admin_panel_migrations_0027_alter_action_nazar_migration",
|
||||
"admin_panel_migrations_0029_alter_article_options",
|
||||
"admin_panel_migrations_0029_alter_article_options_migration",
|
||||
"admin_panel_migrations_0034_alter_article_sarresid",
|
||||
"admin_panel_migrations_0034_alter_article_sarresid_migration",
|
||||
"admin_panel_migrations_0035_alter_article_sarresid",
|
||||
"admin_panel_migrations_0035_alter_article_sarresid_migration",
|
||||
"admin_panel_migrations_0037_sarresid_sarresiddt",
|
||||
"admin_panel_migrations_0037_sarresid_sarresiddt_migration",
|
||||
"admin_panel_migrations_0040_customer_laghv_bazdid",
|
||||
"admin_panel_migrations_0040_customer_laghv_bazdid_migration",
|
||||
"admin_panel_migrations_0047_alter_productinstore_movement_type",
|
||||
"admin_panel_migrations_0047_alter_productinstore_movement_type_migration",
|
||||
"admin_panel_migrations_0055_action_nextnazardt",
|
||||
"admin_panel_migrations_0055_action_nextnazardt_migration",
|
||||
"django_db"
|
||||
],
|
||||
"4": [
|
||||
"admin_panel_templates_admin_panel_customeridbackup_html",
|
||||
"admin_panel_templates_admin_panel_customeridbackup_html_all_products",
|
||||
"admin_panel_templates_admin_panel_customeridbackup_html_buildorderlist",
|
||||
"admin_panel_templates_admin_panel_customeridbackup_html_orderlist",
|
||||
"admin_panel_templates_admin_panel_customeridfactorbackup_html",
|
||||
"admin_panel_templates_admin_panel_customeridfactorbackup_html_js",
|
||||
"admin_panel_templates_admin_panel_customernewbackup_html",
|
||||
"admin_panel_urls_customer",
|
||||
"admin_panel_urls_customeredit",
|
||||
"admin_panel_urls_newfactor",
|
||||
"api_endpoint_panel_customer_del",
|
||||
"api_endpoint_panel_productmojodi",
|
||||
"concept_category",
|
||||
"concept_client_side_form_logic",
|
||||
"concept_customer",
|
||||
"concept_factor",
|
||||
"concept_permission",
|
||||
"concept_product",
|
||||
"concept_productcategory",
|
||||
"concept_user",
|
||||
"django_concepts_csrf_token",
|
||||
"django_contrib_staticfiles_templatetags_static",
|
||||
"django_template_filter_tojalali",
|
||||
"django_template_tag_custom_tags",
|
||||
"django_template_tags_custom_tags",
|
||||
"django_template_tags_static",
|
||||
"django_url_admin_panel_customeredit",
|
||||
"django_url_admin_panel_customerfactors",
|
||||
"django_url_admin_panel_newfactor",
|
||||
"django_url_admin_panel_productsjson",
|
||||
"js_library_pdatepicker",
|
||||
"panel_urls_productmojodi"
|
||||
],
|
||||
"5": [
|
||||
"admin_panel_views",
|
||||
"admin_panel_views_actionjson",
|
||||
"admin_panel_views_api_check_status_inquiry",
|
||||
"admin_panel_views_customerjson",
|
||||
"admin_panel_views_customers",
|
||||
"admin_panel_views_p_login",
|
||||
"admin_panel_views_p_logout",
|
||||
"admin_panel_views_parse_cheque_result_html",
|
||||
"admin_panel_views_rationale_2852",
|
||||
"admin_panel_views_run_cbi_sayad_inquiry_logic",
|
||||
"admin_panel_views_solve_base64_captcha",
|
||||
"asgiref_sync",
|
||||
"asyncio",
|
||||
"base64",
|
||||
"csrf_exempt",
|
||||
"cv2",
|
||||
"ddddocr",
|
||||
"django_contrib_auth_decorators",
|
||||
"django_core_paginator",
|
||||
"django_urls_base",
|
||||
"django_views_decorators_csrf",
|
||||
"django_views_decorators_http",
|
||||
"json",
|
||||
"numpy",
|
||||
"persiantools",
|
||||
"playwright_async_api",
|
||||
"re"
|
||||
],
|
||||
"6": [
|
||||
"admin_panel_views_addsarresid",
|
||||
"admin_panel_views_bedehi",
|
||||
"admin_panel_views_bedehikhadamat",
|
||||
"admin_panel_views_bedehinasb",
|
||||
"admin_panel_views_customerdel",
|
||||
"admin_panel_views_customerssearch",
|
||||
"admin_panel_views_entezar",
|
||||
"admin_panel_views_factordel",
|
||||
"admin_panel_views_financial_dashboard",
|
||||
"admin_panel_views_hesabdari",
|
||||
"admin_panel_views_hesabdari_checkpass",
|
||||
"admin_panel_views_hesabdari_checkpassfail",
|
||||
"admin_panel_views_hesabdari_residnashone",
|
||||
"admin_panel_views_pardakhtnesiye",
|
||||
"admin_panel_views_passcheck",
|
||||
"admin_panel_views_productdel",
|
||||
"admin_panel_views_rationale_395",
|
||||
"admin_panel_views_report",
|
||||
"admin_panel_views_report_debtors_no_vosol",
|
||||
"admin_panel_views_rezayat",
|
||||
"admin_panel_views_rezayatedit",
|
||||
"admin_panel_views_sarresidh",
|
||||
"admin_panel_views_update_check_info",
|
||||
"login_required",
|
||||
"permission_required",
|
||||
"require_post"
|
||||
],
|
||||
"7": [
|
||||
"admin_panel_templates_admin_panel_base",
|
||||
"admin_panel_templates_admin_panel_basehesabdari",
|
||||
"admin_panel_templates_admin_panel_basestore",
|
||||
"admin_panel_templates_admin_panel_customerfactorbackup",
|
||||
"concept_django_custom_tags",
|
||||
"concept_url_admin_panel_actionlistusertoday",
|
||||
"concept_url_admin_panel_bedehi",
|
||||
"concept_url_admin_panel_customers",
|
||||
"concept_url_admin_panel_entezar",
|
||||
"concept_url_admin_panel_hesabdari",
|
||||
"concept_url_admin_panel_hesabdari_residnashone",
|
||||
"concept_url_admin_panel_index",
|
||||
"concept_url_admin_panel_operations",
|
||||
"concept_url_admin_panel_p_logout",
|
||||
"concept_url_admin_panel_productadd",
|
||||
"concept_url_admin_panel_rezayat",
|
||||
"concept_url_admin_panel_store",
|
||||
"concept_url_admin_panel_store_transfers",
|
||||
"concept_url_admin_panel_stores",
|
||||
"concept_url_panel_customer_factor_del",
|
||||
"static_admin_panel_bulma_min_css",
|
||||
"static_admin_panel_datatables_datatables_min_js",
|
||||
"static_admin_panel_kamadatepicker_min_js",
|
||||
"static_admin_panel_persian-datepicker_min_js",
|
||||
"static_admin_panel_style_css"
|
||||
],
|
||||
"8": [
|
||||
"admin_panel_migrations_0001_initial",
|
||||
"admin_panel_migrations_0001_initial_migration",
|
||||
"admin_panel_migrations_0007_productinstore_factor",
|
||||
"admin_panel_migrations_0007_productinstore_factor_migration",
|
||||
"admin_panel_migrations_0008_storeroom_user",
|
||||
"admin_panel_migrations_0008_storeroom_user_migration",
|
||||
"admin_panel_migrations_0018_alter_factoriteam_product",
|
||||
"admin_panel_migrations_0018_alter_factoriteam_product_migration",
|
||||
"admin_panel_migrations_0019_article_articletype",
|
||||
"admin_panel_migrations_0019_article_articletype_migration",
|
||||
"admin_panel_migrations_0024_action",
|
||||
"admin_panel_migrations_0024_action_migration",
|
||||
"admin_panel_migrations_0036_sarresid",
|
||||
"admin_panel_migrations_0036_sarresid_migration",
|
||||
"admin_panel_migrations_0038_auto_20240213_1735",
|
||||
"admin_panel_migrations_0038_auto_20240213_1735_migration",
|
||||
"admin_panel_migrations_0042_article_user",
|
||||
"admin_panel_migrations_0042_article_user_migration",
|
||||
"admin_panel_migrations_0046_auto_20260624_1818",
|
||||
"admin_panel_migrations_0046_auto_20260624_1818_migration",
|
||||
"admin_panel_migrations_0054_auto_20260715_2250",
|
||||
"admin_panel_migrations_0054_auto_20260715_2250_migration",
|
||||
"django_db_models_deletion"
|
||||
],
|
||||
"9": [
|
||||
"admin_panel_migrations_0011_storeroom_user",
|
||||
"admin_panel_migrations_0011_storeroom_user_migration",
|
||||
"admin_panel_migrations_0012_visitqueue_user",
|
||||
"admin_panel_migrations_0012_visitqueue_user_migration",
|
||||
"admin_panel_migrations_0015_auto_20220124_0858",
|
||||
"admin_panel_migrations_0015_auto_20220124_0858_migration",
|
||||
"admin_panel_migrations_0016_factor_user",
|
||||
"admin_panel_migrations_0016_factor_user_migration",
|
||||
"admin_panel_migrations_0026_auto_20220209_1924",
|
||||
"admin_panel_migrations_0026_auto_20220209_1924_migration",
|
||||
"admin_panel_migrations_0043_sarresid_user",
|
||||
"admin_panel_migrations_0043_sarresid_user_migration",
|
||||
"admin_panel_migrations_0045_auto_20260610_1421",
|
||||
"admin_panel_migrations_0045_auto_20260610_1421_migration",
|
||||
"admin_panel_migrations_0050_storetransferrequest",
|
||||
"admin_panel_migrations_0050_storetransferrequest_migration",
|
||||
"admin_panel_migrations_0051_auto_20260705_1356",
|
||||
"admin_panel_migrations_0051_auto_20260705_1356_migration",
|
||||
"admin_panel_migrations_0052_storeroomowner",
|
||||
"admin_panel_migrations_0052_storeroomowner_migration",
|
||||
"admin_panel_migrations_0053_storeroom_owners",
|
||||
"admin_panel_migrations_0053_storeroom_owners_migration",
|
||||
"django_conf"
|
||||
],
|
||||
"10": [
|
||||
"admin_panel_templates_admin_panel_login",
|
||||
"admin_panel_templates_admin_panel_storebk1",
|
||||
"django_csrf_token",
|
||||
"django_custom_tags",
|
||||
"django_static_files",
|
||||
"django_url_admin_panel_newstore",
|
||||
"django_url_admin_panel_operations",
|
||||
"django_url_admin_panel_p_login",
|
||||
"django_url_admin_panel_store",
|
||||
"form_field_password",
|
||||
"form_field_storename",
|
||||
"form_field_username",
|
||||
"javascript_kamadatepicker",
|
||||
"product_property_mojodi",
|
||||
"product_property_product_name",
|
||||
"static_admin_panel_bulma-rtl_min_css",
|
||||
"template_variable_message",
|
||||
"template_variable_productsum",
|
||||
"template_variable_s_id"
|
||||
],
|
||||
"11": [
|
||||
"admin_panel_models_productcategory",
|
||||
"admin_panel_models_productcategory_str",
|
||||
"admin_panel_models_productinstore",
|
||||
"admin_panel_models_productinstore_delete",
|
||||
"admin_panel_models_productinstore_meta",
|
||||
"admin_panel_models_productinstore_movementtype",
|
||||
"admin_panel_models_productinstore_save",
|
||||
"admin_panel_models_productinstore_str",
|
||||
"admin_panel_views_customer",
|
||||
"admin_panel_views_customerfactor",
|
||||
"admin_panel_views_customernew",
|
||||
"admin_panel_views_customernew2",
|
||||
"admin_panel_views_operationproduct",
|
||||
"admin_panel_views_operations",
|
||||
"admin_panel_views_productadd",
|
||||
"admin_panel_views_productedit",
|
||||
"admin_panel_views_store"
|
||||
],
|
||||
"12": [
|
||||
"admin_panel_templates_admin_panel_bedehbk",
|
||||
"admin_panel_templates_admin_panel_customeraction",
|
||||
"admin_panel_templates_admin_panel_customeractioninc_html",
|
||||
"admin_panel_templates_admin_panel_customersbk_html",
|
||||
"admin_panel_url_customernew",
|
||||
"admin_panel_urls_customernew",
|
||||
"admin_panel_urls_customernewaction",
|
||||
"concept_action_model",
|
||||
"concept_datatables",
|
||||
"concept_jquery",
|
||||
"django_template_tag_static",
|
||||
"django_template_tag_url",
|
||||
"library_bulma",
|
||||
"library_datatables",
|
||||
"library_pdatepicker"
|
||||
],
|
||||
"13": [
|
||||
"admin_models_user",
|
||||
"admin_panel_models_action",
|
||||
"admin_panel_views_actionlist",
|
||||
"admin_panel_views_actionlistall",
|
||||
"admin_panel_views_actionlisttoday",
|
||||
"admin_panel_views_actionlistuser",
|
||||
"admin_panel_views_actionlistusertoday",
|
||||
"admin_panel_views_customeraction",
|
||||
"admin_panel_views_customereditaction",
|
||||
"admin_panel_views_customernazar",
|
||||
"admin_panel_views_customernewaction",
|
||||
"admin_panel_views_rezayat_dashboard"
|
||||
],
|
||||
"14": [
|
||||
"admin_panel_templates_admin_panel_bedehi_html",
|
||||
"admin_panel_templates_admin_panel_hesabdaricheckpass_html",
|
||||
"admin_panel_urls_passcheck",
|
||||
"concept_all_sarresid",
|
||||
"django_context_variable_mandehesabkp",
|
||||
"django_templatetags_tojalali",
|
||||
"django_urls_admin_panel_bedehi",
|
||||
"django_urls_admin_panel_bedehikhadamat",
|
||||
"django_urls_admin_panel_bedehinasb",
|
||||
"django_urls_admin_panel_customer",
|
||||
"javascript_jquery"
|
||||
],
|
||||
"15": [
|
||||
"admin_admin",
|
||||
"admin_panel_admin",
|
||||
"admin_panel_admin_rationale_54",
|
||||
"admin_panel_admin_rationale_75",
|
||||
"admin_panel_admin_storeroomadmin",
|
||||
"admin_panel_admin_storeroomadmin_get_owners_count",
|
||||
"admin_panel_admin_storeroomownerinline",
|
||||
"admin_panel_admin_storetransferrequestadmin",
|
||||
"django_contrib",
|
||||
"register"
|
||||
],
|
||||
"16": [
|
||||
"admin_models",
|
||||
"admin_models_customer",
|
||||
"admin_models_factor",
|
||||
"admin_models_factoriteam",
|
||||
"admin_models_phonenumber",
|
||||
"admin_models_product",
|
||||
"admin_models_productcategory",
|
||||
"admin_models_productinstore",
|
||||
"admin_models_storeroom",
|
||||
"admin_models_visitqueue"
|
||||
],
|
||||
"17": [
|
||||
"admin_panel_templates_admin_panel_customerbase",
|
||||
"admin_panel_templates_admin_panel_customerid",
|
||||
"admin_panel_views_customer_delete",
|
||||
"admin_panel_views_customeredit",
|
||||
"admin_panel_views_customerhesabdari",
|
||||
"admin_panel_views_productsjson",
|
||||
"concept_url_admin_panel_newfactor",
|
||||
"django_contrib_auth_models_permission",
|
||||
"django_templatetags_static",
|
||||
"javascript_pdatepicker"
|
||||
],
|
||||
"18": [
|
||||
"admin_panel_data_customer",
|
||||
"admin_panel_data_factor",
|
||||
"admin_panel_data_sarresid",
|
||||
"admin_panel_templates_admin_panel_hesabdaricheckpassfail_html",
|
||||
"admin_panel_url_pardakhtnesiye",
|
||||
"admin_panel_url_passcheck",
|
||||
"django_permission_viewreportmali",
|
||||
"javascript_library_jquery",
|
||||
"javascript_library_pdatepicker"
|
||||
],
|
||||
"19": [
|
||||
"admin_panel_models_storeroom",
|
||||
"admin_panel_models_storeroom_meta",
|
||||
"admin_panel_models_storeroom_str",
|
||||
"admin_panel_views_newoperation",
|
||||
"admin_panel_views_newstore",
|
||||
"admin_panel_views_productmojodi",
|
||||
"admin_panel_views_rationale_1281",
|
||||
"admin_panel_views_store_transfers",
|
||||
"admin_panel_views_stores"
|
||||
],
|
||||
"20": [
|
||||
"admin_panel_views_customerfactors",
|
||||
"admin_panel_views_inventoryexception",
|
||||
"admin_panel_views_newfactor2",
|
||||
"admin_panel_views_parse_jalali_date",
|
||||
"admin_panel_views_parse_timestamp",
|
||||
"admin_panel_views_rationale_39",
|
||||
"admin_panel_views_rationale_53",
|
||||
"admin_panel_views_rationale_65",
|
||||
"exception"
|
||||
],
|
||||
"21": [
|
||||
"copilot_chat",
|
||||
"github_copilot_instructions",
|
||||
"github_copilot_instructions_graphify",
|
||||
"graphify-out_graph_json",
|
||||
"graphify-out_graph_report_md",
|
||||
"graphify-out_wiki_index_md",
|
||||
"graphify_explain",
|
||||
"graphify_path",
|
||||
"graphify_query"
|
||||
],
|
||||
"22": [
|
||||
"admin_panel_templates_admin_panel_hesabdariresidnashode",
|
||||
"admin_panel_urls_pardakhtnesiye",
|
||||
"django_permissions_admin_panel_viewreportmali",
|
||||
"lib_jquery",
|
||||
"lib_pdatepicker",
|
||||
"templatetags_custom_tags",
|
||||
"templatetags_custom_tags_tocurrency",
|
||||
"templatetags_custom_tags_tojalali"
|
||||
],
|
||||
"23": [
|
||||
"admin_panel_views_api_check_sabt_inquiry",
|
||||
"admin_panel_views_inventory_movements_report",
|
||||
"admin_panel_views_operation",
|
||||
"admin_panel_views_rationale_2875",
|
||||
"admin_panel_views_rationale_313",
|
||||
"admin_panel_views_rationale_43",
|
||||
"admin_panel_views_run_bpi_cheque_inquiry_logic",
|
||||
"admin_panel_views_safe_int"
|
||||
],
|
||||
"24": [
|
||||
"admin_apps",
|
||||
"admin_apps_adminconfig",
|
||||
"admin_apps_py_appconfig",
|
||||
"admin_panel_apps",
|
||||
"admin_panel_apps_adminpanelconfig",
|
||||
"admin_panel_apps_py_appconfig",
|
||||
"django_apps"
|
||||
],
|
||||
"25": [
|
||||
"admin_panel_migrations_0002_auto_20220114_1616",
|
||||
"admin_panel_migrations_0002_auto_20220114_1616_migration",
|
||||
"admin_panel_migrations_0003_auto_20220115_1401",
|
||||
"admin_panel_migrations_0003_auto_20220115_1401_migration",
|
||||
"admin_panel_migrations_0031_article_sarresid",
|
||||
"admin_panel_migrations_0031_article_sarresid_migration",
|
||||
"django_utils_timezone"
|
||||
],
|
||||
"26": [
|
||||
"entrypoint",
|
||||
"entrypoint_sh__entry",
|
||||
"manage",
|
||||
"manage_main",
|
||||
"manage_rationale_2",
|
||||
"manage_rationale_8",
|
||||
"sys"
|
||||
],
|
||||
"27": [
|
||||
"admin_init",
|
||||
"admin_urls",
|
||||
"admin_views",
|
||||
"admin_views_index",
|
||||
"django_http",
|
||||
"django_shortcuts"
|
||||
],
|
||||
"28": [
|
||||
"admin_panel_init",
|
||||
"admin_panel_urls",
|
||||
"django_conf_urls_static",
|
||||
"django_urls",
|
||||
"khatibi_urls",
|
||||
"khatibi_urls_rationale_1"
|
||||
],
|
||||
"29": [
|
||||
"admin_panel_templates_admin_panel_entezar_html",
|
||||
"concept_customer_data",
|
||||
"concept_kamadatepicker",
|
||||
"django_templatetags_custom_tags",
|
||||
"django_templatetags_custom_tags_tojalali"
|
||||
],
|
||||
"30": [
|
||||
"admin_panel_migrations_0056_auto_20260731_1824",
|
||||
"admin_panel_migrations_0056_auto_20260731_1824_migration",
|
||||
"django_core_validators"
|
||||
],
|
||||
"31": [
|
||||
"admin_panel_templates_admin_panel_customersbk_html_createcs",
|
||||
"admin_panel_templates_admin_panel_customersbk_html_openrow",
|
||||
"concept_customer_modal_ui"
|
||||
],
|
||||
"32": [
|
||||
"admin_panel_tests",
|
||||
"admin_tests",
|
||||
"django_test"
|
||||
],
|
||||
"33": [
|
||||
"concept_articl_model",
|
||||
"concept_customer_model",
|
||||
"django_context_variable_articls"
|
||||
],
|
||||
"34": [
|
||||
"admin_panel_migrations_0005_auto_20220121_2054",
|
||||
"admin_panel_migrations_0005_auto_20220121_2054_migration"
|
||||
],
|
||||
"35": [
|
||||
"admin_panel_migrations_0006_auto_20220121_2100",
|
||||
"admin_panel_migrations_0006_auto_20220121_2100_migration"
|
||||
],
|
||||
"36": [
|
||||
"admin_panel_migrations_0009_remove_storeroom_user",
|
||||
"admin_panel_migrations_0009_remove_storeroom_user_migration"
|
||||
],
|
||||
"37": [
|
||||
"admin_panel_migrations_0010_auto_20220122_1546",
|
||||
"admin_panel_migrations_0010_auto_20220122_1546_migration"
|
||||
],
|
||||
"38": [
|
||||
"admin_panel_migrations_0025_action_actiontype",
|
||||
"admin_panel_migrations_0025_action_actiontype_migration"
|
||||
],
|
||||
"39": [
|
||||
"admin_panel_migrations_0028_action_grade",
|
||||
"admin_panel_migrations_0028_action_grade_migration"
|
||||
],
|
||||
"40": [
|
||||
"admin_panel_migrations_0030_auto_20220414_1047",
|
||||
"admin_panel_migrations_0030_auto_20220414_1047_migration"
|
||||
],
|
||||
"41": [
|
||||
"admin_panel_migrations_0032_article_paystatus",
|
||||
"admin_panel_migrations_0032_article_paystatus_migration"
|
||||
],
|
||||
"42": [
|
||||
"admin_panel_migrations_0033_article_nahvepardakht",
|
||||
"admin_panel_migrations_0033_article_nahvepardakht_migration"
|
||||
],
|
||||
"43": [
|
||||
"admin_panel_migrations_0039_customer_last_bazdid_dt",
|
||||
"admin_panel_migrations_0039_customer_last_bazdid_dt_migration"
|
||||
],
|
||||
"44": [
|
||||
"admin_panel_migrations_0041_auto_20240216_1607",
|
||||
"admin_panel_migrations_0041_auto_20240216_1607_migration"
|
||||
],
|
||||
"45": [
|
||||
"admin_panel_migrations_0044_sarresid_desc",
|
||||
"admin_panel_migrations_0044_sarresid_desc_migration"
|
||||
],
|
||||
"46": [
|
||||
"admin_panel_migrations_0048_alter_productinstore_options",
|
||||
"admin_panel_migrations_0048_alter_productinstore_options_migration"
|
||||
],
|
||||
"47": [
|
||||
"admin_panel_migrations_0049_alter_productinstore_options",
|
||||
"admin_panel_migrations_0049_alter_productinstore_options_migration"
|
||||
],
|
||||
"48": [
|
||||
"gemini",
|
||||
"gemini_graphify"
|
||||
],
|
||||
"49": [
|
||||
"admin_migrations_init"
|
||||
],
|
||||
"50": [
|
||||
"admin_panel_customer_action_inc"
|
||||
],
|
||||
"51": [
|
||||
"admin_panel_customer_base_new"
|
||||
],
|
||||
"52": [
|
||||
"admin_panel_customer_customernazarinc"
|
||||
],
|
||||
"53": [
|
||||
"admin_panel_customer_factor"
|
||||
],
|
||||
"54": [
|
||||
"admin_panel_customer_hesabdari"
|
||||
],
|
||||
"55": [
|
||||
"admin_panel_customer_id_factor"
|
||||
],
|
||||
"56": [
|
||||
"admin_panel_customer_nazar"
|
||||
],
|
||||
"57": [
|
||||
"admin_panel_management_commands_init"
|
||||
],
|
||||
"58": [
|
||||
"admin_panel_management_init"
|
||||
],
|
||||
"59": [
|
||||
"admin_panel_migrations_init"
|
||||
],
|
||||
"60": [
|
||||
"admin_panel_templates_admin_panel_actionlist"
|
||||
],
|
||||
"61": [
|
||||
"admin_panel_templates_admin_panel_base_html"
|
||||
],
|
||||
"62": [
|
||||
"admin_panel_templates_admin_panel_customerNew"
|
||||
],
|
||||
"63": [
|
||||
"admin_panel_templates_admin_panel_customerNew2"
|
||||
],
|
||||
"64": [
|
||||
"admin_panel_templates_admin_panel_customerRezayat"
|
||||
],
|
||||
"65": [
|
||||
"admin_panel_templates_admin_panel_customerRezayatinc"
|
||||
],
|
||||
"66": [
|
||||
"admin_panel_templates_admin_panel_customerSarresid"
|
||||
],
|
||||
"67": [
|
||||
"admin_panel_templates_admin_panel_customerbasenew_html"
|
||||
],
|
||||
"68": [
|
||||
"admin_panel_templates_admin_panel_customers"
|
||||
],
|
||||
"69": [
|
||||
"admin_panel_templates_admin_panel_entezarbk"
|
||||
],
|
||||
"70": [
|
||||
"admin_panel_templates_admin_panel_financial_dashboard"
|
||||
],
|
||||
"71": [
|
||||
"admin_panel_templates_admin_panel_hesabdari"
|
||||
],
|
||||
"72": [
|
||||
"admin_panel_templates_admin_panel_index"
|
||||
],
|
||||
"73": [
|
||||
"admin_panel_templates_admin_panel_newOperation"
|
||||
],
|
||||
"74": [
|
||||
"admin_panel_templates_admin_panel_operations"
|
||||
],
|
||||
"75": [
|
||||
"admin_panel_templates_admin_panel_operationsbk"
|
||||
],
|
||||
"76": [
|
||||
"admin_panel_templates_admin_panel_report"
|
||||
],
|
||||
"77": [
|
||||
"admin_panel_templates_admin_panel_report_debtors_no_vosol"
|
||||
],
|
||||
"78": [
|
||||
"admin_panel_templates_admin_panel_report_inventory_movements"
|
||||
],
|
||||
"79": [
|
||||
"admin_panel_templates_admin_panel_report_rezayat"
|
||||
],
|
||||
"80": [
|
||||
"admin_panel_templates_admin_panel_reportchecknesiye"
|
||||
],
|
||||
"81": [
|
||||
"admin_panel_templates_admin_panel_rezayat"
|
||||
],
|
||||
"82": [
|
||||
"admin_panel_templates_admin_panel_store"
|
||||
],
|
||||
"83": [
|
||||
"admin_panel_templates_admin_panel_store_transfers"
|
||||
],
|
||||
"84": [
|
||||
"admin_panel_templates_admin_panel_stores"
|
||||
],
|
||||
"85": [
|
||||
"admin_panel_templatetags_custom_tags_tocurrency"
|
||||
],
|
||||
"86": [
|
||||
"admin_panel_templatetags_init"
|
||||
],
|
||||
"87": [
|
||||
"admin_panel_urls_newstore"
|
||||
],
|
||||
"88": [
|
||||
"admin_panel_urls_processtransferaction"
|
||||
],
|
||||
"89": [
|
||||
"admin_panel_urls_rezayatedit"
|
||||
],
|
||||
"90": [
|
||||
"khatibi_init"
|
||||
],
|
||||
"91": [
|
||||
"requirements2_txt"
|
||||
],
|
||||
"92": [
|
||||
"requirements_txt"
|
||||
]
|
||||
},
|
||||
"cohesion": {
|
||||
"0": 0.0673758865248227,
|
||||
"1": 0.07123034227567067,
|
||||
"2": 0.06606606606606606,
|
||||
"3": 0.06060606060606061,
|
||||
"4": 0.06653225806451613,
|
||||
"5": 0.08262108262108261,
|
||||
"6": 0.12923076923076923,
|
||||
"7": 0.08333333333333333,
|
||||
"8": 0.08695652173913043,
|
||||
"9": 0.08695652173913043,
|
||||
"10": 0.1111111111111111,
|
||||
"11": 0.14705882352941177,
|
||||
"12": 0.1523809523809524,
|
||||
"13": 0.3181818181818182,
|
||||
"14": 0.2,
|
||||
"15": 0.2222222222222222,
|
||||
"16": 0.2,
|
||||
"17": 0.2,
|
||||
"18": 0.2222222222222222,
|
||||
"19": 0.2222222222222222,
|
||||
"20": 0.2222222222222222,
|
||||
"21": 0.2222222222222222,
|
||||
"22": 0.32142857142857145,
|
||||
"23": 0.25,
|
||||
"24": 0.2857142857142857,
|
||||
"25": 0.2857142857142857,
|
||||
"26": 0.2857142857142857,
|
||||
"27": 0.3333333333333333,
|
||||
"28": 0.4666666666666667,
|
||||
"29": 0.4,
|
||||
"30": 0.6666666666666666,
|
||||
"31": 0.6666666666666666,
|
||||
"32": 0.6666666666666666,
|
||||
"33": 0.6666666666666666,
|
||||
"34": 1.0,
|
||||
"35": 1.0,
|
||||
"36": 1.0,
|
||||
"37": 1.0,
|
||||
"38": 1.0,
|
||||
"39": 1.0,
|
||||
"40": 1.0,
|
||||
"41": 1.0,
|
||||
"42": 1.0,
|
||||
"43": 1.0,
|
||||
"44": 1.0,
|
||||
"45": 1.0,
|
||||
"46": 1.0,
|
||||
"47": 1.0,
|
||||
"48": 1.0,
|
||||
"49": 1.0,
|
||||
"50": 1.0,
|
||||
"51": 1.0,
|
||||
"52": 1.0,
|
||||
"53": 1.0,
|
||||
"54": 1.0,
|
||||
"55": 1.0,
|
||||
"56": 1.0,
|
||||
"57": 1.0,
|
||||
"58": 1.0,
|
||||
"59": 1.0,
|
||||
"60": 1.0,
|
||||
"61": 1.0,
|
||||
"62": 1.0,
|
||||
"63": 1.0,
|
||||
"64": 1.0,
|
||||
"65": 1.0,
|
||||
"66": 1.0,
|
||||
"67": 1.0,
|
||||
"68": 1.0,
|
||||
"69": 1.0,
|
||||
"70": 1.0,
|
||||
"71": 1.0,
|
||||
"72": 1.0,
|
||||
"73": 1.0,
|
||||
"74": 1.0,
|
||||
"75": 1.0,
|
||||
"76": 1.0,
|
||||
"77": 1.0,
|
||||
"78": 1.0,
|
||||
"79": 1.0,
|
||||
"80": 1.0,
|
||||
"81": 1.0,
|
||||
"82": 1.0,
|
||||
"83": 1.0,
|
||||
"84": 1.0,
|
||||
"85": 1.0,
|
||||
"86": 1.0,
|
||||
"87": 1.0,
|
||||
"88": 1.0,
|
||||
"89": 1.0,
|
||||
"90": 1.0,
|
||||
"91": 1.0,
|
||||
"92": 1.0
|
||||
},
|
||||
"gods": [
|
||||
{
|
||||
"id": "admin_panel_models_storeroom",
|
||||
"label": "StoreRoom",
|
||||
"degree": 25
|
||||
},
|
||||
{
|
||||
"id": "admin_panel_models_productinstore",
|
||||
"label": "ProductInStore",
|
||||
"degree": 23
|
||||
},
|
||||
{
|
||||
"id": "admin_models_user",
|
||||
"label": "User",
|
||||
"degree": 21
|
||||
},
|
||||
{
|
||||
"id": "admin_panel_models_action",
|
||||
"label": "Action",
|
||||
"degree": 20
|
||||
},
|
||||
{
|
||||
"id": "admin_panel_models_product",
|
||||
"label": "Product",
|
||||
"degree": 18
|
||||
},
|
||||
{
|
||||
"id": "admin_panel_models_storetransferrequest",
|
||||
"label": "StoreTransferRequest",
|
||||
"degree": 15
|
||||
},
|
||||
{
|
||||
"id": "admin_panel_models_article",
|
||||
"label": "Article",
|
||||
"degree": 15
|
||||
},
|
||||
{
|
||||
"id": "admin_panel_templates_admin_panel_customeridbackup_html",
|
||||
"label": "Customer ID Backup/New Factor Template",
|
||||
"degree": 15
|
||||
},
|
||||
{
|
||||
"id": "admin_panel_models_productcategory",
|
||||
"label": "ProductCategory",
|
||||
"degree": 14
|
||||
},
|
||||
{
|
||||
"id": "admin_panel_models_customer",
|
||||
"label": "Customer",
|
||||
"degree": 14
|
||||
}
|
||||
],
|
||||
"surprises": [
|
||||
{
|
||||
"source": "VisitQueue",
|
||||
"target": "User",
|
||||
"source_files": [
|
||||
"admin_panel/models.py",
|
||||
"admin/models.py"
|
||||
],
|
||||
"confidence": "INFERRED",
|
||||
"relation": "uses",
|
||||
"why": "inferred connection - not explicitly stated in source; connects across different repos/directories; bridges separate communities; peripheral node `VisitQueue` unexpectedly reaches hub `User`"
|
||||
},
|
||||
{
|
||||
"source": "Factor",
|
||||
"target": "User",
|
||||
"source_files": [
|
||||
"admin_panel/models.py",
|
||||
"admin/models.py"
|
||||
],
|
||||
"confidence": "INFERRED",
|
||||
"relation": "uses",
|
||||
"why": "inferred connection - not explicitly stated in source; connects across different repos/directories; bridges separate communities"
|
||||
},
|
||||
{
|
||||
"source": "StoreRoom",
|
||||
"target": "User",
|
||||
"source_files": [
|
||||
"admin_panel/models.py",
|
||||
"admin/models.py"
|
||||
],
|
||||
"confidence": "INFERRED",
|
||||
"relation": "uses",
|
||||
"why": "inferred connection - not explicitly stated in source; connects across different repos/directories; bridges separate communities"
|
||||
},
|
||||
{
|
||||
"source": "StoreRoomOwner",
|
||||
"target": "User",
|
||||
"source_files": [
|
||||
"admin_panel/models.py",
|
||||
"admin/models.py"
|
||||
],
|
||||
"confidence": "INFERRED",
|
||||
"relation": "uses",
|
||||
"why": "inferred connection - not explicitly stated in source; connects across different repos/directories; bridges separate communities"
|
||||
},
|
||||
{
|
||||
"source": "StoreTransferRequest",
|
||||
"target": "User",
|
||||
"source_files": [
|
||||
"admin_panel/models.py",
|
||||
"admin/models.py"
|
||||
],
|
||||
"confidence": "INFERRED",
|
||||
"relation": "uses",
|
||||
"why": "inferred connection - not explicitly stated in source; connects across different repos/directories; bridges separate communities"
|
||||
}
|
||||
],
|
||||
"tokens": {
|
||||
"input": 76900,
|
||||
"output": 126792
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
{"0": "User Action Views", "1": "Inventory and Product Models", "2": "Daily Reporting Command", "3": "Customer Admin Templates", "4": "Database Schema Migrations", "5": "Admin Panel URLs", "6": "Database Backup Command", "7": "Initial Database Migrations", "8": "User Relation Migrations", "9": "Financial and Accounting Views", "10": "Invoice Management Logic", "11": "Django Admin Configuration", "12": "Core Application Models", "13": "Resource Cleanup Command", "14": "Django App Configurations", "15": "Timezone-related Migrations", "16": "Application Entrypoint Scripts", "17": "Core Admin App", "18": "Project URL Configuration", "19": "Graphify Tooling", "20": "Data Validation Migration", "21": "Application Tests", "22": "Database Schema Migration", "23": "Database Schema Migration", "24": "Remove StoreRoom User Relation", "25": "Database Schema Migration", "26": "Add Action Type Field", "27": "Add Action Grade Field", "28": "Database Schema Migration", "29": "Add Article Payment Status", "30": "Add Article Payment Method", "31": "Add Customer Last Visit", "32": "Database Schema Migration", "33": "Add Sarresid Description", "34": "Update ProductInStore Options", "35": "Update ProductInStore Options", "36": "AI Tooling Documentation", "37": "Admin Migrations Package", "38": "Customer Action Partial", "39": "New Customer Base Template", "40": "Customer Feedback Partial", "41": "Customer Invoice Detail", "42": "Customer Accounting Template", "43": "Customer Invoice List", "44": "Customer Feedback Page", "45": "Management Commands Package", "46": "Management Package", "47": "Admin Panel Migrations Package", "48": "Action List Template", "49": "New Customer Invoice Page", "50": "New Customer Invoice V2", "51": "Customer Satisfaction List", "52": "Customer Satisfaction Partial", "53": "Customer Debt Management", "54": "Customer List Page", "55": "Customer List Backup Template", "56": "Waiting List Backup Template", "57": "Financial Dashboard", "58": "Accounting Main View", "59": "Admin Panel Index Page", "60": "New Inventory Operation", "61": "Inventory Operations List", "62": "Operations Backup Template", "63": "Financial Report Template", "64": "Debt Collection Dashboard", "65": "Inventory Movement Report", "66": "Customer Satisfaction Dashboard", "67": "Check and Credit Report", "68": "Satisfaction List Template", "69": "Store Inventory Template", "70": "Store Transfers Template", "71": "Stores List Template", "72": "Template Tags Package", "73": "Customer Detail URL", "74": "New Store URL", "75": "Process Transfer URL", "76": "Edit Satisfaction URL", "77": "Main Project Package", "78": "Extended Requirements File", "79": "Project Requirements File"}
|
||||
@@ -0,0 +1 @@
|
||||
{"0": "dc38416453f219cd", "1": "17677da135e176af", "2": "a173e495d86da278", "3": "2ac4a8f7fd725f39", "4": "7cd0b8c5a73aaae2", "5": "0666b74f90562078", "6": "c3f18528373c1e6e", "7": "1aa60a8e7dec6306", "8": "0ecf8267dd379fc7", "9": "110a96d098e68da1", "10": "019e40911d267493", "11": "3cc770d8cc99f8ae", "12": "d8399135bcf129db", "13": "dbfbf8557361f5ea", "14": "1cdbbc0afb5b81e2", "15": "a19c211702401a5b", "16": "a9087ce814efe96b", "17": "28ebb54ffa686f35", "18": "2db67510f080898c", "19": "8c2d0656a6e54e1f", "20": "cfbcf8cef78c5757", "21": "37de28eabfcc656a", "22": "6886ad7a5751faca", "23": "9fdcab2ed5d20e49", "24": "a1a1f3c1cdff72cf", "25": "2f1621907db6f86f", "26": "9cc7a507cfecd8fb", "27": "edb619bf5ac0fc49", "28": "8cb6b3db3aadb973", "29": "d5c0f5f6714c9991", "30": "9948fb8b548535ed", "31": "52502a4c1ef75ce6", "32": "8d20e5c1bce8916d", "33": "90e57f26f669372d", "34": "bf60a8731033e467", "35": "6cef5bc37e710e62", "36": "66ed76491a412a72", "37": "e67668b62ee6c62c", "38": "68aee39cd24db354", "39": "09b7297ea62919f2", "40": "054401d27ffaa4b2", "41": "dace81c1995fb321", "42": "19e301aeace95bb2", "43": "d6fd0cec4634a0b0", "44": "0230d355a6dabb54", "45": "5cebbb5528321795", "46": "536fe28d24c361f5", "47": "b08bdc2712cb0f12", "48": "6ce8444f504022cc", "49": "d8e34a3b3eb43ee0", "50": "056b8d6b5072289b", "51": "171c34c74a95481b", "52": "73e9eca6f2ca1c9b", "53": "dcc2230ae751c29a", "54": "2f5417a69eb1d15e", "55": "864760002345205a", "56": "d55cb638532fdfeb", "57": "06cae4389208269f", "58": "e9c0a7be255e9b26", "59": "455b4ca39e55ecb0", "60": "8105c55538c34081", "61": "74304670b54c018f", "62": "a27f876eabb044b2", "63": "73f74dd7a40776d6", "64": "29d433d164b99f89", "65": "3f44aa48aa05d597", "66": "ca8a7efba0a3e579", "67": "5cc770af9d184d77", "68": "2d31fa723128b164", "69": "9d814c2520329846", "70": "f97d1a5c3a066598", "71": "14f84a6e4cd311d6", "72": "0bf6f9d0aeab4fd8", "73": "f16cb34aa8bf540c", "74": "8b491bb3ff0649dd", "75": "638812cee15d1b9b", "76": "3dd16d68928a479c", "77": "72dad91d66d471ce", "78": "353a9d09eaae47ea", "79": "2d29260874184e4a"}
|
||||
@@ -0,0 +1 @@
|
||||
D:\Projects\khatibi
|
||||
@@ -0,0 +1 @@
|
||||
{"output_tokens": 126792}
|
||||
@@ -0,0 +1,214 @@
|
||||
# Graph Report - khatibi (2026-10-09)
|
||||
|
||||
## Corpus Check
|
||||
- cluster-only mode — file stats not available
|
||||
|
||||
## Summary
|
||||
- 548 nodes · 887 edges · 80 communities (14 shown, 66 thin omitted)
|
||||
- Extraction: 85% EXTRACTED · 15% INFERRED · 0% AMBIGUOUS · INFERRED: 131 edges (avg confidence: 0.92)
|
||||
- Token cost: 2,543 input · 5,433 output
|
||||
|
||||
## Graph Freshness
|
||||
- Built from commit: `f19d8ee6`
|
||||
- Run `git rev-parse HEAD` and compare to check if the graph is stale.
|
||||
- Run `graphify update .` after code changes (no API cost).
|
||||
|
||||
## Community Hubs (Navigation)
|
||||
- User Action Views
|
||||
- Inventory and Product Models
|
||||
- Daily Reporting Command
|
||||
- Customer Admin Templates
|
||||
- Database Schema Migrations
|
||||
- Admin Panel URLs
|
||||
- Database Backup Command
|
||||
- Initial Database Migrations
|
||||
- User Relation Migrations
|
||||
- Financial and Accounting Views
|
||||
- Invoice Management Logic
|
||||
- Django Admin Configuration
|
||||
- Core Application Models
|
||||
- Resource Cleanup Command
|
||||
- Django App Configurations
|
||||
- Timezone-related Migrations
|
||||
- Application Entrypoint Scripts
|
||||
- Graphify Tooling
|
||||
- Data Validation Migration
|
||||
- Database Schema Migration
|
||||
- Database Schema Migration
|
||||
- Remove StoreRoom User Relation
|
||||
- Database Schema Migration
|
||||
- Add Action Type Field
|
||||
- Add Action Grade Field
|
||||
- Database Schema Migration
|
||||
- Add Article Payment Status
|
||||
- Add Article Payment Method
|
||||
- Add Customer Last Visit
|
||||
- Database Schema Migration
|
||||
- Add Sarresid Description
|
||||
- Update ProductInStore Options
|
||||
- Update ProductInStore Options
|
||||
- AI Tooling Documentation
|
||||
- Customer Action Partial
|
||||
- New Customer Base Template
|
||||
- Customer Feedback Partial
|
||||
- Customer Invoice Detail
|
||||
- Customer Accounting Template
|
||||
- Customer Invoice List
|
||||
- Customer Feedback Page
|
||||
- Action List Template
|
||||
- New Customer Invoice Page
|
||||
- New Customer Invoice V2
|
||||
- Customer Satisfaction List
|
||||
- Customer Satisfaction Partial
|
||||
- Customer Debt Management
|
||||
- Customer List Page
|
||||
- Financial Dashboard
|
||||
- Accounting Main View
|
||||
- New Inventory Operation
|
||||
- Inventory Operations List
|
||||
- Operations Backup Template
|
||||
- Financial Report Template
|
||||
- Debt Collection Dashboard
|
||||
- Inventory Movement Report
|
||||
- Customer Satisfaction Dashboard
|
||||
- Check and Credit Report
|
||||
- Satisfaction List Template
|
||||
- Store Inventory Template
|
||||
- Store Transfers Template
|
||||
- Stores List Template
|
||||
- Extended Requirements File
|
||||
- Project Requirements File
|
||||
|
||||
## God Nodes (most connected - your core abstractions)
|
||||
1. `StoreRoom` - 25 edges
|
||||
2. `ProductInStore` - 23 edges
|
||||
3. `User` - 21 edges
|
||||
4. `Action` - 20 edges
|
||||
5. `Product` - 18 edges
|
||||
6. `StoreTransferRequest` - 15 edges
|
||||
7. `Article` - 15 edges
|
||||
8. `ProductCategory` - 14 edges
|
||||
9. `Customer` - 13 edges
|
||||
10. `approve_transfer_request()` - 12 edges
|
||||
|
||||
## Surprising Connections (you probably didn't know these)
|
||||
- `VisitQueue` --uses--> `User` [INFERRED]
|
||||
admin_panel/models.py → admin/models.py
|
||||
- `Factor` --uses--> `User` [INFERRED]
|
||||
admin_panel/models.py → admin/models.py
|
||||
- `StoreRoom` --uses--> `User` [INFERRED]
|
||||
admin_panel/models.py → admin/models.py
|
||||
- `StoreRoomOwner` --uses--> `User` [INFERRED]
|
||||
admin_panel/models.py → admin/models.py
|
||||
- `StoreTransferRequest` --uses--> `User` [INFERRED]
|
||||
admin_panel/models.py → admin/models.py
|
||||
|
||||
## Import Cycles
|
||||
- None detected.
|
||||
|
||||
## Hyperedges (group relationships)
|
||||
- **Customer Satisfaction & Collection** — admin_panel_templates_admin_panel_report_rezayat, admin_panel_templates_admin_panel_report_debtors_no_vosol, admin_panel_customer_customernazarinc [EXTRACTED 0.90]
|
||||
- **Customer Management Flow** — admin_panel_customer_base_new, admin_panel_customer_action_inc, admin_panel_customer_id_factor, admin_panel_customer_hesabdari [EXTRACTED 1.00]
|
||||
- **Financial & Debt Management** — admin_panel_templates_admin_panel_financial_dashboard, admin_panel_templates_admin_panel_hesabdari [EXTRACTED 1.00]
|
||||
- **Inventory Management System** — admin_panel_templates_admin_panel_store, admin_panel_templates_admin_panel_store_transfers, admin_panel_templates_admin_panel_report_inventory_movements, admin_panel_templates_admin_panel_operationsbk [EXTRACTED 1.00]
|
||||
- **Login Form** — admin_panel_templates_admin_panel_login, django_url_admin_panel_p_login, django_csrf_token, form_field_username, form_field_password [EXTRACTED]
|
||||
- **New Store Form** — admin_panel_templates_admin_panel_storebk1, django_url_admin_panel_newstore, django_csrf_token, form_field_storename [EXTRACTED]
|
||||
- **Store Inventory Display** — admin_panel_templates_admin_panel_storebk1, template_variable_productsum, product_property_product_name, product_property_mojodi [EXTRACTED]
|
||||
- **Customer Lifecycle Management** — admin_panel_templates_admin_panel_customers [INFERRED 0.85]
|
||||
- **Customer Interaction Lifecycle** — admin_panel_templates_admin_panel_customers, admin_panel_templates_admin_panel_customerNew, admin_panel_templates_admin_panel_customerRezayat [INFERRED 0.85]
|
||||
- **Financial & Debt Management Flow** — admin_panel_templates_admin_panel_customerSarresid, admin_panel_templates_admin_panel_hesabdari, admin_panel_templates_admin_panel_financial_dashboard [INFERRED 0.90]
|
||||
- **Settle Due Payment Flow** — admin_panel_templates_admin_panel_hesabdaricheckpassfail_html, admin_panel_url_passcheck, admin_panel_url_pardakhtnesiye [INFERRED 0.90]
|
||||
- **Accounting and Billing Flow** — admin_panel_templates_admin_panel_basehesabdari, admin_panel_templates_admin_panel_bedehi, admin_panel_templates_admin_panel_hesabdariheckpass, concept_url_admin_panel_hesabdari, concept_url_admin_panel_bedehi, concept_url_admin_panel_pardakhtnesiye [INFERRED]
|
||||
- **Check Clearing Flow** — admin_panel_templates_admin_panel_hesabdariresidnashode, admin_panel_views_passcheck [INFERRED]
|
||||
- **Customer Management Flow** — admin_panel_templates_admin_panel_customerbase, admin_panel_templates_admin_panel_customerbasenew, admin_panel_templates_admin_panel_customeraction, admin_panel_templates_admin_panel_customerid, admin_panel_templates_admin_panel_customeridfactorbackup, concept_url_admin_panel_customers, concept_url_admin_panel_customeredit, concept_url_admin_panel_newfactor [INFERRED]
|
||||
- **Nesiye Payment Flow** — admin_panel_templates_admin_panel_hesabdariresidnashode, admin_panel_urls_pardakhtnesiye [INFERRED]
|
||||
- **Store and Inventory Management Flow** — admin_panel_templates_admin_panel_basestore, concept_url_admin_panel_stores, concept_url_admin_panel_productadd, concept_url_admin_panel_operations, concept_url_admin_panel_store_transfers, concept_url_admin_panel_productsjson, concept_url_panel_productmojodi [INFERRED]
|
||||
|
||||
## Communities (80 total, 66 thin omitted)
|
||||
|
||||
### Community 0 - "User Action Views"
|
||||
Cohesion: 0.05
|
||||
Nodes (57): User, Action, ProductCategory, ActionJson(), ActionList(), ActionListAll(), ActionListToday(), ActionListUser() (+49 more)
|
||||
|
||||
### Community 1 - "Inventory and Product Models"
|
||||
Cohesion: 0.06
|
||||
Nodes (30): ArticleType, CacheTable, PhoneNumber, Product, Meta, ProductInStore, Meta, MovementType (+22 more)
|
||||
|
||||
### Community 2 - "Daily Reporting Command"
|
||||
Cohesion: 0.08
|
||||
Nodes (15): Command, Article, Meta, Customer, Meta, Sarresid, toJalali(), remove_query_param() (+7 more)
|
||||
|
||||
### Community 3 - "Customer Admin Templates"
|
||||
Cohesion: 0.08
|
||||
Nodes (22): admin_panel/base.html, admin_panel/templates/admin_panel/customerActionInc.html, admin_panel/templates/admin_panel/customerBaseNew.html, Django Custom Tags: custom_tags, URL: admin_panel:bedehi, URL: admin_panel:bedehiKhadamat, URL: admin_panel:bedehiNasb, URL: admin_panel:customer (+14 more)
|
||||
|
||||
### Community 4 - "Database Schema Migrations"
|
||||
Cohesion: 0.06
|
||||
Nodes (16): Migration, Migration, Migration, Migration, Migration, Migration, Migration, Migration (+8 more)
|
||||
|
||||
### Community 5 - "Admin Panel URLs"
|
||||
Cohesion: 0.06
|
||||
Nodes (30): URL: admin_panel:ActionListUserToday, URL: admin_panel:entezar, URL: admin_panel:hesabdari, URL: admin_panel:hesabdari_residnashone, URL: admin_panel:index, URL: admin_panel:p_logout, URL: admin_panel:rezayat, URL: admin_panel:stores (+22 more)
|
||||
|
||||
### Community 7 - "Initial Database Migrations"
|
||||
Cohesion: 0.09
|
||||
Nodes (11): Migration, Migration, Migration, Migration, Migration, Migration, Migration, Migration (+3 more)
|
||||
|
||||
### Community 8 - "User Relation Migrations"
|
||||
Cohesion: 0.09
|
||||
Nodes (11): Migration, Migration, Migration, Migration, Migration, Migration, Migration, Migration (+3 more)
|
||||
|
||||
### Community 9 - "Financial and Accounting Views"
|
||||
Cohesion: 0.10
|
||||
Nodes (20): Customer Data Object, Factor Data Object, Sarresid Data Object, admin_panel.ViewReportMali, base.html, toCurrency, admin_panel:customerNew URL, admin_panel:pardakhtNesiye URL (+12 more)
|
||||
|
||||
### Community 10 - "Invoice Management Logic"
|
||||
Cohesion: 0.17
|
||||
Nodes (8): Factor, Meta, FactorIteam, InventoryException, newFactor(), newFactor2(), _parse_jalali_date(), _parse_timestamp()
|
||||
|
||||
### Community 11 - "Django Admin Configuration"
|
||||
Cohesion: 0.22
|
||||
Nodes (3): StoreRoomAdmin, StoreRoomOwnerInline, StoreTransferRequestAdmin
|
||||
|
||||
### Community 12 - "Core Application Models"
|
||||
Cohesion: 0.20
|
||||
Nodes (9): Customer, Factor, FactorIteam, PhoneNumber, Product, ProductCategory, ProductInStore, StoreRoom (+1 more)
|
||||
|
||||
### Community 15 - "Timezone-related Migrations"
|
||||
Cohesion: 0.29
|
||||
Nodes (3): Migration, Migration, Migration
|
||||
|
||||
### Community 19 - "Graphify Tooling"
|
||||
Cohesion: 0.33
|
||||
Nodes (5): graphify tool, graphify explain, graphify path, graphify query, graphify
|
||||
|
||||
## Ambiguous Edges - Review These
|
||||
- `admin_panel/base.html` → `admin_panel/templates/admin_panel/baseHesabdari.html` [AMBIGUOUS]
|
||||
admin_panel/templates/admin_panel/baseHesabdari.html · relation: conceptually_related_to
|
||||
|
||||
## Knowledge Gaps
|
||||
- **84 isolated node(s):** `base.html`, `toCurrency`, `Customer Data Object`, `Factor Data Object`, `admin_panel:customerNew URL` (+79 more)
|
||||
These have ≤1 connection - possible missing edges or undocumented components. (Counts symbols only; 276 node(s) total have ≤1 connection when file, concept and rationale nodes are included.)
|
||||
- **66 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
|
||||
|
||||
## Suggested Questions
|
||||
_Questions this graph is uniquely positioned to answer:_
|
||||
|
||||
- **Why does `passCheck()` connect `Financial and Accounting Views` to `User Action Views`, `Daily Reporting Command`?**
|
||||
_High betweenness centrality (0.208) - this node is a cross-community bridge._
|
||||
- **Are the 20 inferred relationships involving `StoreRoom` (e.g. with `User` and `approve_transfer_request()`) actually correct?**
|
||||
_`StoreRoom` has 20 INFERRED edges - model-reasoned connections that need verification._
|
||||
- **What connects `base.html`, `toCurrency`, `Customer Data Object` to the rest of the system?**
|
||||
_84 weakly-connected nodes found - possible documentation gaps or missing edges._
|
||||
- **Should `User Action Views` be split into smaller, more focused modules?**
|
||||
_Cohesion score 0.053728949478749 - nodes in this community are weakly interconnected._
|
||||
- **Why does `admin_panel/base.html` connect `Customer Admin Templates` to `Financial and Accounting Views`, `Admin Panel URLs`?**
|
||||
_High betweenness centrality (0.194) - this node is a cross-community bridge._
|
||||
- **Are the 14 inferred relationships involving `ProductInStore` (e.g. with `Command` and `approve_transfer_request()`) actually correct?**
|
||||
_`ProductInStore` has 14 INFERRED edges - model-reasoned connections that need verification._
|
||||
|
||||
### Low-confidence Hints
|
||||
_AMBIGUOUS edges — the extractor was unsure. Verify before acting on these._
|
||||
|
||||
- **What is the exact relationship between `admin_panel/base.html` and `admin_panel/templates/admin_panel/baseHesabdari.html`?**
|
||||
_Edge tagged AMBIGUOUS (relation: conceptually_related_to) - confidence is low._
|
||||
@@ -0,0 +1,360 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>graphify - graphify-out/graph.html</title>
|
||||
<script src="https://unpkg.com/vis-network@9.1.6/standalone/umd/vis-network.min.js"
|
||||
integrity="sha384-Ux6phic9PEHJ38YtrijhkzyJ8yQlH8i/+buBR8s3mAZOJrP1gwyvAcIYl3GWtpX1"
|
||||
crossorigin="anonymous"></script>
|
||||
<style>
|
||||
* { box-sizing: border-box; margin: 0; padding: 0; }
|
||||
body { background: #0f0f1a; color: #e0e0e0; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; display: flex; height: 100vh; overflow: hidden; }
|
||||
#graph { flex: 1; }
|
||||
#sidebar { width: 280px; background: #1a1a2e; border-left: 1px solid #2a2a4e; display: flex; flex-direction: column; overflow: hidden; }
|
||||
#search-wrap { padding: 12px; border-bottom: 1px solid #2a2a4e; }
|
||||
#search { width: 100%; background: #0f0f1a; border: 1px solid #3a3a5e; color: #e0e0e0; padding: 7px 10px; border-radius: 6px; font-size: 13px; outline: none; }
|
||||
#search:focus { border-color: #4E79A7; }
|
||||
#search-results { max-height: 140px; overflow-y: auto; padding: 4px 12px; border-bottom: 1px solid #2a2a4e; display: none; }
|
||||
.search-item { padding: 4px 6px; cursor: pointer; border-radius: 4px; font-size: 12px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
||||
.search-item:hover { background: #2a2a4e; }
|
||||
#info-panel { padding: 14px; border-bottom: 1px solid #2a2a4e; min-height: 140px; }
|
||||
#info-panel h3 { font-size: 13px; color: #aaa; margin-bottom: 8px; text-transform: uppercase; letter-spacing: 0.05em; }
|
||||
#info-content { font-size: 13px; color: #ccc; line-height: 1.6; }
|
||||
#info-content .field { margin-bottom: 5px; }
|
||||
#info-content .field b { color: #e0e0e0; }
|
||||
#info-content .empty { color: #555; font-style: italic; }
|
||||
.neighbor-link { display: block; padding: 2px 6px; margin: 2px 0; border-radius: 3px; cursor: pointer; font-size: 12px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; border-left: 3px solid #333; }
|
||||
.neighbor-link:hover { background: #2a2a4e; }
|
||||
#neighbors-list { max-height: 160px; overflow-y: auto; margin-top: 4px; }
|
||||
#legend-wrap { flex: 1; overflow-y: auto; padding: 12px; }
|
||||
#legend-wrap h3 { font-size: 13px; color: #aaa; margin-bottom: 10px; text-transform: uppercase; letter-spacing: 0.05em; }
|
||||
.legend-item { display: flex; align-items: center; gap: 8px; padding: 4px 0; cursor: pointer; border-radius: 4px; font-size: 12px; }
|
||||
.legend-item:hover { background: #2a2a4e; padding-left: 4px; }
|
||||
.legend-item.dimmed { opacity: 0.35; }
|
||||
.legend-dot { width: 12px; height: 12px; border-radius: 50%; flex-shrink: 0; }
|
||||
.legend-label { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
||||
.legend-count { color: #666; font-size: 11px; }
|
||||
#stats { padding: 10px 14px; border-top: 1px solid #2a2a4e; font-size: 11px; color: #555; }
|
||||
#legend-controls { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; padding: 4px 0; }
|
||||
#legend-controls label { display: flex; align-items: center; gap: 6px; cursor: pointer; font-size: 12px; color: #aaa; user-select: none; }
|
||||
#legend-controls label:hover { color: #e0e0e0; }
|
||||
.legend-cb, #select-all-cb { appearance: none; -webkit-appearance: none; width: 14px; height: 14px; border: 1.5px solid #3a3a5e; border-radius: 3px; background: #0f0f1a; cursor: pointer; position: relative; flex-shrink: 0; }
|
||||
.legend-cb:checked, #select-all-cb:checked { background: #4E79A7; border-color: #4E79A7; }
|
||||
.legend-cb:checked::after, #select-all-cb:checked::after { content: ''; position: absolute; left: 3.5px; top: 1px; width: 4px; height: 7px; border: solid #fff; border-width: 0 2px 2px 0; transform: rotate(45deg); }
|
||||
#select-all-cb:indeterminate { background: #4E79A7; border-color: #4E79A7; }
|
||||
#select-all-cb:indeterminate::after { content: ''; position: absolute; left: 2px; top: 5px; width: 8px; height: 2px; background: #fff; border: none; transform: none; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="graph"></div>
|
||||
<div id="sidebar">
|
||||
<div id="search-wrap">
|
||||
<input id="search" type="text" placeholder="Search nodes..." autocomplete="off">
|
||||
<div id="search-results"></div>
|
||||
</div>
|
||||
<div id="info-panel">
|
||||
<h3>Node Info</h3>
|
||||
<div id="info-content"><span class="empty">Click a node to inspect it</span></div>
|
||||
</div>
|
||||
<div id="legend-wrap">
|
||||
<h3>Communities</h3>
|
||||
<div id="legend-controls">
|
||||
<label><input type="checkbox" id="select-all-cb" checked onchange="toggleAllCommunities(!this.checked)">Select All</label>
|
||||
</div>
|
||||
<div id="legend"></div>
|
||||
</div>
|
||||
<div id="stats">548 nodes · 887 edges · 80 communities</div>
|
||||
</div>
|
||||
<script>
|
||||
const RAW_NODES = [{"id": "admin_models_user", "label": "User", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 15.5, "font": {"size": 12, "color": "#ffffff"}, "title": "User", "community": 0, "community_name": "User Action Views", "source_file": "admin/models.py", "file_type": "code", "degree": 21}, {"id": "admin_panel_models_action", "label": "Action", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 15.2, "font": {"size": 12, "color": "#ffffff"}, "title": "Action", "community": 0, "community_name": "User Action Views", "source_file": "admin_panel/models.py", "file_type": "code", "degree": 20}, {"id": "admin_panel_models_productcategory", "label": "ProductCategory", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 13.7, "font": {"size": 0, "color": "#ffffff"}, "title": "ProductCategory", "community": 0, "community_name": "User Action Views", "source_file": "admin_panel/models.py", "file_type": "code", "degree": 14}, {"id": "admin_panel_models_articletype", "label": "ArticleType", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "ArticleType", "community": 1, "community_name": "Inventory and Product Models", "source_file": "admin_panel/models.py", "file_type": "code", "degree": 1}, {"id": "admin_panel_models_cachetable", "label": "CacheTable", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.5, "font": {"size": 0, "color": "#ffffff"}, "title": "CacheTable", "community": 1, "community_name": "Inventory and Product Models", "source_file": "admin_panel/models.py", "file_type": "code", "degree": 2}, {"id": "admin_panel_models_phonenumber", "label": "PhoneNumber", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.5, "font": {"size": 0, "color": "#ffffff"}, "title": "PhoneNumber", "community": 1, "community_name": "Inventory and Product Models", "source_file": "admin_panel/models.py", "file_type": "code", "degree": 2}, {"id": "admin_panel_models_productstockhistory", "label": "ProductStockHistory", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.8, "font": {"size": 0, "color": "#ffffff"}, "title": "ProductStockHistory", "community": 1, "community_name": "Inventory and Product Models", "source_file": "admin_panel/models.py", "file_type": "code", "degree": 3}, {"id": "admin_panel_models_productstockhistory_meta", "label": "Meta", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "Meta", "community": 1, "community_name": "Inventory and Product Models", "source_file": "admin_panel/models.py", "file_type": "code", "degree": 1}, {"id": "admin_panel_models_storeroomowner", "label": "StoreRoomOwner", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.8, "font": {"size": 0, "color": "#ffffff"}, "title": "StoreRoomOwner", "community": 1, "community_name": "Inventory and Product Models", "source_file": "admin_panel/models.py", "file_type": "code", "degree": 3}, {"id": "admin_panel_models_userprofile", "label": "UserProfile", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.8, "font": {"size": 0, "color": "#ffffff"}, "title": "UserProfile", "community": 1, "community_name": "Inventory and Product Models", "source_file": "admin_panel/models.py", "file_type": "code", "degree": 3}, {"id": "admin_panel_models_visitqueue", "label": "VisitQueue", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.5, "font": {"size": 0, "color": "#ffffff"}, "title": "VisitQueue", "community": 1, "community_name": "Inventory and Product Models", "source_file": "admin_panel/models.py", "file_type": "code", "degree": 2}, {"id": "admin_panel_models_product", "label": "Product", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 14.7, "font": {"size": 12, "color": "#ffffff"}, "title": "Product", "community": 1, "community_name": "Inventory and Product Models", "source_file": "admin_panel/models.py", "file_type": "code", "degree": 18}, {"id": "admin_panel_models_product_meta", "label": "Meta", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "Line truncated
|
||||
const RAW_EDGES = [{"from": "admin_models", "to": "admin_models_user", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "admin_panel_models_action", "to": "admin_models_user", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "admin_panel_models_factor", "to": "admin_models_user", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "admin_panel_models_storeroom", "to": "admin_models_user", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "admin_panel_models_storeroomowner", "to": "admin_models_user", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "admin_panel_models_storetransferrequest", "to": "admin_models_user", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "admin_panel_models_userprofile", "to": "admin_models_user", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "admin_panel_models_visitqueue", "to": "admin_models_user", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "admin_panel_views_actionlist", "to": "admin_models_user", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "admin_panel_views_actionlistall", "to": "admin_models_user", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "admin_panel_views_actionlisttoday", "to": "admin_models_user", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "admin_panel_views_actionlistuser", "to": "admin_models_user", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "admin_panel_views_actionlistusertoday", "to": "admin_models_user", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "admin_panel_views_customeraction", "to": "admin_models_user", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "admin_panel_views_customereditaction", "to": "admin_models_user", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "admin_panel_views_customernazar", "to": "admin_models_user", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "admin_panel_views_customernewaction", "to": "admin_models_user", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "admin_panel_views_inventory_movements_report", "to": "admin_models_user", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "admin_panel_views_newfactor", "to": "admin_models_user", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "admin_panel_views_report", "to": "admin_models_user", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "admin_panel_views_rezayat_dashboard", "to": "admin_models_user", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "admin_panel_management_commands_send_daily_report", "to": "admin_panel_models_action", "label": "imports", "title": "imports [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "admin_panel_management_commands_send_daily_report_command", "to": "admin_panel_models_action", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "admin_panel_models", "to": "admin_panel_models_action", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "admin_panel_views", "to": "admin_panel_models_action", "label": "imports", "title": "imports [EXTRACTED]", "dashes":Line truncated
|
||||
const LEGEND = [{"cid": 0, "color": "#4E79A7", "label": "User Action Views", "count": 87}, {"cid": 1, "color": "#F28E2B", "label": "Inventory and Product Models", "count": 60}, {"cid": 2, "color": "#E15759", "label": "Daily Reporting Command", "count": 45}, {"cid": 3, "color": "#76B7B2", "label": "Customer Admin Templates", "count": 34}, {"cid": 4, "color": "#59A14F", "label": "Database Schema Migrations", "count": 33}, {"cid": 5, "color": "#EDC948", "label": "Admin Panel URLs", "count": 33}, {"cid": 6, "color": "#B07AA1", "label": "Database Backup Command", "count": 27}, {"cid": 7, "color": "#FF9DA7", "label": "Initial Database Migrations", "count": 23}, {"cid": 8, "color": "#9C755F", "label": "User Relation Migrations", "count": 23}, {"cid": 9, "color": "#BAB0AC", "label": "Financial and Accounting Views", "count": 22}, {"cid": 10, "color": "#4E79A7", "label": "Invoice Management Logic", "count": 13}, {"cid": 11, "color": "#F28E2B", "label": "Django Admin Configuration", "count": 10}, {"cid": 12, "color": "#E15759", "label": "Core Application Models", "count": 10}, {"cid": 13, "color": "#76B7B2", "label": "Resource Cleanup Command", "count": 10}, {"cid": 14, "color": "#59A14F", "label": "Django App Configurations", "count": 7}, {"cid": 15, "color": "#EDC948", "label": "Timezone-related Migrations", "count": 7}, {"cid": 16, "color": "#B07AA1", "label": "Application Entrypoint Scripts", "count": 7}, {"cid": 17, "color": "#FF9DA7", "label": "Core Admin App", "count": 6}, {"cid": 18, "color": "#9C755F", "label": "Project URL Configuration", "count": 6}, {"cid": 19, "color": "#BAB0AC", "label": "Graphify Tooling", "count": 6}, {"cid": 20, "color": "#4E79A7", "label": "Data Validation Migration", "count": 3}, {"cid": 21, "color": "#F28E2B", "label": "Application Tests", "count": 3}, {"cid": 22, "color": "#E15759", "label": "Database Schema Migration", "count": 2}, {"cid": 23, "color": "#76B7B2", "label": "Database Schema Migration", "count": 2}, {"cid": 24, "color": "#59A14F", "label": "Remove StoreRoom User Relation", "count": 2}, {"cid": 25, "color": "#EDC948", "label": "Database Schema Migration", "count": 2}, {"cid": 26, "color": "#B07AA1", "label": "Add Action Type Field", "count": 2}, {"cid": 27, "color": "#FF9DA7", "label": "Add Action Grade Field", "count": 2}, {"cid": 28, "color": "#9C755F", "label": "Database Schema Migration", "count": 2}, {"cid": 29, "color": "#BAB0AC", "label": "Add Article Payment Status", "count": 2}, {"cid": 30, "color": "#4E79A7", "label": "Add Article Payment Method", "count": 2}, {"cid": 31, "color": "#F28E2B", "label": "Add Customer Last Visit", "count": 2}, {"cid": 32, "color": "#E15759", "label": "Database Schema Migration", "count": 2}, {"cid": 33, "color": "#76B7B2", "label": "Add Sarresid Description", "count": 2}, {"cid": 34, "color": "#59A14F", "label": "Update ProductInStore Options", "count": 2}, {"cid": 35, "color": "#EDC948", "label": "Update ProductInStore Options", "count": 2}, {"cid": 36, "color": "#B07AA1", "label": "AI Tooling Documentation", "count": 2}, {"cid": 37, "color": "#FF9DA7", "label": "Admin Migrations Package", "count": 1}, {"cid": 38, "color": "#9C755F", "label": "Customer Action Partial", "count": 1}, {"cid": 39, "color": "#BAB0AC", "label": "New Customer Base Template", "count": 1}, {"cid": 40, "color": "#4E79A7", "label": "Customer Feedback Partial", "count": 1}, {"cid": 41, "color": "#F28E2B", "label": "Customer Invoice Detail", "count": 1}, {"cid": 42, "color": "#E15759", "label": "Customer Accounting Template", "count": 1}, {"cid": 43, "color": "#76B7B2", "label": "Customer Invoice List", "count": 1}, {"cid": 44, "color": "#59A14F", "label": "Customer Feedback Page", "count": 1}, {"cid": 45, "color": "#EDC948", "label": "Management Commands Package", "count": 1}, {"cid": 46, "color": "#B07AA1", "label": "Management Package", "count": 1}, {"cid": 47, "color": "#FF9DA7", "label": "Admin Panel Migrations Package", "count": 1}, {"cid": 48, "color": "#9C755F", "label": "Action List Template", "count": 1}, {"cid": 49, "color": "#BAB0AC", "label": "New Customer Invoice Page", "count": 1}, {"cid": 50, "color": "#4E79A7", "label": "New Customer Invoice V2", "count": 1}, {"cid": 51, "color": "#F28E2B", "label": "Customer Satisfaction List", "count": 1}, {"cid": 52, "color": "#E15759", "label": "Customer Satisfaction Partial", "count": 1}, {"cid": 53, "color": "#76B7B2", "label": "Customer Debt Management", "count": 1}, {"cid": 54, "color": "#59A14F", "label": "Customer List Page", "count": 1}, {"cid": 55, "color": "#EDC948", "label": "Customer List Backup Template", "count": 1}, {"cid": 56, "color": "#B07AA1", "label": "Waiting List Backup Template", "count": 1}, {"cid": 57, "color": "#FF9DA7", "label": "Financial Dashboard", "count": 1}, {"cid": 58, "color": "#9C755F", "label": "Accounting Main View", "count": 1}, {"cid": 59, "color": "#BAB0AC", "label": "Admin Panel Index Page", "count": 1}, {"cid": 60, "color": "#4E79A7", "label": "New Inventory Line truncated
|
||||
|
||||
// HTML-escape helper — prevents XSS when injecting graph data into innerHTML
|
||||
function esc(s) {
|
||||
return String(s).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"').replace(/'/g,''');
|
||||
}
|
||||
|
||||
// Build vis datasets
|
||||
const nodesDS = new vis.DataSet(RAW_NODES.map((n, i) => ({
|
||||
id: n.id, label: n.label, color: n.color, size: n.size,
|
||||
font: n.font, title: n.title,
|
||||
// Fermat/golden-angle spiral seed positions (#3699): spreading nodes out
|
||||
// before physics runs keeps avoidOverlap from computing near-zero-distance
|
||||
// repulsion that blows the BarnesHut recursion into a stack overflow on large
|
||||
// graphs. `i` is the map index — physics still settles small graphs identically.
|
||||
x: 30 * Math.sqrt(i) * Math.cos(i * 2.4),
|
||||
y: 30 * Math.sqrt(i) * Math.sin(i * 2.4),
|
||||
community: n.community, community_name: n.community_name,
|
||||
source_file: n.source_file, file_type: n.file_type, degree: n.degree,
|
||||
member_count: n.member_count,
|
||||
})));
|
||||
|
||||
const edgesDS = new vis.DataSet(RAW_EDGES.map((e, i) => ({
|
||||
id: i, from: e.from, to: e.to,
|
||||
label: '',
|
||||
title: e.title,
|
||||
dashes: e.dashes,
|
||||
width: e.width,
|
||||
color: e.color,
|
||||
arrows: { to: { enabled: true, scaleFactor: 0.5 } },
|
||||
})));
|
||||
|
||||
const container = document.getElementById('graph');
|
||||
const network = new vis.Network(container, { nodes: nodesDS, edges: edgesDS }, {
|
||||
physics: {
|
||||
enabled: true,
|
||||
solver: 'forceAtlas2Based',
|
||||
forceAtlas2Based: {
|
||||
gravitationalConstant: -60,
|
||||
centralGravity: 0.005,
|
||||
springLength: 120,
|
||||
springConstant: 0.08,
|
||||
damping: 0.4,
|
||||
avoidOverlap: 0.8,
|
||||
},
|
||||
stabilization: { iterations: 200, fit: true },
|
||||
},
|
||||
interaction: {
|
||||
hover: true,
|
||||
tooltipDelay: 100,
|
||||
hideEdgesOnDrag: true,
|
||||
navigationButtons: false,
|
||||
keyboard: false,
|
||||
},
|
||||
nodes: { shape: 'dot', borderWidth: 1.5 },
|
||||
edges: { smooth: { type: 'continuous', roundness: 0.2 }, selectionWidth: 3 },
|
||||
});
|
||||
|
||||
network.once('stabilizationIterationsDone', () => {
|
||||
network.setOptions({ physics: { enabled: false } });
|
||||
});
|
||||
|
||||
function showInfo(nodeId) {
|
||||
const n = nodesDS.get(nodeId);
|
||||
if (!n) return;
|
||||
const neighborIds = network.getConnectedNodes(nodeId);
|
||||
const neighborItems = neighborIds.map(nid => {
|
||||
const nb = nodesDS.get(nid);
|
||||
const color = nb ? nb.color.background : '#555';
|
||||
return `<span class="neighbor-link" style="border-left-color:${esc(color)}" data-nid="${esc(nid)}">${esc(nb ? nb.label : nid)}</span>`;
|
||||
}).join('');
|
||||
const isMetaNode = !n.file_type && !n.source_file;
|
||||
let html = `<div class="field"><b>${esc(n.label)}</b></div>`;
|
||||
if (!isMetaNode) {
|
||||
html += `<div class="field">Type: ${esc(n.file_type || 'unknown')}</div>`;
|
||||
}
|
||||
html += `<div class="field">Community: ${esc(n.community_name || '')}</div>`;
|
||||
if (!isMetaNode) {
|
||||
html += `<div class="field">Source: ${esc(n.source_file || '-')}</div>`;
|
||||
} else if (n.member_count !== undefined && n.member_count !== null) {
|
||||
html += `<div class="field">Members: ${esc(n.member_count)}</div>`;
|
||||
}
|
||||
html += `<div class="field">Degree: ${n.degree}</div>`;
|
||||
if (neighborIds.length) {
|
||||
html += `<div class="field" style="margin-top:8px;color:#aaa;font-size:11px">Neighbors (${neighborIds.length})</div><div id="neighbors-list">${neighborItems}</div>`;
|
||||
}
|
||||
document.getElementById('info-content').innerHTML = html;
|
||||
}
|
||||
|
||||
function focusNode(nodeId) {
|
||||
network.focus(nodeId, { scale: 1.4, animation: true });
|
||||
network.selectNodes([nodeId]);
|
||||
showInfo(nodeId);
|
||||
}
|
||||
|
||||
// Neighbor links use a data attribute + one delegated listener rather than an
|
||||
// inline onclick. A node id/label sourced from a document or a scraped URL
|
||||
// (graphify add) can contain a double-quote; dropping the stringified id
|
||||
// unescaped into a quoted onclick both broke every link and allowed a hostile
|
||||
// source to inject an event handler into the local report (stored XSS, #1838).
|
||||
// esc() on data-nid keeps the value inside the attribute; the listener reads it
|
||||
// back verbatim. Bound to document so it survives the innerHTML rebuild that
|
||||
// recreates #neighbors-list on each showInfo().
|
||||
document.addEventListener('click', e => {
|
||||
const el = e.target.closest('.neighbor-link');
|
||||
if (el && el.dataset.nid !== undefined) focusNode(el.dataset.nid);
|
||||
});
|
||||
|
||||
// Track hovered node — hover detection is more reliable than click params
|
||||
let hoveredNodeId = null;
|
||||
network.on('hoverNode', params => {
|
||||
hoveredNodeId = params.node;
|
||||
container.style.cursor = 'pointer';
|
||||
});
|
||||
network.on('blurNode', () => {
|
||||
hoveredNodeId = null;
|
||||
container.style.cursor = 'default';
|
||||
});
|
||||
container.addEventListener('click', () => {
|
||||
if (hoveredNodeId !== null) {
|
||||
showInfo(hoveredNodeId);
|
||||
network.selectNodes([hoveredNodeId]);
|
||||
}
|
||||
});
|
||||
network.on('click', params => {
|
||||
if (params.nodes.length > 0) {
|
||||
showInfo(params.nodes[0]);
|
||||
} else if (hoveredNodeId === null) {
|
||||
document.getElementById('info-content').innerHTML = '<span class="empty">Click a node to inspect it</span>';
|
||||
}
|
||||
});
|
||||
|
||||
const searchInput = document.getElementById('search');
|
||||
const searchResults = document.getElementById('search-results');
|
||||
searchInput.addEventListener('input', () => {
|
||||
const q = searchInput.value.toLowerCase().trim();
|
||||
searchResults.innerHTML = '';
|
||||
if (!q) { searchResults.style.display = 'none'; return; }
|
||||
const matches = RAW_NODES.filter(n => n.label.toLowerCase().includes(q)).slice(0, 20);
|
||||
if (!matches.length) { searchResults.style.display = 'none'; return; }
|
||||
searchResults.style.display = 'block';
|
||||
matches.forEach(n => {
|
||||
const el = document.createElement('div');
|
||||
el.className = 'search-item';
|
||||
el.textContent = n.label;
|
||||
el.style.borderLeft = `3px solid ${n.color.background}`;
|
||||
el.style.paddingLeft = '8px';
|
||||
el.onclick = () => {
|
||||
network.focus(n.id, { scale: 1.5, animation: true });
|
||||
network.selectNodes([n.id]);
|
||||
showInfo(n.id);
|
||||
searchResults.style.display = 'none';
|
||||
searchInput.value = '';
|
||||
};
|
||||
searchResults.appendChild(el);
|
||||
});
|
||||
});
|
||||
document.addEventListener('click', e => {
|
||||
if (!searchResults.contains(e.target) && e.target !== searchInput)
|
||||
searchResults.style.display = 'none';
|
||||
});
|
||||
|
||||
const hiddenCommunities = new Set();
|
||||
|
||||
const selectAllCb = document.getElementById('select-all-cb');
|
||||
|
||||
function updateSelectAllState() {
|
||||
const total = LEGEND.length;
|
||||
const hidden = hiddenCommunities.size;
|
||||
selectAllCb.checked = hidden === 0;
|
||||
selectAllCb.indeterminate = hidden > 0 && hidden < total;
|
||||
}
|
||||
|
||||
function toggleAllCommunities(hide) {
|
||||
document.querySelectorAll('.legend-item').forEach(item => {
|
||||
hide ? item.classList.add('dimmed') : item.classList.remove('dimmed');
|
||||
});
|
||||
document.querySelectorAll('.legend-cb').forEach(cb => {
|
||||
cb.checked = !hide;
|
||||
});
|
||||
LEGEND.forEach(c => {
|
||||
if (hide) hiddenCommunities.add(c.cid); else hiddenCommunities.delete(c.cid);
|
||||
});
|
||||
const updates = RAW_NODES.map(n => ({ id: n.id, hidden: hide }));
|
||||
nodesDS.update(updates);
|
||||
updateSelectAllState();
|
||||
}
|
||||
|
||||
const legendEl = document.getElementById('legend');
|
||||
LEGEND.forEach(c => {
|
||||
const item = document.createElement('div');
|
||||
item.className = 'legend-item';
|
||||
const cb = document.createElement('input');
|
||||
cb.type = 'checkbox';
|
||||
cb.className = 'legend-cb';
|
||||
cb.checked = true;
|
||||
cb.addEventListener('change', (e) => {
|
||||
e.stopPropagation();
|
||||
if (cb.checked) {
|
||||
hiddenCommunities.delete(c.cid);
|
||||
item.classList.remove('dimmed');
|
||||
} else {
|
||||
hiddenCommunities.add(c.cid);
|
||||
item.classList.add('dimmed');
|
||||
}
|
||||
const updates = RAW_NODES
|
||||
.filter(n => n.community === c.cid)
|
||||
.map(n => ({ id: n.id, hidden: !cb.checked }));
|
||||
nodesDS.update(updates);
|
||||
updateSelectAllState();
|
||||
});
|
||||
item.innerHTML = `<div class="legend-dot" style="background:${c.color}"></div>
|
||||
<span class="legend-label">${c.label}</span>
|
||||
<span class="legend-count">${c.count}</span>`;
|
||||
item.prepend(cb);
|
||||
item.onclick = (e) => {
|
||||
if (e.target === cb) return;
|
||||
cb.checked = !cb.checked;
|
||||
cb.dispatchEvent(new Event('change'));
|
||||
};
|
||||
legendEl.appendChild(item);
|
||||
});
|
||||
</script>
|
||||
<script>
|
||||
// Render hyperedges as shaded regions
|
||||
const hyperedges = [{"id": "customer_retention_flow", "label": "Customer Satisfaction & Collection", "nodes": ["admin_panel_templates_admin_panel_report_rezayat", "admin_panel_templates_admin_panel_report_debtors_no_vosol", "admin_panel_customer_customernazarinc"], "relation": "participate_in", "confidence": "EXTRACTED", "confidence_score": 0.9}, {"id": "customer_management_flow", "label": "Customer Management Flow", "nodes": ["admin_panel_customer_base_new", "admin_panel_customer_action_inc", "admin_panel_customer_id_factor", "admin_panel_customer_hesabdari"], "relation": "participate_in", "confidence": "EXTRACTED", "confidence_score": 1.0}, {"id": "financial_management_flow", "label": "Financial & Debt Management", "nodes": ["admin_panel_templates_admin_panel_financial_dashboard", "admin_panel_templates_admin_panel_hesabdari"], "relation": "participate_in", "confidence": "EXTRACTED", "confidence_score": 1.0}, {"id": "inventory_management_flow", "label": "Inventory Management System", "nodes": ["admin_panel_templates_admin_panel_store", "admin_panel_templates_admin_panel_store_transfers", "admin_panel_templates_admin_panel_report_inventory_movements", "admin_panel_templates_admin_panel_operationsbk"], "relation": "participate_in", "confidence": "EXTRACTED", "confidence_score": 1.0}, {"id": "login_form", "label": "Login Form", "nodes": ["admin_panel_templates_admin_panel_login", "django_url_admin_panel_p_login", "django_csrf_token", "form_field_username", "form_field_password"], "relation": "form", "confidence": "EXTRACTED", "source_file": "admin_panel/templates/admin_panel/login.html"}, {"id": "new_store_form", "label": "New Store Form", "nodes": ["admin_panel_templates_admin_panel_storebk1", "django_url_admin_panel_newstore", "django_csrf_token", "form_field_storename"], "relation": "form", "confidence": "EXTRACTED", "source_file": "admin_panel/templates/admin_panel/storeBK1.html"}, {"id": "store_inventory_display", "label": "Store Inventory Display", "nodes": ["admin_panel_templates_admin_panel_storebk1", "template_variable_productsum", "product_property_product_name", "product_property_mojodi"], "relation": "participate_in", "confidence": "EXTRACTED", "source_file": "admin_panel/templates/admin_panel/storeBK1.html"}, {"id": "customer_interaction_flow", "label": "Customer Lifecycle Management", "nodes": ["admin_panel_templates_admin_panel_customers"], "relation": "participate_in", "confidence": "INFERRED", "confidence_score": 0.85}, {"id": "customer_lifecycle_management", "label": "Customer Interaction Lifecycle", "nodes": ["admin_panel_templates_admin_panel_customers", "admin_panel_templates_admin_panel_customerNew", "admin_panel_templates_admin_panel_customerRezayat"], "relation": "form", "confidence": "INFERRED", "confidence_score": 0.85, "source_file": "admin_panel/templates/admin_panel/customers.html"}, {"id": "financial_management_flow", "label": "Financial & Debt Management Flow", "nodes": ["admin_panel_templates_admin_panel_customerSarresid", "admin_panel_templates_admin_panel_hesabdari", "admin_panel_templates_admin_panel_financial_dashboard"], "relation": "participate_in", "confidence": "INFERRED", "confidence_score": 0.9, "source_file": "admin_panel/templates/admin_panel/financial_dashboard.html"}, {"id": "settle_due_payment_flow", "label": "Settle Due Payment Flow", "nodes": ["admin_panel_templates_admin_panel_hesabdaricheckpassfail_html", "admin_panel_url_passcheck", "admin_panel_url_pardakhtnesiye"], "relation": "participate_in", "confidence": "INFERRED", "confidence_score": 0.9, "source_file": "admin_panel/templates/admin_panel/hesabdariCheckPassFail.html"}, {"id": "accounting_flow", "label": "Accounting and Billing Flow", "nodes": ["admin_panel_templates_admin_panel_basehesabdari", "admin_panel_templates_admin_panel_bedehi", "admin_panel_templates_admin_panel_hesabdariheckpass", "concept_url_admin_panel_hesabdari", "concept_url_admin_panel_bedehi", "concept_url_admin_panel_pardakhtnesiye"], "relation": "participate_in", "confidence": "INFERRED", "source_file": "admin_panel/templates/admin_panel/baseHesabdari.html"}, {"id": "check_clearing_flow", "label": "Check Clearing Flow", "nodes": ["admin_panel_templates_admin_panel_hesabdariresidnashode", "admin_panel_views_passcheck"], "relation": "participate_in", "confidence": "INFERRED", "source_file": "admin_panel/templates/admin_panel/hesabdariResidNashode.html"}, {"id": "customer_management_flow", "label": "Customer Management Flow", "nodes": ["admin_panel_templates_admin_panel_customerbase", "admin_panel_templates_admin_panel_customerbasenew", "admin_panel_templates_admin_panel_customeraction", "admin_panel_templates_admin_panel_customerid", "admin_panel_templates_admin_panel_customeridfactorbackup", "concept_url_admin_panel_customers", "concept_url_admin_panel_customeredit", "concept_url_admin_panel_newfactor"], "relation": "participate_in", "confidence": "INFERRED", "source_file": "admin_panel/templates/admin_panel/customerBase.html"}, {"Line truncated
|
||||
// afterDrawing passes ctx already transformed to network coordinate space.
|
||||
// Draw node positions raw — no manual pan/zoom/DPR math needed.
|
||||
|
||||
// Andrew's monotone chain. Returns the hull in counter-clockwise order, which
|
||||
// is what the perimeter must be traced in. Collinear and duplicate points
|
||||
// collapse to the extremes, so degenerate member sets render as a segment
|
||||
// rather than a zero-area crossed path.
|
||||
function convexHull(pts) {
|
||||
const p = pts.slice().sort((a, b) => (a.x - b.x) || (a.y - b.y));
|
||||
if (p.length < 3) return p;
|
||||
const cross = (o, a, b) => (a.x - o.x) * (b.y - o.y) - (a.y - o.y) * (b.x - o.x);
|
||||
const build = seq => {
|
||||
const out = [];
|
||||
for (const q of seq) {
|
||||
while (out.length >= 2 && cross(out[out.length - 2], out[out.length - 1], q) <= 0) out.pop();
|
||||
out.push(q);
|
||||
}
|
||||
out.pop();
|
||||
return out;
|
||||
};
|
||||
const hull = build(p).concat(build(p.slice().reverse()));
|
||||
return hull.length >= 3 ? hull : p;
|
||||
}
|
||||
network.on('afterDrawing', function(ctx) {
|
||||
hyperedges.forEach(h => {
|
||||
const positions = h.nodes
|
||||
.map(nid => network.getPositions([nid])[nid])
|
||||
.filter(p => p !== undefined);
|
||||
if (positions.length < 2) return;
|
||||
ctx.save();
|
||||
ctx.globalAlpha = 0.12;
|
||||
ctx.fillStyle = '#6366f1';
|
||||
ctx.strokeStyle = '#6366f1';
|
||||
ctx.lineWidth = 2;
|
||||
ctx.beginPath();
|
||||
// Centroid and expanded hull in network coordinates.
|
||||
// The perimeter must follow hull order, not h.nodes order: tracing the
|
||||
// raw member order self-intersects whenever the layout does not happen
|
||||
// to place members in angular order, filling as crossed wedges.
|
||||
const cx = positions.reduce((s, p) => s + p.x, 0) / positions.length;
|
||||
const cy = positions.reduce((s, p) => s + p.y, 0) / positions.length;
|
||||
const hull = convexHull(positions);
|
||||
const expanded = hull.map(p => ({
|
||||
x: cx + (p.x - cx) * 1.15,
|
||||
y: cy + (p.y - cy) * 1.15
|
||||
}));
|
||||
ctx.moveTo(expanded[0].x, expanded[0].y);
|
||||
expanded.slice(1).forEach(p => ctx.lineTo(p.x, p.y));
|
||||
ctx.closePath();
|
||||
ctx.fill();
|
||||
ctx.globalAlpha = 0.4;
|
||||
ctx.stroke();
|
||||
// Label
|
||||
ctx.globalAlpha = 0.8;
|
||||
ctx.fillStyle = '#4f46e5';
|
||||
ctx.font = 'bold 11px sans-serif';
|
||||
ctx.textAlign = 'center';
|
||||
ctx.fillText(h.label, cx, cy - 5);
|
||||
ctx.restore();
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
+18277
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,890 @@
|
||||
{
|
||||
".gemini/settings.json": {
|
||||
"mtime": 1791551505.4245954,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "5381fe51a877fa6d2641ad3a87ae7ee1",
|
||||
"semantic_hash": "5381fe51a877fa6d2641ad3a87ae7ee1"
|
||||
},
|
||||
".opencode/opencode.json": {
|
||||
"mtime": 1791551506.0350895,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "f2ae21510d07365eb2bce8159272c7a0",
|
||||
"semantic_hash": "f2ae21510d07365eb2bce8159272c7a0"
|
||||
},
|
||||
"admin/__init__.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "d41d8cd98f00b204e9800998ecf8427e",
|
||||
"semantic_hash": "d41d8cd98f00b204e9800998ecf8427e"
|
||||
},
|
||||
"admin/admin.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "ef4c241c5311eee11a93e9366f492a72",
|
||||
"semantic_hash": "ef4c241c5311eee11a93e9366f492a72"
|
||||
},
|
||||
"admin/apps.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "8b3d9eda5e9ce46986255783cb994a6c",
|
||||
"semantic_hash": "8b3d9eda5e9ce46986255783cb994a6c"
|
||||
},
|
||||
"admin/migrations/__init__.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "d41d8cd98f00b204e9800998ecf8427e",
|
||||
"semantic_hash": "d41d8cd98f00b204e9800998ecf8427e"
|
||||
},
|
||||
"admin/models.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "335dbbbd9bec5b785bb826dbf6ccc8c9",
|
||||
"semantic_hash": "335dbbbd9bec5b785bb826dbf6ccc8c9"
|
||||
},
|
||||
"admin/tests.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "e08f0582500f6562bf0a931ef9503b39",
|
||||
"semantic_hash": "e08f0582500f6562bf0a931ef9503b39"
|
||||
},
|
||||
"admin/urls.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "9fab312930c17e4fb8e2293ef4cf1f1b",
|
||||
"semantic_hash": "9fab312930c17e4fb8e2293ef4cf1f1b"
|
||||
},
|
||||
"admin/views.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "65e892f735b878955bb7face4f3a15f7",
|
||||
"semantic_hash": "65e892f735b878955bb7face4f3a15f7"
|
||||
},
|
||||
"admin_panel/__init__.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "d41d8cd98f00b204e9800998ecf8427e",
|
||||
"semantic_hash": "d41d8cd98f00b204e9800998ecf8427e"
|
||||
},
|
||||
"admin_panel/admin.py": {
|
||||
"mtime": 1783247518.769521,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "9bf27d273cdeaf40f7f82d818318fa28",
|
||||
"semantic_hash": "9bf27d273cdeaf40f7f82d818318fa28"
|
||||
},
|
||||
"admin_panel/apps.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "7b45752661a9c60826cd3b3cb648f7b9",
|
||||
"semantic_hash": "7b45752661a9c60826cd3b3cb648f7b9"
|
||||
},
|
||||
"admin_panel/context_processor.py": {
|
||||
"mtime": 1785506207.060478,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "a9bc61278ecd5950347b24fd8438583b",
|
||||
"semantic_hash": "a9bc61278ecd5950347b24fd8438583b"
|
||||
},
|
||||
"admin_panel/management/__init__.py": {
|
||||
"mtime": 1782242229.7079034,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "d41d8cd98f00b204e9800998ecf8427e",
|
||||
"semantic_hash": "d41d8cd98f00b204e9800998ecf8427e"
|
||||
},
|
||||
"admin_panel/management/commands/__init__.py": {
|
||||
"mtime": 1782242229.7079034,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "d41d8cd98f00b204e9800998ecf8427e",
|
||||
"semantic_hash": "d41d8cd98f00b204e9800998ecf8427e"
|
||||
},
|
||||
"admin_panel/management/commands/gt_esh.py": {
|
||||
"mtime": 1782311882.9799201,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "a93adc1bf01ae69281bc8736f254f7cc",
|
||||
"semantic_hash": "a93adc1bf01ae69281bc8736f254f7cc"
|
||||
},
|
||||
"admin_panel/management/commands/send_daily_report.py": {
|
||||
"mtime": 1787309060.0288901,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "acb098dbb2d4f61659f7d291b8ababbb",
|
||||
"semantic_hash": "acb098dbb2d4f61659f7d291b8ababbb"
|
||||
},
|
||||
"admin_panel/management/commands/sqlite_db_backup.py": {
|
||||
"mtime": 1782242044.4963484,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "03685ea937f847e6665a40f6cf482121",
|
||||
"semantic_hash": "03685ea937f847e6665a40f6cf482121"
|
||||
},
|
||||
"admin_panel/migrations/0001_initial.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "5ee5874f5ba128bb012c8b3eb7a00915",
|
||||
"semantic_hash": "5ee5874f5ba128bb012c8b3eb7a00915"
|
||||
},
|
||||
"admin_panel/migrations/0002_auto_20220114_1616.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "5086374174d36b7a4a14b6d75f51bb33",
|
||||
"semantic_hash": "5086374174d36b7a4a14b6d75f51bb33"
|
||||
},
|
||||
"admin_panel/migrations/0003_auto_20220115_1401.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "0574a9ab80ed8668f0254c3bf7d84d02",
|
||||
"semantic_hash": "0574a9ab80ed8668f0254c3bf7d84d02"
|
||||
},
|
||||
"admin_panel/migrations/0004_factor_paytype.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "34e4ef38eb7384fef97781003c6bdb0b",
|
||||
"semantic_hash": "34e4ef38eb7384fef97781003c6bdb0b"
|
||||
},
|
||||
"admin_panel/migrations/0005_auto_20220121_2054.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "bb1cbeecc3832ba9940dd171c794739f",
|
||||
"semantic_hash": "bb1cbeecc3832ba9940dd171c794739f"
|
||||
},
|
||||
"admin_panel/migrations/0006_auto_20220121_2100.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "486a3056059cd8cb5fe3dae35d3f2369",
|
||||
"semantic_hash": "486a3056059cd8cb5fe3dae35d3f2369"
|
||||
},
|
||||
"admin_panel/migrations/0007_productinstore_factor.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "f3fec01eca2e30f20bb5048788e0dfe9",
|
||||
"semantic_hash": "f3fec01eca2e30f20bb5048788e0dfe9"
|
||||
},
|
||||
"admin_panel/migrations/0008_storeroom_user.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "d0f91fb7d0fda45e7b55c2c518e94d5a",
|
||||
"semantic_hash": "d0f91fb7d0fda45e7b55c2c518e94d5a"
|
||||
},
|
||||
"admin_panel/migrations/0009_remove_storeroom_user.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "4c22c87bea29138e1b1c1a9718743af3",
|
||||
"semantic_hash": "4c22c87bea29138e1b1c1a9718743af3"
|
||||
},
|
||||
"admin_panel/migrations/0010_auto_20220122_1546.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "5b0929503f30d4bbc07681a98b218883",
|
||||
"semantic_hash": "5b0929503f30d4bbc07681a98b218883"
|
||||
},
|
||||
"admin_panel/migrations/0011_storeroom_user.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "80fa2b4783e9eb67d94fad0cc7f7a3e0",
|
||||
"semantic_hash": "80fa2b4783e9eb67d94fad0cc7f7a3e0"
|
||||
},
|
||||
"admin_panel/migrations/0012_visitqueue_user.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "063c36f0c675ca74d6c4ab47fc3a2460",
|
||||
"semantic_hash": "063c36f0c675ca74d6c4ab47fc3a2460"
|
||||
},
|
||||
"admin_panel/migrations/0013_alter_factor_options.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "a1a9cbb07d67c2a85e2f3bb3321ffcb6",
|
||||
"semantic_hash": "a1a9cbb07d67c2a85e2f3bb3321ffcb6"
|
||||
},
|
||||
"admin_panel/migrations/0014_auto_20220123_1348.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "5f562d5f34b9a225af1bc212060598b4",
|
||||
"semantic_hash": "5f562d5f34b9a225af1bc212060598b4"
|
||||
},
|
||||
"admin_panel/migrations/0015_auto_20220124_0858.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "7969fac0b9f3bcfe374252f63162a044",
|
||||
"semantic_hash": "7969fac0b9f3bcfe374252f63162a044"
|
||||
},
|
||||
"admin_panel/migrations/0016_factor_user.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "ea959dd744b9d8b2386b8ea254365213",
|
||||
"semantic_hash": "ea959dd744b9d8b2386b8ea254365213"
|
||||
},
|
||||
"admin_panel/migrations/0017_factoriteam_garantyesh.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "03245dcb79b9acb25c6942241342e167",
|
||||
"semantic_hash": "03245dcb79b9acb25c6942241342e167"
|
||||
},
|
||||
"admin_panel/migrations/0018_alter_factoriteam_product.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "af05fba320620794d19ce1435b0cb94f",
|
||||
"semantic_hash": "af05fba320620794d19ce1435b0cb94f"
|
||||
},
|
||||
"admin_panel/migrations/0019_article_articletype.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "bffe3cbec0759137d8b9659ef0ac7917",
|
||||
"semantic_hash": "bffe3cbec0759137d8b9659ef0ac7917"
|
||||
},
|
||||
"admin_panel/migrations/0020_auto_20220126_1532.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "de0476b4f325083fb85f72e0b2b07f6e",
|
||||
"semantic_hash": "de0476b4f325083fb85f72e0b2b07f6e"
|
||||
},
|
||||
"admin_panel/migrations/0021_alter_article_type.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "7def7b4625409c8afadb454d59f711b1",
|
||||
"semantic_hash": "7def7b4625409c8afadb454d59f711b1"
|
||||
},
|
||||
"admin_panel/migrations/0022_article_typepy.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "534616af969f58abb7a691a42bb5d89c",
|
||||
"semantic_hash": "534616af969f58abb7a691a42bb5d89c"
|
||||
},
|
||||
"admin_panel/migrations/0023_alter_article_typepy.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "bf5f29a0c95c00db2f327bcfd59ef3e2",
|
||||
"semantic_hash": "bf5f29a0c95c00db2f327bcfd59ef3e2"
|
||||
},
|
||||
"admin_panel/migrations/0024_action.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "bdf1314341fe7f3fdc5f30a2a814a85b",
|
||||
"semantic_hash": "bdf1314341fe7f3fdc5f30a2a814a85b"
|
||||
},
|
||||
"admin_panel/migrations/0025_action_actiontype.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "4c0e586b80b058330e63e484d0030806",
|
||||
"semantic_hash": "4c0e586b80b058330e63e484d0030806"
|
||||
},
|
||||
"admin_panel/migrations/0026_auto_20220209_1924.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "cdebac520a0ca63caa1f96a50f23eb8b",
|
||||
"semantic_hash": "cdebac520a0ca63caa1f96a50f23eb8b"
|
||||
},
|
||||
"admin_panel/migrations/0027_alter_action_nazar.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "a2b02bc693f8f79bbcc8550de42821a4",
|
||||
"semantic_hash": "a2b02bc693f8f79bbcc8550de42821a4"
|
||||
},
|
||||
"admin_panel/migrations/0028_action_grade.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "e415b68bd27ef19db2c95d7cde690023",
|
||||
"semantic_hash": "e415b68bd27ef19db2c95d7cde690023"
|
||||
},
|
||||
"admin_panel/migrations/0029_alter_article_options.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "85e0849c5e61b965e1828fd77996690f",
|
||||
"semantic_hash": "85e0849c5e61b965e1828fd77996690f"
|
||||
},
|
||||
"admin_panel/migrations/0030_auto_20220414_1047.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "e4a28feae47beb437db5275ca1003c51",
|
||||
"semantic_hash": "e4a28feae47beb437db5275ca1003c51"
|
||||
},
|
||||
"admin_panel/migrations/0031_article_sarresid.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "a036c6a51657a842e0e309db26cf5c30",
|
||||
"semantic_hash": "a036c6a51657a842e0e309db26cf5c30"
|
||||
},
|
||||
"admin_panel/migrations/0032_article_paystatus.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "1e9cc1508976669c79784d9ecdacaa5c",
|
||||
"semantic_hash": "1e9cc1508976669c79784d9ecdacaa5c"
|
||||
},
|
||||
"admin_panel/migrations/0033_article_nahvepardakht.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "a171b5d3d41e024eec96060a7553023c",
|
||||
"semantic_hash": "a171b5d3d41e024eec96060a7553023c"
|
||||
},
|
||||
"admin_panel/migrations/0034_alter_article_sarresid.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "f8b4c19246ffd432671dc645b5f7a27e",
|
||||
"semantic_hash": "f8b4c19246ffd432671dc645b5f7a27e"
|
||||
},
|
||||
"admin_panel/migrations/0035_alter_article_sarresid.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "5fc7aaa82f013ed17435c8f712433aeb",
|
||||
"semantic_hash": "5fc7aaa82f013ed17435c8f712433aeb"
|
||||
},
|
||||
"admin_panel/migrations/0036_sarresid.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "41190a4c3a8a42368b9e68be15e59da9",
|
||||
"semantic_hash": "41190a4c3a8a42368b9e68be15e59da9"
|
||||
},
|
||||
"admin_panel/migrations/0037_sarresid_sarresiddt.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "74ce86a53b5317423def533f08e40041",
|
||||
"semantic_hash": "74ce86a53b5317423def533f08e40041"
|
||||
},
|
||||
"admin_panel/migrations/0038_auto_20240213_1735.py": {
|
||||
"mtime": 1707833116.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "1f436c242cd8233cf36b46a344712893",
|
||||
"semantic_hash": "1f436c242cd8233cf36b46a344712893"
|
||||
},
|
||||
"admin_panel/migrations/0039_customer_last_bazdid_dt.py": {
|
||||
"mtime": 1708021379.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "cdbf72bdc29027c67ec6f579dbfd87a5",
|
||||
"semantic_hash": "cdbf72bdc29027c67ec6f579dbfd87a5"
|
||||
},
|
||||
"admin_panel/migrations/0040_customer_laghv_bazdid.py": {
|
||||
"mtime": 1708086290.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "f240e539790c8266e8e6436de3f7ba8e",
|
||||
"semantic_hash": "f240e539790c8266e8e6436de3f7ba8e"
|
||||
},
|
||||
"admin_panel/migrations/0041_auto_20240216_1607.py": {
|
||||
"mtime": 1708087066.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "0e18ee1383cce3042f8d951170a4206c",
|
||||
"semantic_hash": "0e18ee1383cce3042f8d951170a4206c"
|
||||
},
|
||||
"admin_panel/migrations/0042_article_user.py": {
|
||||
"mtime": 1708097636.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "9c1401cdcc3e57cd7fd94bc02b4f5712",
|
||||
"semantic_hash": "9c1401cdcc3e57cd7fd94bc02b4f5712"
|
||||
},
|
||||
"admin_panel/migrations/0043_sarresid_user.py": {
|
||||
"mtime": 1712324765.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "854ae72ac9682f257391fddaafd8df18",
|
||||
"semantic_hash": "854ae72ac9682f257391fddaafd8df18"
|
||||
},
|
||||
"admin_panel/migrations/0044_sarresid_desc.py": {
|
||||
"mtime": 1731443780.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "a016eaa6fc679bf509d831b1a970b625",
|
||||
"semantic_hash": "a016eaa6fc679bf509d831b1a970b625"
|
||||
},
|
||||
"admin_panel/migrations/0045_auto_20260610_1421.py": {
|
||||
"mtime": 1781088666.153017,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "4ef65d5c188e0cdfe6ada14be13a5289",
|
||||
"semantic_hash": "4ef65d5c188e0cdfe6ada14be13a5289"
|
||||
},
|
||||
"admin_panel/migrations/0046_auto_20260624_1818.py": {
|
||||
"mtime": 1782312515.2476697,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "5ca2702b20a1a595e8f70d0febce437b",
|
||||
"semantic_hash": "5ca2702b20a1a595e8f70d0febce437b"
|
||||
},
|
||||
"admin_panel/migrations/0047_alter_productinstore_movement_type.py": {
|
||||
"mtime": 1782400614.7357888,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "dc43c8e6b4e1e070f12746a3ce7b48eb",
|
||||
"semantic_hash": "dc43c8e6b4e1e070f12746a3ce7b48eb"
|
||||
},
|
||||
"admin_panel/migrations/0048_alter_productinstore_options.py": {
|
||||
"mtime": 1783073642.7854881,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "1ef983920121630add36d9d681b13aee",
|
||||
"semantic_hash": "1ef983920121630add36d9d681b13aee"
|
||||
},
|
||||
"admin_panel/migrations/0049_alter_productinstore_options.py": {
|
||||
"mtime": 1783075090.874336,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "6535f13daa18a07d6bbf04101b371d9c",
|
||||
"semantic_hash": "6535f13daa18a07d6bbf04101b371d9c"
|
||||
},
|
||||
"admin_panel/migrations/0050_storetransferrequest.py": {
|
||||
"mtime": 1783081448.2086937,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "479c29e8beb5388215e2dc24751686d1",
|
||||
"semantic_hash": "479c29e8beb5388215e2dc24751686d1"
|
||||
},
|
||||
"admin_panel/migrations/0051_auto_20260705_1356.py": {
|
||||
"mtime": 1783247162.7750995,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "ce9e0ca56be568fae0613e79298666f2",
|
||||
"semantic_hash": "ce9e0ca56be568fae0613e79298666f2"
|
||||
},
|
||||
"admin_panel/migrations/0052_storeroomowner.py": {
|
||||
"mtime": 1783247323.7533815,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "cd1a8e4784e4f21b50c5200da2677199",
|
||||
"semantic_hash": "cd1a8e4784e4f21b50c5200da2677199"
|
||||
},
|
||||
"admin_panel/migrations/0053_storeroom_owners.py": {
|
||||
"mtime": 1783247371.5792572,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "4015f9c7449f85884f89b31d3af39894",
|
||||
"semantic_hash": "4015f9c7449f85884f89b31d3af39894"
|
||||
},
|
||||
"admin_panel/migrations/0054_auto_20260715_2250.py": {
|
||||
"mtime": 1784143234.375771,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "9ee31b1cc86ea3ac5db8e3bb7ad38aad",
|
||||
"semantic_hash": "9ee31b1cc86ea3ac5db8e3bb7ad38aad"
|
||||
},
|
||||
"admin_panel/migrations/0055_action_nextnazardt.py": {
|
||||
"mtime": 1784916401.6852713,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "6dfed65de7902632cb291defd05914ee",
|
||||
"semantic_hash": "6dfed65de7902632cb291defd05914ee"
|
||||
},
|
||||
"admin_panel/migrations/0056_auto_20260731_1824.py": {
|
||||
"mtime": 1785509644.1099384,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "c08ef1beaff253c2e43eccb981073c1f",
|
||||
"semantic_hash": "c08ef1beaff253c2e43eccb981073c1f"
|
||||
},
|
||||
"admin_panel/migrations/__init__.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "d41d8cd98f00b204e9800998ecf8427e",
|
||||
"semantic_hash": "d41d8cd98f00b204e9800998ecf8427e"
|
||||
},
|
||||
"admin_panel/models.py": {
|
||||
"mtime": 1785509631.4338894,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "1b4254486bf126b24e73d7a1fc930007",
|
||||
"semantic_hash": "1b4254486bf126b24e73d7a1fc930007"
|
||||
},
|
||||
"admin_panel/services.py": {
|
||||
"mtime": 1786864057.7585652,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "164f88ca79dff2643a1c38f5974126be",
|
||||
"semantic_hash": "164f88ca79dff2643a1c38f5974126be"
|
||||
},
|
||||
"admin_panel/templatetags/__init__.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "d41d8cd98f00b204e9800998ecf8427e",
|
||||
"semantic_hash": "d41d8cd98f00b204e9800998ecf8427e"
|
||||
},
|
||||
"admin_panel/templatetags/custom_tags.py": {
|
||||
"mtime": 1783251836.4148617,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "8d8c826e168cec5bb68a21c8457380ba",
|
||||
"semantic_hash": "8d8c826e168cec5bb68a21c8457380ba"
|
||||
},
|
||||
"admin_panel/templatetags/remove_q_p.py": {
|
||||
"mtime": 1683307703.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "6ac789d61f86b1a27bc215d2a77761c6",
|
||||
"semantic_hash": "6ac789d61f86b1a27bc215d2a77761c6"
|
||||
},
|
||||
"admin_panel/tests.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "e08f0582500f6562bf0a931ef9503b39",
|
||||
"semantic_hash": "e08f0582500f6562bf0a931ef9503b39"
|
||||
},
|
||||
"admin_panel/urls.py": {
|
||||
"mtime": 1787302652.4618616,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "d550a6f4bbfd8ec74f8ef482ee7f1cff",
|
||||
"semantic_hash": "d550a6f4bbfd8ec74f8ef482ee7f1cff"
|
||||
},
|
||||
"admin_panel/views.py": {
|
||||
"mtime": 1787304201.392812,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "40c436a0d14e9ca9dd798fd6ffc2ba7b",
|
||||
"semantic_hash": "40c436a0d14e9ca9dd798fd6ffc2ba7b"
|
||||
},
|
||||
"check_finance.py": {
|
||||
"mtime": 1786878923.269553,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "75f1e60011aa238abef8ba028761d97f",
|
||||
"semantic_hash": "75f1e60011aa238abef8ba028761d97f"
|
||||
},
|
||||
"entrypoint.sh": {
|
||||
"mtime": 1782246266.1269526,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "f06f9179baa5071b374895438cc05176",
|
||||
"semantic_hash": "f06f9179baa5071b374895438cc05176"
|
||||
},
|
||||
"ghost_hunter.py": {
|
||||
"mtime": 1786881510.522436,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "51f0a2e2323df5d9e444aad5a2883ee5",
|
||||
"semantic_hash": "51f0a2e2323df5d9e444aad5a2883ee5"
|
||||
},
|
||||
"khatibi/__init__.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "d41d8cd98f00b204e9800998ecf8427e",
|
||||
"semantic_hash": "d41d8cd98f00b204e9800998ecf8427e"
|
||||
},
|
||||
"khatibi/asgi.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "b4e49af22c6a30c16299cb82ab55df6d",
|
||||
"semantic_hash": "b4e49af22c6a30c16299cb82ab55df6d"
|
||||
},
|
||||
"khatibi/production_settings.py": {
|
||||
"mtime": 1782245208.734714,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "73a68e0d30f37dc4fbdad316c02b5fc4",
|
||||
"semantic_hash": "73a68e0d30f37dc4fbdad316c02b5fc4"
|
||||
},
|
||||
"khatibi/settings.py": {
|
||||
"mtime": 1782309009.7845018,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "bf91e375449195bc3d958a6c51266d7f",
|
||||
"semantic_hash": "bf91e375449195bc3d958a6c51266d7f"
|
||||
},
|
||||
"khatibi/urls.py": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "c84a36287ab919a7c7af7665f7f74fe7",
|
||||
"semantic_hash": "c84a36287ab919a7c7af7665f7f74fe7"
|
||||
},
|
||||
"khatibi/wsgi.py": {
|
||||
"mtime": 1708013917.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "3201b17eab76f3e248ee368647070e4c",
|
||||
"semantic_hash": "3201b17eab76f3e248ee368647070e4c"
|
||||
},
|
||||
"manage.py": {
|
||||
"mtime": 1708013913.0,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "f2880415f68590c74305913ff0f025f3",
|
||||
"semantic_hash": "f2880415f68590c74305913ff0f025f3"
|
||||
},
|
||||
"reconciliation_tool.py": {
|
||||
"mtime": 1786880527.1578598,
|
||||
"seen": 1791552045.91651,
|
||||
"ast_hash": "29c3e16d73d00a9f3f09692194be3b18",
|
||||
"semantic_hash": "29c3e16d73d00a9f3f09692194be3b18"
|
||||
},
|
||||
".github/copilot-instructions.md": {
|
||||
"mtime": 1791551555.5196745,
|
||||
"seen": 1791553187.9024515,
|
||||
"ast_hash": "2b23503628bf2ec71d067a85ca8948ab",
|
||||
"semantic_hash": "2b23503628bf2ec71d067a85ca8948ab"
|
||||
},
|
||||
"GEMINI.md": {
|
||||
"mtime": 1791551505.4181063,
|
||||
"seen": 1791552251.327148,
|
||||
"ast_hash": "82efb97a359f5c7290bf2513d14686be",
|
||||
"semantic_hash": "82efb97a359f5c7290bf2513d14686be"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/ActionList.html": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552251.327148,
|
||||
"ast_hash": "4ba55e04b37e585d96f0d628c695d228",
|
||||
"semantic_hash": "4ba55e04b37e585d96f0d628c695d228"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/base.html": {
|
||||
"mtime": 1787305605.0913658,
|
||||
"seen": 1791552251.327148,
|
||||
"ast_hash": "3062a4756b2649b3b24a52e5972163d2",
|
||||
"semantic_hash": "3062a4756b2649b3b24a52e5972163d2"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/baseHesabdari.html": {
|
||||
"mtime": 1703841590.0,
|
||||
"seen": 1791553187.9024515,
|
||||
"ast_hash": "47b9ea8bc69fc1731d0dbe267f1ed433",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"admin_panel/templates/admin_panel/baseStore.html": {
|
||||
"mtime": 1783083554.0144844,
|
||||
"seen": 1791553187.9024515,
|
||||
"ast_hash": "d2fe6f58a7303c1874ebe08af1e50564",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"admin_panel/templates/admin_panel/bedehi.html": {
|
||||
"mtime": 1703843184.0,
|
||||
"seen": 1791553187.9024515,
|
||||
"ast_hash": "642f82c9f9c217c83acb79185b9439da",
|
||||
"semantic_hash": "642f82c9f9c217c83acb79185b9439da"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/bedehiBK.html": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791553187.9024515,
|
||||
"ast_hash": "9f714287989d56c19bc1fc28a08cd89d",
|
||||
"semantic_hash": "9f714287989d56c19bc1fc28a08cd89d"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/customerAction.html": {
|
||||
"mtime": 1784913239.8701046,
|
||||
"seen": 1791553187.9024515,
|
||||
"ast_hash": "bb1af41ef956a5e2f30b1266c70a30ee",
|
||||
"semantic_hash": "bb1af41ef956a5e2f30b1266c70a30ee"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/customerActionInc.html": {
|
||||
"mtime": 1784913846.5075295,
|
||||
"seen": 1791552251.327148,
|
||||
"ast_hash": "3232cbf82efe94504f69735791ca5cf4",
|
||||
"semantic_hash": "3232cbf82efe94504f69735791ca5cf4"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/customerBase.html": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791553187.9024515,
|
||||
"ast_hash": "2724fa49985d8c8fa76ddf5c31b64054",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"admin_panel/templates/admin_panel/customerBaseNew.html": {
|
||||
"mtime": 1786558511.2232144,
|
||||
"seen": 1791552251.327148,
|
||||
"ast_hash": "1684b269805012f620bcd90f90572203",
|
||||
"semantic_hash": "1684b269805012f620bcd90f90572203"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/customerFactor.html": {
|
||||
"mtime": 1782399903.8791773,
|
||||
"seen": 1791552251.327148,
|
||||
"ast_hash": "23cc139c4d246a9640220cc1f42a1bd1",
|
||||
"semantic_hash": "23cc139c4d246a9640220cc1f42a1bd1"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/customerFactorBackup.html": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791553187.9034579,
|
||||
"ast_hash": "ff7615faae4df99564cf85d3212a93da",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"admin_panel/templates/admin_panel/customerHesabDari.html": {
|
||||
"mtime": 1708533891.0,
|
||||
"seen": 1791552251.327148,
|
||||
"ast_hash": "2d7c82b08780f0915a1dc145db522cd5",
|
||||
"semantic_hash": "2d7c82b08780f0915a1dc145db522cd5"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/customerID.html": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791553187.9034579,
|
||||
"ast_hash": "52739e2559c60cad69fb7efaf65e2dd3",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"admin_panel/templates/admin_panel/customerIDBackup.html": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791553187.9034579,
|
||||
"ast_hash": "c6646ddb883c9f85033d9e9d3fb54af2",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"admin_panel/templates/admin_panel/customerIDFactor.html": {
|
||||
"mtime": 1784392254.4440935,
|
||||
"seen": 1791552251.327148,
|
||||
"ast_hash": "2c0c3fb300c440860d3f1dd8a6181af1",
|
||||
"semantic_hash": "2c0c3fb300c440860d3f1dd8a6181af1"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/customerIDFactorBackup.html": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791553187.9034579,
|
||||
"ast_hash": "d04aff45b81af659d92173536cbc224f",
|
||||
"semantic_hash": "d04aff45b81af659d92173536cbc224f"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/customerNew.html": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552251.327148,
|
||||
"ast_hash": "6eec9291fd4f6bce96e553f9e7352e44",
|
||||
"semantic_hash": "6eec9291fd4f6bce96e553f9e7352e44"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/customerNew2.html": {
|
||||
"mtime": 1712320283.0,
|
||||
"seen": 1791552251.327148,
|
||||
"ast_hash": "47fa6edfc3228d414f22e1a8f3ae4a7a",
|
||||
"semantic_hash": "47fa6edfc3228d414f22e1a8f3ae4a7a"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/customerNewBackup.html": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791553187.9034579,
|
||||
"ast_hash": "6f281fc25edb4c2822b6a058e4049655",
|
||||
"semantic_hash": "6f281fc25edb4c2822b6a058e4049655"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/customerRezayat.html": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552251.327148,
|
||||
"ast_hash": "4e954f6dd0f4ed95656c457fd4399cdd",
|
||||
"semantic_hash": "4e954f6dd0f4ed95656c457fd4399cdd"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/customerRezayatinc.html": {
|
||||
"mtime": 1784916750.5503716,
|
||||
"seen": 1791552251.327148,
|
||||
"ast_hash": "033adb9aa1873c64ac7bf495cdef7cf5",
|
||||
"semantic_hash": "033adb9aa1873c64ac7bf495cdef7cf5"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/customerSarresid.html": {
|
||||
"mtime": 1786557950.072763,
|
||||
"seen": 1791552251.327148,
|
||||
"ast_hash": "dd92347d0f721008570850177989b927",
|
||||
"semantic_hash": "dd92347d0f721008570850177989b927"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/customer/customerNazarInc.html": {
|
||||
"mtime": 1707672379.0,
|
||||
"seen": 1791552251.327148,
|
||||
"ast_hash": "7687f61651a191ba38a3a7fbc0fa4eea",
|
||||
"semantic_hash": "7687f61651a191ba38a3a7fbc0fa4eea"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/customer/nazar.html": {
|
||||
"mtime": 1707669675.0,
|
||||
"seen": 1791552251.327148,
|
||||
"ast_hash": "1cb1e5086a0f291b86437f03af835407",
|
||||
"semantic_hash": "1cb1e5086a0f291b86437f03af835407"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/customers.html": {
|
||||
"mtime": 1784142973.2160225,
|
||||
"seen": 1791552251.327148,
|
||||
"ast_hash": "77809af7284de3bdacce2e6bb27dccf5",
|
||||
"semantic_hash": "77809af7284de3bdacce2e6bb27dccf5"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/customersBK.html": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791553187.904458,
|
||||
"ast_hash": "c3912ead765eb7b5ada5634b70ebc644",
|
||||
"semantic_hash": "c3912ead765eb7b5ada5634b70ebc644"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/entezar.html": {
|
||||
"mtime": 1708088349.0,
|
||||
"seen": 1791553187.904458,
|
||||
"ast_hash": "808fd766dd0d0abec11bfcccd57dcee2",
|
||||
"semantic_hash": "808fd766dd0d0abec11bfcccd57dcee2"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/entezarBK.html": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791553187.904458,
|
||||
"ast_hash": "09796b3916f635c6bc2a5aa3d2df108f",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"admin_panel/templates/admin_panel/financial_dashboard.html": {
|
||||
"mtime": 1786882219.7287638,
|
||||
"seen": 1791552251.327148,
|
||||
"ast_hash": "d0782d6533e6b105ff1cd837d3b73108",
|
||||
"semantic_hash": "d0782d6533e6b105ff1cd837d3b73108"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/hesabdari.html": {
|
||||
"mtime": 1786553421.551038,
|
||||
"seen": 1791552251.327148,
|
||||
"ast_hash": "9a44f015176e20e333a42321701b3575",
|
||||
"semantic_hash": "9a44f015176e20e333a42321701b3575"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/hesabdariCheckPass.html": {
|
||||
"mtime": 1707470201.0,
|
||||
"seen": 1791553187.905458,
|
||||
"ast_hash": "4f41af8d09e60f2eb1b4db77c5a2ec11",
|
||||
"semantic_hash": "4f41af8d09e60f2eb1b4db77c5a2ec11"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/hesabdariCheckPassFail.html": {
|
||||
"mtime": 1707470341.0,
|
||||
"seen": 1791553187.905458,
|
||||
"ast_hash": "c83c6a1ab4af819947dda04360ba42b4",
|
||||
"semantic_hash": "c83c6a1ab4af819947dda04360ba42b4"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/hesabdariResidNashode.html": {
|
||||
"mtime": 1703840323.0,
|
||||
"seen": 1791553187.905458,
|
||||
"ast_hash": "fec700cfae2a2f99fc20d8e1d4f20aab",
|
||||
"semantic_hash": "fec700cfae2a2f99fc20d8e1d4f20aab"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/index.html": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791553187.905458,
|
||||
"ast_hash": "ead4632d75560f5fc6ab13c6fe0bd33c",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"admin_panel/templates/admin_panel/login.html": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791553187.905458,
|
||||
"ast_hash": "297f4c4a04f98fa223796ca4482dfbbe",
|
||||
"semantic_hash": "297f4c4a04f98fa223796ca4482dfbbe"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/newOperation.html": {
|
||||
"mtime": 1783251875.7455926,
|
||||
"seen": 1791552251.327148,
|
||||
"ast_hash": "9fd1d5148c0121c47d07e4e1346a32ff",
|
||||
"semantic_hash": "9fd1d5148c0121c47d07e4e1346a32ff"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/operations.html": {
|
||||
"mtime": 1782127647.8900125,
|
||||
"seen": 1791552251.327148,
|
||||
"ast_hash": "3199582c3342413eeb8b8a5cf5fb879a",
|
||||
"semantic_hash": "3199582c3342413eeb8b8a5cf5fb879a"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/operationsBK.html": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552251.327148,
|
||||
"ast_hash": "fa2ab834231c3ff3f7500431b74978f4",
|
||||
"semantic_hash": "fa2ab834231c3ff3f7500431b74978f4"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/report.html": {
|
||||
"mtime": 1712328717.0,
|
||||
"seen": 1791552251.327148,
|
||||
"ast_hash": "cc8bbc00a3ec2bf85b67b42d8d48a6aa",
|
||||
"semantic_hash": "cc8bbc00a3ec2bf85b67b42d8d48a6aa"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/reportCheckNesiye.html": {
|
||||
"mtime": 1712328596.0,
|
||||
"seen": 1791552251.327148,
|
||||
"ast_hash": "213c083816f68261bbc926124e6c67ad",
|
||||
"semantic_hash": "213c083816f68261bbc926124e6c67ad"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/report_debtors_no_vosol.html": {
|
||||
"mtime": 1787304395.4691105,
|
||||
"seen": 1791552251.327148,
|
||||
"ast_hash": "fef97825343ad1b8acda81df48a9540e",
|
||||
"semantic_hash": "fef97825343ad1b8acda81df48a9540e"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/report_inventory_movements.html": {
|
||||
"mtime": 1782459887.7241113,
|
||||
"seen": 1791552251.327148,
|
||||
"ast_hash": "6b1591c8e2d96ca73e38c55be001cbd4",
|
||||
"semantic_hash": "6b1591c8e2d96ca73e38c55be001cbd4"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/report_rezayat.html": {
|
||||
"mtime": 1784918413.9920633,
|
||||
"seen": 1791552251.327148,
|
||||
"ast_hash": "96e967c44debbabf2ee8c630cd371a23",
|
||||
"semantic_hash": "96e967c44debbabf2ee8c630cd371a23"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/rezayat.html": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552476.826179,
|
||||
"ast_hash": "df2df73cb519f7915d7f656e46ced406",
|
||||
"semantic_hash": "df2df73cb519f7915d7f656e46ced406"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/store.html": {
|
||||
"mtime": 1783252370.4796727,
|
||||
"seen": 1791552251.327148,
|
||||
"ast_hash": "95e5186068796e24b2635441089dacb5",
|
||||
"semantic_hash": "95e5186068796e24b2635441089dacb5"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/storeBK1.html": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791553187.906458,
|
||||
"ast_hash": "79e507d05c12c39715fc90cf0d8b891d",
|
||||
"semantic_hash": "79e507d05c12c39715fc90cf0d8b891d"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/store_transfers.html": {
|
||||
"mtime": 1783083492.176341,
|
||||
"seen": 1791552251.327148,
|
||||
"ast_hash": "9a02fb0648ea6d8cc7ff73647c173a46",
|
||||
"semantic_hash": "9a02fb0648ea6d8cc7ff73647c173a46"
|
||||
},
|
||||
"admin_panel/templates/admin_panel/stores.html": {
|
||||
"mtime": 1650778147.0,
|
||||
"seen": 1791552251.327148,
|
||||
"ast_hash": "40dcac5b8cdbaf25efa63e4a9680d4ad",
|
||||
"semantic_hash": "40dcac5b8cdbaf25efa63e4a9680d4ad"
|
||||
},
|
||||
"requirements.txt": {
|
||||
"mtime": 1787308505.3543158,
|
||||
"seen": 1791552251.327148,
|
||||
"ast_hash": "4988f4d0e1372076211a9b5ae632ab2d",
|
||||
"semantic_hash": "4988f4d0e1372076211a9b5ae632ab2d"
|
||||
},
|
||||
"requirements2.txt": {
|
||||
"mtime": 1654964543.0,
|
||||
"seen": 1791552476.826179,
|
||||
"ast_hash": "b68cf8783499ded7f16a7da13f974f7b",
|
||||
"semantic_hash": "b68cf8783499ded7f16a7da13f974f7b"
|
||||
}
|
||||
}
|
||||
+263
@@ -0,0 +1,263 @@
|
||||
"""Create a safe, deterministic project tree snapshot.
|
||||
|
||||
Usage:
|
||||
python project_tree.py [--path PATH] [--output FILE] [--depth N]
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import os
|
||||
import sys
|
||||
from dataclasses import dataclass
|
||||
from datetime import datetime, timezone
|
||||
from pathlib import Path
|
||||
from typing import TextIO
|
||||
|
||||
|
||||
DEFAULT_DEPTH = 6
|
||||
DEFAULT_OUTPUT = "PROJECT_TREE.txt"
|
||||
|
||||
EXCLUDED_DIRECTORIES = frozenset(
|
||||
{
|
||||
".git",
|
||||
"__pycache__",
|
||||
".venv",
|
||||
"venv",
|
||||
"env",
|
||||
"node_modules",
|
||||
"dist",
|
||||
"build",
|
||||
"staticfiles",
|
||||
"media",
|
||||
".cache",
|
||||
".pytest_cache",
|
||||
".mypy_cache",
|
||||
".ruff_cache",
|
||||
".coverage",
|
||||
"htmlcov",
|
||||
}
|
||||
)
|
||||
EXCLUDED_FILE_NAMES = frozenset({".coverage"})
|
||||
EXCLUDED_FILE_SUFFIXES = (".pyc", ".pyo", ".log", ".tmp", ".temp", ".cache")
|
||||
DJANGO_FILE_NAMES = frozenset(
|
||||
{
|
||||
"manage.py",
|
||||
"settings.py",
|
||||
"urls.py",
|
||||
"models.py",
|
||||
"views.py",
|
||||
"admin.py",
|
||||
"apps.py",
|
||||
"serializers.py",
|
||||
"forms.py",
|
||||
"signals.py",
|
||||
"tasks.py",
|
||||
"permissions.py",
|
||||
"middleware.py",
|
||||
}
|
||||
)
|
||||
JAVASCRIPT_TYPESCRIPT_SUFFIXES = frozenset(
|
||||
{".js", ".jsx", ".mjs", ".cjs", ".ts", ".tsx", ".mts", ".cts"}
|
||||
)
|
||||
|
||||
|
||||
@dataclass
|
||||
class Counts:
|
||||
"""Counters for entries included in the rendered snapshot."""
|
||||
|
||||
python_files: int = 0
|
||||
django_files: int = 0
|
||||
javascript_typescript_files: int = 0
|
||||
html_files: int = 0
|
||||
total_files: int = 0
|
||||
total_directories: int = 0
|
||||
|
||||
def add_file(self, name: str) -> None:
|
||||
suffix = Path(name).suffix.casefold()
|
||||
folded_name = name.casefold()
|
||||
self.total_files += 1
|
||||
if suffix == ".py":
|
||||
self.python_files += 1
|
||||
if folded_name in DJANGO_FILE_NAMES:
|
||||
self.django_files += 1
|
||||
if suffix in JAVASCRIPT_TYPESCRIPT_SUFFIXES:
|
||||
self.javascript_typescript_files += 1
|
||||
if suffix in {".html", ".htm"}:
|
||||
self.html_files += 1
|
||||
|
||||
|
||||
def warn(message: str) -> None:
|
||||
"""Emit a concise warning without aborting the traversal."""
|
||||
|
||||
print(f"Warning: {message}", file=sys.stderr)
|
||||
|
||||
|
||||
def normalized_path(path: Path) -> str:
|
||||
"""Return a normalized absolute path without requiring it to exist."""
|
||||
|
||||
return os.path.normcase(os.path.abspath(os.fspath(path)))
|
||||
|
||||
|
||||
def is_excluded_file(name: str) -> bool:
|
||||
folded_name = name.casefold()
|
||||
return folded_name in EXCLUDED_FILE_NAMES or folded_name.endswith(
|
||||
EXCLUDED_FILE_SUFFIXES
|
||||
)
|
||||
|
||||
|
||||
def sorted_entries(directory: Path) -> tuple[list[os.DirEntry[str]], list[os.DirEntry[str]]]:
|
||||
"""Scan one directory, pruning excluded directories before recursion."""
|
||||
|
||||
directories: list[os.DirEntry[str]] = []
|
||||
files: list[os.DirEntry[str]] = []
|
||||
try:
|
||||
with os.scandir(directory) as iterator:
|
||||
for entry in iterator:
|
||||
try:
|
||||
if entry.is_symlink():
|
||||
warn(f"skipping symlink: {entry.path}")
|
||||
continue
|
||||
if entry.is_dir(follow_symlinks=False):
|
||||
if entry.name.casefold() not in EXCLUDED_DIRECTORIES:
|
||||
directories.append(entry)
|
||||
elif entry.is_file(follow_symlinks=False):
|
||||
if not is_excluded_file(entry.name):
|
||||
files.append(entry)
|
||||
except (OSError, ValueError) as error:
|
||||
warn(f"skipping inaccessible entry {entry.path!r}: {error}")
|
||||
except (OSError, ValueError) as error:
|
||||
warn(f"cannot scan directory {os.fspath(directory)!r}: {error}")
|
||||
|
||||
sort_key = lambda entry: (entry.name.casefold(), entry.name)
|
||||
directories.sort(key=sort_key)
|
||||
files.sort(key=sort_key)
|
||||
return directories, files
|
||||
|
||||
|
||||
def write_tree(
|
||||
output: TextIO,
|
||||
root: Path,
|
||||
max_depth: int,
|
||||
output_path: Path,
|
||||
counts: Counts,
|
||||
) -> None:
|
||||
"""Write the tree depth-first while retaining only one directory level."""
|
||||
|
||||
output_identity = normalized_path(output_path)
|
||||
output.write(f"{root.name or os.fspath(root)}\n")
|
||||
|
||||
def visit(directory: Path, depth: int, prefix: str) -> None:
|
||||
if depth >= max_depth:
|
||||
return
|
||||
|
||||
directories, files = sorted_entries(directory)
|
||||
visible_files = [
|
||||
entry for entry in files if normalized_path(Path(entry.path)) != output_identity
|
||||
]
|
||||
entries: list[tuple[os.DirEntry[str], bool]] = [
|
||||
(entry, True) for entry in directories
|
||||
] + [(entry, False) for entry in visible_files]
|
||||
|
||||
for index, (entry, is_directory) in enumerate(entries):
|
||||
is_last = index == len(entries) - 1
|
||||
output.write(f"{prefix}{'└──' if is_last else '├──'} {entry.name}\n")
|
||||
if is_directory:
|
||||
counts.total_directories += 1
|
||||
child_prefix = prefix + (" " if is_last else "│ ")
|
||||
visit(Path(entry.path), depth + 1, child_prefix)
|
||||
else:
|
||||
counts.add_file(entry.name)
|
||||
|
||||
visit(root, 0, "")
|
||||
|
||||
|
||||
def format_header(root: Path, generated_at: datetime, counts: Counts) -> str:
|
||||
"""Build a fixed-width header so it can be updated after streaming the tree."""
|
||||
|
||||
fields = (
|
||||
("Project Root", root.name or "."),
|
||||
("Generated At", generated_at.isoformat(timespec="seconds")),
|
||||
("Python Files", str(counts.python_files)),
|
||||
("Django Files", str(counts.django_files)),
|
||||
("JavaScript/TypeScript Files", str(counts.javascript_typescript_files)),
|
||||
("HTML Files", str(counts.html_files)),
|
||||
("Total Files", str(counts.total_files)),
|
||||
("Total Directories", str(counts.total_directories)),
|
||||
)
|
||||
return "".join(f"{label}: {value:<80}\n" for label, value in fields) + "\n"
|
||||
|
||||
|
||||
def generate_snapshot(root: Path, output_path: Path, max_depth: int) -> Counts:
|
||||
"""Create the requested output file; all other filesystem access is read-only."""
|
||||
|
||||
if output_path.is_symlink():
|
||||
raise ValueError(f"refusing to overwrite symlink output: {output_path}")
|
||||
|
||||
counts = Counts()
|
||||
generated_at = datetime.now(timezone.utc)
|
||||
placeholder_header = format_header(root, generated_at, counts)
|
||||
if not output_path.parent.is_dir():
|
||||
raise ValueError(f"output directory does not exist: {output_path.parent}")
|
||||
|
||||
with output_path.open("w+", encoding="utf-8", newline="\n") as output:
|
||||
output.write(placeholder_header)
|
||||
write_tree(output, root, max_depth, output_path, counts)
|
||||
final_header = format_header(root, generated_at, counts)
|
||||
if len(final_header) != len(placeholder_header):
|
||||
raise RuntimeError("internal error: snapshot header size changed")
|
||||
output.seek(0)
|
||||
output.write(final_header)
|
||||
return counts
|
||||
|
||||
|
||||
def non_negative_integer(value: str) -> int:
|
||||
try:
|
||||
number = int(value)
|
||||
except ValueError as error:
|
||||
raise argparse.ArgumentTypeError("depth must be an integer") from error
|
||||
if number < 0:
|
||||
raise argparse.ArgumentTypeError("depth must be zero or greater")
|
||||
return number
|
||||
|
||||
|
||||
def parse_args(argv: list[str] | None = None) -> argparse.Namespace:
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Create a deterministic, AI-friendly project tree snapshot."
|
||||
)
|
||||
parser.add_argument("--path", type=Path, default=Path.cwd(), help="project root")
|
||||
parser.add_argument(
|
||||
"--output", type=Path, default=Path(DEFAULT_OUTPUT), help="snapshot output file"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--depth",
|
||||
type=non_negative_integer,
|
||||
default=DEFAULT_DEPTH,
|
||||
help=f"maximum tree depth (default: {DEFAULT_DEPTH})",
|
||||
)
|
||||
return parser.parse_args(argv)
|
||||
|
||||
|
||||
def main(argv: list[str] | None = None) -> int:
|
||||
args = parse_args(argv)
|
||||
root = args.path.expanduser()
|
||||
output_path = args.output.expanduser()
|
||||
|
||||
try:
|
||||
if root.is_symlink():
|
||||
raise ValueError(f"project root must not be a symlink: {root}")
|
||||
root = root.resolve(strict=True)
|
||||
if not root.is_dir():
|
||||
raise ValueError(f"project root is not a directory: {root}")
|
||||
output_path = Path(os.path.abspath(os.fspath(output_path)))
|
||||
generate_snapshot(root, output_path, args.depth)
|
||||
except (OSError, ValueError, RuntimeError) as error:
|
||||
print(f"Error: {error}", file=sys.stderr)
|
||||
return 1
|
||||
|
||||
print(f"Project tree written to {output_path}")
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
Reference in new issue
Block a user