Add RRO, portal section perms, dislocation presets, and hiring intern flow.

Ship cash-register registry, section-based portal access, configurable dislocation columns, and trial-hire intern accounts with credentials PDF.
This commit is contained in:
2026-08-09 14:58:17 +03:00
parent 237275abd0
commit ae5c1f1848
63 changed files with 5987 additions and 2217 deletions
+15 -3
View File
@@ -227,22 +227,34 @@ class DirectoryAdmin(ModelAdmin, ImportExportModelAdmin):
class AccessSystemAdmin(ModelAdmin):
"""Отдельный раздел для списка систем/баз доступа (1С, почта, CRM…),
которые выбираются чекбоксами в заявке на найм."""
list_display = ['name', 'code', 'is_active', 'updated_at']
list_display = ['name', 'code', 'location_types_display', 'is_active', 'updated_at']
list_filter = [ActiveFilter]
list_filter_sheet = False
list_filter_submit = True
search_fields = ['name', 'code']
ordering = ['name']
fields = ['name', 'code', 'description', 'is_active']
fields = ['name', 'code', 'description', 'location_types', 'is_active']
filter_horizontal = ['location_types']
def get_queryset(self, request):
return super().get_queryset(request).filter(directory_type__code='access_system')
return (
super().get_queryset(request)
.filter(directory_type__code='access_system')
.prefetch_related('location_types')
)
def save_model(self, request, obj, form, change):
if not obj.directory_type_id:
obj.directory_type = DirectoryType.objects.get(code='access_system')
super().save_model(request, obj, form, change)
def location_types_display(self, obj):
types = list(obj.location_types.all())
if not types:
return mark_safe('<span style="color:#999;">все</span>')
return ', '.join(t.name for t in types)
location_types_display.short_description = _('Типы локаций')
@admin.register(ConnectorConfig)
class ConnectorConfigAdmin(ModelAdmin):