Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
.idea
db.sqlite3
__pycache__

File renamed without changes.
89 changes: 89 additions & 0 deletions Account/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
from django.utils import timezone
from django.contrib import admin
from django.core.mail import send_mail
from .models import Members, Users
from django.utils.translation import ugettext_lazy as _

# ******************************
# class StatisticsAdmin(admin.ModelAdmin):
# list_display = ('total_users', 'male_count', 'female_count') # Ajoutez d'autres statistiques si nécessaire
#
# def total_users(self, obj):
# return Users.objects.count()
#
# def male_count(self, obj):
# return Users.objects.filter(sexe='Male').count()
#
# def female_count(self, obj):
# return Users.objects.filter(sexe='Female').count()
#
#
# admin.site.register(Users, StatisticsAdmin)
# *****************************


class MembersAdmin(admin.ModelAdmin):
list_display = ('mentor', 'mentore', 'status', 'created_at', 'updated_at')
list_filter = ('status',)
actions = ['accept_requests', 'reject_requests']

def accept_requests(self, request, queryset):
queryset.update(status=True)
for membership in queryset:
# Envoyer un e-mail à l'utilisateur mentore
subject = "Demande de mentorat acceptée"
message = "Votre demande de mentorat a été acceptée. Vous pouvez maintenant commencer le mentorat."
from_email = "tdev@gmail.com"
recipient_list = [membership.mentore.email]
send_mail(subject, message, from_email, recipient_list, fail_silently=False)

accept_requests.short_description = "Accepter les demandes de mentorat sélectionnées"

def reject_requests(self, request, queryset):
queryset.delete()

reject_requests.short_description = "Rejeter les demandes de mentorat sélectionnées"


admin.site.register(Members, MembersAdmin)


class GenderFilter(admin.SimpleListFilter):
title = _('Gender')
parameter_name = 'sexe'

def lookups(self, request, model_admin):
return (
('Male', _('Male')),
('Female', _('Female')),
)

def queryset(self, request, queryset):
if self.value() == 'Male':
return queryset.filter(sexe='Male')
if self.value() == 'Female':
return queryset.filter(sexe='Female')


class UsersAdmin(admin.ModelAdmin):
list_display = ('username','first_name', 'last_name','duration_since_creation', 'email',)
list_display_links = ('email',) # Lien direct vers la page de modification
search_fields = ("first_name", "email")
list_filter = (GenderFilter,)
actions = ['edit_selected', 'delete_selected', 'show_user_count']

# Méthode pour calculer la durée depuis la création de l'utilisateur
def duration_since_creation(self, obj):
now = timezone.now()
duration = now - obj.created_at
return duration.days

def show_user_count(self, request, queryset):
total_users = Users.objects.count()
self.message_user(request, f"Nombre total d'utilisateurs : {total_users}")

show_user_count.short_description = "Afficher le nombre total d'utilisateurs"
duration_since_creation.short_description = 'Duration Since Creation'


admin.site.register(Users, UsersAdmin)
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from django.core.management.base import BaseCommand
from BaseApi.AppEnum import UserRoleEnum
from Account.models import Users
from Permission.models import User_permissions, Roles
from Permission.models import Roles
from django.contrib.auth.models import Permission

class Seeder:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Generated by Django 4.2 on 2023-10-21 22:39
# Generated by Django 4.2 on 2023-10-22 19:00

from django.db import migrations, models
import django.db.models.deletion
Expand Down Expand Up @@ -69,9 +69,11 @@ class Migration(migrations.Migration):
('first_name', models.CharField(max_length=255, null=True)),
('phone', models.CharField(max_length=50, null=True, unique=True)),
('email', models.EmailField(max_length=255, unique=True, verbose_name='email address')),
('username', models.CharField(max_length=255, unique=True)),
('status', models.BooleanField(default=False)),
('password', models.CharField(max_length=255)),
('sexe', models.CharField(choices=[('Homme', 'HOMME'), ('Femme', 'FEMME'), ('Autre', 'AUTRE')], max_length=255, null=True)),
('is_superuser', models.BooleanField(default=False)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('pays', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='Account.pays')),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Generated by Django 4.2 on 2023-10-21 22:39
# Generated by Django 4.2 on 2023-10-22 19:00

from django.conf import settings
from django.db import migrations, models
Expand Down
23 changes: 23 additions & 0 deletions Account/migrations/0003_users_is_active_users_is_staff.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Generated by Django 4.2.2 on 2023-10-22 17:46

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('Account', '0002_initial'),
]

operations = [
migrations.AddField(
model_name='users',
name='is_active',
field=models.BooleanField(default=True),
),
migrations.AddField(
model_name='users',
name='is_staff',
field=models.BooleanField(default=False),
),
]
18 changes: 18 additions & 0 deletions Account/migrations/0004_users_is_superuser.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 4.2.2 on 2023-10-22 18:01

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('Account', '0003_users_is_active_users_is_staff'),
]

operations = [
migrations.AddField(
model_name='users',
name='is_superuser',
field=models.BooleanField(default=False),
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Generated by Django 4.2.2 on 2023-10-22 19:17

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('Account', '0004_users_is_superuser'),
]

operations = [
migrations.RemoveField(
model_name='users',
name='is_active',
),
migrations.RemoveField(
model_name='users',
name='is_staff',
),
]
21 changes: 21 additions & 0 deletions Account/migrations/0006_auto_20231023_1224.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Generated by Django 3.2.11 on 2023-10-23 12:24

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('Account', '0005_remove_users_is_active_remove_users_is_staff'),
]

operations = [
migrations.AlterModelOptions(
name='members',
options={'verbose_name': 'Membre'},
),
migrations.AlterModelOptions(
name='users',
options={'verbose_name': 'Utilisateur'},
),
]
File renamed without changes.
66 changes: 64 additions & 2 deletions backend/Account/models.py → Account/models.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
from django.core.mail import send_mail
from django.db import models
from django.contrib.auth.models import AbstractBaseUser
from django.utils import timezone
from BaseApi.AppEnum import GenderEnum
from BaseApi.AppEnum import *
from django.contrib.auth.models import UserManager
from django.contrib.auth.models import BaseUserManager
from Permission.models import Roles

class Pays(models.Model):
code = models.CharField(max_length=4)
Expand All @@ -16,20 +20,74 @@ class Professions(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)

class UserManager(BaseUserManager):
def create_user(self, email, password=None, **extra_fields):
if not email:
raise ValueError('The Email field must be set')
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user

def create_superuser(self, email, password=None, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)

superUserRole, created = Roles.objects.get_or_create(name=UserRoleEnum.SUPER_ADMIN.value, defaults={'description': 'The super user'})
extra_fields.setdefault('role_id', superUserRole.id)

if extra_fields.get('is_staff') is not True:
raise ValueError('Superuser must have is_staff=True.')
if extra_fields.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser=True.')

return self.create_user(email, password, **extra_fields)

class Users(AbstractBaseUser):
last_name = models.CharField(max_length=255, null=True)
first_name = models.CharField(max_length=255, null=True)
pays = models.ForeignKey('Account.Pays', on_delete=models.CASCADE,null=True)
phone = models.CharField(max_length=50, unique=True, null=True)
email = models.EmailField(verbose_name='email address', max_length=255, unique=True)
username = models.CharField(max_length=255, unique=True)
status = models.BooleanField(default=False)
password = models.CharField(max_length=255)
sexe = models.CharField(max_length=255, choices=[(sexe.value, sexe.name) for sexe in GenderEnum], null=True)
role = models.ForeignKey('Permission.Roles', on_delete=models.CASCADE, related_name='users_role')
profession = models.ForeignKey('Account.Professions', on_delete=models.CASCADE, null=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']

class Meta:
verbose_name = 'Utilisateur'

def is_mentor(self):
# Vérifie si l'utilisateur est un mentor (au moins une demande en tant que mentor)
return self.mentor.exists()

def is_mentore(self):
return self.mentore.exists()

objects = UserManager()

@property
def is_staff(self):
return self.is_superuser

def has_perm(self, perm, obj=None):
return self.is_superuser

def has_module_perms(self, app_label):
return self.is_superuser

@is_staff.setter
def is_staff(self, value):
self._is_staff = value

class Stacks(models.Model):
name = models.CharField(max_length=255)
Expand All @@ -43,9 +101,13 @@ class UserStacks(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)


class Members(models.Model):
mentor = models.ForeignKey('Account.Users', related_name='mentor', on_delete=models.CASCADE)
mentore = models.ForeignKey('Account.Users', related_name='mentore', on_delete=models.CASCADE)
status = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
updated_at = models.DateTimeField(auto_now=True)

class Meta:
verbose_name = 'Membre'
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Loading