diff --git a/CHANGELOG.md b/CHANGELOG.md
index dcf03168..f390ba09 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -121,7 +121,7 @@ in their own Payment models.
To have a closer look on how the payments works, please go to the wiki.
-## MR xxx: Add role models
+## MR 182: Add role models
Adds the Role model.
You need to ensure that your database character set is utf-8.
diff --git a/machines/forms.py b/machines/forms.py
index c8584d30..ecffcc71 100644
--- a/machines/forms.py
+++ b/machines/forms.py
@@ -37,6 +37,7 @@ from __future__ import unicode_literals
from django.forms import ModelForm, Form
from django import forms
+from django.utils.translation import ugettext_lazy as _l
from re2o.field_permissions import FieldPermissionFormMixin
from re2o.mixins import FormRevMixin
@@ -499,7 +500,7 @@ class DelNasForm(FormRevMixin, Form):
class RoleForm(FormRevMixin, ModelForm):
- """Ajout et edition d'un role"""
+ """Add and edit role."""
class Meta:
model = Role
fields = '__all__'
@@ -514,10 +515,10 @@ class RoleForm(FormRevMixin, ModelForm):
class DelRoleForm(FormRevMixin, Form):
- """Suppression d'un ou plusieurs service"""
+ """Deletion of one or several roles."""
role = forms.ModelMultipleChoiceField(
queryset=Role.objects.none(),
- label="Roles actuels",
+ label=_l("Current roles"),
widget=forms.CheckboxSelectMultiple
)
@@ -527,9 +528,7 @@ class DelRoleForm(FormRevMixin, Form):
if instances:
self.fields['role'].queryset = instances
else:
- self.fields['role'].queryset = role.objects.all()
-
-
+ self.fields['role'].queryset = Role.objects.all()
class ServiceForm(FormRevMixin, ModelForm):
diff --git a/machines/models.py b/machines/models.py
index 2f401301..6ce84adb 100644
--- a/machines/models.py
+++ b/machines/models.py
@@ -42,6 +42,7 @@ from django.forms import ValidationError
from django.utils.functional import cached_property
from django.utils import timezone
from django.core.validators import MaxValueValidator
+from django.utils.translation import ugettext_lazy as _l
from macaddress.fields import MACAddressField
@@ -158,7 +159,7 @@ class Machine(RevMixin, FieldPermissionModelMixin, models.Model):
user_request,
*args,
**kwargs
- )[0]):
+ )[0]):
return False, (u"Vous ne pouvez pas éditer une machine "
"d'un autre user que vous sans droit")
return True, None
@@ -176,7 +177,7 @@ class Machine(RevMixin, FieldPermissionModelMixin, models.Model):
user_request,
*args,
**kwargs
- )[0]):
+ )[0]):
return False, (u"Vous ne pouvez pas éditer une machine "
"d'un autre user que vous sans droit")
return True, None
@@ -338,10 +339,10 @@ class IpType(RevMixin, AclMixin, models.Model):
return
else:
for ipv6 in Ipv6List.objects.filter(
- interface__in=Interface.objects.filter(
- type__in=MachineType.objects.filter(ip_type=self)
- )
- ):
+ interface__in=Interface.objects.filter(
+ type__in=MachineType.objects.filter(ip_type=self)
+ )
+ ):
ipv6.check_and_replace_prefix(prefix=self.prefix_v6)
def clean(self):
@@ -713,7 +714,7 @@ class Srv(RevMixin, AclMixin, models.Model):
choices=(
(TCP, 'TCP'),
(UDP, 'UDP'),
- ),
+ ),
default=TCP,
)
extension = models.ForeignKey('Extension', on_delete=models.PROTECT)
@@ -1047,7 +1048,7 @@ class Interface(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model):
user_request,
*args,
**kwargs
- )[0]):
+ )[0]):
return False, (u"Vous ne pouvez pas éditer une machine "
"d'un autre user que vous sans droit")
return True, None
@@ -1064,7 +1065,7 @@ class Interface(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model):
user_request,
*args,
**kwargs
- )[0]):
+ )[0]):
return False, (u"Vous ne pouvez pas éditer une machine "
"d'un autre user que vous sans droit")
return True, None
@@ -1165,7 +1166,7 @@ class Ipv6List(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model):
user_request,
*args,
**kwargs
- )[0]):
+ )[0]):
return False, (u"Vous ne pouvez pas éditer une machine "
"d'un autre user que vous sans droit")
return True, None
@@ -1182,7 +1183,7 @@ class Ipv6List(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model):
user_request,
*args,
**kwargs
- )[0]):
+ )[0]):
return False, (u"Vous ne pouvez pas éditer une machine "
"d'un autre user que vous sans droit")
return True, None
@@ -1358,11 +1359,11 @@ class Domain(RevMixin, AclMixin, models.Model):
return False, (u"Vous ne pouvez pas ajouter un alias à une "
"machine d'un autre user que vous sans droit")
if Domain.objects.filter(
- cname__in=Domain.objects.filter(
- interface_parent__in=(interface.machine.user
- .user_interfaces())
- )
- ).count() >= max_lambdauser_aliases:
+ cname__in=Domain.objects.filter(
+ interface_parent__in=(interface.machine.user
+ .user_interfaces())
+ )
+ ).count() >= max_lambdauser_aliases:
return False, (u"Vous avez atteint le maximum d'alias "
"autorisés que vous pouvez créer vous même "
"(%s) " % max_lambdauser_aliases)
@@ -1441,27 +1442,25 @@ class IpList(RevMixin, AclMixin, models.Model):
return self.ipv4
-
class Role(RevMixin, AclMixin, models.Model):
- """ Definition d'un role (routeur principal, routeur de backkup)"""
- """ Sert à la génération automatique de la conf des serveurs"""
- PRETTY_NAME = "Roles des serveurs"
+ """Define the role of a machine.
+ Allow automated generation of the server configuration.
+ """
ROLE = (
- ('dhcp-server', 'dhcp-server'),
- ('switch-conf-server', 'switch-conf-server'),
- ('dns-recursif-server', 'dns-recursif-server'),
- ('ntp-server', 'ntp-server'),
- ('radius-server', 'radius-server'),
- ('ntp-server', 'ntp-server'),
- ('log-server', 'log-server'),
- ('ldap-master-server', 'ldap-master-server'),
- ('ldap-backup-server', 'ldap-backup-server'),
- ('smtp-server', 'smtp-server'),
- ('postgresql-server', 'postgresql-server'),
- ('mysql-server', 'mysql-server'),
- ('sql-client', 'sql-client'),
- ('gateway', 'gateway'),
+ ('dhcp-server', _l('DHCP server')),
+ ('switch-conf-server', _l('Switches configuration server')),
+ ('dns-recursif-server', _l('Recursive DNS server')),
+ ('ntp-server', _l('NTP server')),
+ ('radius-server', _l('Radius server')),
+ ('log-server', _l('Log server')),
+ ('ldap-master-server', _l('LDAP master server')),
+ ('ldap-backup-server', _l('LDAP backup server')),
+ ('smtp-server', _l('SMTP server')),
+ ('postgresql-server', _l('postgreSQL server')),
+ ('mysql-server', _l('mySQL server')),
+ ('sql-client', _l('SQL client')),
+ ('gateway', _l('Gatewaw')),
)
role_type = models.CharField(max_length=255, unique=True)
@@ -1475,21 +1474,28 @@ class Role(RevMixin, AclMixin, models.Model):
class Meta:
permissions = (
- ("view_role", "Peut voir un objet service"),
+ ("view_role", _l("Can view a role.")),
)
+ verbose_name = _l("Server role")
@classmethod
- def get_instance(cls, machineid, *_args, **_kwargs):
- """Get the Machine instance with machineid.
- :param userid: The id
- :return: The user
+ def get_instance(cls, roleid, *_args, **_kwargs):
+ """Get the Role instance with roleid.
+
+ Args:
+ roleid: The id
+
+ Returns:
+ The role.
"""
- return cls.objects.get(pk=machineid)
+ return cls.objects.get(pk=roleid)
@classmethod
def interface_for_roletype(cls, roletype):
"""Return interfaces for a roletype"""
- return Interface.objects.filter(role=cls.objects.filter(specific_role=roletype))
+ return Interface.objects.filter(
+ role=cls.objects.filter(specific_role=roletype)
+ )
def save(self, *args, **kwargs):
super(Role, self).save(*args, **kwargs)
@@ -1497,6 +1503,7 @@ class Role(RevMixin, AclMixin, models.Model):
def __str__(self):
return str(self.role_type)
+
class Service(RevMixin, AclMixin, models.Model):
""" Definition d'un service (dhcp, dns, etc)"""
PRETTY_NAME = "Services à générer (dhcp, dns, etc)"
@@ -1527,8 +1534,8 @@ class Service(RevMixin, AclMixin, models.Model):
""" Django ne peut créer lui meme les relations manytomany avec table
intermediaire explicite"""
for serv in servers.exclude(
- pk__in=Interface.objects.filter(service=self)
- ):
+ pk__in=Interface.objects.filter(service=self)
+ ):
link = Service_link(service=self, server=serv)
link.save()
Service_link.objects.filter(service=self).exclude(server__in=servers)\
@@ -1686,7 +1693,7 @@ class OuverturePort(RevMixin, AclMixin, models.Model):
choices=(
(TCP, 'TCP'),
(UDP, 'UDP'),
- ),
+ ),
default=TCP,
)
io = models.CharField(
@@ -1694,7 +1701,7 @@ class OuverturePort(RevMixin, AclMixin, models.Model):
choices=(
(IN, 'IN'),
(OUT, 'OUT'),
- ),
+ ),
default=OUT,
)
diff --git a/machines/templates/machines/aff_role.html b/machines/templates/machines/aff_role.html
index 691cc0c2..f83a4adb 100644
--- a/machines/templates/machines/aff_role.html
+++ b/machines/templates/machines/aff_role.html
@@ -23,29 +23,31 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% endcomment %}
{% load acl %}
+{% load i18n %}
-
-
-
- Nom du role |
- Role spécifique |
- Serveurs inclus |
- |
- |
-
-
- {% for role in role_list %}
+
+
+
- {{ role.role_type }} |
- {{ role.specific_role }} |
- {% for serv in role.servers.all %}{{ serv }}, {% endfor %} |
-
- {% can_edit role %}
- {% include 'buttons/edit.html' with href='machines:edit-role' id=role.id %}
- {% acl_end %}
- {% include 'buttons/history.html' with href='machines:history' name='role' id=role.id %}
- |
+ {% trans "Role name" %} |
+ {% trans "Specific role" %} |
+ {% trans "Servers" %} |
+ |
+ |
- {% endfor %}
-
+
+ {% for role in role_list %}
+
+ {{ role.role_type }} |
+ {{ role.specific_role }} |
+ {% for serv in role.servers.all %}{{ serv }}, {% endfor %} |
+
+ {% can_edit role %}
+ {% include 'buttons/edit.html' with href='machines:edit-role' id=role.id %}
+ {% acl_end %}
+ {% include 'buttons/history.html' with href='machines:history' name='role' id=role.id %}
+ |
+
+ {% endfor %}
+
diff --git a/machines/views.py b/machines/views.py
index 134560ba..975cac08 100644
--- a/machines/views.py
+++ b/machines/views.py
@@ -40,6 +40,7 @@ from django.contrib.auth.decorators import login_required, permission_required
from django.db.models import ProtectedError, F
from django.forms import modelformset_factory
from django.views.decorators.csrf import csrf_exempt
+from django.utils.translation import ugettext as _
from rest_framework.renderers import JSONRenderer
@@ -181,14 +182,14 @@ def generate_ipv4_engine(is_type_tt):
"""
return (
'new Bloodhound( {{'
- 'datumTokenizer: Bloodhound.tokenizers.obj.whitespace( "value" ),'
- 'queryTokenizer: Bloodhound.tokenizers.whitespace,'
- 'local: choices_ipv4[ $( "#{type_id}" ).val() ],'
- 'identify: function( obj ) {{ return obj.key; }}'
+ 'datumTokenizer: Bloodhound.tokenizers.obj.whitespace( "value" ),'
+ 'queryTokenizer: Bloodhound.tokenizers.whitespace,'
+ 'local: choices_ipv4[ $( "#{type_id}" ).val() ],'
+ 'identify: function( obj ) {{ return obj.key; }}'
'}} )'
- ).format(
- type_id=f_type_id(is_type_tt)
- )
+ ).format(
+ type_id=f_type_id(is_type_tt)
+ )
def generate_ipv4_match_func(is_type_tt):
@@ -196,17 +197,17 @@ def generate_ipv4_match_func(is_type_tt):
"""
return (
'function(q, sync) {{'
- 'if (q === "") {{'
- 'var first = choices_ipv4[$("#{type_id}").val()].slice(0, 5);'
- 'first = first.map( function (obj) {{ return obj.key; }} );'
- 'sync(engine_ipv4.get(first));'
- '}} else {{'
- 'engine_ipv4.search(q, sync);'
- '}}'
+ 'if (q === "") {{'
+ 'var first = choices_ipv4[$("#{type_id}").val()].slice(0, 5);'
+ 'first = first.map( function (obj) {{ return obj.key; }} );'
+ 'sync(engine_ipv4.get(first));'
+ '}} else {{'
+ 'engine_ipv4.search(q, sync);'
'}}'
- ).format(
- type_id=f_type_id(is_type_tt)
- )
+ '}}'
+ ).format(
+ type_id=f_type_id(is_type_tt)
+ )
def generate_ipv4_mbf_param(form_obj, is_type_tt):
@@ -1168,10 +1169,10 @@ def edit_role(request, role_instance, **_kwargs):
if role.is_valid():
if role.changed_data:
role.save()
- messages.success(request, "Role modifié")
+ messages.success(request, _("Role updated"))
return redirect(reverse('machines:index-role'))
return form(
- {'roleform': role, 'action_name': 'Editer'},
+ {'roleform': role, 'action_name': _('Edit')},
'machines/machine.html',
request
)
@@ -1187,22 +1188,22 @@ def del_role(request, instances):
for role_del in role_dels:
try:
role_del.delete()
- messages.success(request, "Le role a été supprimée")
+ messages.success(request, _("The role has been deleted."))
except ProtectedError:
messages.error(
request,
- ("Erreur le role suivant %s ne peut être supprimé"
- % role_del)
+ (_("Error: The following role cannot be deleted: %(role)")
+ % {'role': role_del}
+ )
)
return redirect(reverse('machines:index-role'))
return form(
- {'roleform': role, 'action_name': 'Supprimer'},
+ {'roleform': role, 'action_name': _('Delete')},
'machines/machine.html',
request
)
-
@login_required
@can_create(Service)
def add_service(request):
@@ -1548,9 +1549,9 @@ def index_ipv6(request, interface, interfaceid):
def index_role(request):
""" View used to display the list of existing roles """
role_list = (Role.objects
- .prefetch_related(
- 'servers__domain__extension'
- ).all())
+ .prefetch_related(
+ 'servers__domain__extension'
+ ).all())
return render(
request,
'machines/index_role.html',
@@ -1647,12 +1648,12 @@ def add_portlist(request):
""" View used to add a port policy """
port_list = EditOuverturePortListForm(request.POST or None)
port_formset = modelformset_factory(
- OuverturePort,
- fields=('begin', 'end', 'protocole', 'io'),
- extra=0,
- can_delete=True,
- min_num=1,
- validate_min=True,
+ OuverturePort,
+ fields=('begin', 'end', 'protocole', 'io'),
+ extra=0,
+ can_delete=True,
+ min_num=1,
+ validate_min=True,
)(request.POST or None, queryset=OuverturePort.objects.none())
if port_list.is_valid() and port_formset.is_valid():
pl = port_list.save()
@@ -1699,11 +1700,12 @@ def configure_ports(request, interface_instance, **_kwargs):
)
-## Framework Rest
+# Framework Rest
class JSONResponse(HttpResponse):
""" Class to build a JSON response. Used for API """
+
def __init__(self, data, **kwargs):
content = JSONRenderer().render(data)
kwargs['content_type'] = 'application/json'