From 9aa144faf825270a6043b430c90d7af97b17331f Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 12 Jul 2025 05:11:08 +0530 Subject: [PATCH] Add database population for Railway deployment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Create populate_agents management command to add default agents - Add admin user creation (admin@netcop.ai / admin123) - Update Railway startup to run population after migrations - This fixes empty marketplace and login issues on Railway 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .../management/commands/populate_agents.py | 93 +++++++++++++++++++ railway.json | 2 +- 2 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 agent_base/management/commands/populate_agents.py diff --git a/agent_base/management/commands/populate_agents.py b/agent_base/management/commands/populate_agents.py new file mode 100644 index 0000000..33b4d15 --- /dev/null +++ b/agent_base/management/commands/populate_agents.py @@ -0,0 +1,93 @@ +from django.core.management.base import BaseCommand +from django.contrib.auth import get_user_model +from agent_base.models import BaseAgent + +User = get_user_model() + + +class Command(BaseCommand): + help = 'Populate the database with default agents and create admin user' + + def handle(self, *args, **options): + self.stdout.write("Creating admin user...") + + # Create superuser if it doesn't exist + if not User.objects.filter(is_superuser=True).exists(): + User.objects.create_superuser( + email='admin@netcop.ai', + password='admin123', + first_name='Admin', + last_name='User' + ) + self.stdout.write("Created superuser: admin@netcop.ai / admin123") + else: + self.stdout.write("Superuser already exists") + + self.stdout.write("Creating default agents...") + + agents_data = [ + { + 'name': 'Weather Reporter', + 'slug': 'weather-reporter', + 'description': 'Get real-time weather information for any location worldwide. Provides current conditions, forecasts, and detailed weather reports.', + 'category': 'utilities', + 'price': 2.0, + 'icon': '🌤️', + 'agent_type': 'api', + }, + { + 'name': 'Data Analyzer', + 'slug': 'data-analyzer', + 'description': 'Analyze and extract insights from your data files. Supports PDF, CSV, and text analysis with AI-powered insights.', + 'category': 'analytics', + 'price': 5.0, + 'icon': '📊', + 'agent_type': 'webhook', + }, + { + 'name': 'Job Posting Generator', + 'slug': 'job-posting-generator', + 'description': 'Create professional job postings with AI assistance. Generate compelling job descriptions that attract the right candidates.', + 'category': 'content', + 'price': 3.0, + 'icon': '💼', + 'agent_type': 'webhook', + }, + { + 'name': 'Social Ads Generator', + 'slug': 'social-ads-generator', + 'description': 'Generate engaging social media advertisements. Create compelling ad copy for various platforms to boost your marketing campaigns.', + 'category': 'marketing', + 'price': 4.0, + 'icon': '📱', + 'agent_type': 'webhook', + }, + ] + + created_count = 0 + updated_count = 0 + + for agent_data in agents_data: + agent, created = BaseAgent.objects.get_or_create( + slug=agent_data['slug'], + defaults=agent_data + ) + + if created: + created_count += 1 + self.stdout.write(f"Created: {agent.name}") + else: + # Update existing agent + for key, value in agent_data.items(): + if key != 'slug': + setattr(agent, key, value) + agent.save() + updated_count += 1 + self.stdout.write(f"Updated: {agent.name}") + + self.stdout.write( + self.style.SUCCESS( + f"Successfully processed {len(agents_data)} agents: " + f"{created_count} created, {updated_count} updated" + ) + ) \ No newline at end of file diff --git a/railway.json b/railway.json index 642b29a..06f9921 100644 --- a/railway.json +++ b/railway.json @@ -4,7 +4,7 @@ "builder": "NIXPACKS" }, "deploy": { - "startCommand": "python manage.py migrate && python manage.py collectstatic --noinput && gunicorn netcop_hub.wsgi:application", + "startCommand": "python manage.py migrate && python manage.py populate_agents && python manage.py collectstatic --noinput && gunicorn netcop_hub.wsgi:application", "restartPolicyType": "ON_FAILURE", "restartPolicyMaxRetries": 10 }