diff --git a/backend/seismic_site/settings.py b/backend/seismic_site/settings.py index 86cb41cb..9ac152f6 100644 --- a/backend/seismic_site/settings.py +++ b/backend/seismic_site/settings.py @@ -33,6 +33,8 @@ HERE_MAPS_API_KEY=(str, ""), DATA_UPLOAD_MAX_NUMBER_FIELDS=(int, 1000), BACKGROUND_WORKERS_COUNT=(int, 1), + DJANGO_ADMIN_EMAIL=(str, ""), + DJANGO_ADMIN_PASSWORD=(str, ""), # email settings EMAIL_SEND_METHOD=(str, "async"), EMAIL_BACKEND=(str, "django.core.mail.backends.console.EmailBackend"), @@ -149,6 +151,7 @@ "utils", "buildings", "static_custom", + "users", # api documentation "drf_spectacular", ] @@ -224,6 +227,11 @@ DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" +AUTH_USER_MODEL = "users.User" +DJANGO_ADMIN_EMAIL = env.str("DJANGO_ADMIN_EMAIL") +DJANGO_ADMIN_PASSWORD = env.str("DJANGO_ADMIN_PASSWORD") + + # Password validation # https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators @@ -305,12 +313,7 @@ STATIC_ROOT = os.path.abspath(os.path.join(BASE_DIR, "static")) MEDIA_ROOT = os.path.abspath(os.path.join(BASE_DIR, "media")) -DEV_DEPENDECIES_LOCATION = "bower_components" - -STATICFILES_DIRS = [ - os.path.abspath(os.path.join(DEV_DEPENDECIES_LOCATION)), - os.path.abspath(os.path.join("static_extras")), -] +STATICFILES_DIRS = [] default_storage_options = {} diff --git a/backend/users/__init__.py b/backend/users/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/users/admin.py b/backend/users/admin.py new file mode 100644 index 00000000..846f6b40 --- /dev/null +++ b/backend/users/admin.py @@ -0,0 +1 @@ +# Register your models here. diff --git a/backend/users/apps.py b/backend/users/apps.py new file mode 100644 index 00000000..88f7b179 --- /dev/null +++ b/backend/users/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class UsersConfig(AppConfig): + default_auto_field = "django.db.models.BigAutoField" + name = "users" diff --git a/backend/users/migrations/0001_initial.py b/backend/users/migrations/0001_initial.py new file mode 100644 index 00000000..e0358af2 --- /dev/null +++ b/backend/users/migrations/0001_initial.py @@ -0,0 +1,93 @@ +# Generated by Django 4.2.11 on 2024-04-02 05:23 + +import django.contrib.auth.models +import django.contrib.auth.validators +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ("auth", "0012_alter_user_first_name_max_length"), + ] + + 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")), + ( + "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={ + "db_table": "auth_user", + }, + managers=[ + ("objects", django.contrib.auth.models.UserManager()), + ], + ), + ] diff --git a/backend/users/migrations/__init__.py b/backend/users/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/users/models.py b/backend/users/models.py new file mode 100644 index 00000000..3294eead --- /dev/null +++ b/backend/users/models.py @@ -0,0 +1,6 @@ +from django.contrib.auth.models import AbstractUser + + +class User(AbstractUser): + class Meta: + db_table = "auth_user" # TODO: This will be changed back after the data migration diff --git a/backend/users/tests.py b/backend/users/tests.py new file mode 100644 index 00000000..a39b155a --- /dev/null +++ b/backend/users/tests.py @@ -0,0 +1 @@ +# Create your tests here. diff --git a/backend/users/views.py b/backend/users/views.py new file mode 100644 index 00000000..60f00ef0 --- /dev/null +++ b/backend/users/views.py @@ -0,0 +1 @@ +# Create your views here. diff --git a/docker/s6-rc.d/init/init.sh b/docker/s6-rc.d/init/init.sh index a8162af7..43eba497 100755 --- a/docker/s6-rc.d/init/init.sh +++ b/docker/s6-rc.d/init/init.sh @@ -25,6 +25,13 @@ python3 manage.py check # Run the database migrations if is_enabled "${RUN_MIGRATIONS:-False}"; then + + # Fix the User model + echo "Fixing the User model" + echo "INSERT INTO django_migrations (app, name, applied) SELECT 'users', '0001_initial', CURRENT_TIMESTAMP WHERE NOT EXISTS (SELECT app FROM django_migrations WHERE app='users' AND name='0001_initial');" | python3 manage.py dbshell + echo "UPDATE django_content_type SET app_label = 'users' WHERE app_label = 'auth' and model = 'user';" | python manage.py dbshell + + # Run the actual migrations echo "Migrating database" python3 manage.py migrate --run-syncdb python3 manage.py createcachetable