Release Notes
Git Hash:
4600d7eaecf3e1a10139a378c75d8618519dc956
1. .githooks/post_commit.py - Auto-incrementing version system
- Changed get_version() to read from version.txt instead of release_data.json
- Now increments the last number in version tuple (0.0.0.5 → 0.0.0.6)
- Automatically writes incremented version back to version.txt
- Updated git hash from 7 to 8 characters
- Replaced hardcoded version mapping with dynamic version calculation
2. release_data.json - Updated git hashes
- Fixed git hashes to be 8 characters instead of 7
- Updated current git hash from e35744c to 9a94c432
- Updated all historical git hashes to proper 8-character format
3. templates/menu_bar/release_notes.html - Enhanced UI display
- Added version numbers to header display: "date - vX.X.X.X"
- Changed from short to full git hash display (40 characters)
- Added CSS for left-justified text
- Added bold formatting for headings and strong text
- Added |linebreaksbr filter for proper line break display
- Added version number in details section
New Files:
4. version.txt - Version control file
- Contains current version: 0.0.0.52
- You control this file manually, git increments automatically
Key Changes Summary:
- Auto-incrementing versions controlled by version.txt
- Full git hashes (40 chars) instead of short ones
- Enhanced release notes UI with versions and proper formatting
- Left-justified text and bold headings in release messages
- Changed get_version() to read from version.txt instead of release_data.json
- Now increments the last number in version tuple (0.0.0.5 → 0.0.0.6)
- Automatically writes incremented version back to version.txt
- Updated git hash from 7 to 8 characters
- Replaced hardcoded version mapping with dynamic version calculation
2. release_data.json - Updated git hashes
- Fixed git hashes to be 8 characters instead of 7
- Updated current git hash from e35744c to 9a94c432
- Updated all historical git hashes to proper 8-character format
3. templates/menu_bar/release_notes.html - Enhanced UI display
- Added version numbers to header display: "date - vX.X.X.X"
- Changed from short to full git hash display (40 characters)
- Added CSS for left-justified text
- Added bold formatting for headings and strong text
- Added |linebreaksbr filter for proper line break display
- Added version number in details section
New Files:
4. version.txt - Version control file
- Contains current version: 0.0.0.52
- You control this file manually, git increments automatically
Key Changes Summary:
- Auto-incrementing versions controlled by version.txt
- Full git hashes (40 chars) instead of short ones
- Enhanced release notes UI with versions and proper formatting
- Left-justified text and bold headings in release messages
Git Hash:
9a94c43273ad205f37ba9d03f0593916b820b6ce
🔧 Post-Commit Hook Enhancement (.githooks/post_commit.py)
Key Changes:
- Fixed commit message extraction: Changed from %H|%s|%ai (subject only) to %H|%ai + separate full
message lookup
- Added full message retrieval: Now uses git log -1 --pretty=format:%B to get complete commit
messages
- Updated version mapping: Incremented to start at v0.0.0.52 (latest) down to v0.0.0.48
Technical Details:
- git log --pretty=format:%H|%s|%ai # Only subject line
+ git log --pretty=format:%H|%ai # Hash and date
+ git log -1 --pretty=format:%B # Full commit message per commit
📊 Release Data Transformation (release_data.json)
Before: Only commit subject lines like "📊 Release Notes System Enhancement"
After: Complete detailed commit messages with:
- Full technical descriptions with bullet points and sections
- Comprehensive change lists with specific implementation details
- Emojis and formatting preserved from original commits
- Benefits and impact summaries
- File change counts and technical notes
Example transformation:
// BEFORE - Just subject
"message": "📊 Release Notes System Enhancement"
// AFTER - Full detailed message
"message": "📊 Release Notes System Enhancement\n\nEnhanced Release Notes Display & Data
Management\n\n- Updated release notes to show last 5 releases with collapsible sections\n- Fixed
release_data.json location: Moved from .githooks/ to project root for proper Django access\n- Added
historical release tracking with dates, commit messages, and git hashes..."
✅ Impact
Now the release notes page will show:
- Complete technical documentation for each release
- Professional formatting with emojis, bullet points, sections
- Comprehensive change descriptions instead of just titles
- Real commit data extracted directly from git history
- Proper version progression (0.0.0.52 → 0.0.0.48)
Key Changes:
- Fixed commit message extraction: Changed from %H|%s|%ai (subject only) to %H|%ai + separate full
message lookup
- Added full message retrieval: Now uses git log -1 --pretty=format:%B to get complete commit
messages
- Updated version mapping: Incremented to start at v0.0.0.52 (latest) down to v0.0.0.48
Technical Details:
- git log --pretty=format:%H|%s|%ai # Only subject line
+ git log --pretty=format:%H|%ai # Hash and date
+ git log -1 --pretty=format:%B # Full commit message per commit
📊 Release Data Transformation (release_data.json)
Before: Only commit subject lines like "📊 Release Notes System Enhancement"
After: Complete detailed commit messages with:
- Full technical descriptions with bullet points and sections
- Comprehensive change lists with specific implementation details
- Emojis and formatting preserved from original commits
- Benefits and impact summaries
- File change counts and technical notes
Example transformation:
// BEFORE - Just subject
"message": "📊 Release Notes System Enhancement"
// AFTER - Full detailed message
"message": "📊 Release Notes System Enhancement\n\nEnhanced Release Notes Display & Data
Management\n\n- Updated release notes to show last 5 releases with collapsible sections\n- Fixed
release_data.json location: Moved from .githooks/ to project root for proper Django access\n- Added
historical release tracking with dates, commit messages, and git hashes..."
✅ Impact
Now the release notes page will show:
- Complete technical documentation for each release
- Professional formatting with emojis, bullet points, sections
- Comprehensive change descriptions instead of just titles
- Real commit data extracted directly from git history
- Proper version progression (0.0.0.52 → 0.0.0.48)
Git Hash:
e35744c53750b8b2782a38f283567c53f43e6a8a
📋 Release Data Structure (release_data.json)
- New comprehensive format with:
- current_release: Latest release details
- releases: Array of last 5 releases with full git history
- Proper version progression (0.0.0.51 → 0.0.0.50 → 0.0.0.49 → 0.0.0.48 → 0.0.0.47)
- Real commit messages with emojis (📊, 🛠️, 🏗️)
- Formatted dates and git hashes
✅ Key Benefits
1. No more Unicode errors when starting Django web server
2. Automatic version management - no manual file updates needed
3. Complete release history - shows last 5 releases with full details
4. Cross-platform compatibility - works on both Windows and Linux
5. Single source of truth - everything in one JSON file
- New comprehensive format with:
- current_release: Latest release details
- releases: Array of last 5 releases with full git history
- Proper version progression (0.0.0.51 → 0.0.0.50 → 0.0.0.49 → 0.0.0.48 → 0.0.0.47)
- Real commit messages with emojis (📊, 🛠️, 🏗️)
- Formatted dates and git hashes
✅ Key Benefits
1. No more Unicode errors when starting Django web server
2. Automatic version management - no manual file updates needed
3. Complete release history - shows last 5 releases with full details
4. Cross-platform compatibility - works on both Windows and Linux
5. Single source of truth - everything in one JSON file
Git Hash:
bf0e5576f664db2c3080ba4f3413467edd650fac
📊 Release Notes System Enhancement
Enhanced Release Notes Display & Data Management
- Updated release notes to show last 5 releases with collapsible sections
- Fixed release_data.json location: Moved from .githooks/ to project root for proper Django access
- Added historical release tracking with dates, commit messages, and git hashes
- Implemented collapsible UI: Most recent release open by default, others collapsed on click
- Enhanced Release class: Added get_last_releases() method for git history retrieval
- Updated post_commit.py hook to generate release_data.json in correct location
- Improved template with responsive design and smooth animations
- Fixed git hook data management: Removed redundant git_hash.txt and git_notes.txt files
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Enhanced Release Notes Display & Data Management
- Updated release notes to show last 5 releases with collapsible sections
- Fixed release_data.json location: Moved from .githooks/ to project root for proper Django access
- Added historical release tracking with dates, commit messages, and git hashes
- Implemented collapsible UI: Most recent release open by default, others collapsed on click
- Enhanced Release class: Added get_last_releases() method for git history retrieval
- Updated post_commit.py hook to generate release_data.json in correct location
- Improved template with responsive design and smooth animations
- Fixed git hook data management: Removed redundant git_hash.txt and git_notes.txt files
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Git Hash:
8cd6de5cc13e1489ef187d2bb2b7ab02c11f0839
🛠️ Deployment System Overhaul
Database Reset & Migration Fixes
- Fixed fundamental deployment issue: Changed reset_database to actually DROP DATABASE propman and
CREATE DATABASE propman instead of just clearing tables
- Restructured deployment logic: Implemented clean sequence: delete database → run migrations → add
initial data → add test data (if flag present)
- Added proper database recreation with MySQL commands in deployment script
MySQL Constraint Compatibility Issues
- Fixed BLOB/TEXT constraint errors: Changed multiple TextField to CharField with appropriate
max_length:
- Property.property_name: TextField → CharField(max_length=255)
- Person.first_name/last_name: TextField → CharField(max_length=100)
- Unit.unit_name: TextField → CharField(max_length=255)
- Contract.contract_name: TextField → CharField(max_length=255)
- Rent.rent_name: TextField → CharField(max_length=255)
- Updated both models AND migration files to maintain consistency
File Transfer Optimization
- Added conditional file exclusions: Only transfer test data files when --add-test-data specified,
only transfer initial data when --reset-database specified
- Excluded database_media directory from transfers (prevents overwriting user uploads)
- Fixed rsync permission issues: Changed from -avz to -rlptD -v -z to avoid ownership conflicts
- Added proper error handling: rsync exit code 23 is now handled correctly for conditional
exclusions
🔧 Management Command Improvements
Error Handling Enhancement
- Created proper Django management command: Fixed add_initial_data.py to have correct Command class
structure
- Added FileNotFoundError exceptions: Commands now fail properly when required image files are
missing
- Enhanced validation: Both add_countries and add_test_data validate required directories exist
Image Handling Fixes
- Fixed profile image overwrite bug: Changed from hardcoded 'image.jpg' filename to using original
filenames (os.path.basename())
- Preserved test image files: Removed cleanup of test data files directory so media system can
access them
🌐 Web Server Configuration
Apache Media Serving
- Added media file alias: Apache now serves /database_media/ URLs from the correct directory
- Fixed missing media configuration: Added Alias /database_media and directory permissions to Apache
SSL config
Deployment Monitoring
- Added deployment duration tracking: Script now shows total time taken in Xm Ys format
📋 Root Cause Resolution
The Core Issue
The original problem (broken profile images) was caused by a cascade of issues:
1. Migration state inconsistency: Django thought migrations were applied but database schema was
wrong
2. MySQL field type incompatibility: TextField constraints failing
3. Image filename conflicts: All profile images overwriting each other
4. Missing Apache media configuration: Web server couldn't serve uploaded files
Current Status
- ✅ Database deployment: Now works correctly with proper schema
- ✅ Migration system: Fixed schema mismatches
- ✅ File handling: Conditional transfers working properly
- ✅ Image uploads: Each person gets unique image file
- ✅ Web serving: Apache configured to serve media files
- ⏱️ Performance tracking: Deployment duration monitoring added
Database Reset & Migration Fixes
- Fixed fundamental deployment issue: Changed reset_database to actually DROP DATABASE propman and
CREATE DATABASE propman instead of just clearing tables
- Restructured deployment logic: Implemented clean sequence: delete database → run migrations → add
initial data → add test data (if flag present)
- Added proper database recreation with MySQL commands in deployment script
MySQL Constraint Compatibility Issues
- Fixed BLOB/TEXT constraint errors: Changed multiple TextField to CharField with appropriate
max_length:
- Property.property_name: TextField → CharField(max_length=255)
- Person.first_name/last_name: TextField → CharField(max_length=100)
- Unit.unit_name: TextField → CharField(max_length=255)
- Contract.contract_name: TextField → CharField(max_length=255)
- Rent.rent_name: TextField → CharField(max_length=255)
- Updated both models AND migration files to maintain consistency
File Transfer Optimization
- Added conditional file exclusions: Only transfer test data files when --add-test-data specified,
only transfer initial data when --reset-database specified
- Excluded database_media directory from transfers (prevents overwriting user uploads)
- Fixed rsync permission issues: Changed from -avz to -rlptD -v -z to avoid ownership conflicts
- Added proper error handling: rsync exit code 23 is now handled correctly for conditional
exclusions
🔧 Management Command Improvements
Error Handling Enhancement
- Created proper Django management command: Fixed add_initial_data.py to have correct Command class
structure
- Added FileNotFoundError exceptions: Commands now fail properly when required image files are
missing
- Enhanced validation: Both add_countries and add_test_data validate required directories exist
Image Handling Fixes
- Fixed profile image overwrite bug: Changed from hardcoded 'image.jpg' filename to using original
filenames (os.path.basename())
- Preserved test image files: Removed cleanup of test data files directory so media system can
access them
🌐 Web Server Configuration
Apache Media Serving
- Added media file alias: Apache now serves /database_media/ URLs from the correct directory
- Fixed missing media configuration: Added Alias /database_media and directory permissions to Apache
SSL config
Deployment Monitoring
- Added deployment duration tracking: Script now shows total time taken in Xm Ys format
📋 Root Cause Resolution
The Core Issue
The original problem (broken profile images) was caused by a cascade of issues:
1. Migration state inconsistency: Django thought migrations were applied but database schema was
wrong
2. MySQL field type incompatibility: TextField constraints failing
3. Image filename conflicts: All profile images overwriting each other
4. Missing Apache media configuration: Web server couldn't serve uploaded files
Current Status
- ✅ Database deployment: Now works correctly with proper schema
- ✅ Migration system: Fixed schema mismatches
- ✅ File handling: Conditional transfers working properly
- ✅ Image uploads: Each person gets unique image file
- ✅ Web serving: Apache configured to serve media files
- ⏱️ Performance tracking: Deployment duration monitoring added