django-cfg 1.1.81__py3-none-any.whl → 1.2.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- django_cfg/__init__.py +20 -448
- django_cfg/apps/accounts/README.md +3 -3
- django_cfg/apps/accounts/admin/__init__.py +0 -2
- django_cfg/apps/accounts/admin/activity.py +2 -9
- django_cfg/apps/accounts/admin/filters.py +0 -42
- django_cfg/apps/accounts/admin/inlines.py +8 -8
- django_cfg/apps/accounts/admin/otp.py +5 -5
- django_cfg/apps/accounts/admin/registration_source.py +1 -8
- django_cfg/apps/accounts/admin/user.py +12 -20
- django_cfg/apps/accounts/managers/user_manager.py +2 -129
- django_cfg/apps/accounts/migrations/0006_remove_twilioresponse_otp_secret_and_more.py +46 -0
- django_cfg/apps/accounts/models.py +3 -123
- django_cfg/apps/accounts/serializers/otp.py +40 -44
- django_cfg/apps/accounts/serializers/profile.py +0 -2
- django_cfg/apps/accounts/services/otp_service.py +98 -186
- django_cfg/apps/accounts/signals.py +25 -15
- django_cfg/apps/accounts/utils/auth_email_service.py +84 -0
- django_cfg/apps/accounts/views/otp.py +35 -36
- django_cfg/apps/agents/README.md +129 -0
- django_cfg/apps/agents/__init__.py +68 -0
- django_cfg/apps/agents/admin/__init__.py +17 -0
- django_cfg/apps/agents/admin/execution_admin.py +460 -0
- django_cfg/apps/agents/admin/registry_admin.py +360 -0
- django_cfg/apps/agents/admin/toolsets_admin.py +482 -0
- django_cfg/apps/agents/apps.py +29 -0
- django_cfg/apps/agents/core/__init__.py +20 -0
- django_cfg/apps/agents/core/agent.py +281 -0
- django_cfg/apps/agents/core/dependencies.py +154 -0
- django_cfg/apps/agents/core/exceptions.py +66 -0
- django_cfg/apps/agents/core/models.py +106 -0
- django_cfg/apps/agents/core/orchestrator.py +391 -0
- django_cfg/apps/agents/examples/__init__.py +3 -0
- django_cfg/apps/agents/examples/simple_example.py +161 -0
- django_cfg/apps/agents/integration/__init__.py +14 -0
- django_cfg/apps/agents/integration/middleware.py +80 -0
- django_cfg/apps/agents/integration/registry.py +345 -0
- django_cfg/apps/agents/integration/signals.py +50 -0
- django_cfg/apps/agents/management/__init__.py +3 -0
- django_cfg/apps/agents/management/commands/__init__.py +3 -0
- django_cfg/apps/agents/management/commands/create_agent.py +365 -0
- django_cfg/apps/agents/management/commands/orchestrator_status.py +191 -0
- django_cfg/apps/agents/managers/__init__.py +23 -0
- django_cfg/apps/agents/managers/execution.py +236 -0
- django_cfg/apps/agents/managers/registry.py +254 -0
- django_cfg/apps/agents/managers/toolsets.py +496 -0
- django_cfg/apps/agents/migrations/0001_initial.py +286 -0
- django_cfg/apps/agents/migrations/__init__.py +5 -0
- django_cfg/apps/agents/models/__init__.py +15 -0
- django_cfg/apps/agents/models/execution.py +215 -0
- django_cfg/apps/agents/models/registry.py +220 -0
- django_cfg/apps/agents/models/toolsets.py +305 -0
- django_cfg/apps/agents/patterns/__init__.py +24 -0
- django_cfg/apps/agents/patterns/content_agents.py +234 -0
- django_cfg/apps/agents/toolsets/__init__.py +15 -0
- django_cfg/apps/agents/toolsets/cache_toolset.py +285 -0
- django_cfg/apps/agents/toolsets/django_toolset.py +220 -0
- django_cfg/apps/agents/toolsets/file_toolset.py +324 -0
- django_cfg/apps/agents/toolsets/orm_toolset.py +319 -0
- django_cfg/apps/agents/urls.py +46 -0
- django_cfg/apps/knowbase/README.md +150 -0
- django_cfg/apps/knowbase/__init__.py +27 -0
- django_cfg/apps/knowbase/admin/__init__.py +23 -0
- django_cfg/apps/knowbase/admin/archive_admin.py +857 -0
- django_cfg/apps/knowbase/admin/chat_admin.py +386 -0
- django_cfg/apps/knowbase/admin/document_admin.py +650 -0
- django_cfg/apps/knowbase/admin/external_data_admin.py +685 -0
- django_cfg/apps/knowbase/apps.py +81 -0
- django_cfg/apps/knowbase/config/README.md +176 -0
- django_cfg/apps/knowbase/config/__init__.py +51 -0
- django_cfg/apps/knowbase/config/constance_fields.py +186 -0
- django_cfg/apps/knowbase/config/constance_settings.py +200 -0
- django_cfg/apps/knowbase/config/settings.py +444 -0
- django_cfg/apps/knowbase/examples/__init__.py +3 -0
- django_cfg/apps/knowbase/examples/external_data_usage.py +191 -0
- django_cfg/apps/knowbase/management/__init__.py +0 -0
- django_cfg/apps/knowbase/management/commands/__init__.py +0 -0
- django_cfg/apps/knowbase/management/commands/knowbase_stats.py +158 -0
- django_cfg/apps/knowbase/management/commands/setup_knowbase.py +59 -0
- django_cfg/apps/knowbase/managers/__init__.py +22 -0
- django_cfg/apps/knowbase/managers/archive.py +426 -0
- django_cfg/apps/knowbase/managers/base.py +32 -0
- django_cfg/apps/knowbase/managers/chat.py +141 -0
- django_cfg/apps/knowbase/managers/document.py +203 -0
- django_cfg/apps/knowbase/managers/external_data.py +471 -0
- django_cfg/apps/knowbase/migrations/0001_initial.py +427 -0
- django_cfg/apps/knowbase/migrations/0002_archiveitem_archiveitemchunk_documentarchive_and_more.py +434 -0
- django_cfg/apps/knowbase/migrations/__init__.py +5 -0
- django_cfg/apps/knowbase/mixins/__init__.py +15 -0
- django_cfg/apps/knowbase/mixins/config.py +108 -0
- django_cfg/apps/knowbase/mixins/creator.py +81 -0
- django_cfg/apps/knowbase/mixins/examples/vehicle_model_example.py +199 -0
- django_cfg/apps/knowbase/mixins/external_data_mixin.py +813 -0
- django_cfg/apps/knowbase/mixins/service.py +362 -0
- django_cfg/apps/knowbase/models/__init__.py +41 -0
- django_cfg/apps/knowbase/models/archive.py +599 -0
- django_cfg/apps/knowbase/models/base.py +58 -0
- django_cfg/apps/knowbase/models/chat.py +157 -0
- django_cfg/apps/knowbase/models/document.py +267 -0
- django_cfg/apps/knowbase/models/external_data.py +376 -0
- django_cfg/apps/knowbase/serializers/__init__.py +68 -0
- django_cfg/apps/knowbase/serializers/archive_serializers.py +386 -0
- django_cfg/apps/knowbase/serializers/chat_serializers.py +137 -0
- django_cfg/apps/knowbase/serializers/document_serializers.py +94 -0
- django_cfg/apps/knowbase/serializers/external_data_serializers.py +256 -0
- django_cfg/apps/knowbase/serializers/public_serializers.py +74 -0
- django_cfg/apps/knowbase/services/__init__.py +40 -0
- django_cfg/apps/knowbase/services/archive/__init__.py +42 -0
- django_cfg/apps/knowbase/services/archive/archive_service.py +541 -0
- django_cfg/apps/knowbase/services/archive/chunking_service.py +791 -0
- django_cfg/apps/knowbase/services/archive/exceptions.py +52 -0
- django_cfg/apps/knowbase/services/archive/extraction_service.py +508 -0
- django_cfg/apps/knowbase/services/archive/vectorization_service.py +362 -0
- django_cfg/apps/knowbase/services/base.py +53 -0
- django_cfg/apps/knowbase/services/chat_service.py +239 -0
- django_cfg/apps/knowbase/services/document_service.py +144 -0
- django_cfg/apps/knowbase/services/embedding/__init__.py +43 -0
- django_cfg/apps/knowbase/services/embedding/async_processor.py +244 -0
- django_cfg/apps/knowbase/services/embedding/batch_processor.py +250 -0
- django_cfg/apps/knowbase/services/embedding/batch_result.py +61 -0
- django_cfg/apps/knowbase/services/embedding/models.py +229 -0
- django_cfg/apps/knowbase/services/embedding/processors.py +148 -0
- django_cfg/apps/knowbase/services/embedding/utils.py +176 -0
- django_cfg/apps/knowbase/services/prompt_builder.py +191 -0
- django_cfg/apps/knowbase/services/search_service.py +293 -0
- django_cfg/apps/knowbase/signals/__init__.py +21 -0
- django_cfg/apps/knowbase/signals/archive_signals.py +211 -0
- django_cfg/apps/knowbase/signals/chat_signals.py +37 -0
- django_cfg/apps/knowbase/signals/document_signals.py +143 -0
- django_cfg/apps/knowbase/signals/external_data_signals.py +157 -0
- django_cfg/apps/knowbase/tasks/__init__.py +39 -0
- django_cfg/apps/knowbase/tasks/archive_tasks.py +316 -0
- django_cfg/apps/knowbase/tasks/document_processing.py +341 -0
- django_cfg/apps/knowbase/tasks/external_data_tasks.py +341 -0
- django_cfg/apps/knowbase/tasks/maintenance.py +195 -0
- django_cfg/apps/knowbase/urls.py +43 -0
- django_cfg/apps/knowbase/utils/__init__.py +12 -0
- django_cfg/apps/knowbase/utils/chunk_settings.py +261 -0
- django_cfg/apps/knowbase/utils/text_processing.py +375 -0
- django_cfg/apps/knowbase/utils/validation.py +99 -0
- django_cfg/apps/knowbase/views/__init__.py +28 -0
- django_cfg/apps/knowbase/views/archive_views.py +469 -0
- django_cfg/apps/knowbase/views/base.py +49 -0
- django_cfg/apps/knowbase/views/chat_views.py +181 -0
- django_cfg/apps/knowbase/views/document_views.py +183 -0
- django_cfg/apps/knowbase/views/public_views.py +129 -0
- django_cfg/apps/leads/admin.py +70 -0
- django_cfg/apps/newsletter/admin.py +234 -0
- django_cfg/apps/newsletter/admin_filters.py +124 -0
- django_cfg/apps/support/admin.py +196 -0
- django_cfg/apps/support/admin_filters.py +71 -0
- django_cfg/apps/support/templates/support/chat/ticket_chat.html +1 -1
- django_cfg/apps/urls.py +5 -4
- django_cfg/cli/README.md +1 -1
- django_cfg/cli/commands/create_project.py +2 -2
- django_cfg/cli/commands/info.py +1 -1
- django_cfg/config.py +44 -0
- django_cfg/core/config.py +29 -82
- django_cfg/core/environment.py +1 -1
- django_cfg/core/generation.py +19 -107
- django_cfg/{integration.py → core/integration.py} +18 -16
- django_cfg/core/validation.py +1 -1
- django_cfg/management/__init__.py +1 -1
- django_cfg/management/commands/__init__.py +1 -1
- django_cfg/management/commands/auto_generate.py +482 -0
- django_cfg/management/commands/migrator.py +19 -101
- django_cfg/management/commands/test_email.py +1 -1
- django_cfg/middleware/README.md +0 -158
- django_cfg/middleware/__init__.py +0 -2
- django_cfg/middleware/user_activity.py +3 -3
- django_cfg/models/api.py +145 -0
- django_cfg/models/base.py +287 -0
- django_cfg/models/cache.py +4 -4
- django_cfg/models/constance.py +25 -88
- django_cfg/models/database.py +9 -9
- django_cfg/models/drf.py +3 -36
- django_cfg/models/email.py +163 -0
- django_cfg/models/environment.py +276 -0
- django_cfg/models/limits.py +1 -1
- django_cfg/models/logging.py +366 -0
- django_cfg/models/revolution.py +41 -2
- django_cfg/models/security.py +125 -0
- django_cfg/models/services.py +1 -1
- django_cfg/modules/__init__.py +2 -56
- django_cfg/modules/base.py +78 -52
- django_cfg/modules/django_currency/service.py +2 -2
- django_cfg/modules/django_email.py +2 -2
- django_cfg/modules/django_health.py +267 -0
- django_cfg/modules/django_llm/llm/client.py +79 -17
- django_cfg/modules/django_llm/translator/translator.py +2 -2
- django_cfg/modules/django_logger.py +2 -2
- django_cfg/modules/django_ngrok.py +2 -2
- django_cfg/modules/django_tasks.py +68 -3
- django_cfg/modules/django_telegram.py +3 -3
- django_cfg/modules/django_twilio/sendgrid_service.py +2 -2
- django_cfg/modules/django_twilio/service.py +2 -2
- django_cfg/modules/django_twilio/simple_service.py +2 -2
- django_cfg/modules/django_twilio/templates/guide.md +266 -0
- django_cfg/modules/django_twilio/twilio_service.py +2 -2
- django_cfg/modules/django_unfold/__init__.py +69 -0
- django_cfg/modules/{unfold → django_unfold}/callbacks.py +23 -22
- django_cfg/modules/django_unfold/dashboard.py +278 -0
- django_cfg/modules/django_unfold/icons/README.md +145 -0
- django_cfg/modules/django_unfold/icons/__init__.py +12 -0
- django_cfg/modules/django_unfold/icons/constants.py +2851 -0
- django_cfg/modules/django_unfold/icons/generate_icons.py +486 -0
- django_cfg/modules/django_unfold/models/__init__.py +42 -0
- django_cfg/modules/django_unfold/models/config.py +601 -0
- django_cfg/modules/django_unfold/models/dashboard.py +206 -0
- django_cfg/modules/django_unfold/models/dropdown.py +40 -0
- django_cfg/modules/django_unfold/models/navigation.py +73 -0
- django_cfg/modules/django_unfold/models/tabs.py +25 -0
- django_cfg/modules/{unfold → django_unfold}/system_monitor.py +2 -2
- django_cfg/modules/django_unfold/utils.py +140 -0
- django_cfg/registry/__init__.py +23 -0
- django_cfg/registry/core.py +61 -0
- django_cfg/registry/exceptions.py +11 -0
- django_cfg/registry/modules.py +12 -0
- django_cfg/registry/services.py +26 -0
- django_cfg/registry/third_party.py +52 -0
- django_cfg/routing/__init__.py +19 -0
- django_cfg/routing/callbacks.py +198 -0
- django_cfg/routing/routers.py +48 -0
- django_cfg/templates/admin/layouts/dashboard_with_tabs.html +8 -9
- django_cfg/templatetags/__init__.py +0 -0
- django_cfg/templatetags/django_cfg.py +33 -0
- django_cfg/urls.py +33 -0
- django_cfg/utils/path_resolution.py +1 -1
- django_cfg/utils/smart_defaults.py +7 -61
- django_cfg/utils/toolkit.py +663 -0
- {django_cfg-1.1.81.dist-info → django_cfg-1.2.0.dist-info}/METADATA +83 -86
- django_cfg-1.2.0.dist-info/RECORD +441 -0
- django_cfg/apps/tasks/@docs/README.md +0 -195
- django_cfg/archive/django_sample.zip +0 -0
- django_cfg/models/unfold.py +0 -271
- django_cfg/modules/unfold/__init__.py +0 -29
- django_cfg/modules/unfold/dashboard.py +0 -318
- django_cfg/pyproject.toml +0 -370
- django_cfg/routers.py +0 -83
- django_cfg-1.1.81.dist-info/RECORD +0 -278
- /django_cfg/{exceptions.py → core/exceptions.py} +0 -0
- /django_cfg/modules/{unfold → django_unfold}/models.py +0 -0
- /django_cfg/modules/{unfold → django_unfold}/tailwind.py +0 -0
- /django_cfg/{version_check.py → utils/version_check.py} +0 -0
- {django_cfg-1.1.81.dist-info → django_cfg-1.2.0.dist-info}/WHEEL +0 -0
- {django_cfg-1.1.81.dist-info → django_cfg-1.2.0.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.1.81.dist-info → django_cfg-1.2.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,199 @@
|
|
1
|
+
"""
|
2
|
+
Example of using ExternalDataMixin with VehicleModel.
|
3
|
+
|
4
|
+
This shows how to integrate VehicleModel with knowbase using the mixin.
|
5
|
+
"""
|
6
|
+
|
7
|
+
from django.db import models
|
8
|
+
from django_cfg.apps.knowbase.mixins import ExternalDataMixin
|
9
|
+
from django_cfg.apps.knowbase.models.external_data import ExternalDataType
|
10
|
+
|
11
|
+
|
12
|
+
class VehicleModelWithMixin(ExternalDataMixin, models.Model):
|
13
|
+
"""
|
14
|
+
Example VehicleModel with ExternalDataMixin integration.
|
15
|
+
|
16
|
+
This replaces the manual integration we had before with automatic
|
17
|
+
tracking and vectorization.
|
18
|
+
"""
|
19
|
+
|
20
|
+
# Original VehicleModel fields
|
21
|
+
brand = models.ForeignKey('vehicles_data.Brand', on_delete=models.CASCADE)
|
22
|
+
code = models.CharField(max_length=20)
|
23
|
+
name = models.CharField(max_length=100)
|
24
|
+
body_type = models.CharField(max_length=20, blank=True)
|
25
|
+
segment = models.CharField(max_length=50, blank=True)
|
26
|
+
is_active = models.BooleanField(default=True)
|
27
|
+
total_vehicles = models.PositiveIntegerField(default=0)
|
28
|
+
created_at = models.DateTimeField(auto_now_add=True)
|
29
|
+
updated_at = models.DateTimeField(auto_now=True)
|
30
|
+
|
31
|
+
class Meta:
|
32
|
+
abstract = True # This is just an example
|
33
|
+
|
34
|
+
class ExternalDataMeta:
|
35
|
+
# Fields to watch for changes - only update when these change
|
36
|
+
watch_fields = ['name', 'body_type', 'segment', 'is_active']
|
37
|
+
|
38
|
+
# Lower threshold for multilingual vehicle data
|
39
|
+
similarity_threshold = 0.4
|
40
|
+
|
41
|
+
# Vehicle models are model type
|
42
|
+
source_type = ExternalDataType.MODEL
|
43
|
+
|
44
|
+
# Enable auto-sync
|
45
|
+
auto_sync = True
|
46
|
+
|
47
|
+
# Make public for search
|
48
|
+
is_public = True
|
49
|
+
|
50
|
+
# Required: content generation method
|
51
|
+
def get_external_content(self):
|
52
|
+
"""Generate content for vectorization."""
|
53
|
+
content_parts = [
|
54
|
+
f"# {self.brand.name} {self.name}",
|
55
|
+
"",
|
56
|
+
"## Basic Information",
|
57
|
+
f"- **Brand**: {self.brand.name} ({self.brand.code})",
|
58
|
+
f"- **Model**: {self.name} ({self.code})",
|
59
|
+
]
|
60
|
+
|
61
|
+
if self.body_type:
|
62
|
+
content_parts.append(f"- **Body Type**: {self.body_type}")
|
63
|
+
|
64
|
+
if self.segment:
|
65
|
+
content_parts.append(f"- **Market Segment**: {self.segment}")
|
66
|
+
|
67
|
+
content_parts.extend([
|
68
|
+
f"- **Status**: {'Active' if self.is_active else 'Inactive'}",
|
69
|
+
"",
|
70
|
+
"## Market Statistics",
|
71
|
+
f"- **Total Listings**: {self.total_vehicles:,} vehicles available",
|
72
|
+
])
|
73
|
+
|
74
|
+
if hasattr(self, 'vehicles') and self.vehicles.exists():
|
75
|
+
# Add some vehicle statistics if available
|
76
|
+
vehicles = self.vehicles.filter(is_active=True)
|
77
|
+
if vehicles.exists():
|
78
|
+
content_parts.extend([
|
79
|
+
"",
|
80
|
+
"## Available Vehicles",
|
81
|
+
f"- **Active Listings**: {vehicles.count():,} vehicles",
|
82
|
+
])
|
83
|
+
|
84
|
+
# Add price range if available
|
85
|
+
if hasattr(vehicles.first(), 'price'):
|
86
|
+
prices = vehicles.exclude(price__isnull=True).values_list('price', flat=True)
|
87
|
+
if prices:
|
88
|
+
min_price = min(prices)
|
89
|
+
max_price = max(prices)
|
90
|
+
content_parts.append(f"- **Price Range**: ${min_price:,} - ${max_price:,}")
|
91
|
+
|
92
|
+
content_parts.extend([
|
93
|
+
"",
|
94
|
+
f"## Model History",
|
95
|
+
f"- **First Listed**: {self.created_at.strftime('%Y-%m-%d')}",
|
96
|
+
f"- **Last Updated**: {self.updated_at.strftime('%Y-%m-%d')}",
|
97
|
+
])
|
98
|
+
|
99
|
+
return "\n".join(content_parts)
|
100
|
+
|
101
|
+
# Optional: custom title
|
102
|
+
def get_external_title(self):
|
103
|
+
"""Generate title for ExternalData."""
|
104
|
+
return f"Vehicle Model: {self.brand.name} {self.name}"
|
105
|
+
|
106
|
+
# Optional: custom description
|
107
|
+
def get_external_description(self):
|
108
|
+
"""Generate description for ExternalData."""
|
109
|
+
parts = [f"Comprehensive information about {self.brand.name} {self.name}"]
|
110
|
+
|
111
|
+
if self.body_type:
|
112
|
+
parts.append(f"({self.body_type})")
|
113
|
+
|
114
|
+
parts.append("including specifications, market data, and vehicle listings.")
|
115
|
+
|
116
|
+
return " ".join(parts)
|
117
|
+
|
118
|
+
# Optional: metadata
|
119
|
+
def get_external_metadata(self):
|
120
|
+
"""Generate metadata for ExternalData."""
|
121
|
+
return {
|
122
|
+
'vehicle_model_id': str(self.id),
|
123
|
+
'brand_code': self.brand.code,
|
124
|
+
'brand_name': self.brand.name,
|
125
|
+
'model_code': self.code,
|
126
|
+
'model_name': self.name,
|
127
|
+
'body_type': self.body_type,
|
128
|
+
'segment': self.segment,
|
129
|
+
'total_vehicles': self.total_vehicles,
|
130
|
+
'is_active': self.is_active,
|
131
|
+
'created_at': self.created_at.isoformat(),
|
132
|
+
'updated_at': self.updated_at.isoformat(),
|
133
|
+
'integration_type': 'vehicle_model_mixin_auto'
|
134
|
+
}
|
135
|
+
|
136
|
+
# Optional: tags
|
137
|
+
def get_external_tags(self):
|
138
|
+
"""Generate tags for ExternalData."""
|
139
|
+
tags = [
|
140
|
+
'vehicle',
|
141
|
+
'model',
|
142
|
+
self.brand.code.lower(),
|
143
|
+
self.code.lower(),
|
144
|
+
self.brand.name.lower().replace(' ', '_'),
|
145
|
+
self.name.lower().replace(' ', '_'),
|
146
|
+
]
|
147
|
+
|
148
|
+
if self.body_type:
|
149
|
+
tags.append(self.body_type.lower().replace(' ', '_'))
|
150
|
+
|
151
|
+
if self.segment:
|
152
|
+
tags.append(self.segment.lower().replace(' ', '_'))
|
153
|
+
|
154
|
+
return tags
|
155
|
+
|
156
|
+
@property
|
157
|
+
def full_name(self):
|
158
|
+
"""Get full model name with brand."""
|
159
|
+
return f"{self.brand.name} {self.name}"
|
160
|
+
|
161
|
+
def __str__(self):
|
162
|
+
return self.full_name
|
163
|
+
|
164
|
+
|
165
|
+
# Usage example:
|
166
|
+
"""
|
167
|
+
# To use this mixin in your existing VehicleModel:
|
168
|
+
|
169
|
+
1. Add the mixin to your model:
|
170
|
+
class VehicleModel(ExternalDataMixin, models.Model):
|
171
|
+
# ... your existing fields ...
|
172
|
+
|
173
|
+
class ExternalDataMeta:
|
174
|
+
watch_fields = ['name', 'body_type', 'segment', 'is_active']
|
175
|
+
similarity_threshold = 0.4
|
176
|
+
source_type = ExternalDataType.MODEL
|
177
|
+
auto_sync = True
|
178
|
+
is_public = True
|
179
|
+
|
180
|
+
def get_external_content(self):
|
181
|
+
# ... content generation logic ...
|
182
|
+
return content
|
183
|
+
|
184
|
+
2. Run migrations to add the mixin fields:
|
185
|
+
python manage.py makemigrations
|
186
|
+
python manage.py migrate
|
187
|
+
|
188
|
+
3. That's it! The mixin will automatically:
|
189
|
+
- Create ExternalData when VehicleModel is created
|
190
|
+
- Update ExternalData when watched fields change
|
191
|
+
- Delete ExternalData when VehicleModel is deleted
|
192
|
+
- Handle vectorization and search integration
|
193
|
+
|
194
|
+
4. Manual operations (if needed):
|
195
|
+
vehicle_model.regenerate_external_data() # Force regeneration
|
196
|
+
vehicle_model.delete_external_data() # Remove integration
|
197
|
+
vehicle_model.has_external_data # Check if linked
|
198
|
+
vehicle_model.external_data_status # Get processing status
|
199
|
+
"""
|