diff --git a/server/djangomaps/bin/python b/server/djangomaps/bin/python new file mode 120000 index 0000000..b8a0adb --- /dev/null +++ b/server/djangomaps/bin/python @@ -0,0 +1 @@ +python3 \ No newline at end of file diff --git a/server/djangomaps/bin/python3 b/server/djangomaps/bin/python3 new file mode 120000 index 0000000..ae65fda --- /dev/null +++ b/server/djangomaps/bin/python3 @@ -0,0 +1 @@ +/usr/bin/python3 \ No newline at end of file diff --git a/server/djangomaps/bin/python3.12 b/server/djangomaps/bin/python3.12 new file mode 120000 index 0000000..b8a0adb --- /dev/null +++ b/server/djangomaps/bin/python3.12 @@ -0,0 +1 @@ +python3 \ No newline at end of file diff --git a/server/djangomaps/lib64 b/server/djangomaps/lib64 new file mode 120000 index 0000000..7951405 --- /dev/null +++ b/server/djangomaps/lib64 @@ -0,0 +1 @@ +lib \ No newline at end of file diff --git a/server/djangomaps/pyvenv.cfg b/server/djangomaps/pyvenv.cfg new file mode 100644 index 0000000..ce982c5 --- /dev/null +++ b/server/djangomaps/pyvenv.cfg @@ -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 diff --git a/server/home_page/__init__.py b/server/home_page/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/home_page/admin.py b/server/home_page/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/server/home_page/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/server/home_page/apps.py b/server/home_page/apps.py new file mode 100644 index 0000000..824489a --- /dev/null +++ b/server/home_page/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class HomePageConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'home_page' diff --git a/server/home_page/migrations/__init__.py b/server/home_page/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/home_page/models.py b/server/home_page/models.py new file mode 100644 index 0000000..64ed077 --- /dev/null +++ b/server/home_page/models.py @@ -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}" diff --git a/server/home_page/tests.py b/server/home_page/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/server/home_page/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/server/home_page/urls.py b/server/home_page/urls.py new file mode 100644 index 0000000..e4b03b1 --- /dev/null +++ b/server/home_page/urls.py @@ -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("", views.PetDetail.as_view(), name="pet-details"), +] diff --git a/server/home_page/views.py b/server/home_page/views.py new file mode 100644 index 0000000..16dc931 --- /dev/null +++ b/server/home_page/views.py @@ -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) diff --git a/server/landing_page/admin.py b/server/landing_page/admin.py index 8c38f3f..190693f 100644 --- a/server/landing_page/admin.py +++ b/server/landing_page/admin.py @@ -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) diff --git a/server/pet/serializers.py b/server/pet/serializers.py new file mode 100644 index 0000000..5ff87d0 --- /dev/null +++ b/server/pet/serializers.py @@ -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", + ) diff --git a/server/server/settings.py b/server/server/settings.py index 0887fcb..a2ced19 100644 --- a/server/server/settings.py +++ b/server/server/settings.py @@ -59,6 +59,10 @@ "health.apps.HealthConfig", ] +MAPBOX_ACCESS_TOKEN = 'pk.eyJ1IjoiaXJvaGE4ODg4IiwiYSI6ImNtaXR3YWFvdzA5eHEzZHM4dzB2cDI2dXAifQ.ZXNuWEnqCHBnT79aW8fBNg' + + + MIDDLEWARE = [ "django.middleware.security.SecurityMiddleware", "django.contrib.sessions.middleware.SessionMiddleware", diff --git a/server/server/urls.py b/server/server/urls.py index 73fb9a1..04cee5e 100644 --- a/server/server/urls.py +++ b/server/server/urls.py @@ -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")) ] diff --git a/server/tasks/migrations/0002_alter_task_descr.py b/server/tasks/migrations/0002_alter_task_descr.py new file mode 100644 index 0000000..0eb1f19 --- /dev/null +++ b/server/tasks/migrations/0002_alter_task_descr.py @@ -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'), + ), + ] diff --git a/server/tasks/migrations/0003_alter_task_descr.py b/server/tasks/migrations/0003_alter_task_descr.py new file mode 100644 index 0000000..ecabd90 --- /dev/null +++ b/server/tasks/migrations/0003_alter_task_descr.py @@ -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), + ), + ] diff --git a/server/tasks/models.py b/server/tasks/models.py index 70e7e09..2e477ec 100644 --- a/server/tasks/models.py +++ b/server/tasks/models.py @@ -9,4 +9,4 @@ class Task(models.Model): due = models.DateTimeField() isComplete = models.BooleanField(default=False) def __str__(self): - return self.title \ No newline at end of file + return self.title