diff --git a/back/.gitignore b/back/.gitignore
index 0aeae32..66651d4 100644
--- a/back/.gitignore
+++ b/back/.gitignore
@@ -87,4 +87,6 @@ __pycache__/
local_settings.py
.env
-db.sqlite3
\ No newline at end of file
+db.sqlite3
+
+migrations/00*
\ No newline at end of file
diff --git a/back/api/admin.py b/back/api/admin.py
index 8c38f3f..fd67800 100644
--- a/back/api/admin.py
+++ b/back/api/admin.py
@@ -1,3 +1,5 @@
from django.contrib import admin
+from .models import Product
# Register your models here.
+admin.site.register(Product)
diff --git a/back/api/migrations/0002_rename_task_product.py b/back/api/migrations/0002_rename_task_product.py
new file mode 100644
index 0000000..31c1020
--- /dev/null
+++ b/back/api/migrations/0002_rename_task_product.py
@@ -0,0 +1,17 @@
+# Generated by Django 5.0.4 on 2024-04-26 11:26
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.RenameModel(
+ old_name='Task',
+ new_name='Product',
+ ),
+ ]
diff --git a/back/api/migrations/0003_product_model3d.py b/back/api/migrations/0003_product_model3d.py
new file mode 100644
index 0000000..a6f5732
--- /dev/null
+++ b/back/api/migrations/0003_product_model3d.py
@@ -0,0 +1,18 @@
+# Generated by Django 5.0.4 on 2024-04-26 12:45
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0002_rename_task_product'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='product',
+ name='model3d',
+ field=models.FileField(default=None, null=True, upload_to=''),
+ ),
+ ]
diff --git a/back/api/migrations/0004_product_description.py b/back/api/migrations/0004_product_description.py
new file mode 100644
index 0000000..4b755d0
--- /dev/null
+++ b/back/api/migrations/0004_product_description.py
@@ -0,0 +1,18 @@
+# Generated by Django 5.0.4 on 2024-04-26 12:57
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0003_product_model3d'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='product',
+ name='description',
+ field=models.TextField(default=None, null=True),
+ ),
+ ]
diff --git a/back/api/models.py b/back/api/models.py
index 5c59ecb..809c60a 100644
--- a/back/api/models.py
+++ b/back/api/models.py
@@ -1,8 +1,11 @@
from django.db import models
+
# Create your models here.
-class Task(models.Model):
+class Product(models.Model):
title = models.CharField(max_length=100)
+ model3d = models.FileField(default=None, null=True)
+ description = models.TextField(default=None, null=True)
def __str__(self):
return self.title
diff --git a/back/api/serializers.py b/back/api/serializers.py
index 94f05b6..758fdd7 100644
--- a/back/api/serializers.py
+++ b/back/api/serializers.py
@@ -1,11 +1,13 @@
from rest_framework import routers, serializers, viewsets
-from .models import Task
+from .models import Product
-class TaskSerializer(serializers.HyperlinkedModelSerializer):
+class ProductSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
- model = Task
+ model = Product
fields = [
"id",
"title",
+ "model3d",
+ "description"
]
diff --git a/back/api/views.py b/back/api/views.py
index e07d33a..a1dc6fb 100644
--- a/back/api/views.py
+++ b/back/api/views.py
@@ -2,22 +2,22 @@ from django.shortcuts import render
from rest_framework.parsers import JSONParser
from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse, JsonResponse
-from .serializers import TaskSerializer
-from .models import Task
+from .serializers import ProductSerializer
+from .models import Product
@csrf_exempt
-def tasks(request):
+def products(request):
"""
List all task snippets
"""
if request.method == "GET":
- tasks = Task.objects.all()
- serializer = TaskSerializer(tasks, many=True)
+ tasks = Product.objects.all()
+ serializer = ProductSerializer(tasks, many=True)
return JsonResponse(serializer.data, safe=False)
elif request.method == "POST":
data = JSONParser().parse(request)
- serializer = TaskSerializer(data=data)
+ serializer = ProductSerializer(data=data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data, status=201)
diff --git a/back/back/settings.py b/back/back/settings.py
index e7716fa..4b6207b 100644
--- a/back/back/settings.py
+++ b/back/back/settings.py
@@ -25,9 +25,29 @@ SECRET_KEY = "django-insecure-ly8rk@zb&ne*-063&q-=81!d@8q0hh4$&q!_7mtqc81(rlejqd
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
-ALLOWED_HOSTS = []
-
-
+ALLOWED_HOSTS = [
+ "localhost",
+ "localhost:8000",
+ "127.0.0.1",
+ "127.0.0.1:8000",
+ "192.168.103.159",
+ "192.168.103.159:8000",
+]
+CSRF_TRUSTED_ORIGINS = (
+ "http://localhost",
+ "http://192.168.103.159",
+)
+CORS_ORIGIN_ALLOW_ALL = False
+CORS_ORIGIN_WHITELIST = [
+ "null",
+ "http://localhost",
+ "http://localhost:4173",
+ "http://localhost:5173",
+ "http://localhost:8000",
+ "http://127.0.0.1",
+ "http://192.168.103.159",
+ "http://192.168.103.159:8000",
+]
# Application definition
INSTALLED_APPS = [
@@ -37,6 +57,7 @@ INSTALLED_APPS = [
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
+ "corsheaders",
"api",
"rest_framework",
]
@@ -45,6 +66,7 @@ MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",
+ "corsheaders.middleware.CorsMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.messages.middleware.MessageMiddleware",
@@ -122,4 +144,34 @@ STATIC_URL = "static/"
# Default primary key field type
# https://docs.djangoproject.com/en/5.0/ref/settings/#default-auto-field
+
DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
+LOGGING = {
+ "version": 1,
+ "disable_existing_loggers": False,
+ "formatters": {
+ "verbose": {
+ "format": "{levelname} {asctime} {module} {process:d} {thread:d} {message}",
+ "style": "{",
+ },
+ "large": {
+ "format": "%(asctime)s %(levelname)s %(process)d %(filename)s:%(lineno)d "
+ + "%(funcName)s %(message)s "
+ },
+ "simple": {
+ "format": "{levelname} {asctime} {module} {message}",
+ "style": "{",
+ },
+ },
+ "handlers": {
+ "console": {
+ "level": "INFO",
+ "class": "logging.StreamHandler",
+ "formatter": "large",
+ },
+ },
+ "root": {
+ "handlers": ["console"],
+ "level": "INFO",
+ },
+}
diff --git a/back/back/urls.py b/back/back/urls.py
index 5a1c43d..8af0b95 100644
--- a/back/back/urls.py
+++ b/back/back/urls.py
@@ -19,6 +19,6 @@ from django.urls import path
from api import views
urlpatterns = [
- path('admin/', admin.site.urls),
- path('api/', views.tasks),
+ path("admin/", admin.site.urls),
+ path("api/products", views.products),
]
diff --git a/front/.env.development b/front/.env.development
new file mode 100644
index 0000000..1795ce7
--- /dev/null
+++ b/front/.env.development
@@ -0,0 +1 @@
+VITE_SERVER_URL='http://localhost:8000'
\ No newline at end of file
diff --git a/front/.gitignore b/front/.gitignore
index 8ee54e8..a547bf3 100644
--- a/front/.gitignore
+++ b/front/.gitignore
@@ -8,23 +8,17 @@ pnpm-debug.log*
lerna-debug.log*
node_modules
-.DS_Store
dist
dist-ssr
-coverage
*.local
-/cypress/videos/
-/cypress/screenshots/
-
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
+.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
-
-*.tsbuildinfo
diff --git a/front/README.md b/front/README.md
index cfdbcc6..0bfecb0 100644
--- a/front/README.md
+++ b/front/README.md
@@ -1,29 +1,9 @@
-# interactive-table
+# Vue 3 + TypeScript + Vite
-This template should help get you started developing with Vue 3 in Vite.
+This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 `
+