Skip to content
4 changes: 2 additions & 2 deletions backendapi/converters.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ class BinaryHexConverter:
regex = "(?:[0-9a-fA-F]{2})+"

def to_python(self, value: str) -> bytes:
return b16decode(value, casefold=True)
return b16encode(b16decode(value, casefold=True)).decode

def to_url(self, value: bytes) -> str:
return b16encode(value).decode()
return value
3 changes: 3 additions & 0 deletions backendapi/exceptions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from rest_framework.exceptions import APIException

# write your custm exceptions here if we need it later.
60 changes: 60 additions & 0 deletions backendapi/forms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
from django import forms
from database.models import Attendant, Crewmember, Crews


class AttendantNFCForm(forms.ModelForm):
prefix = "attendant"

class Meta:
model = Attendant
fields = [
"nfc_id",
]
widgets = {
"nfc_id": forms.TextInput(
attrs={
"class": "form-input",
"placeholder": "Scan NFC tag...",
# "disabled": True,
}
),
}


class CrewmemberForm(forms.ModelForm):
# Allow multiple (different) forms in single page
# Can also be specified as an argument to the class init
prefix = "crewmember"

class Meta:
model = Crewmember # Link the form to the Attendant model
fields = [
"first_name",
"last_name",
"email",
"discord",
"phone_number",
"crew",
"profile_image",
]
widgets = {
"first_name": forms.TextInput(
attrs={"class": "form-input", "placeholder": "Ola"}
),
"last_name": forms.TextInput(
attrs={"class": "form-input", "placeholder": "Nordmann"}
),
"email": forms.EmailInput(
attrs={"class": "form-input", "placeholder": "email@example.com"}
),
"discord": forms.TextInput(
attrs={"class": "form-input", "placeholder": "Discord#1234"}
),
"phone_number": forms.TextInput(
attrs={"class": "form-input", "placeholder": "+47012345678"}
),
"crew": forms.TextInput(
# Crews.objects.all(),
attrs={"class": "form-input", "placeholder": "Select crew..."},
),
}
31 changes: 31 additions & 0 deletions backendapi/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Generated by Django 5.1.3 on 2024-11-25 08:50

from django.db import migrations, models


class Migration(migrations.Migration):

initial = True

dependencies = []

operations = [
migrations.CreateModel(
name="Attendant",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("first_name", models.CharField(max_length=30)),
("last_name", models.CharField(max_length=30)),
("email", models.EmailField(max_length=100)),
("phone_number", models.CharField(max_length=12)),
],
),
]
16 changes: 16 additions & 0 deletions backendapi/migrations/0002_delete_attendant.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Generated by Django 5.1.3 on 2025-01-06 22:56

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
("backendapi", "0001_initial"),
]

operations = [
migrations.DeleteModel(
name="Attendant",
),
]
33 changes: 33 additions & 0 deletions backendapi/migrations/0003_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Generated by Django 4.2.7 on 2025-02-14 20:48

from django.db import migrations, models


class Migration(migrations.Migration):

initial = True

dependencies = [
("backendapi", "0002_delete_attendant"),
]

operations = [
migrations.CreateModel(
name="Attendant",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("first_name", models.CharField(max_length=30)),
("last_name", models.CharField(max_length=30)),
("email", models.EmailField(max_length=100)),
("phone_number", models.CharField(max_length=12)),
],
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# Generated by Django 4.2.7 on 2025-02-19 18:05

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("backendapi", "0003_initial"),
]

operations = [
migrations.AddField(
model_name="attendant",
name="crew",
field=models.CharField(default="Undefined crew", max_length=100),
),
migrations.AddField(
model_name="attendant",
name="discord",
field=models.CharField(default=False, max_length=100),
preserve_default=False,
),
migrations.AddField(
model_name="attendant",
name="profile_image",
field=models.ImageField(blank=True, null=True, upload_to="profile_images/"),
),
migrations.AddField(
model_name="attendant",
name="ticketCrewID",
field=models.CharField(default=False, max_length=100),
preserve_default=False,
),
migrations.AlterField(
model_name="attendant",
name="email",
field=models.EmailField(max_length=200),
),
migrations.AlterField(
model_name="attendant",
name="first_name",
field=models.CharField(max_length=100),
),
migrations.AlterField(
model_name="attendant",
name="last_name",
field=models.CharField(max_length=100),
),
migrations.AlterField(
model_name="attendant",
name="phone_number",
field=models.CharField(max_length=15),
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Generated by Django 4.2.7 on 2025-02-19 18:10

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("backendapi", "0004_attendant_crew_attendant_discord_and_more"),
]

operations = [
migrations.AlterField(
model_name="attendant",
name="crew",
field=models.CharField(max_length=100),
),
migrations.AlterField(
model_name="attendant",
name="ticketCrewID",
field=models.CharField(max_length=100, null=True),
),
]
16 changes: 16 additions & 0 deletions backendapi/migrations/0006_delete_attendant.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Generated by Django 5.1.5 on 2025-02-20 14:45

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
("backendapi", "0005_alter_attendant_crew_alter_attendant_ticketcrewid"),
]

operations = [
migrations.DeleteModel(
name="Attendant",
),
]
2 changes: 2 additions & 0 deletions backendapi/models.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from django.db import models
from rest_framework import serializers
from django.contrib.auth.models import User

# Create your models here.
88 changes: 88 additions & 0 deletions backendapi/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
import re
from rest_framework import serializers
from django.conf import settings
from database.models import Crewmember

# Serializer for the Attendant model: handles validation, serialization, and desersialization of data.
# Change the model later depending on requirements. Please tell me what, and il remake the model later to fit requirements.


class CrewmemberAdmin(serializers.ModelSerializer): # defined a serialiser class
first_name = serializers.CharField(
label=("First Name* "), # Labels for the field
required=True, # This makes the fields required.
max_length=100,
style={
"input_type": "text",
"autofocus": False,
"autocomplete": "off",
"required": True,
},
error_messages={
"required": "This field is required.",
"blank": "First Name is required.",
},
)

last_name = serializers.CharField(
label=("Last Name* "), # Label for the field
required=True, # This makes the fields required.
max_length=100,
style={
"input_type": "text",
"autofocus": False,
"autocomplete": "off",
"required": True,
},
error_messages={
"required": "This field is required.",
"blank": "Last Name is required.",
"invalid": "Last Name can only contain characters.",
},
)

email = serializers.EmailField(
label=("Email* "), # Label for the field
required=True, # Field is required
max_length=100,
style={
"input_type": "email",
"autofocus": False,
"autocomplete": "off",
"required": True,
},
error_messages={
"required": "This field is required.",
"blank": "Email is required.",
},
)
phone_number = serializers.CharField(
label="Phone Number* ", # Label for the field
max_length=14,
min_length=10,
required=True, # Field is required
error_messages={
"required": "This field is required .",
"blank": "Phone number is required.",
},
)

class Meta:
model = Crewmember
fields = ["first_name", "last_name", "email", "phone_number"]


def validate_first_name(value):
# Check if the first name contains only characters or letters with spaces and letters from a-Z
if not re.match(r"^[a-zA-Zå-öÅ-Ö ]*$", value):
raise serializers.ValidationError(
"First Name can only contain letters and spaces."
)


def validate_last_name(value):
# Check if the first name contains only characters
if not re.match(r"^[a-zA-Zå-öÅ-Ö ]*$", value):
raise serializers.ValidationError(
"Last Name can only contain letters and spaces."
)
1 change: 0 additions & 1 deletion backendapi/urls.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
from django.urls import path, register_converter

from . import views, converters

register_converter(converters.BinaryHexConverter, "hex")
Expand Down
Loading
Loading