# XML name normalization via `sanitize_field_identifier`

## Summary

XML element/attribute names are now normalized using a shared utility `sanitize_field_identifier` to produce safe Django field identifiers. This consolidates logic and improves handling of CamelCase and separator variants.

## Behavior

- Converts CamelCase/mixedCase to snake_case.
- Replaces common namespace/punctuation separators (`:`, `.`, `-`, spaces) with `_`.
- Removes invalid characters and ensures a valid identifier (letter/underscore start, lowercase, collapsed underscores).

Examples:
- `creationTime` → `creation_time`
- `xlink:timestamp` → `xlink_timestamp`
- `time-stamp` → `time_stamp`

## Affected code

- `src/pydantic2django/django/models.py` — `_xml_name_to_django_field` now delegates to the sanitizer.
- `src/pydantic2django/xmlschema/ingestor.py` — uses sanitizer for name normalization.
- `src/pydantic2django/*/factory.py` — normalizes generated/ingested field names consistently.
- `src/pydantic2django/django/utils/naming.py` — shim delegates to core sanitizer.
- Core utility: `src/pydantic2django/core/utils/naming.py`.

## Impact

- More robust mapping from XML to Django fields.
- Enables reliable detection of timestamp aliases for Timescale ingestion.
- Backward compatible for typical inputs; improves edge-case handling without breaking existing names.
