mirror of
https://gitlab2.federez.net/re2o/re2o
synced 2024-11-05 01:16:27 +00:00
Crée des comptes mail et des alias mail
This commit is contained in:
parent
3837084e84
commit
27464ffa6f
10 changed files with 289 additions and 3 deletions
|
@ -262,6 +262,7 @@ 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):
|
||||
|
|
|
@ -546,6 +546,10 @@ 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 = (
|
||||
|
|
|
@ -79,7 +79,6 @@ from django.contrib.contenttypes.models import ContentType
|
|||
|
||||
register = template.Library()
|
||||
|
||||
|
||||
def get_model(model_name):
|
||||
"""Retrieve the model object from its name"""
|
||||
splitted = model_name.split('.')
|
||||
|
|
|
@ -34,6 +34,8 @@ from reversion.admin import VersionAdmin
|
|||
|
||||
from .models import (
|
||||
User,
|
||||
Mail,
|
||||
MailAlias,
|
||||
ServiceUser,
|
||||
School,
|
||||
ListRight,
|
||||
|
|
|
@ -53,6 +53,7 @@ from .models import (
|
|||
School,
|
||||
ListRight,
|
||||
Whitelist,
|
||||
MailAlias,
|
||||
ListShell,
|
||||
Ban,
|
||||
Adherent,
|
||||
|
@ -590,3 +591,16 @@ class WhitelistForm(FormRevMixin, ModelForm):
|
|||
model = Whitelist
|
||||
exclude = ['user']
|
||||
widgets = {'date_end':DateTimePicker}
|
||||
|
||||
|
||||
class MailAliasForm(FormRevMixin, ModelForm):
|
||||
"""Creation, edition d'un objet alias mail"""
|
||||
def __init__(self, *args, **kwargs):
|
||||
prefix = kwargs.pop('prefix', self.Meta.model.__name__)
|
||||
super(MailAliasForm, self).__init__(*args, prefix=prefix, **kwargs)
|
||||
self.fields['valeur'].label = 'nom de l\'adresse mail'
|
||||
self.fields['extension'].label = 'extension de l\'adresse mail'
|
||||
|
||||
class Meta:
|
||||
model = MailAlias
|
||||
exclude = ['mail']
|
||||
|
|
115
users/models.py
115
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
|
||||
from machines.models import Domain, Interface, Machine, regen, Extension
|
||||
from preferences.models import GeneralOption, AssoOption, OptionalUser
|
||||
from preferences.models import OptionalMachine, MailMessageOption
|
||||
|
||||
|
@ -195,6 +195,12 @@ class User(RevMixin, FieldPermissionModelMixin, AbstractBaseUser,
|
|||
validators=[linux_user_validator]
|
||||
)
|
||||
email = models.EmailField()
|
||||
"""
|
||||
email= models.OneToOneField(
|
||||
Mail,
|
||||
on_delete=models.PROTECT
|
||||
)
|
||||
"""
|
||||
school = models.ForeignKey(
|
||||
'School',
|
||||
on_delete=models.PROTECT,
|
||||
|
@ -247,6 +253,8 @@ class User(RevMixin, FieldPermissionModelMixin, AbstractBaseUser,
|
|||
"Peut voir un objet user quelquonque"),
|
||||
)
|
||||
|
||||
|
||||
|
||||
@cached_property
|
||||
def name(self):
|
||||
"""Si il s'agit d'un adhérent, on renvoie le prénom"""
|
||||
|
@ -674,6 +682,15 @@ class User(RevMixin, FieldPermissionModelMixin, AbstractBaseUser,
|
|||
self.pwd_ntlm = hashNT(password)
|
||||
return
|
||||
|
||||
def get_mail(self):
|
||||
"""
|
||||
Return the mail address choosen by the user
|
||||
"""
|
||||
if not self.mail.internal_activated:
|
||||
return(self.mail.external)
|
||||
else:
|
||||
return(self.mail.mailalias_set.first())
|
||||
|
||||
def get_next_domain_name(self):
|
||||
"""Look for an available name for a new interface for
|
||||
this user by trying "pseudo0", "pseudo1", "pseudo2", ...
|
||||
|
@ -1593,3 +1610,99 @@ class LdapServiceUserGroup(ldapdb.models.Model):
|
|||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
|
||||
class Mail(RevMixin, AclMixin, models.Model):
|
||||
"""
|
||||
Mail account of a user
|
||||
|
||||
Compte mail d'un utilisateur
|
||||
"""
|
||||
external_mail = models.EmailField(help_text="Mail externe")
|
||||
user = models.ForeignKey(
|
||||
'User',
|
||||
on_delete=models.CASCADE,
|
||||
help_text="Object mail d'un User"
|
||||
)
|
||||
redirection = models.BooleanField(
|
||||
default=False
|
||||
)
|
||||
internal_address = models.BooleanField(
|
||||
default=False
|
||||
)
|
||||
|
||||
def __str__(self):
|
||||
return self.mail
|
||||
|
||||
|
||||
class MailAlias(RevMixin, AclMixin, models.Model):
|
||||
"""
|
||||
Define a alias for a user Mail
|
||||
|
||||
Définit un aliase pour un Mail d'utilisateur
|
||||
"""
|
||||
mail = models.ForeignKey(
|
||||
'Mail',
|
||||
on_delete=models.CASCADE,
|
||||
help_text="Objects Mail associé"
|
||||
)
|
||||
valeur = models.CharField(
|
||||
max_length=64,
|
||||
help_text="username de l'adresse mail"
|
||||
)
|
||||
extension = models.ForeignKey(
|
||||
'Extension',
|
||||
on_delete=models.CASCADE,
|
||||
help_text="Extension mail interne"
|
||||
)
|
||||
|
||||
class Meta:
|
||||
unique_together = ('valeur', 'extension',)
|
||||
|
||||
def __str__(self):
|
||||
return self.valeur + "@" + self.extension
|
||||
|
||||
def can_view(self, user_request, *_args, **_kwargs):
|
||||
"""
|
||||
Check if the user can view the aliases
|
||||
"""
|
||||
|
||||
if user_request.has_perm('users.view_mailalias') or user.request == self.mail.user:
|
||||
return True, None
|
||||
else:
|
||||
return False, "Vous n'avais pas les droits suffisants et n'êtes pas propriétaire de ces alias"
|
||||
|
||||
def can_delete(self, user_request, *_args, **_kwargs):
|
||||
"""
|
||||
Check if the user can delete the alias
|
||||
"""
|
||||
|
||||
if user_request.has_perm('users.delete_mailalias'):
|
||||
return True, None
|
||||
else:
|
||||
if user_request == self.mail.user:
|
||||
if self.id != 0:
|
||||
return True, None
|
||||
else:
|
||||
return False, "Vous ne pouvez pas supprimer l'alias lié à votre pseudo"
|
||||
else:
|
||||
return False, "Vous n'avez pas les droits suffisants et n'êtes pas propriétairs de ces alias"
|
||||
|
||||
def can_edit(self, user_request, *_args, **_kwargs):
|
||||
"""
|
||||
Check if the user can edit the alias
|
||||
"""
|
||||
|
||||
if user_request.has_perm('users.change_mailalias'):
|
||||
return True, None
|
||||
else:
|
||||
if user_request == self.mail.user:
|
||||
if self.id != 0:
|
||||
return True, None
|
||||
else:
|
||||
return False, "Vous ne pouvez pas modifier l'alias lié à votre pseudo"
|
||||
else:
|
||||
return False, "Vous n'avez pas les droits suffisants et n'êtes pas propriétairs de cet alias"
|
||||
|
||||
|
||||
|
||||
|
|
53
users/templates/users/aff_alias.html
Normal file
53
users/templates/users/aff_alias.html
Normal file
|
@ -0,0 +1,53 @@
|
|||
{% comment %}
|
||||
Re2o est un logiciel d'administration développé initiallement au rezometz. Il
|
||||
se veut agnostique au réseau considéré, de manière à être installable en
|
||||
quelques clics.
|
||||
|
||||
Copyright © 2017 Gabriel Détraz
|
||||
Copyright © 2017 Goulven Kermarec
|
||||
Copyright © 2017 Augustin Lemesle
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
{% endcomment %}
|
||||
{% load acl %}
|
||||
{% if alias_list.paginator %}
|
||||
{% include "pagination.html" with list=alias_list %}
|
||||
{% endif %}
|
||||
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Alias</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
{% for alias in alias_list %}
|
||||
<td>{{ alias }}</td>
|
||||
<td class="text-right">
|
||||
{% can_delete alias %}
|
||||
{% include 'buttons/suppr.html' with href='users:del-alias' id=alias.id %}
|
||||
{% acl_end %}
|
||||
{% can_edit alias %}
|
||||
{% include 'buttons/edit.html' with href='users:edit-alias' id=alias.id %}
|
||||
{% acl_end %}
|
||||
{% include 'buttons/history.html' with href='users:history' name='alias' id=alias.id %}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
|
||||
{% if alias_list.paginator %}
|
||||
{% include "pagination.html" with list=alias_list %}
|
||||
{% endif %}
|
37
users/templates/users/index_alias.html
Normal file
37
users/templates/users/index_alias.html
Normal file
|
@ -0,0 +1,37 @@
|
|||
{% extends "users/sidebar.html" %}
|
||||
{% comment %}
|
||||
Re2o est un logiciel d'administration développé initiallement au rezometz. Il
|
||||
se veut agnostique au réseau considéré, de manière à être installable en
|
||||
quelques clics.
|
||||
|
||||
Copyright © 2017 Gabriel Détraz
|
||||
Copyright © 2017 Goulven Kermarec
|
||||
Copyright © 2017 Augustin Lemesle
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
{% endcomment %}
|
||||
|
||||
{% load bootstrap3 %}
|
||||
|
||||
{% block title %}Utilisateurs{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<h2>Alias</h2>
|
||||
{% include "users/aff_alias.html" with alias_list=alias_list %}
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
{% endblock %}
|
||||
|
|
@ -64,6 +64,9 @@ urlpatterns = [
|
|||
url(r'^del_whitelist/(?P<whitelistid>[0-9]+)$',
|
||||
views.del_whitelist,
|
||||
name='del-whitelist'),
|
||||
url(r'^add_mailalias/(?P<userid>[0-9]+)$', views.add_mailalias, name='add-mailalias'),
|
||||
url(r'^edit_mailalias/(?P<mailaliasid>[0-9]+)$', views.edit_mailalias, name='edit-mailalias'),
|
||||
url(r'^del-mailalias/(?P<mailaliasid>[0-9]+)$', views.del_mailalias, name='del-mailalias'),
|
||||
url(r'^add_school/$', views.add_school, name='add-school'),
|
||||
url(r'^edit_school/(?P<schoolid>[0-9]+)$',
|
||||
views.edit_school,
|
||||
|
|
|
@ -492,6 +492,66 @@ def del_whitelist(request, whitelist, **_kwargs):
|
|||
)
|
||||
|
||||
|
||||
@login_required
|
||||
@can_create(MailAlias)
|
||||
@can_edit(User)
|
||||
def add_mailalias(request, user, userid):
|
||||
""" Créer un alias """
|
||||
mailalias_instance = MailAlias(mail=user.mail)
|
||||
whitelist = WhitelistForm(
|
||||
request.POST or None,
|
||||
instance=whitelist_instance
|
||||
)
|
||||
if whitelist.is_valid():
|
||||
whitelist.save()
|
||||
messages.success(request, "Alias créé")
|
||||
return redirect(reverse(
|
||||
'users:profil',
|
||||
kwargs={'userid': str(userid)}
|
||||
))
|
||||
|
||||
return form(
|
||||
{'userform': mailalias, 'action_name': 'Ajouter un alias mail'},
|
||||
'users/user.html',
|
||||
request
|
||||
)
|
||||
|
||||
@login_required
|
||||
@can_edit(MailAlias)
|
||||
def edit_mailalias(request, mailalias_instance, **_kwargs):
|
||||
""" Editer un alias mail"""
|
||||
mailalias = MailAliasForm(
|
||||
request.POST or None,
|
||||
instance=mailalias_instance
|
||||
)
|
||||
if whitelist.is_valid():
|
||||
if whitelist.changed_data:
|
||||
whitelist.save()
|
||||
messages.success(request, "Alias modifiée")
|
||||
return redirect(reverse('users:index'))
|
||||
return form(
|
||||
{'userform': mailalias, 'action_name': 'Editer un alias mail'},
|
||||
'users/user.html',
|
||||
request
|
||||
)
|
||||
|
||||
@login_required
|
||||
@can_delete(MailAlias)
|
||||
def del_mailalias(request, mailalias, **_kwargs):
|
||||
""" Supprime un alias mail"""
|
||||
if request.method == "POST":
|
||||
mailalias.delete()
|
||||
messages.success(request, "L'alias a été supprimé")
|
||||
return redirect(reverse(
|
||||
'users:profil',
|
||||
kwargs={'userid': str(mailalias.mail.user.id)}
|
||||
))
|
||||
return form(
|
||||
{'objet': mailalias, 'objet_name': 'mailalias'},
|
||||
'users/delete.html',
|
||||
request
|
||||
)
|
||||
|
||||
@login_required
|
||||
@can_create(School)
|
||||
def add_school(request):
|
||||
|
|
Loading…
Reference in a new issue