From e533710345a0ba55602037e6d98bec20c5dd312a Mon Sep 17 00:00:00 2001 From: Kumi Date: Tue, 9 Aug 2022 06:27:55 +0000 Subject: [PATCH] Start implementing models --- datastore/forms/__init__.py | 0 datastore/forms/auth.py | 18 ++++++++++++++++ datastore/helpers/__init__.py | 0 datastore/helpers/uploads.py | 5 +++++ datastore/models/auth.py | 25 ++++++++++++++++++++-- datastore/models/competences.py | 0 datastore/models/crew.py | 22 +++++++++++++++++++ datastore/models/places.py | 38 +++++++++++++++++++++++++++++++++ requirements.txt | 2 ++ 9 files changed, 108 insertions(+), 2 deletions(-) create mode 100644 datastore/forms/__init__.py create mode 100644 datastore/forms/auth.py create mode 100644 datastore/helpers/__init__.py create mode 100644 datastore/helpers/uploads.py create mode 100644 datastore/models/competences.py create mode 100644 datastore/models/crew.py create mode 100644 datastore/models/places.py diff --git a/datastore/forms/__init__.py b/datastore/forms/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/datastore/forms/auth.py b/datastore/forms/auth.py new file mode 100644 index 0000000..3797671 --- /dev/null +++ b/datastore/forms/auth.py @@ -0,0 +1,18 @@ +from django import forms +from django.contrib.auth.hashers import make_password +from django.core.exceptions import ValidationError + +from ..models.auth import APIUser + + +class APIUserForm(forms.ModelForm): + model = APIUser + fields = ["username", "password"] + + def clean_password(self): + raw = self.cleaned_data['password'] + + if not raw: + return ValidationError("You did not enter a password.") + + return make_password(raw) \ No newline at end of file diff --git a/datastore/helpers/__init__.py b/datastore/helpers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/datastore/helpers/uploads.py b/datastore/helpers/uploads.py new file mode 100644 index 0000000..8fcd31b --- /dev/null +++ b/datastore/helpers/uploads.py @@ -0,0 +1,5 @@ +import uuid + + +def get_upload_path(instance, filename): + return f"{str(uuid.uuid4)}/{filename}" \ No newline at end of file diff --git a/datastore/models/auth.py b/datastore/models/auth.py index 275eef6..2bac116 100644 --- a/datastore/models/auth.py +++ b/datastore/models/auth.py @@ -1,6 +1,9 @@ from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin from django.db import models from django.utils import timezone +from django.contrib.auth.hashers import check_password + +import uuid from ..managers import UserManager @@ -9,7 +12,7 @@ class User(AbstractBaseUser, PermissionsMixin): email = models.EmailField('email address', unique=True) is_staff = models.BooleanField(default=False) is_active = models.BooleanField(default=True) - date_joined = models.DateTimeField(default=timezone.now) + date_joined = models.DateTimeField(auto_now_add=True) USERNAME_FIELD = 'email' REQUIRED_FIELDS = [] @@ -17,4 +20,22 @@ class User(AbstractBaseUser, PermissionsMixin): objects = UserManager() def __str__(self): - return self.email \ No newline at end of file + return self.email + + +class APIUser(models.Model): + username = models.CharField(max_length=256) + password = models.CharField(max_length=256) + + def check_password(self, password): + return check_password(password, self.password) + + +class APIToken(models.Model): + value = models.UUIDField(default=uuid.uuid4) + user = models.ForeignKey(APIUser, models.CASCADE) + expiry = models.DateTimeField() + created_at = models.DateTimeField(auto_now_add=True) + + def is_valid(self): + return timezone.now() < self.expiry \ No newline at end of file diff --git a/datastore/models/competences.py b/datastore/models/competences.py new file mode 100644 index 0000000..e69de29 diff --git a/datastore/models/crew.py b/datastore/models/crew.py new file mode 100644 index 0000000..9e143cf --- /dev/null +++ b/datastore/models/crew.py @@ -0,0 +1,22 @@ +from django.db import models + +from .places import Nationality, ZipPlaces + + +class CrewMember(models.Model): + pin = models.IntegerField(primary_key=True) + + first_name = models.CharField(max_length=128) + middle_name = models.CharField(max_length=128, null=True, blank=True) + last_name = models.CharField(max_length=128) + calling_name = models.CharField(max_length=128) + + nationality = models.ForeignKey(Nationality, models.PROTECT) + place_of_birth = models.CharField(max_length=128) + first_address = models.ForeignKey(Address, models.PROTECT) + second_address = models.ForeignKey(Address, models.PROTECT, null=True) + +class Address(models.Model): + address = models.TextField() + zipplace = models.ForeignKey(ZipPlaces, models.PROTECT) + diff --git a/datastore/models/places.py b/datastore/models/places.py new file mode 100644 index 0000000..a8f5ab2 --- /dev/null +++ b/datastore/models/places.py @@ -0,0 +1,38 @@ +from django.db import models + +from base64 import b64encode + +from ..helpers.uploads import get_upload_path + + +""" +These models are used by Adonis to return tens of thousands of +lines of unneeded data. +""" + +class Airport(models.Model): + city_code = models.CharField(max_length=256, null=True, blank=True) + code = models.CharField(max_length=256, null=True, blank=True, unique=True) + country_name = models.CharField(max_length=256, null=True, blank=True) + name = models.CharField(max_length=256, null=True, blank=True) + +class ZipPlaces(models.Model): + postcode = models.CharField(max_length=64) + postplace = models.CharField(max_length=256) + country = models.ForeignKey(Nationality, models.PROTECT) + +class Nationality(models.Model): + country = models.ForeignKey(Country, models.PROTECT) + +class Country(models.Model): + code = models.CharField(max_length=16) + text = models.CharField(max_length=128) + +class PhoneCode(models.Model): + code = models.CharField(max_length=16) + flag = models.ImageField(null=True, upload_to=get_upload_path) + text = models.CharField(max_length=128) + + @property + def flag_base64(self): + return b64encode(self.flag.read()) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 8e2e9d3..7c0dff9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,6 +2,8 @@ Django django-autosecretkey +pillow + # For MySQL mysqlclient