Update documentation: Global numbering is now the default standard
This commit is contained in:
@@ -4,13 +4,16 @@
|
|||||||
|
|
||||||
The LEGO Instructions Manager now includes automatic MOC (My Own Creation) set number generation, making it easier to track and organize your custom LEGO builds without manually managing set numbers.
|
The LEGO Instructions Manager now includes automatic MOC (My Own Creation) set number generation, making it easier to track and organize your custom LEGO builds without manually managing set numbers.
|
||||||
|
|
||||||
|
**Default Behavior: Global Numbering** - All users share the same MOC number sequence, ensuring system-wide unique MOC numbers.
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
### 🤖 Automatic Number Generation
|
### 🤖 Automatic Number Generation
|
||||||
- **Sequential Numbering**: Automatically generates MOC numbers in sequence (MOC-10000, MOC-10001, MOC-10002, etc.)
|
- **Sequential Numbering**: Automatically generates MOC numbers in sequence (MOC-10000, MOC-10001, MOC-10002, etc.)
|
||||||
- **Conflict-Free**: Ensures no duplicate MOC numbers
|
- **Global by Default**: All users share the same sequence for system-wide uniqueness
|
||||||
|
- **Conflict-Free**: Ensures no duplicate MOC numbers across the entire system
|
||||||
- **Customizable Prefix**: Default is "MOC" but can be changed
|
- **Customizable Prefix**: Default is "MOC" but can be changed
|
||||||
- **User-Scoped Option**: Can scope MOC numbers per user or globally
|
- **Optional User-Scoping**: Can scope to individual users if needed
|
||||||
|
|
||||||
### 🔌 API Endpoints
|
### 🔌 API Endpoints
|
||||||
|
|
||||||
@@ -21,7 +24,7 @@ GET /api/moc/generate
|
|||||||
|
|
||||||
**Query Parameters:**
|
**Query Parameters:**
|
||||||
- `prefix` (optional): MOC prefix, default is 'MOC'
|
- `prefix` (optional): MOC prefix, default is 'MOC'
|
||||||
- `user_scoped` (optional): Scope to current user, default is 'true'
|
- `user_scoped` (optional): Scope to current user, default is **'false'** (GLOBAL)
|
||||||
|
|
||||||
**Response:**
|
**Response:**
|
||||||
```json
|
```json
|
||||||
@@ -29,17 +32,25 @@ GET /api/moc/generate
|
|||||||
"success": true,
|
"success": true,
|
||||||
"moc_number": "MOC-10001",
|
"moc_number": "MOC-10001",
|
||||||
"prefix": "MOC",
|
"prefix": "MOC",
|
||||||
"user_scoped": true
|
"user_scoped": false
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
**Example Usage:**
|
**Example Usage:**
|
||||||
```javascript
|
```javascript
|
||||||
|
// Get next global MOC number (default)
|
||||||
fetch('/api/moc/generate')
|
fetch('/api/moc/generate')
|
||||||
.then(response => response.json())
|
.then(response => response.json())
|
||||||
.then(data => {
|
.then(data => {
|
||||||
console.log('Next MOC number:', data.moc_number);
|
console.log('Next MOC number:', data.moc_number);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Get next user-scoped MOC number (optional)
|
||||||
|
fetch('/api/moc/generate?user_scoped=true')
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(data => {
|
||||||
|
console.log('Next user MOC number:', data.moc_number);
|
||||||
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
#### 2. Validate MOC Number
|
#### 2. Validate MOC Number
|
||||||
@@ -51,7 +62,7 @@ POST /api/moc/validate
|
|||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"set_number": "MOC-12345",
|
"set_number": "MOC-12345",
|
||||||
"user_scoped": true
|
"user_scoped": false
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -131,7 +142,7 @@ document.getElementById('is_moc').addEventListener('change', function() {
|
|||||||
officialSection.style.display = 'none';
|
officialSection.style.display = 'none';
|
||||||
setNumberInput.removeAttribute('required');
|
setNumberInput.removeAttribute('required');
|
||||||
|
|
||||||
// Fetch next MOC number
|
// Fetch next MOC number (global by default)
|
||||||
fetchNextMocNumber();
|
fetchNextMocNumber();
|
||||||
} else {
|
} else {
|
||||||
// Show official section, hide MOC section
|
// Show official section, hide MOC section
|
||||||
@@ -168,16 +179,22 @@ The `MOCNumberGenerator` service handles all MOC number logic:
|
|||||||
```python
|
```python
|
||||||
from app.services.moc_generator import MOCNumberGenerator
|
from app.services.moc_generator import MOCNumberGenerator
|
||||||
|
|
||||||
# Generate next MOC number
|
# Generate next GLOBAL MOC number (default)
|
||||||
moc_number = MOCNumberGenerator.generate_next_number(
|
moc_number = MOCNumberGenerator.generate_next_number(
|
||||||
prefix='MOC',
|
prefix='MOC',
|
||||||
user_id=current_user.id # Optional: scope to user
|
user_id=None # None = global numbering
|
||||||
)
|
)
|
||||||
|
|
||||||
# Validate MOC number availability
|
# Generate next USER-SCOPED MOC number (optional)
|
||||||
|
moc_number = MOCNumberGenerator.generate_next_number(
|
||||||
|
prefix='MOC',
|
||||||
|
user_id=current_user.id # Scope to specific user
|
||||||
|
)
|
||||||
|
|
||||||
|
# Validate MOC number availability (global)
|
||||||
is_available = MOCNumberGenerator.validate_moc_number(
|
is_available = MOCNumberGenerator.validate_moc_number(
|
||||||
'MOC-12345',
|
'MOC-12345',
|
||||||
user_id=current_user.id
|
user_id=None # Check globally
|
||||||
)
|
)
|
||||||
|
|
||||||
# Check if number follows MOC format
|
# Check if number follows MOC format
|
||||||
@@ -198,8 +215,12 @@ bp = Blueprint('moc', __name__, url_prefix='/api/moc')
|
|||||||
@bp.route('/generate', methods=['GET'])
|
@bp.route('/generate', methods=['GET'])
|
||||||
@login_required
|
@login_required
|
||||||
def generate_moc_number():
|
def generate_moc_number():
|
||||||
|
# Default: user_scoped=false (global numbering)
|
||||||
|
user_scoped = request.args.get('user_scoped', 'false').lower() == 'true'
|
||||||
|
user_id = current_user.id if user_scoped else None
|
||||||
|
|
||||||
moc_number = MOCNumberGenerator.generate_next_number(
|
moc_number = MOCNumberGenerator.generate_next_number(
|
||||||
user_id=current_user.id
|
user_id=user_id
|
||||||
)
|
)
|
||||||
return jsonify({
|
return jsonify({
|
||||||
'success': True,
|
'success': True,
|
||||||
@@ -219,17 +240,20 @@ class MOCNumberGenerator:
|
|||||||
DEFAULT_START = 10000 # Starting number for MOCs
|
DEFAULT_START = 10000 # Starting number for MOCs
|
||||||
```
|
```
|
||||||
|
|
||||||
### Per-User vs Global Numbering
|
### Numbering Modes
|
||||||
|
|
||||||
**Per-User Numbering** (default):
|
**Global Numbering** (Default - **RECOMMENDED**):
|
||||||
|
- All users share the same MOC number sequence
|
||||||
|
- Ensures system-wide unique MOC numbers
|
||||||
|
- MOC-10000 is unique across the entire system
|
||||||
|
- **API**: `user_scoped=false` or omit parameter
|
||||||
|
- **Use Case**: Single household, organization, or when you want guaranteed unique IDs
|
||||||
|
|
||||||
|
**Per-User Numbering** (Optional):
|
||||||
- Each user has their own MOC number sequence
|
- Each user has their own MOC number sequence
|
||||||
- MOC-10000 can exist for multiple users
|
- MOC-10000 can exist for multiple users
|
||||||
- API: `user_scoped=true`
|
- **API**: `user_scoped=true`
|
||||||
|
- **Use Case**: Multi-tenant systems where users want isolated numbering
|
||||||
**Global Numbering**:
|
|
||||||
- All users share the same MOC number sequence
|
|
||||||
- Ensures unique MOC numbers across the entire system
|
|
||||||
- API: `user_scoped=false`
|
|
||||||
|
|
||||||
## Use Cases
|
## Use Cases
|
||||||
|
|
||||||
@@ -237,7 +261,7 @@ class MOCNumberGenerator:
|
|||||||
|
|
||||||
1. User clicks "Add New Set"
|
1. User clicks "Add New Set"
|
||||||
2. User toggles "This is a MOC" checkbox
|
2. User toggles "This is a MOC" checkbox
|
||||||
3. System automatically generates MOC-10000 (or next available)
|
3. System automatically generates next global MOC number (e.g., MOC-10000)
|
||||||
4. User fills in MOC designer, description, and other details
|
4. User fills in MOC designer, description, and other details
|
||||||
5. System saves set with is_moc=True
|
5. System saves set with is_moc=True
|
||||||
|
|
||||||
@@ -247,6 +271,7 @@ class MOCNumberGenerator:
|
|||||||
from app.services.moc_generator import MOCNumberGenerator
|
from app.services.moc_generator import MOCNumberGenerator
|
||||||
|
|
||||||
for moc_data in moc_import_list:
|
for moc_data in moc_import_list:
|
||||||
|
# Global numbering - user_id=None
|
||||||
moc_number = MOCNumberGenerator.generate_next_number()
|
moc_number = MOCNumberGenerator.generate_next_number()
|
||||||
new_set = Set(
|
new_set = Set(
|
||||||
set_number=moc_number,
|
set_number=moc_number,
|
||||||
@@ -297,8 +322,8 @@ mocs_range = Set.query.filter(
|
|||||||
**Issue**: Same MOC number assigned to multiple sets
|
**Issue**: Same MOC number assigned to multiple sets
|
||||||
|
|
||||||
**Solutions**:
|
**Solutions**:
|
||||||
1. Check database constraints on `set_number` field
|
1. Verify you're using global numbering (default `user_scoped=false`)
|
||||||
2. Verify `user_scoped` parameter matches your use case
|
2. Check database constraints on `set_number` field (should be unique)
|
||||||
3. Run database migration to add unique constraint if missing
|
3. Run database migration to add unique constraint if missing
|
||||||
|
|
||||||
### MOC Toggle Not Working
|
### MOC Toggle Not Working
|
||||||
@@ -325,8 +350,7 @@ Potential improvements for the MOC feature:
|
|||||||
|
|
||||||
- [Main README](../README.md) - General application documentation
|
- [Main README](../README.md) - General application documentation
|
||||||
- [Setup Guide](../SETUP_GUIDE.md) - Installation and configuration
|
- [Setup Guide](../SETUP_GUIDE.md) - Installation and configuration
|
||||||
- [API Documentation](../docs/api.md) - Complete API reference (if exists)
|
- [Feature Update Summary](../FEATURE_UPDATE_SUMMARY.md) - Recent changes
|
||||||
- [Database Schema](../docs/database.md) - Database structure (if exists)
|
|
||||||
|
|
||||||
## Support
|
## Support
|
||||||
|
|
||||||
@@ -344,5 +368,5 @@ For issues or questions about MOC auto-generation:
|
|||||||
---
|
---
|
||||||
|
|
||||||
**Last Updated**: December 2024
|
**Last Updated**: December 2024
|
||||||
**Feature Version**: 1.0
|
**Feature Version**: 1.1 (Global Numbering Default)
|
||||||
**Compatibility**: LEGO Instructions Manager v1.3.0+
|
**Compatibility**: LEGO Instructions Manager v1.3.0+
|
||||||
|
|||||||
Reference in New Issue
Block a user