in doc-architect/doc-architect-core/src/main/java/com/docarchitect/core/scanner/impl/python/DjangoOrmScanner.java [365:420]
private FallbackParsingStrategy<EntityResult> createFallbackStrategy() {
return (file, content) -> {
List<EntityResult> results = new ArrayList<>();
// Check if file contains Django patterns
if (!content.contains("class ") || !content.contains("models.")) {
return results;
}
// Simple regex-based extraction for basic Django models
java.util.regex.Pattern classPattern = java.util.regex.Pattern.compile(
"class\\s+(\\w+)\\s*\\([^)]*models\\.Model[^)]*\\):"
);
java.util.regex.Matcher classMatcher = classPattern.matcher(content);
while (classMatcher.find()) {
String className = classMatcher.group(1);
String tableName = toSnakeCase(className);
// Extract simple fields using regex
List<DataEntity.Field> fields = new ArrayList<>();
// Add default id field
fields.add(new DataEntity.Field(DEFAULT_PRIMARY_KEY, FIELD_AUTO, false, null));
// Simple field pattern: field_name = models.SomeField(...)
java.util.regex.Pattern fieldPattern = java.util.regex.Pattern.compile(
"(\\w+)\\s*=\\s*models\\.(\\w+Field)\\("
);
java.util.regex.Matcher fieldMatcher = fieldPattern.matcher(content);
while (fieldMatcher.find()) {
String fieldName = fieldMatcher.group(1);
String fieldType = fieldMatcher.group(2);
if (!fieldName.startsWith("_")) {
String sqlType = mapDjangoFieldToSql(fieldType);
fields.add(new DataEntity.Field(fieldName, sqlType, true, null));
}
}
if (!fields.isEmpty()) {
DataEntity entity = new DataEntity(
className,
tableName,
ENTITY_TYPE_TABLE,
fields,
DEFAULT_PRIMARY_KEY,
"Django Model: " + className
);
results.add(new EntityResult(entity, List.of()));
log.debug("Fallback parsing found entity: {} -> {}", className, tableName);
}
}
return results;
};
}