diff --git a/core/helpers/__init__.py b/core/helpers/__init__.py new file mode 100644 index 0000000..205167d --- /dev/null +++ b/core/helpers/__init__.py @@ -0,0 +1,2 @@ +from .geo import get_coords_for_address +from .media import uuid_path \ No newline at end of file diff --git a/core/helpers/geo.py b/core/helpers/geo.py new file mode 100644 index 0000000..e0378e7 --- /dev/null +++ b/core/helpers/geo.py @@ -0,0 +1,9 @@ +from geopy.geocoders import Nominatim + +from restoroo.const import USER_AGENT + + +def get_coords_for_address(*address): + nominatim = Nominatim(user_agent=USER_AGENT) + nominatim.geocode(", ".join(*address)) + return location.latitude, location.longitude \ No newline at end of file diff --git a/core/helpers/media.py b/core/helpers/media.py new file mode 100644 index 0000000..d406d65 --- /dev/null +++ b/core/helpers/media.py @@ -0,0 +1,5 @@ +import uuid + + +def uuid_path(instance, filename): + return f'{uuid.uuid4()}/{filename}' \ No newline at end of file diff --git a/core/models/__init__.py b/core/models/__init__.py index 611c4d8..37d673b 100644 --- a/core/models/__init__.py +++ b/core/models/__init__.py @@ -1 +1,2 @@ -from .auth import User \ No newline at end of file +from .auth import User +from .profiles import Profile \ No newline at end of file diff --git a/core/models/billing.py b/core/models/billing.py new file mode 100644 index 0000000..ade1466 --- /dev/null +++ b/core/models/billing.py @@ -0,0 +1,22 @@ +from django.db import models +from django.utils.translation import gettext as _ + + +class ExpenseTypeChoices(models.IntegerChoices): + MONTHLY_FEE = (0, _("Monthly Fee")) + SUPPORT = (1, _("Support")) + DEVELOPMENT = (2, _("Custom Development")) + COMMISSION = (3, _("Commission")) + CONTRIBUTION = (4, _("Contribution")) + + +class RelatedModelChoices(models.IntegerChoices): + CHAIN = (0, _("Chain")) + RESTAURANT = (1, _("Restaurant")) + ROOM = (2, _("Room")) + TABLE = (3, _("Table")) + + +class Expense(models.Model): + expense_type = models.IntegerField(choices=ExpenseTypeChoices.choices(), null=True, blank=True) + text = models.CharField(max_length=256) diff --git a/core/models/businesses.py b/core/models/businesses.py new file mode 100644 index 0000000..07448e6 --- /dev/null +++ b/core/models/businesses.py @@ -0,0 +1,25 @@ +from django.db import models + +from .media import Image +from .geo import Location + + +class Chain(models.Model): + ''' + Model for "Restaurant Chains" + + Each Restaurant belongs to a Chain – just in case any large corporation + running several different chains comes around... + ''' + name = models.CharField(max_length=128) + logo = models.ForeignKey(Image, models.PROTECT, null=True) + + +class Restaurant(models.Model): + ''' + Model representing an individual Restaurant within a Chain + ''' + name = models.CharField(max_length=128) + logo = models.ForeignKey(Image, models.PROTECT, null=True) + location = models.ForeignKey(Location, models.PROTECT) + maximum_capacity = models.PositiveSmallIntegerField(null=True, blank=True) diff --git a/core/models/geo.py b/core/models/geo.py new file mode 100644 index 0000000..2bb6d8b --- /dev/null +++ b/core/models/geo.py @@ -0,0 +1,15 @@ +from django.contrib.gis.db import models + +from django_countries.fields import CountryField + + +class Location(models.Model): + address = CharField(max_length=256) + address2 = CharField(max_length=256, null=True, blank=True) + city = CharField(max_length=128) + zipcode = CharField(max_length=16) + state = CharField(max_length=128) + country = CountryField() + + floor = CharField(max_length=16, null=True, blank=True) + door = CharField(max_length=16, null=True, blank=True) \ No newline at end of file diff --git a/core/models/layout.py b/core/models/layout.py new file mode 100644 index 0000000..a8f75f6 --- /dev/null +++ b/core/models/layout.py @@ -0,0 +1,15 @@ +from django.db import models + +from .businesses import Restaurant + + +class Room(models.Model): + restaurant = models.ForeignKey(Restaurant, models.CASCADE) + name = models.CharField(max_length=128) + maximum_capacity = models.PositiveSmallIntegerField(null=True, blank=True) + + +class Table(models.Model): + room = models.ForeignKey(Room, models.CASCADE) + number = models.CharField(max_length=64) + capacity = models.PositiveSmallIntegerField(null=True, blank=True) \ No newline at end of file diff --git a/core/models/media.py b/core/models/media.py new file mode 100644 index 0000000..5801c83 --- /dev/null +++ b/core/models/media.py @@ -0,0 +1,8 @@ +from django.db import models + +from ..helpers.media import uuid_path + + +class Image(models.Model): + name = models.CharField(max_length=256) + file = models.ImageField(upload_to=uuid_path) \ No newline at end of file diff --git a/core/models/profiles.py b/core/models/profiles.py new file mode 100644 index 0000000..432a501 --- /dev/null +++ b/core/models/profiles.py @@ -0,0 +1,12 @@ +from django.db import models +from django.contrib.auth import get_user_model + +class Profile(models.Model): + ''' + Model for additional user data, so we don't have to touch the actual auth model for that + ''' + user = models.OneToOneField(get_user_model(), on_delete=models.PROTECT, primary_key=True) + first_name = models.CharField(max_length=128) + last_name = models.CharField(max_length=128) + display_name = models.CharField(max_length=128) + diff --git a/core/models/reservation.py b/core/models/reservation.py new file mode 100644 index 0000000..e69de29 diff --git a/requirements.txt b/requirements.txt index 3b646ad..d78e5a1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,7 @@ Django django-autosecretkey dbsettings -argon2-cffi \ No newline at end of file +argon2-cffi +geopy +django-countries[pyuca] +pillow \ No newline at end of file diff --git a/restoroo/const.py b/restoroo/const.py new file mode 100644 index 0000000..322dab7 --- /dev/null +++ b/restoroo/const.py @@ -0,0 +1 @@ +USER_AGENT = "Restoroo by Kumi Systems (https://kumi.systems/)" \ No newline at end of file diff --git a/restoroo/settings.py b/restoroo/settings.py index a2e913a..bc7fa82 100644 --- a/restoroo/settings.py +++ b/restoroo/settings.py @@ -67,12 +67,15 @@ WSGI_APPLICATION = 'restoroo.wsgi.application' # Database # https://docs.djangoproject.com/en/4.0/ref/settings/#databases -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': BASE_DIR / 'db.sqlite3', +if CONFIG_FILE.config.has_section("MariaDB"): + pass # TODO +else: + DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': BASE_DIR / 'db.sqlite3', + } } -} # Password validation