irongit

A simpler way to view django projects

able to see all models and fields!

huncholanehuncholaneauthored
parent e5d51a9commit c689498007c97c9f24e9a783d5b27729b6c30cb4Browse files

2 files changed, +73 -30

+12-12src/project.ts
@@ -8,28 +8,28 @@ import * as vscode from "vscode";
88
99 const readFile = promisify(fs.readFile);
1010
11-type Field = {
11+export type Field = {
1212 name: string;
1313 type: string;
1414 index: number;
1515 raw: string;
1616 };
1717
18-type Model = {
18+export type Model = {
1919 name: string;
2020 index: number;
21- fields: Field[];
21+ fields: Map<string, Field>;
2222 };
2323
24-class App {
24+export class App {
2525 name: string;
2626 module: string;
2727 path: string;
28- models: Model[];
28+ models: Map<string, Model>;
2929
3030 constructor(module: string) {
3131 this.module = module;
32- this.models = [];
32+ this.models = new Map();
3333 let name = module.split(".").pop();
3434 const pythonPath =
3535 vscode.workspace.getConfiguration("python").get("pythonPath") ||
@@ -62,7 +62,7 @@ if spec is not None and spec.origin is not None:
6262 const model: Model = {
6363 name: modelMatch[1],
6464 index: modelMatch.index || 0,
65- fields: [],
65+ fields: new Map(),
6666 };
6767 const fields = modelMatch[2].matchAll(regex.modelField);
6868 for (const fieldMatch of fields) {
@@ -72,9 +72,9 @@ if spec is not None and spec.origin is not None:
7272 index: fieldMatch.index || 0,
7373 raw: fieldMatch[0],
7474 };
75- model.fields.push(field);
75+ model.fields.set(field.name, field);
7676 }
77- this.models.push(model);
77+ this.models.set(model.name, model);
7878 }
7979 } catch (err) {
8080 // throw new Error(`Error reading models.py for app ${this.name}`);
@@ -85,11 +85,11 @@ if spec is not None and spec.origin is not None:
8585 export default class DjangoProject {
8686 projectDir: string;
8787 name?: string;
88- apps: App[];
88+ apps: Map<string, App>;
8989
9090 constructor(rootDir: string) {
9191 this.projectDir = rootDir;
92- this.apps = [];
92+ this.apps = new Map();
9393 }
9494
9595 async read() {
@@ -118,7 +118,7 @@ export default class DjangoProject {
118118 const apps = appContainer.matchAll(regex.module);
119119 for (const app of apps ? apps : []) {
120120 try {
121- this.apps.push(new App(app[1]));
121+ this.apps.set(app[1], new App(app[1]));
122122 } catch {}
123123 }
124124 }
+61-18src/providers/project.ts
@@ -1,5 +1,5 @@
11 import * as vscode from "vscode";
2-import DjangoProject from "../project";
2+import DjangoProject, { Model } from "../project";
33
44 export default class ProjectDataProvider
55 implements vscode.TreeDataProvider<vscode.TreeItem>
@@ -19,31 +19,74 @@ export default class ProjectDataProvider
1919 }
2020
2121 getChildren(element?: vscode.TreeItem): Thenable<vscode.TreeItem[]> {
22+ if (!this.project) {
23+ return Promise.resolve([]);
24+ }
2225 if (element === undefined) {
23- // Return the root items
24- return Promise.resolve([this.createModelsTreeItem()]);
25- } else if (element.contextValue === "models") {
26- if (!this.project) {
27- return Promise.resolve([]);
26+ const items = [];
27+ for (const [app_name, app] of this.project.apps.entries()) {
28+ items.push(this.createAppTreeItem(app_name));
29+ }
30+ return Promise.resolve(items);
31+ } else if (element.contextValue?.includes("-app")) {
32+ const appName = element.contextValue.split("-")[0];
33+ return Promise.resolve([this.createModelsTreeItem(appName)]);
34+ } else if (element.contextValue?.includes("-models")) {
35+ const appName = element.contextValue.split("-")[0];
36+ const app = this.project.apps.get(appName);
37+ const items = [];
38+ if (app) {
39+ for (const [modelName, model] of app.models) {
40+ items.push(this.createModelTreeItem(appName, model));
41+ }
2842 }
29- const models = this.project.apps.flatMap((app) => app.models);
30- return Promise.resolve(
31- models.map((model) => new vscode.TreeItem(model.name))
32- );
33- } else {
34- // Return the child items for the given parent item
35- return Promise.resolve([
36- new vscode.TreeItem("Subitem 2"),
37- new vscode.TreeItem("Subitem 3"),
38- ]);
43+ return Promise.resolve(items);
44+ } else if (element.contextValue?.includes("-model")) {
45+ console.log(`Getting fields for ${element.label}`);
46+ const appName = element.contextValue.split("-")[0];
47+ const modelName = element.contextValue.split("-")[1];
48+ const app = this.project.apps.get(appName);
49+ const model = app?.models.get(modelName);
50+ console.log(model);
51+ const items = [];
52+ if (model) {
53+ for (const [fieldName, field] of model.fields) {
54+ items.push(this.createFieldTreeItem(appName, modelName, field));
55+ }
56+ }
57+ return Promise.resolve(items);
3958 }
59+ return Promise.resolve([]);
60+ }
61+
62+ private createFieldTreeItem(appName: string, modelName: string, field: any) {
63+ const treeItem = new vscode.TreeItem(field.name);
64+ treeItem.contextValue = `${appName}-${modelName}-${field.name}-field`;
65+ treeItem.iconPath = new vscode.ThemeIcon("symbol-field");
66+ return treeItem;
67+ }
68+
69+ private createModelTreeItem(appName: string, model: Model) {
70+ const treeItem = new vscode.TreeItem(model.name);
71+ treeItem.contextValue = `${appName}-${model.name}-model`;
72+ treeItem.collapsibleState = vscode.TreeItemCollapsibleState.Collapsed;
73+ treeItem.iconPath = new vscode.ThemeIcon("symbol-class");
74+ return treeItem;
4075 }
4176
42- private createModelsTreeItem(): vscode.TreeItem {
77+ private createModelsTreeItem(appName: string): vscode.TreeItem {
4378 const treeItem = new vscode.TreeItem("Models");
44- treeItem.contextValue = "models";
79+ treeItem.contextValue = `${appName}-models`;
4580 treeItem.collapsibleState = vscode.TreeItemCollapsibleState.Collapsed;
4681 treeItem.iconPath = new vscode.ThemeIcon("database");
4782 return treeItem;
4883 }
84+
85+ private createAppTreeItem(appName: string): vscode.TreeItem {
86+ const treeItem = new vscode.TreeItem(appName);
87+ treeItem.contextValue = `${appName}-app`;
88+ treeItem.collapsibleState = vscode.TreeItemCollapsibleState.Collapsed;
89+ treeItem.iconPath = new vscode.ThemeIcon("project");
90+ return treeItem;
91+ }
4992 }