diff --git a/machines/forms.py b/machines/forms.py
index 241ce303..23c2aa39 100644
--- a/machines/forms.py
+++ b/machines/forms.py
@@ -262,7 +262,6 @@ class ExtensionForm(FormRevMixin, ModelForm):
self.fields['origin'].label = 'Enregistrement A origin'
self.fields['origin_v6'].label = 'Enregistrement AAAA origin'
self.fields['soa'].label = 'En-tête SOA à utiliser'
- self.fielss['mail_extension'].label = 'Utilisable comme extension mail'
class DelExtensionForm(FormRevMixin, Form):
diff --git a/machines/models.py b/machines/models.py
index c8dccadf..7be76e74 100644
--- a/machines/models.py
+++ b/machines/models.py
@@ -546,10 +546,6 @@ class Extension(RevMixin, AclMixin, models.Model):
'SOA',
on_delete=models.CASCADE
)
- mail_extension = models.BooleanField(
- default=False,
- help_text="Determine si l'extension peut être utilisée comme extension mail interne"
- )
class Meta:
permissions = (
diff --git a/preferences/migrations/0035_optionaluser_mail_extension.py b/preferences/migrations/0035_optionaluser_mail_extension.py
new file mode 100644
index 00000000..3d1b42b4
--- /dev/null
+++ b/preferences/migrations/0035_optionaluser_mail_extension.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.7 on 2018-06-26 19:31
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('preferences', '0034_auto_20180416_1120'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='optionaluser',
+ name='mail_extension',
+ field=models.CharField(default='@example.org', help_text='Extension principale pour les mails internes', max_length=32),
+ ),
+ ]
diff --git a/preferences/models.py b/preferences/models.py
index d39b9f8e..516de515 100644
--- a/preferences/models.py
+++ b/preferences/models.py
@@ -31,6 +31,8 @@ from django.db.models.signals import post_save
from django.dispatch import receiver
from django.core.cache import cache
+from django.forms import ValidationError
+import cotisations.models
import machines.models
from re2o.mixins import AclMixin
@@ -83,12 +85,25 @@ class OptionalUser(AclMixin, PreferencesModel):
blank=True,
null=True
)
+ mail_extension = models.CharField(
+ max_length = 32,
+ default = "@example.org",
+ help_text="Extension principale pour les mails internes",
+ )
class Meta:
permissions = (
("view_optionaluser", "Peut voir les options de l'user"),
)
+ def clean(self):
+ """Clean du model:
+ Creation du mode de paiement par solde
+ Vérifie que l'extension mail commence bien par @
+ """
+ if self.mail_extension[0] != "@":
+ raise ValidationError("L'extension mail doit commencer par un @")
+
@receiver(post_save, sender=OptionalUser)
def optionaluser_post_save(**kwargs):
diff --git a/preferences/templates/preferences/display_preferences.html b/preferences/templates/preferences/display_preferences.html
index 34417695..c232f13c 100755
--- a/preferences/templates/preferences/display_preferences.html
+++ b/preferences/templates/preferences/display_preferences.html
@@ -56,6 +56,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
Creations de clubs par tous |
{{ useroptions.all_can_create_club|tick }} |
+
+ Extension mail interne |
+ {{ useroptions.mail_extension }} |
+
diff --git a/users/admin.py b/users/admin.py
index 5f4c197b..92528455 100644
--- a/users/admin.py
+++ b/users/admin.py
@@ -127,7 +127,6 @@ class UserAdmin(VersionAdmin, BaseUserAdmin):
list_display = (
'pseudo',
'surname',
- 'email',
'school',
'is_admin',
'shell'
@@ -141,7 +140,7 @@ class UserAdmin(VersionAdmin, BaseUserAdmin):
'Personal info',
{
'fields':
- ('surname', 'email', 'school', 'shell', 'uid_number')
+ ('surname', 'school', 'shell', 'uid_number')
}
),
('Permissions', {'fields': ('is_admin', )}),
@@ -156,7 +155,6 @@ class UserAdmin(VersionAdmin, BaseUserAdmin):
'fields': (
'pseudo',
'surname',
- 'email',
'school',
'is_admin',
'password1',
diff --git a/users/forms.py b/users/forms.py
index ba8e137e..a3459eac 100644
--- a/users/forms.py
+++ b/users/forms.py
@@ -140,7 +140,7 @@ class UserCreationForm(FormRevMixin, forms.ModelForm):
class Meta:
model = Adherent
- fields = ('pseudo', 'surname', 'email')
+ fields = ('pseudo', 'surname')
def clean_password2(self):
"""Verifie que password1 et 2 sont identiques"""
@@ -220,7 +220,7 @@ class UserChangeForm(FormRevMixin, forms.ModelForm):
class Meta:
model = Adherent
- fields = ('pseudo', 'password', 'surname', 'email')
+ fields = ('pseudo', 'password', 'surname')
def __init__(self, *args, **kwargs):
prefix = kwargs.pop('prefix', self.Meta.model.__name__)
@@ -313,7 +313,6 @@ class AdherentForm(FormRevMixin, FieldPermissionFormMixin, ModelForm):
'name',
'surname',
'pseudo',
- 'email',
'school',
'comment',
'room',
@@ -365,7 +364,6 @@ class ClubForm(FormRevMixin, FieldPermissionFormMixin, ModelForm):
fields = [
'surname',
'pseudo',
- 'email',
'school',
'comment',
'room',
diff --git a/users/migrations/0073_mail_mailalias.py b/users/migrations/0073_mail_mailalias.py
new file mode 100644
index 00000000..ce676464
--- /dev/null
+++ b/users/migrations/0073_mail_mailalias.py
@@ -0,0 +1,38 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.7 on 2018-06-26 19:07
+from __future__ import unicode_literals
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+import re2o.mixins
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('users', '0072_auto_20180426_2021'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Mail',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('external_mail', models.EmailField(help_text='Mail externe', max_length=254)),
+ ('redirection', models.BooleanField(default=False)),
+ ('internal_address', models.BooleanField(default=False)),
+ ('user', models.OneToOneField(help_text="Object mail d'un User", on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
+ ],
+ bases=(re2o.mixins.RevMixin, re2o.mixins.AclMixin, models.Model),
+ ),
+ migrations.CreateModel(
+ name='MailAlias',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('valeur', models.CharField(help_text="username de l'adresse mail", max_length=64, unique=True)),
+ ('mail', models.ForeignKey(help_text='Objects Mail associé', on_delete=django.db.models.deletion.CASCADE, to='users.Mail')),
+ ],
+ bases=(re2o.mixins.RevMixin, re2o.mixins.AclMixin, models.Model),
+ ),
+ ]
diff --git a/users/migrations/0074_transfermail.py b/users/migrations/0074_transfermail.py
new file mode 100644
index 00000000..dbf6adca
--- /dev/null
+++ b/users/migrations/0074_transfermail.py
@@ -0,0 +1,36 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.7 on 2018-06-26 18:34
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('users', '0073_mail_mailalias'),
+ ]
+
+ def create_mail(apps, schema_editor):
+ db_alias = schema_editor.connection.alias
+ user = apps.get_model('users','User')
+ mail = apps.get_model('users','Mail')
+ mailalias = apps.get_model('users','MailAlias')
+ users = user.objects.using(db_alias).all()
+ for us in users:
+ ma = mail()
+ ma.user=us
+ ma.external_mail = us.email
+ ma.save()
+ al = mailalias()
+ al.mail = ma
+ al.valeur = us.pseudo
+ al.save()
+
+ def uncreatemail(apps,schema_editor):
+ pass
+
+ operations = [
+ migrations.RunPython(create_mail, uncreatemail)
+ ]
diff --git a/users/models.py b/users/models.py
index f5e2039f..bbdbef58 100644
--- a/users/models.py
+++ b/users/models.py
@@ -79,7 +79,7 @@ from re2o.field_permissions import FieldPermissionModelMixin
from re2o.mixins import AclMixin, RevMixin
from cotisations.models import Cotisation, Facture, Paiement, Vente
-from machines.models import Domain, Interface, Machine, regen, Extension
+from machines.models import Domain, Interface, Machine, regen
from preferences.models import GeneralOption, AssoOption, OptionalUser
from preferences.models import OptionalMachine, MailMessageOption
@@ -134,7 +134,6 @@ class UserManager(BaseUserManager):
self,
pseudo,
surname,
- email,
password=None,
su=False
):
@@ -148,7 +147,6 @@ class UserManager(BaseUserManager):
pseudo=pseudo,
surname=surname,
name=surname,
- email=self.normalize_email(email),
)
user.set_password(password)
@@ -157,19 +155,19 @@ class UserManager(BaseUserManager):
user.save(using=self._db)
return user
- def create_user(self, pseudo, surname, email, password=None):
+ def create_user(self, pseudo, surname, password=None):
"""
Creates and saves a User with the given pseudo, name, surname, email,
and password.
"""
- return self._create_user(pseudo, surname, email, password, False)
+ return self._create_user(pseudo, surname, password, False)
- def create_superuser(self, pseudo, surname, email, password):
+ def create_superuser(self, pseudo, surname, password):
"""
Creates and saves a superuser with the given pseudo, name, surname,
email, and password.
"""
- return self._create_user(pseudo, surname, email, password, True)
+ return self._create_user(pseudo, surname, password, True)
class User(RevMixin, FieldPermissionModelMixin, AbstractBaseUser,
@@ -188,19 +186,13 @@ class User(RevMixin, FieldPermissionModelMixin, AbstractBaseUser,
)
surname = models.CharField(max_length=255)
+ email = models.EmailField()
pseudo = models.CharField(
max_length=32,
unique=True,
help_text="Doit contenir uniquement des lettres, chiffres, ou tirets",
validators=[linux_user_validator]
)
- email = models.EmailField()
- """
- email= models.OneToOneField(
- Mail,
- on_delete=models.PROTECT
- )
- """
school = models.ForeignKey(
'School',
on_delete=models.PROTECT,
@@ -233,7 +225,7 @@ class User(RevMixin, FieldPermissionModelMixin, AbstractBaseUser,
)
USERNAME_FIELD = 'pseudo'
- REQUIRED_FIELDS = ['surname', 'email']
+ REQUIRED_FIELDS = ['surname']
objects = UserManager()
@@ -686,10 +678,10 @@ class User(RevMixin, FieldPermissionModelMixin, AbstractBaseUser,
"""
Return the mail address choosen by the user
"""
- if not self.mail.internal_activated:
- return(self.mail.external)
+ if not self.mail.internal_address:
+ return self.mail.external_mail
else:
- return(self.mail.mailalias_set.first())
+ return self.mail.mailalias_set.get(valeur=pseudo)
def get_next_domain_name(self):
"""Look for an available name for a new interface for
@@ -1619,7 +1611,7 @@ class Mail(RevMixin, AclMixin, models.Model):
Compte mail d'un utilisateur
"""
external_mail = models.EmailField(help_text="Mail externe")
- user = models.ForeignKey(
+ user = models.OneToOneField(
'User',
on_delete=models.CASCADE,
help_text="Object mail d'un User"
@@ -1632,7 +1624,7 @@ class Mail(RevMixin, AclMixin, models.Model):
)
def __str__(self):
- return self.mail
+ return self.user.get_mail()
class MailAlias(RevMixin, AclMixin, models.Model):
@@ -1647,20 +1639,14 @@ class MailAlias(RevMixin, AclMixin, models.Model):
help_text="Objects Mail associé"
)
valeur = models.CharField(
+ unique=True,
max_length=64,
help_text="username de l'adresse mail"
)
- extension = models.ForeignKey(
- 'machines.Extension',
- on_delete=models.CASCADE,
- help_text="Extension mail interne"
- )
- class Meta:
- unique_together = ('valeur', 'extension',)
def __str__(self):
- return self.valeur + "@" + self.extension
+ return self.valeur + OptionalUser.get_cached_value('mail_extension')
def can_view(self, user_request, *_args, **_kwargs):
"""
@@ -1681,7 +1667,7 @@ class MailAlias(RevMixin, AclMixin, models.Model):
return True, None
else:
if user_request == self.mail.user:
- if self.id != 0:
+ if self.valeur == self.mail.user.pseudo:
return True, None
else:
return False, "Vous ne pouvez pas supprimer l'alias lié à votre pseudo"
@@ -1697,7 +1683,7 @@ class MailAlias(RevMixin, AclMixin, models.Model):
return True, None
else:
if user_request == self.mail.user:
- if self.id != 0:
+ if self.valeur == self.mail.user.pseudo:
return True, None
else:
return False, "Vous ne pouvez pas modifier l'alias lié à votre pseudo"
diff --git a/users/views.py b/users/views.py
index b2a83dbe..c8061040 100644
--- a/users/views.py
+++ b/users/views.py
@@ -81,6 +81,8 @@ from .models import (
Adherent,
Club,
ListShell,
+ MailAlias,
+ Mail,
)
from .forms import (
BanForm,