Browse Source

first commit, basic working

master
Domagoj Zecevic 4 weeks ago
commit
4d33f49082
  1. 72
      .gitignore
  2. 0
      core/__init__.py
  3. 0
      divebases/__init__.py
  4. 6
      divebases/admin.py
  5. 22
      divebases/migrations/0001_initial.py
  6. 0
      divebases/migrations/__init__.py
  7. 6
      divebases/models.py
  8. 0
      divemanager/__init__.py
  9. 59
      divemanager/settings.py
  10. 7
      divemanager/urls.py
  11. 0
      events/__init__.py
  12. 7
      events/admin.py
  13. 23
      events/migrations/0001_initial.py
  14. 29
      events/migrations/0002_initial.py
  15. 0
      events/migrations/__init__.py
  16. 26
      events/models.py
  17. 0
      infos/__init__.py
  18. 8
      infos/admin.py
  19. 24
      infos/migrations/0001_initial.py
  20. 29
      infos/migrations/0002_initial.py
  21. 0
      infos/migrations/__init__.py
  22. 28
      infos/models.py
  23. 9
      manage.py
  24. 1
      users/__init__.py
  25. 8
      users/admin.py
  26. 5
      users/apps.py
  27. 49
      users/migrations/0001_initial.py
  28. 0
      users/migrations/__init__.py
  29. 9
      users/models.py

72
.gitignore

@ -0,0 +1,72 @@
# Python compiled files
__pycache__/
*.py[cod]
*$py.class
# Django specific
*.log
*.pot
*.pyc
*.sqlite3
db.sqlite3
media/
staticfiles/
.env
.env.*
# Distribution / packaging
*.egg
*.egg-info/
dist/
build/
eggs/
parts/
bin/
var/
sdist/
develop-eggs/
# PyInstaller
*.manifest
*.spec
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
# Translations
*.mo
*.pot
# Django stuff:
local_settings.py
db.sqlite3
media/
# IDEs and editors
.vscode/
.idea/
*.sublime-project
*.sublime-workspace
*.iml
*.ipr
*.iws
# macOS
.DS_Store
# Windows
Thumbs.db
# Venv
venv/

0
core/__init__.py

0
divebases/__init__.py

6
divebases/admin.py

@ -0,0 +1,6 @@
from django.contrib import admin
from .models import DiveBase
@admin.register(DiveBase)
class DiveBaseAdmin(admin.ModelAdmin):
list_display = ("name", "location")

22
divebases/migrations/0001_initial.py

@ -0,0 +1,22 @@
# Generated by Django 5.2.9 on 2026-01-06 11:46
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='DiveBase',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255)),
('location', models.CharField(max_length=255)),
],
),
]

0
divebases/migrations/__init__.py

6
divebases/models.py

@ -0,0 +1,6 @@
from django.db import models
class DiveBase(models.Model):
name = models.CharField(max_length=255)
location = models.CharField(max_length=255)

0
divemanager/__init__.py

59
divemanager/settings.py

@ -0,0 +1,59 @@
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent
SECRET_KEY = 'dev-secret-key'
DEBUG = True
ALLOWED_HOSTS = []
INSTALLED_APPS = [
'users',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'divebases',
'events',
'infos',
]
AUTH_USER_MODEL = 'users.User'
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
]
ROOT_URLCONF = 'divemanager.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR / 'templates'],
'APP_DIRS': True,
'OPTIONS': {'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
]},
},
]
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
STATIC_URL = '/static/'
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

7
divemanager/urls.py

@ -0,0 +1,7 @@
from django.contrib import admin
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
]

0
events/__init__.py

7
events/admin.py

@ -0,0 +1,7 @@
from django.contrib import admin
from .models import Event
@admin.register(Event)
class EventAdmin(admin.ModelAdmin):
list_display = ("title", "start_datetime", "dive_base", "is_deleted")
list_filter = ("dive_base", "is_deleted")

23
events/migrations/0001_initial.py

@ -0,0 +1,23 @@
# Generated by Django 5.2.9 on 2026-01-06 11:46
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Event',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=255)),
('start_datetime', models.DateTimeField()),
('is_deleted', models.BooleanField(default=False)),
],
),
]

29
events/migrations/0002_initial.py

@ -0,0 +1,29 @@
# Generated by Django 5.2.9 on 2026-01-06 11:46
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
('divebases', '0001_initial'),
('events', '0001_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.AddField(
model_name='event',
name='created_by',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='created_events', to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='event',
name='dive_base',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='events', to='divebases.divebase'),
),
]

0
events/migrations/__init__.py

26
events/models.py

@ -0,0 +1,26 @@
from django.db import models
from django.conf import settings
User = settings.AUTH_USER_MODEL
class Event(models.Model):
title = models.CharField(max_length=255)
start_datetime = models.DateTimeField()
dive_base = models.ForeignKey(
'divebases.DiveBase',
on_delete=models.CASCADE,
related_name='events'
)
created_by = models.ForeignKey(
User,
on_delete=models.PROTECT,
related_name='created_events'
)
is_deleted = models.BooleanField(default=False)
def __str__(self):
return self.title

0
infos/__init__.py

8
infos/admin.py

@ -0,0 +1,8 @@
from django.contrib import admin
from .models import InfoArticle
@admin.register(InfoArticle)
class InfoArticleAdmin(admin.ModelAdmin):
list_display = ("title", "dive_base", "created_at", "is_deleted")
list_filter = ("dive_base", "is_deleted")

24
infos/migrations/0001_initial.py

@ -0,0 +1,24 @@
# Generated by Django 5.2.9 on 2026-01-06 11:46
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='InfoArticle',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=255)),
('content', models.TextField()),
('created_at', models.DateTimeField(auto_now_add=True)),
('is_deleted', models.BooleanField(default=False)),
],
),
]

29
infos/migrations/0002_initial.py

@ -0,0 +1,29 @@
# Generated by Django 5.2.9 on 2026-01-06 11:46
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
('divebases', '0001_initial'),
('infos', '0001_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.AddField(
model_name='infoarticle',
name='created_by',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='articles', to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='infoarticle',
name='dive_base',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='articles', to='divebases.divebase'),
),
]

0
infos/migrations/__init__.py

28
infos/models.py

@ -0,0 +1,28 @@
from django.db import models
from django.conf import settings
User = settings.AUTH_USER_MODEL
class InfoArticle(models.Model):
title = models.CharField(max_length=255)
content = models.TextField()
dive_base = models.ForeignKey(
'divebases.DiveBase',
on_delete=models.CASCADE,
related_name='articles'
)
created_by = models.ForeignKey(
User,
on_delete=models.PROTECT,
related_name='articles'
)
created_at = models.DateTimeField(auto_now_add=True)
is_deleted = models.BooleanField(default=False)
def __str__(self):
return self.title

9
manage.py

@ -0,0 +1,9 @@
#!/usr/bin/env python
import os, sys
def main():
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'divemanager.settings')
from django.core.management import execute_from_command_line
execute_from_command_line(sys.argv)
if __name__ == '__main__':
main()

1
users/__init__.py

@ -0,0 +1 @@
default_app_config = "users.apps.UsersConfig"

8
users/admin.py

@ -0,0 +1,8 @@
from django.contrib import admin
from .models import User
@admin.register(User)
class UserAdmin(admin.ModelAdmin):
list_display = ("username", "email", "role", "dive_base", "is_staff")
list_filter = ("role", "dive_base")
search_fields = ("username", "email")

5
users/apps.py

@ -0,0 +1,5 @@
from django.apps import AppConfig
class UsersConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "users"

49
users/migrations/0001_initial.py

@ -0,0 +1,49 @@
# Generated by Django 5.2.9 on 2026-01-06 11:46
import django.contrib.auth.models
import django.contrib.auth.validators
import django.db.models.deletion
import django.utils.timezone
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
('auth', '0012_alter_user_first_name_max_length'),
('divebases', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='User',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('password', models.CharField(max_length=128, verbose_name='password')),
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')),
('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')),
('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')),
('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')),
('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
('role', models.CharField(choices=[('USER', 'User'), ('ADMIN', 'Admin')], default='USER', max_length=10)),
('dive_certificate', models.CharField(blank=True, max_length=255)),
('dive_base', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='divebases.divebase')),
('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups')),
('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')),
],
options={
'verbose_name': 'user',
'verbose_name_plural': 'users',
'abstract': False,
},
managers=[
('objects', django.contrib.auth.models.UserManager()),
],
),
]

0
users/migrations/__init__.py

9
users/models.py

@ -0,0 +1,9 @@
from django.contrib.auth.models import AbstractUser
from django.db import models
class User(AbstractUser):
ROLE_CHOICES = [('USER','User'), ('ADMIN','Admin')]
role = models.CharField(max_length=10, choices=ROLE_CHOICES, default='USER')
dive_certificate = models.CharField(max_length=255, blank=True)
dive_base = models.ForeignKey('divebases.DiveBase', null=True, blank=True, on_delete=models.SET_NULL)
Loading…
Cancel
Save