-
+
+
+
+
+
+ {% with list_url="sample:"|add:sample_type|add:"_list" %}
+
-
+
@@ -120,4 +124,4 @@
No samples to show.
{% endwith %}
{% endwith %}
-{% endblock %}
+{% endblock %}
\ No newline at end of file
diff --git a/user/admin.py b/user/admin.py
new file mode 100644
index 0000000..b5ed08a
--- /dev/null
+++ b/user/admin.py
@@ -0,0 +1,27 @@
+from django.contrib import admin
+from django.contrib.auth.admin import UserAdmin
+from django.contrib.auth.models import User
+
+from user.models import Profile
+
+
+class ProfileInline(admin.StackedInline):
+ model = Profile
+ can_delete = False
+ verbose_name_plural = 'Profile'
+ fk_name = 'user'
+
+
+class CustomUserAdmin(UserAdmin):
+ inlines = (ProfileInline, )
+
+ def get_inline_instances(self, request, obj=None):
+ if not obj:
+ return list()
+ return super(CustomUserAdmin, self).get_inline_instances(request, obj)
+
+
+# Register your models here.
+admin.site.register(Profile)
+admin.site.unregister(User)
+admin.site.register(User, CustomUserAdmin)
diff --git a/user/migrations/0001_initial.py b/user/migrations/0001_initial.py
new file mode 100644
index 0000000..301a3cf
--- /dev/null
+++ b/user/migrations/0001_initial.py
@@ -0,0 +1,40 @@
+# Generated by Django 4.1.3 on 2023-10-09 16:56
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ("address", "0003_province_code"),
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name="Profile",
+ fields=[
+ (
+ "id",
+ models.BigAutoField(
+ auto_created=True,
+ primary_key=True,
+ serialize=False,
+ verbose_name="ID",
+ ),
+ ),
+ ("provinces", models.ManyToManyField(to="address.province")),
+ (
+ "user",
+ models.OneToOneField(
+ on_delete=django.db.models.deletion.CASCADE,
+ to=settings.AUTH_USER_MODEL,
+ ),
+ ),
+ ],
+ ),
+ ]
diff --git a/user/migrations/0002_alter_profile_provinces.py b/user/migrations/0002_alter_profile_provinces.py
new file mode 100644
index 0000000..5289060
--- /dev/null
+++ b/user/migrations/0002_alter_profile_provinces.py
@@ -0,0 +1,19 @@
+# Generated by Django 4.1.3 on 2023-10-09 17:14
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("address", "0003_province_code"),
+ ("user", "0001_initial"),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name="profile",
+ name="provinces",
+ field=models.ManyToManyField(blank=True, to="address.province"),
+ ),
+ ]
diff --git a/user/migrations/__init__.py b/user/migrations/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/user/models.py b/user/models.py
new file mode 100644
index 0000000..0cabdad
--- /dev/null
+++ b/user/models.py
@@ -0,0 +1,24 @@
+from django.db import models
+from django.contrib.auth.models import User
+from address.models import Province
+from django.db.models.signals import post_save
+from django.dispatch import receiver
+from django.core.exceptions import ObjectDoesNotExist
+
+
+class Profile(models.Model):
+ user = models.OneToOneField(User, on_delete=models.CASCADE)
+ provinces = models.ManyToManyField(Province, blank=True)
+
+
+@receiver(post_save, sender=User)
+def create_user_profile(sender, instance, created, **kwargs):
+ try:
+ instance.profile.save()
+ except ObjectDoesNotExist:
+ Profile.objects.create(user=instance)
+
+
+@receiver(post_save, sender=User)
+def save_user_profile(sender, instance, **kwargs):
+ instance.profile.save()