Moving fast and breaking things
This is a first commit in preparation for 2.0 - now using prototempaltes™ - updated README - makefile for some nice shortcuts - add new tikettes - remove tikettes Things that don't work (yet) - authentication on the main frontend (there is none) - generating PDFs
This commit is contained in:
152
backend/zetikettes/initial_db.json
Normal file
152
backend/zetikettes/initial_db.json
Normal file
@@ -0,0 +1,152 @@
|
||||
[
|
||||
{
|
||||
"model": "tikette.tisub",
|
||||
"pk": 2,
|
||||
"fields": {
|
||||
"name": "dluo",
|
||||
"descritpion": "DLUO",
|
||||
"default": "décembre 1992",
|
||||
"type": "YM"
|
||||
}
|
||||
},
|
||||
{
|
||||
"model": "tikette.tisub",
|
||||
"pk": 3,
|
||||
"fields": {
|
||||
"name": "lot",
|
||||
"descritpion": "№ de lot",
|
||||
"default": "1234-5",
|
||||
"type": "ST"
|
||||
}
|
||||
},
|
||||
{
|
||||
"model": "tikette.tisub",
|
||||
"pk": 4,
|
||||
"fields": {
|
||||
"name": "qty",
|
||||
"descritpion": "Poids net (g)",
|
||||
"default": "370",
|
||||
"type": "ST"
|
||||
}
|
||||
},
|
||||
{
|
||||
"model": "tikette.tisub",
|
||||
"pk": 5,
|
||||
"fields": {
|
||||
"name": "teneur",
|
||||
"descritpion": "Teneur en fruits (%)",
|
||||
"default": "50",
|
||||
"type": "ST"
|
||||
}
|
||||
},
|
||||
{
|
||||
"model": "tikette.tisub",
|
||||
"pk": 6,
|
||||
"fields": {
|
||||
"name": "fruit",
|
||||
"descritpion": "Quantité de fruits pour 100g (g)",
|
||||
"default": "60",
|
||||
"type": "ST"
|
||||
}
|
||||
},
|
||||
{
|
||||
"model": "tikette.tikategory",
|
||||
"pk": 1,
|
||||
"fields": {
|
||||
"name": "Pesto",
|
||||
"landscape": true,
|
||||
"prototempalte": "Pesto.svg",
|
||||
"subs": [
|
||||
2,
|
||||
3,
|
||||
4
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"model": "tikette.tikategory",
|
||||
"pk": 2,
|
||||
"fields": {
|
||||
"name": "Confiture",
|
||||
"landscape": true,
|
||||
"prototempalte": "Confiture.svg",
|
||||
"subs": [
|
||||
2,
|
||||
3,
|
||||
4,
|
||||
5,
|
||||
6
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"model": "tikette.tikategory",
|
||||
"pk": 3,
|
||||
"fields": {
|
||||
"name": "Chocolat",
|
||||
"landscape": false,
|
||||
"prototempalte": "Chocolat.svg",
|
||||
"subs": [
|
||||
2,
|
||||
3,
|
||||
4
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"model": "tikette.tikategory",
|
||||
"pk": 4,
|
||||
"fields": {
|
||||
"name": "Aromate",
|
||||
"landscape": false,
|
||||
"prototempalte": "Aromate.svg",
|
||||
"subs": [
|
||||
2,
|
||||
3,
|
||||
4
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"model": "tikette.tikategory",
|
||||
"pk": 5,
|
||||
"fields": {
|
||||
"name": "Sel",
|
||||
"landscape": true,
|
||||
"prototempalte": "Sel.svg",
|
||||
"subs": [
|
||||
2,
|
||||
3,
|
||||
4
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"model": "tikette.tikategory",
|
||||
"pk": 6,
|
||||
"fields": {
|
||||
"name": "Sirop",
|
||||
"landscape": false,
|
||||
"prototempalte": "Sirop.svg",
|
||||
"subs": [
|
||||
2,
|
||||
3,
|
||||
4
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"model": "tikette.tikategory",
|
||||
"pk": 7,
|
||||
"fields": {
|
||||
"name": "Tisane",
|
||||
"landscape": false,
|
||||
"prototempalte": "Tisane.svg",
|
||||
"subs": [
|
||||
2,
|
||||
3,
|
||||
4
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
@@ -1,8 +1,9 @@
|
||||
from django.contrib import admin
|
||||
|
||||
from .models import Tikette, Tikategory, Tisub
|
||||
from .models import Tikette, Tizer, Tikategory, Tisub
|
||||
|
||||
admin.site.register(Tikette)
|
||||
admin.site.register(Tizer)
|
||||
admin.site.register(Tikategory)
|
||||
admin.site.register(Tisub)
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
# Generated by Django 4.2.2 on 2023-07-03 14:37
|
||||
# Generated by Django 5.2.4 on 2025-08-05 12:57
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
@@ -18,6 +18,7 @@ class Migration(migrations.Migration):
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('name', models.CharField(max_length=50)),
|
||||
('landscape', models.BooleanField()),
|
||||
('prototempalte', models.FileField(upload_to='')),
|
||||
],
|
||||
options={
|
||||
'verbose_name_plural': 'tikategoriez',
|
||||
@@ -30,22 +31,41 @@ class Migration(migrations.Migration):
|
||||
('name', models.CharField(max_length=50)),
|
||||
('descritpion', models.TextField()),
|
||||
('default', models.TextField()),
|
||||
('type', models.CharField(choices=[('ST', 'Short Text'), ('LT', 'Long Text'), ('C', 'Color'), ('YM', 'Year Month'), ('B', 'Boolean')], default='ST', max_length=2)),
|
||||
],
|
||||
options={
|
||||
'verbose_name_plural': 'tisubz',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Tizer',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('email', models.CharField()),
|
||||
],
|
||||
options={
|
||||
'verbose_name_plural': 'tizerz',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Tikette',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('title', models.CharField(max_length=100)),
|
||||
('svg', models.FileField(upload_to='')),
|
||||
('designation', models.CharField(max_length=100)),
|
||||
('ingredients', models.TextField()),
|
||||
('description', models.TextField()),
|
||||
('color', models.CharField(max_length=6)),
|
||||
('ab', models.CharField(choices=[('inline', 'Visible'), ('none', 'Invisible')], max_length=7)),
|
||||
('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tikette.tikategory')),
|
||||
('subs', models.ManyToManyField(to='tikette.tisub')),
|
||||
],
|
||||
options={
|
||||
'verbose_name_plural': 'tikettz',
|
||||
},
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='tikategory',
|
||||
name='subs',
|
||||
field=models.ManyToManyField(to='tikette.tisub'),
|
||||
),
|
||||
]
|
||||
|
@@ -1,22 +0,0 @@
|
||||
# Generated by Django 5.2.4 on 2025-08-04 14:31
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('tikette', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RemoveField(
|
||||
model_name='tikette',
|
||||
name='subs',
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='tikategory',
|
||||
name='subs',
|
||||
field=models.ManyToManyField(to='tikette.tisub'),
|
||||
),
|
||||
]
|
@@ -1,9 +1,18 @@
|
||||
from django.db import models
|
||||
|
||||
class Tisub(models.Model):
|
||||
class Type(models.TextChoices):
|
||||
SHORT_TEXT = "ST"
|
||||
LONG_TEXT = "LT"
|
||||
COLOR = "C"
|
||||
YEAR_MONTH = "YM"
|
||||
BOOLEAN = "B"
|
||||
|
||||
name = models.CharField(max_length=50)
|
||||
descritpion = models.TextField()
|
||||
default = models.TextField()
|
||||
# everything is text. type is for UX (e.g. color picker)
|
||||
type = models.CharField(max_length=2, choices=Type, default=Type.SHORT_TEXT)
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
@@ -16,6 +25,10 @@ class Tikategory(models.Model):
|
||||
name = models.CharField(max_length=50)
|
||||
landscape = models.BooleanField()
|
||||
subs = models.ManyToManyField(Tisub)
|
||||
# For now we'll hardcode the following:xi
|
||||
# [designation, ingredients, description, color, AB, designation_fontsize]
|
||||
#protosubs = models.ManyToManyField(Tisub, related_name="protosubs")
|
||||
prototempalte = models.FileField()
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
@@ -25,9 +38,19 @@ class Tikategory(models.Model):
|
||||
|
||||
|
||||
class Tikette(models.Model):
|
||||
class AbVisibility(models.TextChoices):
|
||||
VISIBLE = "inline"
|
||||
INVISIBLE = "none"
|
||||
|
||||
title = models.CharField(max_length=100)
|
||||
category = models.ForeignKey(Tikategory, on_delete=models.CASCADE)
|
||||
svg = models.FileField()
|
||||
|
||||
designation = models.CharField(max_length=100)
|
||||
ingredients = models.TextField()
|
||||
description = models.TextField()
|
||||
color = models.CharField(max_length=6)
|
||||
ab = models.CharField(max_length=7, choices=AbVisibility)
|
||||
# designation_fontsize is hardcoded to 42.6667
|
||||
|
||||
def __str__(self):
|
||||
return self.title
|
||||
@@ -35,4 +58,12 @@ class Tikette(models.Model):
|
||||
class Meta:
|
||||
verbose_name_plural = "tikettz"
|
||||
|
||||
# Create your models here.
|
||||
|
||||
class Tizer(models.Model):
|
||||
email = models.CharField()
|
||||
|
||||
def __str__(self):
|
||||
return self.email
|
||||
|
||||
class Meta:
|
||||
verbose_name_plural = "tizerz"
|
||||
|
@@ -10,16 +10,26 @@ from .models import Tikette, Tikategory
|
||||
|
||||
CORS={'access-control-allow-origin': '*'}
|
||||
|
||||
def index(request):
|
||||
|
||||
def get_list(request):
|
||||
tikettes = [{
|
||||
'id': x.id,
|
||||
'title': x.title,
|
||||
'category': x.category.name,
|
||||
'sticker': x.svg.name,
|
||||
'landscape': x.category.landscape,
|
||||
'subs': {x.name: x.default for x in x.category.subs.all()},
|
||||
} for x in Tikette.objects.all()]
|
||||
return JsonResponse({'status': 'ok', 'tikettes': tikettes}, headers=CORS)
|
||||
|
||||
|
||||
def get_categories(request):
|
||||
tikats = [{
|
||||
'id': x.id,
|
||||
'name': x.name,
|
||||
} for x in Tikategory.objects.all()]
|
||||
return JsonResponse({'status': 'ok', 'tikats': tikats}, headers=CORS)
|
||||
|
||||
|
||||
@csrf_exempt
|
||||
def generate(request):
|
||||
if request.method != "POST":
|
||||
@@ -29,3 +39,26 @@ def generate(request):
|
||||
pdfpath = stickersheet.generate(payload, out_dir=settings.TIKETTE_OUT_DIR)
|
||||
|
||||
return JsonResponse({'status': 'ok', 'file': pdfpath}, headers=CORS)
|
||||
|
||||
|
||||
@csrf_exempt
|
||||
def newtikette(request):
|
||||
if request.method != "POST":
|
||||
return JsonResponse({'status': 'notok', 'message': 'this isn\'t the way'})
|
||||
|
||||
payload = json.loads(request.body)
|
||||
tikette = Tikette(**payload)
|
||||
tikette.save()
|
||||
|
||||
return JsonResponse({'status': 'ok'}, headers=CORS)
|
||||
|
||||
|
||||
@csrf_exempt
|
||||
def deletetikette(request):
|
||||
if request.method != "POST":
|
||||
return JsonResponse({'status': 'notok', 'message': 'this isn\'t the way'})
|
||||
|
||||
payload = json.loads(request.body)
|
||||
Tikette.objects.get(id=payload["id"]).delete()
|
||||
|
||||
return JsonResponse({'status': 'ok'}, headers=CORS)
|
||||
|
@@ -24,6 +24,9 @@ import tikette.views
|
||||
|
||||
urlpatterns = [
|
||||
path('admin/', admin.site.urls),
|
||||
path('list', tikette.views.index),
|
||||
path('', tikette.views.generate),
|
||||
path('list', tikette.views.get_list),
|
||||
path('categories', tikette.views.get_categories),
|
||||
path('generate', tikette.views.generate),
|
||||
path('newtikette', tikette.views.newtikette),
|
||||
path('deletetikette', tikette.views.deletetikette),
|
||||
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|
||||
|
Reference in New Issue
Block a user