private void parsePythonFile()

in doc-architect/doc-architect-core/src/main/java/com/docarchitect/core/scanner/impl/python/DjangoOrmScanner.java [426:508]


    private void parsePythonFile(Path file, List<DataEntity> dataEntities,
                                 List<Relationship> relationships) {
        List<PythonAst.PythonClass> classes = parseAstFile(file);

        for (PythonAst.PythonClass pythonClass : classes) {
            // Skip non-Django models
            if (!pythonClass.inheritsFrom(BASE_CLASS_MODELS_MODEL) &&
                !pythonClass.inheritsFrom(BASE_CLASS_MODEL)) {
                continue;
            }

            // Extract table name
            String tableName = extractTableName(pythonClass);

            // Extract fields and relationships
            List<DataEntity.Field> fields = new ArrayList<>();
            String primaryKey = null;

            for (PythonAst.Field field : pythonClass.fields()) {
                if (field.name().equals(META_CLASS_NAME) || field.name().startsWith("_")) {
                    continue;
                }

                // Check if this is a relationship field
                if (RELATIONSHIP_FIELDS.stream().anyMatch(rel -> field.type().contains(rel))) {
                    // Extract relationship
                    Relationship rel = extractRelationship(pythonClass.name(), field);
                    if (rel != null) {
                        relationships.add(rel);
                        log.debug("Found Django relationship: {} --[{}]--> {}",
                            pythonClass.name(), field.type(), rel.targetId());
                    }
                } else {
                    // Regular field
                    String sqlType = mapDjangoFieldToSql(field.type());
                    boolean nullable = isNullableField(field.value());
                    boolean isPrimaryKey = isPrimaryKeyField(field.value());

                    DataEntity.Field dataField = new DataEntity.Field(
                        field.name(),
                        sqlType,
                        nullable,
                        null
                    );

                    fields.add(dataField);

                    if (isPrimaryKey && primaryKey == null) {
                        primaryKey = field.name();
                    }

                    log.debug("Found Django field: {}.{} ({})", pythonClass.name(), field.name(), sqlType);
                }
            }

            // Django models always have an implicit 'id' primary key if not specified
            if (primaryKey == null) {
                primaryKey = DEFAULT_PRIMARY_KEY;
                DataEntity.Field idField = new DataEntity.Field(
                    DEFAULT_PRIMARY_KEY,
                    FIELD_AUTO,
                    false,
                    null
                );
                fields.add(0, idField);
            }

            // Create DataEntity
            if (!fields.isEmpty()) {
                DataEntity entity = new DataEntity(
                    pythonClass.name(),
                    tableName,
                    ENTITY_TYPE_TABLE,
                    fields,
                    primaryKey,
                    "Django Model: " + pythonClass.name()
                );

                dataEntities.add(entity);
                log.debug("Found Django model: {} -> table: {}", pythonClass.name(), tableName);
            }
        }
    }