diff --git a/optimap/settings.py b/optimap/settings.py index e307b36..4267786 100644 --- a/optimap/settings.py +++ b/optimap/settings.py @@ -50,6 +50,8 @@ "sesame.backends.ModelBackend", ] +AUTH_USER_MODEL = "publications.CustomUser" + INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', diff --git a/publications/admin.py b/publications/admin.py index 58836a6..5f96f81 100644 --- a/publications/admin.py +++ b/publications/admin.py @@ -10,10 +10,6 @@ from django_q.models import Schedule from datetime import datetime, timedelta - -# Unregister the default User admin -admin.site.unregister(User) - @admin.action(description="Mark selected publications as published") def make_public(modeladmin, request, queryset): queryset.update(status="p") diff --git a/publications/models.py b/publications/models.py index 1cc5e30..d879672 100644 --- a/publications/models.py +++ b/publications/models.py @@ -2,9 +2,11 @@ from django.contrib.postgres.fields import ArrayField from django_currentuser.db.models import CurrentUserField from django.utils.timezone import now -from django.contrib.auth import get_user_model - -User = get_user_model() +from django.contrib.auth.models import AbstractUser, Group, Permission +import uuid +from django.utils.timezone import now +import logging +logger = logging.getLogger(__name__) STATUS_CHOICES = ( ("d", "Draft"), @@ -14,6 +16,27 @@ ("h", "Harvested"), ) +class CustomUser(AbstractUser): + deleted = models.BooleanField(default=False) + deleted_at = models.DateTimeField(null=True, blank=True) + groups = models.ManyToManyField(Group, related_name="publications_users", blank=True) + user_permissions = models.ManyToManyField(Permission, related_name="publications_users_permissions", blank=True) + + def soft_delete(self): + """Marks the user as deleted instead of removing from the database.""" + self.deleted = True + self.deleted_at = now() + self.save() + logger.info(f"User {self.username} (ID: {self.id}) was soft deleted at {self.deleted_at}") + + + def restore(self): + """Restores a previously deleted user.""" + self.deleted = False + self.deleted_at = None + self.save() + logger.info(f"User {self.username} (ID: {self.id}) was restored.") + class Publication(models.Model): # required fields title = models.TextField() @@ -88,6 +111,9 @@ class Meta: ordering = ['user_name'] verbose_name = "subscription" +from django.contrib.auth import get_user_model +User = get_user_model() + class EmailLog(models.Model): TRIGGER_CHOICES = [ ("admin", "Admin Panel"), @@ -126,7 +152,7 @@ def log_email(cls, recipient, subject, content, sent_by=None, trigger_source="ma from import_export import fields, resources from import_export.widgets import ForeignKeyWidget from django.conf import settings -from django.contrib.auth.models import User + class PublicationResource(resources.ModelResource): #created_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='username') #updated_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='username') diff --git a/publications/serializers.py b/publications/serializers.py index 00e9f60..3de2566 100644 --- a/publications/serializers.py +++ b/publications/serializers.py @@ -2,6 +2,8 @@ from rest_framework_gis import serializers from .models import Publication +from django.contrib.auth import get_user_model +User = get_user_model() from publications.models import Publication,Subscription @@ -23,4 +25,14 @@ class Meta: fields = ("search_term","timeperiod_startdate","timeperiod_enddate","user_name") geo_field = "search_area" auto_bbox = True - \ No newline at end of file + +class UserSerializer(serializers.ModelSerializer): + class Meta: + model = User + fields = ["id", "username", "email"] + + def to_representation(self, instance): + """Ensure deleted users are excluded from serialization.""" + if instance.deleted: + return None + return super().to_representation(instance) diff --git a/publications/signals.py b/publications/signals.py index 3041364..580a3cf 100644 --- a/publications/signals.py +++ b/publications/signals.py @@ -4,6 +4,7 @@ from django.db.models.signals import pre_save from django.dispatch import receiver from django.contrib.auth import get_user_model +User = get_user_model() from django.conf import settings from django.db.models.signals import post_save User = get_user_model() diff --git a/publications/templates/base.html b/publications/templates/base.html index bb9b7a8..9749d74 100644 --- a/publications/templates/base.html +++ b/publications/templates/base.html @@ -1,53 +1,57 @@ {% load static %} - -
- - - -