mirror of
https://github.com/house-of-vanity/OutFleet.git
synced 2025-08-21 14:37:16 +00:00
Added TG bot
This commit is contained in:
@@ -4,6 +4,7 @@ from django.urls import path, reverse
|
|||||||
from django.shortcuts import redirect
|
from django.shortcuts import redirect
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
|
from django import forms
|
||||||
from .models import BotSettings, TelegramMessage, AccessRequest
|
from .models import BotSettings, TelegramMessage, AccessRequest
|
||||||
from .localization import MessageLocalizer
|
from .localization import MessageLocalizer
|
||||||
import logging
|
import logging
|
||||||
@@ -11,6 +12,27 @@ import logging
|
|||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class AccessRequestAdminForm(forms.ModelForm):
|
||||||
|
"""Custom form for AccessRequest with existing user selection"""
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = AccessRequest
|
||||||
|
fields = '__all__'
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
# Rename the field for better UI
|
||||||
|
if 'selected_existing_user' in self.fields:
|
||||||
|
self.fields['selected_existing_user'].label = 'Link to existing user'
|
||||||
|
self.fields['selected_existing_user'].empty_label = "— Create new user —"
|
||||||
|
self.fields['selected_existing_user'].help_text = "Select an existing user without Telegram to link, or leave empty to create new user"
|
||||||
|
# Get users without telegram_user_id
|
||||||
|
from vpn.models import User
|
||||||
|
self.fields['selected_existing_user'].queryset = User.objects.filter(
|
||||||
|
telegram_user_id__isnull=True
|
||||||
|
).order_by('username')
|
||||||
|
|
||||||
|
|
||||||
@admin.register(BotSettings)
|
@admin.register(BotSettings)
|
||||||
class BotSettingsAdmin(admin.ModelAdmin):
|
class BotSettingsAdmin(admin.ModelAdmin):
|
||||||
list_display = ('__str__', 'enabled', 'bot_token_display', 'updated_at')
|
list_display = ('__str__', 'enabled', 'bot_token_display', 'updated_at')
|
||||||
@@ -259,6 +281,7 @@ class TelegramMessageAdmin(admin.ModelAdmin):
|
|||||||
|
|
||||||
@admin.register(AccessRequest)
|
@admin.register(AccessRequest)
|
||||||
class AccessRequestAdmin(admin.ModelAdmin):
|
class AccessRequestAdmin(admin.ModelAdmin):
|
||||||
|
form = AccessRequestAdminForm
|
||||||
list_display = (
|
list_display = (
|
||||||
'created_at',
|
'created_at',
|
||||||
'user_display',
|
'user_display',
|
||||||
@@ -309,9 +332,10 @@ class AccessRequestAdmin(admin.ModelAdmin):
|
|||||||
}),
|
}),
|
||||||
('User Creation', {
|
('User Creation', {
|
||||||
'fields': (
|
'fields': (
|
||||||
|
'selected_existing_user',
|
||||||
'desired_username',
|
'desired_username',
|
||||||
),
|
),
|
||||||
'description': 'Edit username before approving the request'
|
'description': 'Choose existing user to link OR specify username for new user'
|
||||||
}),
|
}),
|
||||||
('Telegram User', {
|
('Telegram User', {
|
||||||
'fields': (
|
'fields': (
|
||||||
@@ -416,6 +440,35 @@ class AccessRequestAdmin(admin.ModelAdmin):
|
|||||||
|
|
||||||
approve_requests.short_description = "✅ Approve selected requests"
|
approve_requests.short_description = "✅ Approve selected requests"
|
||||||
|
|
||||||
|
def save_model(self, request, obj, form, change):
|
||||||
|
"""Override save to handle existing user linking"""
|
||||||
|
super().save_model(request, obj, form, change)
|
||||||
|
|
||||||
|
# If approved and existing user was selected, link them
|
||||||
|
if obj.approved and obj.selected_existing_user and not obj.created_user:
|
||||||
|
try:
|
||||||
|
# Link telegram data to selected user
|
||||||
|
obj.selected_existing_user.telegram_user_id = obj.telegram_user_id
|
||||||
|
obj.selected_existing_user.telegram_username = obj.telegram_username
|
||||||
|
obj.selected_existing_user.telegram_first_name = obj.telegram_first_name or ""
|
||||||
|
obj.selected_existing_user.telegram_last_name = obj.telegram_last_name or ""
|
||||||
|
obj.selected_existing_user.save()
|
||||||
|
|
||||||
|
# Update the request to reference the linked user
|
||||||
|
obj.created_user = obj.selected_existing_user
|
||||||
|
obj.processed_by = request.user
|
||||||
|
obj.processed_at = timezone.now()
|
||||||
|
obj.save()
|
||||||
|
|
||||||
|
# Send notification
|
||||||
|
self._send_approval_notification(obj)
|
||||||
|
|
||||||
|
messages.success(request, f"Successfully linked Telegram user to existing user {obj.selected_existing_user.username}")
|
||||||
|
logger.info(f"Linked Telegram user {obj.telegram_user_id} to existing user {obj.selected_existing_user.username}")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
messages.error(request, f"Failed to link existing user: {e}")
|
||||||
|
logger.error(f"Failed to link existing user: {e}")
|
||||||
|
|
||||||
def _create_user_from_request(self, access_request, admin_user):
|
def _create_user_from_request(self, access_request, admin_user):
|
||||||
"""Create User from AccessRequest or link to existing user"""
|
"""Create User from AccessRequest or link to existing user"""
|
||||||
@@ -430,6 +483,19 @@ class AccessRequestAdmin(admin.ModelAdmin):
|
|||||||
logger.info(f"User already exists: {existing_user.username}")
|
logger.info(f"User already exists: {existing_user.username}")
|
||||||
return existing_user
|
return existing_user
|
||||||
|
|
||||||
|
# Check if admin selected an existing user to link
|
||||||
|
if access_request.selected_existing_user:
|
||||||
|
selected_user = access_request.selected_existing_user
|
||||||
|
logger.info(f"Linking Telegram user {access_request.telegram_user_id} to selected existing user {selected_user.username}")
|
||||||
|
|
||||||
|
# Link telegram data to selected user
|
||||||
|
selected_user.telegram_user_id = access_request.telegram_user_id
|
||||||
|
selected_user.telegram_username = access_request.telegram_username
|
||||||
|
selected_user.telegram_first_name = access_request.telegram_first_name or ""
|
||||||
|
selected_user.telegram_last_name = access_request.telegram_last_name or ""
|
||||||
|
selected_user.save()
|
||||||
|
return selected_user
|
||||||
|
|
||||||
# Check if we can link to existing user by telegram_username
|
# Check if we can link to existing user by telegram_username
|
||||||
if access_request.telegram_username:
|
if access_request.telegram_username:
|
||||||
existing_user_by_username = User.objects.filter(
|
existing_user_by_username = User.objects.filter(
|
||||||
|
@@ -0,0 +1,28 @@
|
|||||||
|
# Generated migration for adding selected_existing_user field
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
|
('telegram_bot', '0007_remove_botsettings_help_message_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='accessrequest',
|
||||||
|
name='selected_existing_user',
|
||||||
|
field=models.ForeignKey(
|
||||||
|
blank=True,
|
||||||
|
help_text='Existing user selected to link with this Telegram account',
|
||||||
|
null=True,
|
||||||
|
on_delete=django.db.models.deletion.SET_NULL,
|
||||||
|
related_name='selected_for_requests',
|
||||||
|
to=settings.AUTH_USER_MODEL
|
||||||
|
),
|
||||||
|
),
|
||||||
|
]
|
@@ -216,6 +216,14 @@ class AccessRequest(models.Model):
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Related objects
|
# Related objects
|
||||||
|
selected_existing_user = models.ForeignKey(
|
||||||
|
User,
|
||||||
|
null=True,
|
||||||
|
blank=True,
|
||||||
|
on_delete=models.SET_NULL,
|
||||||
|
related_name='selected_for_requests',
|
||||||
|
help_text="Existing user selected to link with this Telegram account"
|
||||||
|
)
|
||||||
created_user = models.ForeignKey(
|
created_user = models.ForeignKey(
|
||||||
User,
|
User,
|
||||||
null=True,
|
null=True,
|
||||||
|
Reference in New Issue
Block a user