Skip to content
Merged
1 change: 1 addition & 0 deletions server/djangomaps/bin/python
1 change: 1 addition & 0 deletions server/djangomaps/bin/python3
1 change: 1 addition & 0 deletions server/djangomaps/bin/python3.12
1 change: 1 addition & 0 deletions server/djangomaps/lib64
5 changes: 5 additions & 0 deletions server/djangomaps/pyvenv.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
home = /usr/bin
include-system-site-packages = false
version = 3.12.3
executable = /usr/bin/python3.12
command = /usr/bin/python3 -m venv /home/iroha/intermediate_team_1/server/djangomaps
Empty file added server/home_page/__init__.py
Empty file.
3 changes: 3 additions & 0 deletions server/home_page/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 server/home_page/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from django.apps import AppConfig


class HomePageConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'home_page'
Empty file.
89 changes: 89 additions & 0 deletions server/home_page/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
from django.db import models

from pet.models import Pet
from tasks.models import Task
from registration.models import Household, Business, PetCarer
from vet.models import VetClinic

# Create your models here.

# NOTE: new address class to simplify code [SUGGESTION]
# class Address(models.Model):
# streetName = models.CharField(max_length=200)
# suburb = models.CharField(max_length=100)
# postcode = models.CharField(max_length=10)
# state = models.CharField(max_length=5)
# country = models.CharField(max_length=30)
#
# class Household(models.Model):
# # [insert petcarer id here, from Kerry]
# houseName = models.CharField(max_length=20)
# houseNo = models.PositiveIntegerField() # houseNo is the same thing as streetNo in the DB diagram
# address = models.ForeignKey(Address, on_delete=models.CASCADE)
# def __str__(self):
# return self.address
#
# class Business(models.Model):
# businessID = models.CharField(max_length=10)
# # [insert petcarer id here, from Kerry]
# businessName = models.CharField(max_length=20)
# buildingNo = models.PositiveIntegerField() # buildingNo is the same thing as streetNo in the DB diagram
# def __str__(self):
# return self.address


# NOTE: selectable pets [SUGGESTION]
# class Pet(models.Model):
# CAT = 'cat'
# DOG = 'dog'
# BIRD = 'bir'
# FISH = 'fis'
# ANIMAL_TYPES = {
# CAT: "Cat",
# DOG: "Dog",
# BIRD: "Bird",
# FISH: "Fish",
# }
# animalType = models.CharField(
# max_length=3,
# choices=ANIMAL_TYPES,
# default=CAT,
# )
#
# petID = models.CharField(max_length=10)
# petName = models.CharField(max_length=20)
# birthDate = models.DateField()
# petBreed = models.CharField(max_length=15)
# weight = models.PositiveIntegerField()
# # not sure what exerciseReq means
# # [insert Household foreign key here]
# # [insert Business foreign key here]
# def __str__(self):
# return self.petID


# NOTE: crosscheck with Annabelle's tasks class
# class PetTasks(models.Model): # the same thing as Tasks in the DB diagram
# petID = models.ForeignKey(Pet, on_delete=models.CASCADE)
# title = models.CharField(max_length=100)
# description = models.CharField(max_length=1000)
# due = models.DateTimeField()
# isComplete = models.BooleanField(default=False)
# def __str__(self):
# return self.title


class SymptomInstance(models.Model):
petID = models.ForeignKey(Pet, on_delete=models.CASCADE)
symptomType = models.CharField(max_length=100)
extraInfo = models.CharField(max_length=1000)
dateAndTime = models.DateTimeField()
def __str__(self):
return self.symptomType

class VetAppointment(models.Model):
petID = models.ForeignKey(Pet, on_delete=models.CASCADE)
dateAndTime = models.DateTimeField()
vetClinic - models.ForeignKey(VetClinic, on_delete=models.CASCADE)
def __str__(self):
return f"{self.petID} - {self.dateAndTime}"
3 changes: 3 additions & 0 deletions server/home_page/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.
9 changes: 9 additions & 0 deletions server/home_page/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from django.urls import path
from . import views

app_name = "home_page"
urlpatterns = [
path("", views.main.as_view(), name="home"),
# path("api/mapbox/suggestions/", views.get_mapbox_suggestions, name="mapbox_suggestions"),
path("<int:pk>", views.PetDetail.as_view(), name="pet-details"),
]
51 changes: 51 additions & 0 deletions server/home_page/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
from django.shortcuts import render
from rest_framework import generics, permissions
from rest_framework.response import Response
from rest_framework.views import APIView
from django.conf import settings
from django.http import JsonResponse
from django.views.decorators.http import require_http_methods
from django.apps import apps
from django.views import View

pet = apps.get_model('pet','Pet')
tasks = apps.get_model('tasks', 'Task')
from pet.serializers import PetSerializer
from user_profile.permissions import IsUserOrReadOnly
# remember to also import household and business

# Create your views here.

class main(View):
def get(self, request):
petTasks = tasks.objects.all().values()
return JsonResponse(list(petTasks), safe=False)

class PetDetail(generics.RetrieveUpdateAPIView):
permission_classes = (permissions.IsAuthenticated, IsUserOrReadOnly)
queryset = pet.objects.all()
serializer_class = PetSerializer


# NOTE: messing around with MAPBOX API but we may actually need it in the future, so I've left the code here
# MAPBOX_SUGGEST_URL = "https://api.mapbox.com/search/searchbox/v1/suggest"
#
# @require_http_methods(["GET"])
# def get_mapbox_suggestions(request):
# query = request.GET.get('q')
#
# if not query:
# return JsonResponse({"error": "Missing query parameter 'q'"}, status=400)
#
# params = {
# 'q': query,
# 'access_token': settings.MAPBOX_ACCESS_TOKEN,
# }
#
# try:
# mapbox_response = requests.get(MAPBOX_SUGGEST_URL, params=params)
# mapbox_response.raise_for_status()
# return JsonResponse(mapbox_response.json())
#
# except requests.exceptions.RequestException as e:
# return JsonResponse({'error': f"Mapbox API error: {e}"}, status=500)
3 changes: 3 additions & 0 deletions server/landing_page/admin.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
from django.contrib import admin
from .models import Pricing, Feature

# Register your models here.
admin.site.register(Pricing)
admin.site.register(Feature)
25 changes: 25 additions & 0 deletions server/pet/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
from rest_framework import serializers
from .models import Pet, Food, Medication

class PetSerializer(serializers.ModelSerializer):
class Meta:
model = Pet
fields = "__all__"

class FoodSerializer(serializers.ModelSerializer):
profile = PetSerializer(read_only=True)

class Meta:
model = Food
fields = (
"id",
)

class MedicationSerializer(serializers.ModelSerializer):
profile = PetSerializer(read_only=True)

class Meta:
model = Medication
fields = (
"id",
)
4 changes: 4 additions & 0 deletions server/server/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,10 @@
"health.apps.HealthConfig",
]

MAPBOX_ACCESS_TOKEN = 'pk.eyJ1IjoiaXJvaGE4ODg4IiwiYSI6ImNtaXR3YWFvdzA5eHEzZHM4dzB2cDI2dXAifQ.ZXNuWEnqCHBnT79aW8fBNg'



MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
Expand Down
3 changes: 2 additions & 1 deletion server/server/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,10 @@
path("api/user/", include("user_profile.urls")),
path("pet/", include("pet.urls")),
path("tasks/", include("tasks.urls")),
path("home/", include("landing_page.urls")),
path("landing/", include("landing_page.urls")),
path("dog/", include("dog.urls")),
path("vet/", include("vet.urls")),
path("home/", include("home_page.urls")),
path("shop/", include("shop.urls")),
path("health/", include("health.urls"))
]
18 changes: 18 additions & 0 deletions server/tasks/migrations/0002_alter_task_descr.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 5.2.8 on 2025-12-10 06:25

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('tasks', '0001_initial'),
]

operations = [
migrations.AlterField(
model_name='task',
name='descr',
field=models.TextField(blank=True, default='Insert description here'),
),
]
18 changes: 18 additions & 0 deletions server/tasks/migrations/0003_alter_task_descr.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 5.2.8 on 2025-12-10 06:25

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('tasks', '0002_alter_task_descr'),
]

operations = [
migrations.AlterField(
model_name='task',
name='descr',
field=models.TextField(null=True),
),
]
2 changes: 1 addition & 1 deletion server/tasks/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,4 @@ class Task(models.Model):
due = models.DateTimeField()
isComplete = models.BooleanField(default=False)
def __str__(self):
return self.title
return self.title
Loading