diff --git a/tmessage/apps.py b/tmessage/apps.py new file mode 100644 index 0000000..b69a924 --- /dev/null +++ b/tmessage/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class DBConfig(AppConfig): + default_auto_field = "django.db.models.BigAutoField" + name = "tmessage" diff --git a/tmessage/migrations/0001_initial.py b/tmessage/migrations/0001_initial.py new file mode 100644 index 0000000..539b51a --- /dev/null +++ b/tmessage/migrations/0001_initial.py @@ -0,0 +1,56 @@ +# Generated by Django 5.0.7 on 2024-12-23 15:14 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='tMMessage', + fields=[ + ('message_id', models.IntegerField(primary_key=True, serialize=False)), + ('content', models.CharField(max_length=10000)), + ('response', models.CharField(blank=True, max_length=10000, null=True)), + ('anonymous', models.BooleanField()), + ], + ), + migrations.CreateModel( + name='tMUser', + fields=[ + ('username', models.CharField(max_length=30, primary_key=True, serialize=False, unique=True)), + ], + ), + migrations.CreateModel( + name='tMM2MLike', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('message', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='likes_obj', to='tmessage.tmmessage')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='liked_obj', to='tmessage.tmuser')), + ], + options={ + 'unique_together': {('user', 'message')}, + }, + ), + migrations.AddField( + model_name='tmmessage', + name='likes', + field=models.ManyToManyField(related_name='liked', through='tmessage.tMM2MLike', to='tmessage.tmuser'), + ), + migrations.AddField( + model_name='tmmessage', + name='u_from', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='sent', to='tmessage.tmuser'), + ), + migrations.AddField( + model_name='tmmessage', + name='u_to', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='received', to='tmessage.tmuser'), + ), + ] diff --git a/tmessage/migrations/__init__.py b/tmessage/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tmessage/models.py b/tmessage/models.py new file mode 100644 index 0000000..682be24 --- /dev/null +++ b/tmessage/models.py @@ -0,0 +1,48 @@ +from typing import TYPE_CHECKING + +from django.contrib import admin as django_admin +from django.contrib.admin.exceptions import AlreadyRegistered # type: ignore +from django.db import models + + +class tMUser(models.Model): + username = models.CharField(max_length=30, unique=True, primary_key=True) + + if TYPE_CHECKING: + liked = models.Manager["tMMessage"] + sent = models.Manager["tMMessage"] + received = models.Manager["tMMessage"] + + def __str__(self) -> str: + return self.username + +class tMMessage(models.Model): + message_id = models.IntegerField(primary_key=True) + content = models.CharField(max_length=10_000) + response = models.CharField(max_length=10_000, blank=True, null=True) + anonymous = models.BooleanField() + likes = models.ManyToManyField(tMUser, through="tMM2MLike", related_name="liked") + u_to = models.ForeignKey(tMUser, on_delete=models.CASCADE, related_name="received") + + if TYPE_CHECKING: + u_from: tMUser | None + else: + u_from = models.ForeignKey(tMUser, on_delete=models.SET_NULL, blank=True, null=True, related_name="sent") + + def __str__(self) -> str: + return f"({self.message_id}) {self.u_from.username if self.u_from else 'Anonymous'} messaged {self.u_to.username}" + +class tMM2MLike(models.Model): + user = models.ForeignKey(tMUser, on_delete=models.CASCADE, related_name="liked_obj") + message = models.ForeignKey(tMMessage, on_delete=models.CASCADE, related_name="likes_obj") + + class Meta: + unique_together = ("user", "message") + + def __str__(self) -> str: + return f"{self.user.username} liked message {self.message.message_id}" + +try: + django_admin.site.register((tMUser, tMMessage, tMM2MLike)) +except AlreadyRegistered: + ... diff --git a/tmessage/settings.py b/tmessage/settings.py index a3cf9f4..7132d3f 100644 --- a/tmessage/settings.py +++ b/tmessage/settings.py @@ -26,7 +26,8 @@ INSTALLED_APPS = [ "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", - "django.contrib.messages" + "django.contrib.messages", + "tmessage.apps.DBConfig" ] MIDDLEWARE = [ @@ -69,10 +70,10 @@ DATABASES = { } AUTH_PASSWORD_VALIDATORS = [] - LANGUAGE_CODE = "en-us" TIME_ZONE = "UTC" USE_I18N = True USE_TZ = True - +STATIC_URL = "/static/" DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" +STATIC_ROOT = BASE_DIR / "collected-static" diff --git a/tmessage/templates/index.html b/tmessage/templates/index.html new file mode 100644 index 0000000..2326b0c --- /dev/null +++ b/tmessage/templates/index.html @@ -0,0 +1,24 @@ +{% extends "base.html" %} + +{% block body %} +
Read your messages ({{ new }} new)
++
{{ config.services.message.url.pub }}/m/{{ username }}/