Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 18 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,20 @@
# Byte-compiled / optimized / DLL files
__pycache__/
*.pyc

# Virtual environments
env/
.pyc
venv/
.venv/

# Django database
db.sqlite3
__pychache__/

# Environment variables
.env

.vscode/
.idea/

.history/
.lh/
Empty file added agents/__init__.py
Empty file.
3 changes: 3 additions & 0 deletions agents/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.contrib import admin

# Register your models here.
6 changes: 6 additions & 0 deletions agents/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from django.apps import AppConfig


class AgentsConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'agents'
22 changes: 22 additions & 0 deletions agents/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Generated by Django 5.2.6 on 2025-09-07 15:50

from django.db import migrations, models


class Migration(migrations.Migration):

initial = True

dependencies = [
]

operations = [
migrations.CreateModel(
name='Agent',
fields=[
('agent_id', models.AutoField(primary_key=True, serialize=False)),
('agent_name', models.CharField(max_length=255)),
('description', models.TextField()),
],
),
]
17 changes: 17 additions & 0 deletions agents/migrations/0002_alter_agent_agent_name.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Generated by Django 4.2.11 on 2025-09-08 08:44

from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("agents", "0001_initial"),
]

operations = [
migrations.AlterField(
model_name="agent",
name="agent_name",
field=models.CharField(max_length=255, unique=True),
),
]
Empty file added agents/migrations/__init__.py
Empty file.
9 changes: 9 additions & 0 deletions agents/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from django.db import models

class Agent(models.Model):
agent_id = models.AutoField(primary_key=True)
agent_name = models.CharField(max_length=255, unique=True)
description = models.TextField()

def __str__(self):
return self.agent_name
35 changes: 35 additions & 0 deletions agents/tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
from django.test import TestCase
from django.db import IntegrityError, transaction
from .models import Agent

class AgentModelTest(TestCase):
def setUp(self):
self.agent = Agent.objects.create(
agent_name="Test Agent",
description="A test agent for unit testing."
)

def test_agent_creation(self):
self.assertEqual(self.agent.agent_name, "Test Agent")
self.assertEqual(self.agent.description, "A test agent for unit testing.")
self.assertIsInstance(self.agent, Agent)

def test_agent_str_representation(self):
self.assertEqual(str(self.agent), "Test Agent")

def test_agent_id_auto_increment(self):
another_agent = Agent.objects.create(
agent_name="Second Agent",
description="Another test agent."
)
self.assertNotEqual(self.agent.agent_id, another_agent.agent_id)
self.assertTrue(another_agent.agent_id > self.agent.agent_id)

def test_agent_name_uniqueness(self):
"""Test that agent_name must be unique."""
with self.assertRaises(IntegrityError):
with transaction.atomic():
Agent.objects.create(
agent_name="Test Agent",
description="Should fail"
)
3 changes: 3 additions & 0 deletions agents/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.shortcuts import render

# Create your views here.
Empty file added api/__init__.py
Empty file.
3 changes: 3 additions & 0 deletions api/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.contrib import admin

# Register your models here.
6 changes: 6 additions & 0 deletions api/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from django.apps import AppConfig


class ApiConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'api'
Empty file added api/migrations/__init__.py
Empty file.
3 changes: 3 additions & 0 deletions api/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.db import models

# Create your models here.
7 changes: 7 additions & 0 deletions api/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from rest_framework import serializers
from agents.models import Agent

class AgentSerializer(serializers.ModelSerializer):
class Meta:
model = Agent
fields = ['agent_id', 'agent_name', 'description']
3 changes: 3 additions & 0 deletions api/tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.test import TestCase

# Create your tests here.
7 changes: 7 additions & 0 deletions api/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from django.urls import path
from .views import AgentListCreateView, AgentRetrieveUpdateDestroyView

urlpatterns = [
path('agents/', AgentListCreateView.as_view(), name='agent-list-create'),
path('agents/<int:agent_id>/', AgentRetrieveUpdateDestroyView.as_view(), name='agent-detail'),
]
12 changes: 12 additions & 0 deletions api/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from rest_framework import generics
from agents.models import Agent
from .serializers import AgentSerializer

class AgentListCreateView(generics.ListCreateAPIView):
queryset = Agent.objects.all()
serializer_class = AgentSerializer

class AgentRetrieveUpdateDestroyView(generics.RetrieveUpdateDestroyAPIView):
queryset = Agent.objects.all()
serializer_class = AgentSerializer
lookup_field = 'agent_id'
15 changes: 11 additions & 4 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
asgiref==3.8.1
backports-zoneinfo==0.2.1
django==4.2.24
black==23.12.1
click==8.1.8
django==4.2.11
djangorestframework==3.15.2
mypy-extensions==1.1.0
packaging==25.0
pathspec==0.12.1
platformdirs==4.3.6
psycopg==3.2.9
psycopg2-binary==2.9.10
sqlparse==0.5.3
typing-extensions==4.13.2
black==24.8.0
whitenoise==6.7.0
4 changes: 4 additions & 0 deletions zeno/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,12 @@
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'agents',
'rest_framework',
'api',
]


MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
Expand Down
3 changes: 2 additions & 1 deletion zeno/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,9 @@
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from django.urls import path, include

urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('api.urls')),
]