8
0
Fork 0
mirror of https://gitlab2.federez.net/re2o/re2o synced 2024-11-25 22:22:26 +00:00

Merge branch 'translation' into 'dev'

Translation

See merge request federez/re2o!256
This commit is contained in:
klafyvel 2018-08-19 20:40:35 +02:00
commit da3f1f5d59
191 changed files with 9750 additions and 3434 deletions

View file

@ -42,4 +42,5 @@ def can_view(user):
if can: if can:
return can, None return can, None
else: else:
return can, _("You don't have the rights to see this application.") return can, _("You don't have the right to view this application.")

View file

@ -40,8 +40,8 @@ from django import forms
from django.db.models import Q from django.db.models import Q
from django.forms import ModelForm, Form from django.forms import ModelForm, Form
from django.core.validators import MinValueValidator from django.core.validators import MinValueValidator
from django.utils.translation import ugettext as _
from django.utils.translation import ugettext_lazy as _l from django.utils.translation import ugettext_lazy as _
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from re2o.field_permissions import FieldPermissionFormMixin from re2o.field_permissions import FieldPermissionFormMixin
@ -93,11 +93,11 @@ class SelectUserArticleForm(FormRevMixin, Form):
queryset=Article.objects.filter( queryset=Article.objects.filter(
Q(type_user='All') | Q(type_user='Adherent') Q(type_user='All') | Q(type_user='Adherent')
), ),
label=_l("Article"), label=_("Article"),
required=True required=True
) )
quantity = forms.IntegerField( quantity = forms.IntegerField(
label=_l("Quantity"), label=_("Quantity"),
validators=[MinValueValidator(1)], validators=[MinValueValidator(1)],
required=True required=True
) )
@ -117,11 +117,11 @@ class SelectClubArticleForm(Form):
queryset=Article.objects.filter( queryset=Article.objects.filter(
Q(type_user='All') | Q(type_user='Club') Q(type_user='All') | Q(type_user='Club')
), ),
label=_l("Article"), label=_("Article"),
required=True required=True
) )
quantity = forms.IntegerField( quantity = forms.IntegerField(
label=_l("Quantity"), label=_("Quantity"),
validators=[MinValueValidator(1)], validators=[MinValueValidator(1)],
required=True required=True
) )
@ -161,7 +161,7 @@ class DelArticleForm(FormRevMixin, Form):
""" """
articles = forms.ModelMultipleChoiceField( articles = forms.ModelMultipleChoiceField(
queryset=Article.objects.none(), queryset=Article.objects.none(),
label=_l("Existing articles"), label=_("Available articles"),
widget=forms.CheckboxSelectMultiple widget=forms.CheckboxSelectMultiple
) )
@ -201,7 +201,7 @@ class DelPaiementForm(FormRevMixin, Form):
# TODO : change paiement to payment # TODO : change paiement to payment
paiements = forms.ModelMultipleChoiceField( paiements = forms.ModelMultipleChoiceField(
queryset=Paiement.objects.none(), queryset=Paiement.objects.none(),
label=_l("Existing payment method"), label=_("Available payment methods"),
widget=forms.CheckboxSelectMultiple widget=forms.CheckboxSelectMultiple
) )
@ -239,7 +239,7 @@ class DelBanqueForm(FormRevMixin, Form):
# TODO : change banque to bank # TODO : change banque to bank
banques = forms.ModelMultipleChoiceField( banques = forms.ModelMultipleChoiceField(
queryset=Banque.objects.none(), queryset=Banque.objects.none(),
label=_l("Existing banks"), label=_("Available banks"),
widget=forms.CheckboxSelectMultiple widget=forms.CheckboxSelectMultiple
) )
@ -258,13 +258,13 @@ class RechargeForm(FormRevMixin, Form):
Form used to refill a user's balance Form used to refill a user's balance
""" """
value = forms.FloatField( value = forms.FloatField(
label=_l("Amount"), label=_("Amount"),
min_value=0.01, min_value=0.01,
validators=[] validators=[]
) )
payment = forms.ModelChoiceField( payment = forms.ModelChoiceField(
queryset=Paiement.objects.none(), queryset=Paiement.objects.none(),
label=_l("Payment method") label=_("Payment method")
) )
def __init__(self, *args, user=None, **kwargs): def __init__(self, *args, user=None, **kwargs):
@ -290,3 +290,4 @@ class RechargeForm(FormRevMixin, Form):
} }
) )
return self.cleaned_data return self.cleaned_data

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,181 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.7 on 2018-08-18 11:19
from __future__ import unicode_literals
import cotisations.validators
import django.core.validators
from django.db import migrations, models
import django.db.models.deletion
import re2o.aes_field
class Migration(migrations.Migration):
dependencies = [
('cotisations', '0032_custom_invoice'),
]
operations = [
migrations.AlterModelOptions(
name='article',
options={'permissions': (('view_article', 'Can view an article object'), ('buy_every_article', 'Can buy every article')), 'verbose_name': 'article', 'verbose_name_plural': 'articles'},
),
migrations.AlterModelOptions(
name='balancepayment',
options={'verbose_name': 'user balance'},
),
migrations.AlterModelOptions(
name='banque',
options={'permissions': (('view_banque', 'Can view a bank object'),), 'verbose_name': 'bank', 'verbose_name_plural': 'banks'},
),
migrations.AlterModelOptions(
name='cotisation',
options={'permissions': (('view_cotisation', 'Can view a subscription object'), ('change_all_cotisation', 'Can edit the previous subscriptions')), 'verbose_name': 'subscription', 'verbose_name_plural': 'subscriptions'},
),
migrations.AlterModelOptions(
name='custominvoice',
options={'permissions': (('view_custominvoice', 'Can view a custom invoice object'),)},
),
migrations.AlterModelOptions(
name='facture',
options={'permissions': (('change_facture_control', 'Can edit the "controlled" state'), ('view_facture', 'Can view an invoice object'), ('change_all_facture', 'Can edit all the previous invoices')), 'verbose_name': 'invoice', 'verbose_name_plural': 'invoices'},
),
migrations.AlterModelOptions(
name='paiement',
options={'permissions': (('view_paiement', 'Can view a payment method object'), ('use_every_payment', 'Can use every payment method')), 'verbose_name': 'payment method', 'verbose_name_plural': 'payment methods'},
),
migrations.AlterModelOptions(
name='vente',
options={'permissions': (('view_vente', 'Can view a purchase object'), ('change_all_vente', 'Can edit all the previous purchases')), 'verbose_name': 'purchase', 'verbose_name_plural': 'purchases'},
),
migrations.AlterField(
model_name='article',
name='available_for_everyone',
field=models.BooleanField(default=False, verbose_name='is available for every user'),
),
migrations.AlterField(
model_name='article',
name='duration',
field=models.PositiveIntegerField(blank=True, null=True, validators=[django.core.validators.MinValueValidator(0)], verbose_name='duration (in months)'),
),
migrations.AlterField(
model_name='article',
name='name',
field=models.CharField(max_length=255, verbose_name='designation'),
),
migrations.AlterField(
model_name='article',
name='prix',
field=models.DecimalField(decimal_places=2, max_digits=5, verbose_name='unit price'),
),
migrations.AlterField(
model_name='article',
name='type_cotisation',
field=models.CharField(blank=True, choices=[('Connexion', 'Connection'), ('Adhesion', 'Membership'), ('All', 'Both of them')], default=None, max_length=255, null=True, verbose_name='subscription type'),
),
migrations.AlterField(
model_name='article',
name='type_user',
field=models.CharField(choices=[('Adherent', 'Member'), ('Club', 'Club'), ('All', 'Both of them')], default='All', max_length=255, verbose_name='type of users concerned'),
),
migrations.AlterField(
model_name='banque',
name='name',
field=models.CharField(max_length=255),
),
migrations.AlterField(
model_name='comnpaypayment',
name='payment_credential',
field=models.CharField(blank=True, default='', max_length=255, verbose_name='ComNpay VAT Number'),
),
migrations.AlterField(
model_name='comnpaypayment',
name='payment_pass',
field=re2o.aes_field.AESEncryptedField(blank=True, max_length=255, null=True, verbose_name='ComNpay secret key'),
),
migrations.AlterField(
model_name='comnpaypayment',
name='production',
field=models.BooleanField(default=True, verbose_name='Production mode enabled (production URL, instead of homologation)'),
),
migrations.AlterField(
model_name='cotisation',
name='date_end',
field=models.DateTimeField(verbose_name='end date'),
),
migrations.AlterField(
model_name='cotisation',
name='date_start',
field=models.DateTimeField(verbose_name='start date'),
),
migrations.AlterField(
model_name='cotisation',
name='type_cotisation',
field=models.CharField(choices=[('Connexion', 'Connection'), ('Adhesion', 'Membership'), ('All', 'Both of them')], default='All', max_length=255, verbose_name='subscription type'),
),
migrations.AlterField(
model_name='cotisation',
name='vente',
field=models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, to='cotisations.Vente', verbose_name='purchase'),
),
migrations.AlterField(
model_name='facture',
name='cheque',
field=models.CharField(blank=True, max_length=255, verbose_name='cheque number'),
),
migrations.AlterField(
model_name='facture',
name='control',
field=models.BooleanField(default=False, verbose_name='controlled'),
),
migrations.AlterField(
model_name='facture',
name='valid',
field=models.BooleanField(default=True, verbose_name='validated'),
),
migrations.AlterField(
model_name='paiement',
name='available_for_everyone',
field=models.BooleanField(default=False, verbose_name='is available for every user'),
),
migrations.AlterField(
model_name='paiement',
name='is_balance',
field=models.BooleanField(default=False, editable=False, help_text='There should be only one balance payment method.', validators=[cotisations.validators.check_no_balance], verbose_name='is user balance'),
),
migrations.AlterField(
model_name='paiement',
name='moyen',
field=models.CharField(max_length=255, verbose_name='method'),
),
migrations.AlterField(
model_name='vente',
name='duration',
field=models.PositiveIntegerField(blank=True, null=True, verbose_name='duration (in months)'),
),
migrations.AlterField(
model_name='vente',
name='facture',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='cotisations.BaseInvoice', verbose_name='invoice'),
),
migrations.AlterField(
model_name='vente',
name='name',
field=models.CharField(max_length=255, verbose_name='article'),
),
migrations.AlterField(
model_name='vente',
name='number',
field=models.IntegerField(validators=[django.core.validators.MinValueValidator(1)], verbose_name='amount'),
),
migrations.AlterField(
model_name='vente',
name='prix',
field=models.DecimalField(decimal_places=2, max_digits=5, verbose_name='price'),
),
migrations.AlterField(
model_name='vente',
name='type_cotisation',
field=models.CharField(blank=True, choices=[('Connexion', 'Connection'), ('Adhesion', 'Membership'), ('All', 'Both of them')], max_length=255, null=True, verbose_name='subscription type'),
),
]

View file

@ -41,8 +41,7 @@ from django.dispatch import receiver
from django.forms import ValidationError from django.forms import ValidationError
from django.core.validators import MinValueValidator from django.core.validators import MinValueValidator
from django.utils import timezone from django.utils import timezone
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext_lazy as _
from django.utils.translation import ugettext_lazy as _l
from django.urls import reverse from django.urls import reverse
from django.shortcuts import redirect from django.shortcuts import redirect
from django.contrib import messages from django.contrib import messages
@ -58,7 +57,7 @@ from cotisations.validators import check_no_balance
class BaseInvoice(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model): class BaseInvoice(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model):
date = models.DateTimeField( date = models.DateTimeField(
auto_now_add=True, auto_now_add=True,
verbose_name=_l("Date") verbose_name=_("Date")
) )
# TODO : change prix to price # TODO : change prix to price
@ -134,17 +133,17 @@ class Facture(BaseInvoice):
cheque = models.CharField( cheque = models.CharField(
max_length=255, max_length=255,
blank=True, blank=True,
verbose_name=_l("Cheque number") verbose_name=_("cheque number")
) )
# TODO : change name to validity for clarity # TODO : change name to validity for clarity
valid = models.BooleanField( valid = models.BooleanField(
default=True, default=True,
verbose_name=_l("Validated") verbose_name=_("validated")
) )
# TODO : changed name to controlled for clarity # TODO : changed name to controlled for clarity
control = models.BooleanField( control = models.BooleanField(
default=False, default=False,
verbose_name=_l("Controlled") verbose_name=_("controlled")
) )
class Meta: class Meta:
@ -152,14 +151,14 @@ class Facture(BaseInvoice):
permissions = ( permissions = (
# TODO : change facture to invoice # TODO : change facture to invoice
('change_facture_control', ('change_facture_control',
_l("Can change the \"controlled\" state")), _("Can edit the \"controlled\" state")),
('view_facture', ('view_facture',
_l("Can see an invoice's details")), _("Can view an invoice object")),
('change_all_facture', ('change_all_facture',
_l("Can edit all the previous invoices")), _("Can edit all the previous invoices")),
) )
verbose_name = _l("Invoice") verbose_name = _("invoice")
verbose_name_plural = _l("Invoices") verbose_name_plural = _("invoices")
def linked_objects(self): def linked_objects(self):
"""Return linked objects : machine and domain. """Return linked objects : machine and domain.
@ -195,7 +194,7 @@ class Facture(BaseInvoice):
def can_view(self, user_request, *_args, **_kwargs): def can_view(self, user_request, *_args, **_kwargs):
if not user_request.has_perm('cotisations.view_facture') and \ if not user_request.has_perm('cotisations.view_facture') and \
self.user != user_request: self.user != user_request:
return False, _("You don't have the right to see someone else's " return False, _("You don't have the right to view someone else's "
"invoices history.") "invoices history.")
elif not self.valid: elif not self.valid:
return False, _("The invoice has been invalidated.") return False, _("The invoice has been invalidated.")
@ -222,7 +221,7 @@ class Facture(BaseInvoice):
if user_request.has_perm('cotisations.add_facture'): if user_request.has_perm('cotisations.add_facture'):
return True, None return True, None
if len(Paiement.find_allowed_payments(user_request)) <= 0: if len(Paiement.find_allowed_payments(user_request)) <= 0:
return False, _("There are no payment types which you can use.") return False, _("There are no payment method which you can use.")
if len(Article.find_allowed_articles(user_request)) <= 0: if len(Article.find_allowed_articles(user_request)) <= 0:
return False, _("There are no article that you can buy.") return False, _("There are no article that you can buy.")
return True, None return True, None
@ -259,22 +258,22 @@ def facture_post_delete(**kwargs):
class CustomInvoice(BaseInvoice): class CustomInvoice(BaseInvoice):
class Meta: class Meta:
permissions = ( permissions = (
('view_custominvoice', _l("Can view a custom invoice")), ('view_custominvoice', _("Can view a custom invoice object")),
) )
recipient = models.CharField( recipient = models.CharField(
max_length=255, max_length=255,
verbose_name=_l("Recipient") verbose_name=_("Recipient")
) )
payment = models.CharField( payment = models.CharField(
max_length=255, max_length=255,
verbose_name=_l("Payment type") verbose_name=_("Payment type")
) )
address = models.CharField( address = models.CharField(
max_length=255, max_length=255,
verbose_name=_l("Address") verbose_name=_("Address")
) )
paid = models.BooleanField( paid = models.BooleanField(
verbose_name="Paid" verbose_name=_("Paid")
) )
@ -294,38 +293,38 @@ class Vente(RevMixin, AclMixin, models.Model):
# TODO : change this to English # TODO : change this to English
COTISATION_TYPE = ( COTISATION_TYPE = (
('Connexion', _l("Connexion")), ('Connexion', _("Connection")),
('Adhesion', _l("Membership")), ('Adhesion', _("Membership")),
('All', _l("Both of them")), ('All', _("Both of them")),
) )
# TODO : change facture to invoice # TODO : change facture to invoice
facture = models.ForeignKey( facture = models.ForeignKey(
'BaseInvoice', 'BaseInvoice',
on_delete=models.CASCADE, on_delete=models.CASCADE,
verbose_name=_l("Invoice") verbose_name=_("invoice")
) )
# TODO : change number to amount for clarity # TODO : change number to amount for clarity
number = models.IntegerField( number = models.IntegerField(
validators=[MinValueValidator(1)], validators=[MinValueValidator(1)],
verbose_name=_l("Amount") verbose_name=_("amount")
) )
# TODO : change this field for a ForeinKey to Article # TODO : change this field for a ForeinKey to Article
name = models.CharField( name = models.CharField(
max_length=255, max_length=255,
verbose_name=_l("Article") verbose_name=_("article")
) )
# TODO : change prix to price # TODO : change prix to price
# TODO : this field is not needed if you use Article ForeignKey # TODO : this field is not needed if you use Article ForeignKey
prix = models.DecimalField( prix = models.DecimalField(
max_digits=5, max_digits=5,
decimal_places=2, decimal_places=2,
verbose_name=_l("Price")) verbose_name=_("price"))
# TODO : this field is not needed if you use Article ForeignKey # TODO : this field is not needed if you use Article ForeignKey
duration = models.PositiveIntegerField( duration = models.PositiveIntegerField(
blank=True, blank=True,
null=True, null=True,
verbose_name=_l("Duration (in whole month)") verbose_name=_("duration (in months)")
) )
# TODO : this field is not needed if you use Article ForeignKey # TODO : this field is not needed if you use Article ForeignKey
type_cotisation = models.CharField( type_cotisation = models.CharField(
@ -333,16 +332,16 @@ class Vente(RevMixin, AclMixin, models.Model):
blank=True, blank=True,
null=True, null=True,
max_length=255, max_length=255,
verbose_name=_l("Type of cotisation") verbose_name=_("subscription type")
) )
class Meta: class Meta:
permissions = ( permissions = (
('view_vente', _l("Can see a purchase's details")), ('view_vente', _("Can view a purchase object")),
('change_all_vente', _l("Can edit all the previous purchases")), ('change_all_vente', _("Can edit all the previous purchases")),
) )
verbose_name = _l("Purchase") verbose_name = _("purchase")
verbose_name_plural = _l("Purchases") verbose_name_plural = _("purchases")
# TODO : change prix_total to total_price # TODO : change prix_total to total_price
def prix_total(self): def prix_total(self):
@ -409,7 +408,7 @@ class Vente(RevMixin, AclMixin, models.Model):
# Checking that if a cotisation is specified, there is also a duration # Checking that if a cotisation is specified, there is also a duration
if self.type_cotisation and not self.duration: if self.type_cotisation and not self.duration:
raise ValidationError( raise ValidationError(
_("A cotisation should always have a duration.") _("Duration must be specified for a subscription.")
) )
self.update_cotisation() self.update_cotisation()
super(Vente, self).save(*args, **kwargs) super(Vente, self).save(*args, **kwargs)
@ -445,7 +444,7 @@ class Vente(RevMixin, AclMixin, models.Model):
def can_view(self, user_request, *_args, **_kwargs): def can_view(self, user_request, *_args, **_kwargs):
if (not user_request.has_perm('cotisations.view_vente') and if (not user_request.has_perm('cotisations.view_vente') and
self.facture.user != user_request): self.facture.user != user_request):
return False, _("You don't have the right to see someone " return False, _("You don't have the right to view someone "
"else's purchase history.") "else's purchase history.")
else: else:
return True, None return True, None
@ -508,38 +507,38 @@ class Article(RevMixin, AclMixin, models.Model):
# TODO : Either use TYPE or TYPES in both choices but not both # TODO : Either use TYPE or TYPES in both choices but not both
USER_TYPES = ( USER_TYPES = (
('Adherent', _l("Member")), ('Adherent', _("Member")),
('Club', _l("Club")), ('Club', _("Club")),
('All', _l("Both of them")), ('All', _("Both of them")),
) )
COTISATION_TYPE = ( COTISATION_TYPE = (
('Connexion', _l("Connexion")), ('Connexion', _("Connection")),
('Adhesion', _l("Membership")), ('Adhesion', _("Membership")),
('All', _l("Both of them")), ('All', _("Both of them")),
) )
name = models.CharField( name = models.CharField(
max_length=255, max_length=255,
verbose_name=_l("Designation") verbose_name=_("designation")
) )
# TODO : change prix to price # TODO : change prix to price
prix = models.DecimalField( prix = models.DecimalField(
max_digits=5, max_digits=5,
decimal_places=2, decimal_places=2,
verbose_name=_l("Unitary price") verbose_name=_("unit price")
) )
duration = models.PositiveIntegerField( duration = models.PositiveIntegerField(
blank=True, blank=True,
null=True, null=True,
validators=[MinValueValidator(0)], validators=[MinValueValidator(0)],
verbose_name=_l("Duration (in whole month)") verbose_name=_("duration (in months)")
) )
type_user = models.CharField( type_user = models.CharField(
choices=USER_TYPES, choices=USER_TYPES,
default='All', default='All',
max_length=255, max_length=255,
verbose_name=_l("Type of users concerned") verbose_name=_("type of users concerned")
) )
type_cotisation = models.CharField( type_cotisation = models.CharField(
choices=COTISATION_TYPE, choices=COTISATION_TYPE,
@ -547,31 +546,31 @@ class Article(RevMixin, AclMixin, models.Model):
blank=True, blank=True,
null=True, null=True,
max_length=255, max_length=255,
verbose_name=_l("Type of cotisation") verbose_name=_("subscription type")
) )
available_for_everyone = models.BooleanField( available_for_everyone = models.BooleanField(
default=False, default=False,
verbose_name=_l("Is available for every user") verbose_name=_("is available for every user")
) )
unique_together = ('name', 'type_user') unique_together = ('name', 'type_user')
class Meta: class Meta:
permissions = ( permissions = (
('view_article', _l("Can see an article's details")), ('view_article', _("Can view an article object")),
('buy_every_article', _l("Can buy every_article")) ('buy_every_article', _("Can buy every article"))
) )
verbose_name = "Article" verbose_name = "article"
verbose_name_plural = "Articles" verbose_name_plural = "articles"
def clean(self): def clean(self):
if self.name.lower() == 'solde': if self.name.lower() == 'solde':
raise ValidationError( raise ValidationError(
_("Solde is a reserved article name") _("Balance is a reserved article name.")
) )
if self.type_cotisation and not self.duration: if self.type_cotisation and not self.duration:
raise ValidationError( raise ValidationError(
_("Duration must be specified for a cotisation") _("Duration must be specified for a subscription.")
) )
def __str__(self): def __str__(self):
@ -592,7 +591,7 @@ class Article(RevMixin, AclMixin, models.Model):
self.available_for_everyone self.available_for_everyone
or user.has_perm('cotisations.buy_every_article') or user.has_perm('cotisations.buy_every_article')
or user.has_perm('cotisations.add_facture'), or user.has_perm('cotisations.add_facture'),
_("You cannot buy this Article.") _("You can't buy this article.")
) )
@classmethod @classmethod
@ -618,15 +617,14 @@ class Banque(RevMixin, AclMixin, models.Model):
name = models.CharField( name = models.CharField(
max_length=255, max_length=255,
verbose_name=_l("Name")
) )
class Meta: class Meta:
permissions = ( permissions = (
('view_banque', _l("Can see a bank's details")), ('view_banque', _("Can view a bank object")),
) )
verbose_name = _l("Bank") verbose_name = _("bank")
verbose_name_plural = _l("Banks") verbose_name_plural = _("banks")
def __str__(self): def __str__(self):
return self.name return self.name
@ -644,33 +642,33 @@ class Paiement(RevMixin, AclMixin, models.Model):
# TODO : change moyen to method # TODO : change moyen to method
moyen = models.CharField( moyen = models.CharField(
max_length=255, max_length=255,
verbose_name=_l("Method") verbose_name=_("method")
) )
available_for_everyone = models.BooleanField( available_for_everyone = models.BooleanField(
default=False, default=False,
verbose_name=_l("Is available for every user") verbose_name=_("is available for every user")
) )
is_balance = models.BooleanField( is_balance = models.BooleanField(
default=False, default=False,
editable=False, editable=False,
verbose_name=_l("Is user balance"), verbose_name=_("is user balance"),
help_text=_l("There should be only one balance payment method."), help_text=_("There should be only one balance payment method."),
validators=[check_no_balance] validators=[check_no_balance]
) )
class Meta: class Meta:
permissions = ( permissions = (
('view_paiement', _l("Can see a payement's details")), ('view_paiement', _("Can view a payment method object")),
('use_every_payment', _l("Can use every payement")), ('use_every_payment', _("Can use every payment method")),
) )
verbose_name = _l("Payment method") verbose_name = _("payment method")
verbose_name_plural = _l("Payment methods") verbose_name_plural = _("payment methods")
def __str__(self): def __str__(self):
return self.moyen return self.moyen
def clean(self): def clean(self):
""" """l
Override of the herited clean function to get a correct name Override of the herited clean function to get a correct name
""" """
self.moyen = self.moyen.title() self.moyen = self.moyen.title()
@ -698,8 +696,8 @@ class Paiement(RevMixin, AclMixin, models.Model):
if any(sell.type_cotisation for sell in invoice.vente_set.all()): if any(sell.type_cotisation for sell in invoice.vente_set.all()):
messages.success( messages.success(
request, request,
_("The cotisation of %(member_name)s has been \ _("The subscription of %(member_name)s was extended to"
extended to %(end_date)s.") % { " %(end_date)s.") % {
'member_name': invoice.user.pseudo, 'member_name': invoice.user.pseudo,
'end_date': invoice.user.end_adhesion() 'end_date': invoice.user.end_adhesion()
} }
@ -708,7 +706,7 @@ class Paiement(RevMixin, AclMixin, models.Model):
else: else:
messages.success( messages.success(
request, request,
_("The invoice has been created.") _("The invoice was created.")
) )
return redirect(reverse( return redirect(reverse(
'users:profil', 'users:profil',
@ -729,7 +727,7 @@ class Paiement(RevMixin, AclMixin, models.Model):
self.available_for_everyone self.available_for_everyone
or user.has_perm('cotisations.use_every_payment') or user.has_perm('cotisations.use_every_payment')
or user.has_perm('cotisations.add_facture'), or user.has_perm('cotisations.add_facture'),
_("You cannot use this Payment.") _("You can't use this payment method.")
) )
@classmethod @classmethod
@ -747,7 +745,7 @@ class Paiement(RevMixin, AclMixin, models.Model):
p = find_payment_method(self) p = find_payment_method(self)
if p is not None: if p is not None:
return p._meta.verbose_name return p._meta.verbose_name
return _("No custom payment method") return _("No custom payment method.")
class Cotisation(RevMixin, AclMixin, models.Model): class Cotisation(RevMixin, AclMixin, models.Model):
@ -763,9 +761,9 @@ class Cotisation(RevMixin, AclMixin, models.Model):
""" """
COTISATION_TYPE = ( COTISATION_TYPE = (
('Connexion', _l("Connexion")), ('Connexion', _("Connection")),
('Adhesion', _l("Membership")), ('Adhesion', _("Membership")),
('All', _l("Both of them")), ('All', _("Both of them")),
) )
# TODO : change vente to purchase # TODO : change vente to purchase
@ -773,34 +771,36 @@ class Cotisation(RevMixin, AclMixin, models.Model):
'Vente', 'Vente',
on_delete=models.CASCADE, on_delete=models.CASCADE,
null=True, null=True,
verbose_name=_l("Purchase") verbose_name=_("purchase")
) )
type_cotisation = models.CharField( type_cotisation = models.CharField(
choices=COTISATION_TYPE, choices=COTISATION_TYPE,
max_length=255, max_length=255,
default='All', default='All',
verbose_name=_l("Type of cotisation") verbose_name=_("subscription type")
) )
date_start = models.DateTimeField( date_start = models.DateTimeField(
verbose_name=_l("Starting date") verbose_name=_("start date")
) )
date_end = models.DateTimeField( date_end = models.DateTimeField(
verbose_name=_l("Ending date") verbose_name=_("end date")
) )
class Meta: class Meta:
permissions = ( permissions = (
('view_cotisation', _l("Can see a cotisation's details")), ('view_cotisation', _("Can view a subscription object")),
('change_all_cotisation', _l("Can edit the previous cotisations")), ('change_all_cotisation', _("Can edit the previous subscriptions")),
) )
verbose_name = _("subscription")
verbose_name_plural = _("subscriptions")
def can_edit(self, user_request, *_args, **_kwargs): def can_edit(self, user_request, *_args, **_kwargs):
if not user_request.has_perm('cotisations.change_cotisation'): if not user_request.has_perm('cotisations.change_cotisation'):
return False, _("You don't have the right to edit a cotisation.") return False, _("You don't have the right to edit a subscription.")
elif not user_request.has_perm('cotisations.change_all_cotisation') \ elif not user_request.has_perm('cotisations.change_all_cotisation') \
and (self.vente.facture.control or and (self.vente.facture.control or
not self.vente.facture.valid): not self.vente.facture.valid):
return False, _("You don't have the right to edit a cotisation " return False, _("You don't have the right to edit a subscription "
"already controlled or invalidated.") "already controlled or invalidated.")
else: else:
return True, None return True, None
@ -808,9 +808,9 @@ class Cotisation(RevMixin, AclMixin, models.Model):
def can_delete(self, user_request, *_args, **_kwargs): def can_delete(self, user_request, *_args, **_kwargs):
if not user_request.has_perm('cotisations.delete_cotisation'): if not user_request.has_perm('cotisations.delete_cotisation'):
return False, _("You don't have the right to delete a " return False, _("You don't have the right to delete a "
"cotisation.") "subscription.")
if self.vente.facture.control or not self.vente.facture.valid: if self.vente.facture.control or not self.vente.facture.valid:
return False, _("You don't have the right to delete a cotisation " return False, _("You don't have the right to delete a subscription "
"already controlled or invalidated.") "already controlled or invalidated.")
else: else:
return True, None return True, None
@ -818,8 +818,8 @@ class Cotisation(RevMixin, AclMixin, models.Model):
def can_view(self, user_request, *_args, **_kwargs): def can_view(self, user_request, *_args, **_kwargs):
if not user_request.has_perm('cotisations.view_cotisation') and\ if not user_request.has_perm('cotisations.view_cotisation') and\
self.vente.facture.user != user_request: self.vente.facture.user != user_request:
return False, _("You don't have the right to see someone else's " return False, _("You don't have the right to view someone else's "
"cotisation history.") "subscription history.")
else: else:
return True, None return True, None
@ -847,3 +847,4 @@ def cotisation_post_delete(**_kwargs):
""" """
regen('mac_ip_list') regen('mac_ip_list')
regen('mailing') regen('mailing')

View file

@ -21,8 +21,7 @@
from django.db import models from django.db import models
from django.shortcuts import redirect from django.shortcuts import redirect
from django.urls import reverse from django.urls import reverse
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext_lazy as _
from django.utils.translation import ugettext_lazy as _l
from django.contrib import messages from django.contrib import messages
@ -36,7 +35,7 @@ class BalancePayment(PaymentMethodMixin, models.Model):
""" """
class Meta: class Meta:
verbose_name = _l("User Balance") verbose_name = _("user balance")
payment = models.OneToOneField( payment = models.OneToOneField(
Paiement, Paiement,
@ -45,8 +44,8 @@ class BalancePayment(PaymentMethodMixin, models.Model):
editable=False editable=False
) )
minimum_balance = models.DecimalField( minimum_balance = models.DecimalField(
verbose_name=_l("Minimum balance"), verbose_name=_("Minimum balance"),
help_text=_l("The minimal amount of money allowed for the balance" help_text=_("The minimal amount of money allowed for the balance"
" at the end of a payment. You can specify negative " " at the end of a payment. You can specify negative "
"amount." "amount."
), ),
@ -55,8 +54,8 @@ class BalancePayment(PaymentMethodMixin, models.Model):
default=0, default=0,
) )
maximum_balance = models.DecimalField( maximum_balance = models.DecimalField(
verbose_name=_l("Maximum balance"), verbose_name=_("Maximum balance"),
help_text=_l("The maximal amount of money allowed for the balance."), help_text=_("The maximal amount of money allowed for the balance."),
max_digits=5, max_digits=5,
decimal_places=2, decimal_places=2,
default=50, default=50,
@ -64,7 +63,7 @@ class BalancePayment(PaymentMethodMixin, models.Model):
null=True, null=True,
) )
credit_balance_allowed = models.BooleanField( credit_balance_allowed = models.BooleanField(
verbose_name=_l("Allow user to credit their balance"), verbose_name=_("Allow user to credit their balance"),
default=False, default=False,
) )
@ -97,7 +96,7 @@ class BalancePayment(PaymentMethodMixin, models.Model):
if len(p) > 0: if len(p) > 0:
form.add_error( form.add_error(
'payment_method', 'payment_method',
_("There is already a payment type for user balance") _("There is already a payment method for user balance.")
) )
def alter_payment(self, payment): def alter_payment(self, payment):
@ -118,3 +117,4 @@ class BalancePayment(PaymentMethodMixin, models.Model):
len(Paiement.find_allowed_payments(user_request) len(Paiement.find_allowed_payments(user_request)
.exclude(is_balance=True)) > 0 .exclude(is_balance=True)) > 0
) and self.credit_balance_allowed ) and self.credit_balance_allowed

View file

@ -21,7 +21,7 @@
from django.db import models from django.db import models
from django.shortcuts import redirect from django.shortcuts import redirect
from django.urls import reverse from django.urls import reverse
from django.utils.translation import ugettext_lazy as _l from django.utils.translation import ugettext_lazy as _
from cotisations.models import Paiement from cotisations.models import Paiement
from cotisations.payment_methods.mixins import PaymentMethodMixin from cotisations.payment_methods.mixins import PaymentMethodMixin
@ -33,7 +33,7 @@ class ChequePayment(PaymentMethodMixin, models.Model):
""" """
class Meta: class Meta:
verbose_name = _l("Cheque") verbose_name = _("Cheque")
payment = models.OneToOneField( payment = models.OneToOneField(
Paiement, Paiement,
@ -52,3 +52,4 @@ class ChequePayment(PaymentMethodMixin, models.Model):
'cotisations:cheque:validate', 'cotisations:cheque:validate',
kwargs={'invoice_pk': invoice.pk} kwargs={'invoice_pk': invoice.pk}
)) ))

View file

@ -44,7 +44,7 @@ def cheque(request, invoice_pk):
if invoice.valid or not isinstance(payment_method, ChequePayment): if invoice.valid or not isinstance(payment_method, ChequePayment):
messages.error( messages.error(
request, request,
_("You cannot pay this invoice with a cheque.") _("You can't pay this invoice with a cheque.")
) )
return redirect(reverse( return redirect(reverse(
'users:profil', 'users:profil',
@ -67,3 +67,4 @@ def cheque(request, invoice_pk):
'amount': invoice.prix_total() 'amount': invoice.prix_total()
} }
) )

View file

@ -21,8 +21,7 @@
from django.db import models from django.db import models
from django.shortcuts import render from django.shortcuts import render
from django.urls import reverse from django.urls import reverse
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext_lazy as _
from django.utils.translation import ugettext_lazy as _l
from cotisations.models import Paiement from cotisations.models import Paiement
from cotisations.payment_methods.mixins import PaymentMethodMixin from cotisations.payment_methods.mixins import PaymentMethodMixin
@ -37,7 +36,7 @@ class ComnpayPayment(PaymentMethodMixin, models.Model):
""" """
class Meta: class Meta:
verbose_name = "ComNpay" verbose_name = _("ComNpay")
payment = models.OneToOneField( payment = models.OneToOneField(
Paiement, Paiement,
@ -49,17 +48,17 @@ class ComnpayPayment(PaymentMethodMixin, models.Model):
max_length=255, max_length=255,
default='', default='',
blank=True, blank=True,
verbose_name=_l("ComNpay VAD Number"), verbose_name=_("ComNpay VAT Number"),
) )
payment_pass = AESEncryptedField( payment_pass = AESEncryptedField(
max_length=255, max_length=255,
null=True, null=True,
blank=True, blank=True,
verbose_name=_l("ComNpay Secret Key"), verbose_name=_("ComNpay secret key"),
) )
minimum_payment = models.DecimalField( minimum_payment = models.DecimalField(
verbose_name=_l("Minimum payment"), verbose_name=_("Minimum payment"),
help_text=_l("The minimal amount of money you have to use when paying" help_text=_("The minimal amount of money you have to use when paying"
" with ComNpay"), " with ComNpay"),
max_digits=5, max_digits=5,
decimal_places=2, decimal_places=2,
@ -67,7 +66,7 @@ class ComnpayPayment(PaymentMethodMixin, models.Model):
) )
production = models.BooleanField( production = models.BooleanField(
default=True, default=True,
verbose_name=_l("Production mode enabled (production url, instead of homologation)"), verbose_name=_("Production mode enabled (production URL, instead of homologation)"),
) )
def return_url_comnpay(self): def return_url_comnpay(self):
@ -102,7 +101,7 @@ class ComnpayPayment(PaymentMethodMixin, models.Model):
'action': self.return_url_comnpay(), 'action': self.return_url_comnpay(),
'method': 'POST', 'method': 'POST',
'content': p.buildSecretHTML( 'content': p.buildSecretHTML(
_("Pay invoice no : ")+str(invoice.id), _("Pay invoice number ")+str(invoice.id),
invoice.prix_total(), invoice.prix_total(),
idTransaction=str(invoice.id) idTransaction=str(invoice.id)
), ),
@ -114,6 +113,6 @@ class ComnpayPayment(PaymentMethodMixin, models.Model):
"""Checks that the price meets the requirement to be paid with ComNpay. """Checks that the price meets the requirement to be paid with ComNpay.
""" """
return ((price >= self.minimum_payment), return ((price >= self.minimum_payment),
_('In order to pay your invoice with ComNpay' _("In order to pay your invoice with ComNpay, the price must"
', the price must be grater than {}') " be greater than {} €.").format(self.minimum_payment))
.format(self.minimum_payment))

View file

@ -50,7 +50,7 @@ def accept_payment(request, factureid):
if invoice.valid: if invoice.valid:
messages.success( messages.success(
request, request,
_("The payment of %(amount)shas been accepted.") % { _("The payment of %(amount)swas accepted.") % {
'amount': invoice.prix_total() 'amount': invoice.prix_total()
} }
) )
@ -60,8 +60,8 @@ def accept_payment(request, factureid):
for purchase in invoice.vente_set.all()): for purchase in invoice.vente_set.all()):
messages.success( messages.success(
request, request,
_("The cotisation of %(member_name)s has been \ _("The subscription of %(member_name)s was extended to"
extended to %(end_date)s.") % { " %(end_date)s.") % {
'member_name': request.user.pseudo, 'member_name': request.user.pseudo,
'end_date': request.user.end_adhesion() 'end_date': request.user.end_adhesion()
} }
@ -81,7 +81,7 @@ def refuse_payment(request):
""" """
messages.error( messages.error(
request, request,
_("The payment has been refused.") _("The payment was refused.")
) )
return redirect(reverse( return redirect(reverse(
'users:profil', 'users:profil',
@ -136,3 +136,4 @@ def ipn(request):
# Everything worked we send a reponse to Comnpay indicating that # Everything worked we send a reponse to Comnpay indicating that
# it's ok for them to proceed # it's ok for them to proceed
return HttpResponse("HTTP/1.0 200 OK") return HttpResponse("HTTP/1.0 200 OK")

View file

@ -19,8 +19,7 @@
# with this program; if not, write to the Free Software Foundation, Inc., # with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
from django import forms from django import forms
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext_lazy as _
from django.utils.translation import ugettext_lazy as _l
from . import PAYMENT_METHODS from . import PAYMENT_METHODS
from cotisations.utils import find_payment_method from cotisations.utils import find_payment_method
@ -58,8 +57,8 @@ class PaymentMethodForm(forms.Form):
""" """
payment_method = forms.ChoiceField( payment_method = forms.ChoiceField(
label=_l("Special payment method"), label=_("Special payment method"),
help_text=_l("Warning : You will not be able to change the payment " help_text=_("Warning: you will not be able to change the payment "
"method later. But you will be allowed to edit the other " "method later. But you will be allowed to edit the other "
"options." "options."
), ),
@ -70,7 +69,7 @@ class PaymentMethodForm(forms.Form):
super(PaymentMethodForm, self).__init__(*args, **kwargs) super(PaymentMethodForm, self).__init__(*args, **kwargs)
prefix = kwargs.get('prefix', None) prefix = kwargs.get('prefix', None)
self.fields['payment_method'].choices = [(i,p.NAME) for (i,p) in enumerate(PAYMENT_METHODS)] self.fields['payment_method'].choices = [(i,p.NAME) for (i,p) in enumerate(PAYMENT_METHODS)]
self.fields['payment_method'].choices.insert(0, ('', _l('no'))) self.fields['payment_method'].choices.insert(0, ('', _('no')))
self.fields['payment_method'].widget.attrs = { self.fields['payment_method'].widget.attrs = {
'id': 'paymentMethodSelect' 'id': 'paymentMethodSelect'
} }

View file

@ -32,8 +32,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
<tr> <tr>
<th>{% trans "Article" %}</th> <th>{% trans "Article" %}</th>
<th>{% trans "Price" %}</th> <th>{% trans "Price" %}</th>
<th>{% trans "Cotisation type" %}</th> <th>{% trans "Subscription type" %}</th>
<th>{% trans "Duration (month)" %}</th> <th>{% trans "Duration (in months)" %}</th>
<th>{% trans "Concerned users" %}</th> <th>{% trans "Concerned users" %}</th>
<th>{% trans "Available for everyone" %}</th> <th>{% trans "Available for everyone" %}</th>
<th></th> <th></th>

View file

@ -26,25 +26,23 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% load i18n %} {% load i18n %}
{% load logs_extra %} {% load logs_extra %}
<table class="table table-striped"> <table class="table table-striped">
<thead> <thead>
<tr>
<th>{% trans "Bank" %}</th>
<th></th>
</tr>
</thead>
{% for banque in banque_list %}
<tr> <tr>
<td>{{ banque.name }}</td> <th>{% trans "Bank" %}</th>
<td class="text-right"> <th></th>
{% can_edit banque %}
<a class="btn btn-primary btn-sm" role="button" title="{% trans "Edit" %}" href="{% url 'cotisations:edit-banque' banque.id %}">
<i class="fa fa-edit"></i>
</a>
{% acl_end %}
{% history_button banque %}
</td>
</tr> </tr>
{% endfor %} </thead>
</table> {% for banque in banque_list %}
<tr>
<td>{{ banque.name }}</td>
<td class="text-right">
{% can_edit banque %}
{% include 'buttons/edit.html' with href='cotisations:edit-banque' id=banque.id %}
{% acl_end %}
{% history_button banque %}
</td>
</tr>
{% endfor %}
</table>

View file

@ -49,7 +49,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% include 'buttons/sort.html' with prefix='cotis' col='date' text=tr_date %} {% include 'buttons/sort.html' with prefix='cotis' col='date' text=tr_date %}
</th> </th>
<th> <th>
{% trans "Invoice id" as tr_invoice_id %} {% trans "Invoice ID" as tr_invoice_id %}
{% include 'buttons/sort.html' with prefix='cotis' col='id' text=tr_invoice_id %} {% include 'buttons/sort.html' with prefix='cotis' col='id' text=tr_invoice_id %}
</th> </th>
<th></th> <th></th>
@ -65,32 +65,15 @@ with this program; if not, write to the Free Software Foundation, Inc.,
<td>{{ facture.date }}</td> <td>{{ facture.date }}</td>
<td>{{ facture.id }}</td> <td>{{ facture.id }}</td>
<td> <td>
<div class="dropdown"> {% can_edit facture %}
<button class="btn btn-default dropdown-toggle" type="button" id="editinvoice" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true"> {% include 'buttons/edit.html' with href='cotisations:edit-facture' id=facture.id %}
{% trans "Edit" %}<span class="caret"></span> {% acl_else %}
</button> {% trans "Controlled invoice" %}
<ul class="dropdown-menu" aria-labelledby="editinvoice"> {% acl_end %}
{% can_edit facture %} {% can_delete facture %}
<li> {% include 'buttons/suppr.html' with href='cotisations:del-facture' id=facture.id %}
<a href="{% url 'cotisations:edit-facture' facture.id %}"> {% acl_end %}
<i class="fa fa-dollar-sign"></i> {% trans "Edit" %} {% history_button facture text=True html_class=False %}
</a>
</li>
{% acl_else %}
<li>{% trans "Controlled invoice" %}</li>
{% acl_end %}
{% can_delete facture %}
<li>
<a href="{% url 'cotisations:del-facture' facture.id %}">
<i class="fa fa-trash"></i> {% trans "Delete" %}
</a>
</li>
{% acl_end %}
<li>
{% history_button facture text=True html_class=False%}
</li>
</ul>
</div>
</td> </td>
<td> <td>
{% if facture.valid %} {% if facture.valid %}
@ -109,3 +92,4 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% include 'pagination.html' with list=facture_list %} {% include 'pagination.html' with list=facture_list %}
{% endif %} {% endif %}
</div> </div>

View file

@ -47,7 +47,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% include 'buttons/sort.html' with prefix='invoice' col='date' text=tr_date %} {% include 'buttons/sort.html' with prefix='invoice' col='date' text=tr_date %}
</th> </th>
<th> <th>
{% trans "Invoice id" as tr_invoice_id %} {% trans "Invoice ID" as tr_invoice_id %}
{% include 'buttons/sort.html' with prefix='invoice' col='id' text=tr_invoice_id %} {% include 'buttons/sort.html' with prefix='invoice' col='id' text=tr_invoice_id %}
</th> </th>
<th> <th>

View file

@ -41,7 +41,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
<td>{{ paiement.moyen }}</td> <td>{{ paiement.moyen }}</td>
<td>{{ paiement.available_for_everyone|tick }}</td> <td>{{ paiement.available_for_everyone|tick }}</td>
<td> <td>
{{paiement.get_payment_method_name}} {{ paiement.get_payment_method_name }}
</td> </td>
<td class="text-right"> <td class="text-right">
{% can_edit paiement %} {% can_edit paiement %}

View file

@ -30,17 +30,20 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% block title %}{% trans "Invoice control" %}{% endblock %} {% block title %}{% trans "Invoice control" %}{% endblock %}
{% block content %} {% block content %}
<h2>{% trans "Invoice control and validation" %}</h2> <h2>{% trans "Invoice control and validation" %}</h2>
{% if facture_list.paginator %} {% if facture_list.paginator %}
{% include 'pagination.html' with list=facture_list %} {% include 'pagination.html' with list=facture_list %}
{% endif %} {% endif %}
<form class="form" method="post"> <form class="form" method="post">
{% csrf_token %} {% csrf_token %}
{{ controlform.management_form }} {{ controlform.management_form }}
<table class="table table-striped"> <table class="table table-striped">
<thead> <thead>
<tr> <tr>
<th>{% trans "Profil" %}</th> <th>{% trans "Profile" %}</th>
<th> <th>
{% trans "Last name" as tr_last_name %} {% trans "Last name" as tr_last_name %}
{% include 'buttons/sort.html' with prefix='control' col='name' text=tr_last_name %} {% include 'buttons/sort.html' with prefix='control' col='name' text=tr_last_name %}
@ -50,11 +53,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% include 'buttons/sort.html' with prefix='control' col='surname' text=tr_first_name %} {% include 'buttons/sort.html' with prefix='control' col='surname' text=tr_first_name %}
</th> </th>
<th> <th>
{% trans "Invoice id" as tr_invoice_id %} {% trans "Invoice ID" as tr_invoice_id %}
{% include 'buttons/sort.html' with prefix='control' col='id' text=tr_invoice_id %} {% include 'buttons/sort.html' with prefix='control' col='id' text=tr_invoice_id %}
</th> </th>
<th> <th>
{% trans "User id" as tr_user_id %} {% trans "User ID" as tr_user_id %}
{% include 'buttons/sort.html' with prefix='control' col='user-id' text=tr_user_id %} {% include 'buttons/sort.html' with prefix='control' col='user-id' text=tr_user_id %}
</th> </th>
<th>{% trans "Designation" %}</th> <th>{% trans "Designation" %}</th>
@ -65,7 +68,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
</th> </th>
<th> <th>
{% trans "Date" as tr_date %} {% trans "Date" as tr_date %}
{% include 'buttons/sort.html' with prefix='control' col='date' text=tr_date %}i {% include 'buttons/sort.html' with prefix='control' col='date' text=tr_date %}
</th> </th>
<th> <th>
{% trans "Validated" as tr_validated %} {% trans "Validated" as tr_validated %}
@ -109,3 +112,4 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% if facture_list.paginator %} {% if facture_list.paginator %}
{% include 'pagination.html' with list=facture_list %} {% include 'pagination.html' with list=facture_list %}
{% endif %} {% endif %}

View file

@ -26,18 +26,17 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% load bootstrap3 %} {% load bootstrap3 %}
{% load i18n %} {% load i18n %}
{% block title %}{% trans "Deletion of cotisations" %}{% endblock %} {% block title %}{% trans "Deletion of subscriptions" %}{% endblock %}
{% block content %} {% block content %}
<form class="form" method="post"> <form class="form" method="post">
{% csrf_token %} {% csrf_token %}
<h4> <h4>
{% blocktrans %} {% blocktrans %}Warning: are you sure you really want to delete this {{ object_name }} object ( {{ objet }} )?{% endblocktrans %}
Warning. Are you sure you really want te delete this {{ object_name }} object ( {{ objet }} ) ?
{% endblocktrans %}
</h4> </h4>
{% trans "Confirm" as tr_confirm %} {% trans "Confirm" as tr_confirm %}
{% bootstrap_button tr_confirm button_type='submit' icon='trash' %} {% bootstrap_button tr_confirm button_type='submit' icon='trash' %}
</form> </form>
{% endblock %} {% endblock %}

View file

@ -28,7 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% load massive_bootstrap_form %} {% load massive_bootstrap_form %}
{% load i18n %} {% load i18n %}
{% block title %}{% trans "Invoices creation and edition" %}{% endblock %} {% block title %}{% trans "Creation and editing of invoices" %}{% endblock %}
{% block content %} {% block content %}
{% bootstrap_form_errors factureform %} {% bootstrap_form_errors factureform %}
@ -62,3 +62,4 @@ with this program; if not, write to the Free Software Foundation, Inc.,
</form> </form>
{% endblock %} {% endblock %}

View file

@ -27,20 +27,21 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% load staticfiles%} {% load staticfiles%}
{% load i18n %} {% load i18n %}
{% block title %}{% trans "Invoices creation and edition" %}{% endblock %} {% block title %}{% trans "Creation and editing of invoices" %}{% endblock %}
{% block content %} {% block content %}
{% if title %} {% if title %}
<h3>{{title}}</h3> <h3>{{ title }}</h3>
{% else %} {% else %}
<h3>{% trans "New invoice" %}</h3> <h3>{% trans "New invoice" %}</h3>
{% endif %} {% endif %}
{% if max_balance %} {% if max_balance %}
<h4>{% trans "Maximum allowed balance : "%}{{max_balance}} €</h4> <h4>{% blocktrans %}Maximum allowed balance: {{ max_balance }} €{% endblocktrans %}</h4>
{% endif %} {% endif %}
{% if balance is not None %} {% if balance is not None %}
<p> <p>
{% trans "Current balance :" %} {{ balance }} € {% blocktrans %}Current balance: {{ balance }} €{% endblocktrans %}
</p> </p>
{% endif %} {% endif %}
@ -68,9 +69,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
</div> </div>
<input class="btn btn-primary btn-sm" role="button" value="{% trans "Add an article"%}" id="add_one"> <input class="btn btn-primary btn-sm" role="button" value="{% trans "Add an article"%}" id="add_one">
<p> <p>
{% blocktrans %} {% blocktrans %}Total price: <span id="total_price">0,00</span> €{% endblocktrans %}
Total price : <span id="total_price">0,00</span>
{% endblocktrans %}
</p> </p>
{% endif %} {% endif %}
{% bootstrap_button action_name button_type='submit' icon='star' %} {% bootstrap_button action_name button_type='submit' icon='star' %}
@ -183,3 +182,4 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% endif %} {% endif %}
{% endblock %} {% endblock %}

View file

@ -29,7 +29,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% block title %}{% trans "Invoices" %}{% endblock %} {% block title %}{% trans "Invoices" %}{% endblock %}
{% block content %} {% block content %}
<h2>{% trans "Cotisations" %}</h2> <h2>{% trans "Subscriptions" %}</h2>
{% include 'cotisations/aff_cotisations.html' with facture_list=facture_list %} {% include 'cotisations/aff_cotisations.html' with facture_list=facture_list %}
{% endblock %} {% endblock %}

View file

@ -37,7 +37,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
</a> </a>
{% acl_end %} {% acl_end %}
<a class="btn btn-danger btn-sm" role="button" href="{% url 'cotisations:del-article' %}"> <a class="btn btn-danger btn-sm" role="button" href="{% url 'cotisations:del-article' %}">
<i class="fa fa-trash"></i> {% trans "Delete article types" %} <i class="fa fa-trash"></i> {% trans "Delete one or several article types" %}
</a> </a>
{% include 'cotisations/aff_article.html' with article_list=article_list %} {% include 'cotisations/aff_article.html' with article_list=article_list %}
{% endblock %} {% endblock %}

View file

@ -37,7 +37,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
</a> </a>
{% acl_end %} {% acl_end %}
<a class="btn btn-danger btn-sm" role="button" href="{% url 'cotisations:del-banque' %}"> <a class="btn btn-danger btn-sm" role="button" href="{% url 'cotisations:del-banque' %}">
<i class="fa fa-trash"></i> {% trans "Delete banks" %} <i class="fa fa-trash"></i> {% trans "Delete one or several banks" %}
</a> </a>
{% include 'cotisations/aff_banque.html' with banque_list=banque_list %} {% include 'cotisations/aff_banque.html' with banque_list=banque_list %}
{% endblock %} {% endblock %}

View file

@ -27,17 +27,17 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% load acl %} {% load acl %}
{% load i18n %} {% load i18n %}
{% block title %}{% trans "Payments" %}{% endblock %} {% block title %}{% trans "Payment methods" %}{% endblock %}
{% block content %} {% block content %}
<h2>{% trans "Payment types list" %}</h2> <h2>{% trans "List of payment methods" %}</h2>
{% can_create Paiement %} {% can_create Paiement %}
<a class="btn btn-primary btn-sm" role="button" href="{% url 'cotisations:add-paiement' %}"> <a class="btn btn-primary btn-sm" role="button" href="{% url 'cotisations:add-paiement' %}">
<i class="fa fa-cart-plus"></i> {% trans "Add a payment type" %} <i class="fa fa-cart-plus"></i> {% trans "Add a payment method" %}
</a> </a>
{% acl_end %} {% acl_end %}
<a class="btn btn-danger btn-sm" role="button" href="{% url 'cotisations:del-paiement' %}"> <a class="btn btn-danger btn-sm" role="button" href="{% url 'cotisations:del-paiement' %}">
<i class="fa fa-trash"></i> {% trans "Delete payment types" %} <i class="fa fa-trash"></i> {% trans "Delete one or several payment methods" %}
</a> </a>
{% include 'cotisations/aff_paiement.html' with paiement_list=paiement_list %} {% include 'cotisations/aff_paiement.html' with paiement_list=paiement_list %}
{% endblock %} {% endblock %}

View file

@ -31,11 +31,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% block content %} {% block content %}
<h3> <h3>
{% blocktrans %} {% blocktrans %}Pay {{ amount }} €{% endblocktrans %}
Pay {{ amount }} €
{% endblocktrans %}
</h3> </h3>
<form class="form" method="{{ method | default:"post" }}" action="{{ action }}"> <form class="form" method="{{ method|default:"post" }}" action="{{ action }}">
{{ content | safe }} {{ content | safe }}
{% if form %} {% if form %}
{% csrf_token %} {% csrf_token %}
@ -45,3 +43,4 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% bootstrap_button tr_pay button_type='submit' icon='piggy-bank' %} {% bootstrap_button tr_pay button_type='submit' icon='piggy-bank' %}
</form> </form>
{% endblock %} {% endblock %}

View file

@ -61,3 +61,4 @@ with this program; if not, write to the Free Software Foundation, Inc.,
</a> </a>
{% acl_end %} {% acl_end %}
{% endblock %} {% endblock %}

View file

@ -17,5 +17,6 @@ def check_no_balance(is_balance):
p = Paiement.objects.filter(is_balance=True) p = Paiement.objects.filter(is_balance=True)
if len(p) > 0: if len(p) > 0:
raise ValidationError( raise ValidationError(
_("There are already payment method(s) for user balance") _("There is already a payment method for user balance.")
) )

View file

@ -225,7 +225,7 @@ def new_custom_invoice(request):
) )
messages.success( messages.success(
request, request,
_('The custom invoice was successfully created.') _("The custom invoice was created.")
) )
return redirect(reverse('cotisations:index-custom-invoice')) return redirect(reverse('cotisations:index-custom-invoice'))
@ -313,7 +313,7 @@ def edit_facture(request, facture, **_kwargs):
purchase_form.save() purchase_form.save()
messages.success( messages.success(
request, request,
_("The invoice has been successfully edited.") _("The invoice was edited.")
) )
return redirect(reverse('cotisations:index')) return redirect(reverse('cotisations:index'))
return form({ return form({
@ -333,7 +333,7 @@ def del_facture(request, facture, **_kwargs):
facture.delete() facture.delete()
messages.success( messages.success(
request, request,
_("The invoice has been successfully deleted.") _("The invoice was deleted.")
) )
return redirect(reverse('cotisations:index')) return redirect(reverse('cotisations:index'))
return form({ return form({
@ -367,7 +367,7 @@ def edit_custom_invoice(request, invoice, **kwargs):
purchase_form.save() purchase_form.save()
messages.success( messages.success(
request, request,
_("The invoice has been successfully edited.") _("The invoice was edited.")
) )
return redirect(reverse('cotisations:index-custom-invoice')) return redirect(reverse('cotisations:index-custom-invoice'))
@ -427,7 +427,7 @@ def del_custom_invoice(request, invoice, **_kwargs):
invoice.delete() invoice.delete()
messages.success( messages.success(
request, request,
_("The invoice has been successfully deleted.") _("The invoice was deleted.")
) )
return redirect(reverse('cotisations:index-custom-invoice')) return redirect(reverse('cotisations:index-custom-invoice'))
return form({ return form({
@ -453,7 +453,7 @@ def add_article(request):
article.save() article.save()
messages.success( messages.success(
request, request,
_("The article has been successfully created.") _("The article was created.")
) )
return redirect(reverse('cotisations:index-article')) return redirect(reverse('cotisations:index-article'))
return form({ return form({
@ -475,7 +475,7 @@ def edit_article(request, article_instance, **_kwargs):
article.save() article.save()
messages.success( messages.success(
request, request,
_("The article has been successfully edited.") _("The article was edited.")
) )
return redirect(reverse('cotisations:index-article')) return redirect(reverse('cotisations:index-article'))
return form({ return form({
@ -497,7 +497,7 @@ def del_article(request, instances):
article_del.delete() article_del.delete()
messages.success( messages.success(
request, request,
_("The article(s) have been successfully deleted.") _("The articles were deleted.")
) )
return redirect(reverse('cotisations:index-article')) return redirect(reverse('cotisations:index-article'))
return form({ return form({
@ -525,7 +525,7 @@ def add_paiement(request):
payment_method.save(payment) payment_method.save(payment)
messages.success( messages.success(
request, request,
_("The payment method has been successfully created.") _("The payment method was created.")
) )
return redirect(reverse('cotisations:index-paiement')) return redirect(reverse('cotisations:index-paiement'))
return form({ return form({
@ -561,8 +561,7 @@ def edit_paiement(request, paiement_instance, **_kwargs):
if payment_method is not None: if payment_method is not None:
payment_method.save() payment_method.save()
messages.success( messages.success(
request, request,_("The payment method was edited.")
_("The payement method has been successfully edited.")
) )
return redirect(reverse('cotisations:index-paiement')) return redirect(reverse('cotisations:index-paiement'))
return form({ return form({
@ -588,8 +587,7 @@ def del_paiement(request, instances):
payment_del.delete() payment_del.delete()
messages.success( messages.success(
request, request,
_("The payment method %(method_name)s has been \ _("The payment method %(method_name)s was deleted.") % {
successfully deleted.") % {
'method_name': payment_del 'method_name': payment_del
} }
) )
@ -621,7 +619,7 @@ def add_banque(request):
bank.save() bank.save()
messages.success( messages.success(
request, request,
_("The bank has been successfully created.") _("The bank was created.")
) )
return redirect(reverse('cotisations:index-banque')) return redirect(reverse('cotisations:index-banque'))
return form({ return form({
@ -644,7 +642,7 @@ def edit_banque(request, banque_instance, **_kwargs):
bank.save() bank.save()
messages.success( messages.success(
request, request,
_("The bank has been successfully edited") _("The bank was edited.")
) )
return redirect(reverse('cotisations:index-banque')) return redirect(reverse('cotisations:index-banque'))
return form({ return form({
@ -669,8 +667,7 @@ def del_banque(request, instances):
bank_del.delete() bank_del.delete()
messages.success( messages.success(
request, request,
_("The bank %(bank_name)s has been successfully \ _("The bank %(bank_name)s was deleted.") % {
deleted.") % {
'bank_name': bank_del 'bank_name': bank_del
} }
) )
@ -873,3 +870,4 @@ def credit_solde(request, user, **_kwargs):
'action_name': _("Pay"), 'action_name': _("Pay"),
'max_balance': p.payment_method.maximum_balance, 'max_balance': p.payment_method.maximum_balance,
}, 'cotisations/facture.html', request) }, 'cotisations/facture.html', request)

View file

@ -25,6 +25,7 @@
Here are defined some functions to check acl on the application. Here are defined some functions to check acl on the application.
""" """
from django.utils.translation import ugettext as _
def can_view(user): def can_view(user):
@ -38,4 +39,6 @@ def can_view(user):
viewing is granted and msg is a message (can be None). viewing is granted and msg is a message (can be None).
""" """
can = user.has_module_perms('admin') can = user.has_module_perms('admin')
return can, None if can else "Vous ne pouvez pas voir cette application." return can, None if can else _("You don't have the right to view this"
" application.")

Binary file not shown.

View file

@ -0,0 +1,338 @@
# 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 © 2018 Maël Kervella
#
# 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.
msgid ""
msgstr ""
"Project-Id-Version: 2.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-08-15 20:12+0200\n"
"PO-Revision-Date: 2018-06-23 16:01+0200\n"
"Last-Translator: Laouen Fernet <laouen.fernet@supelec.fr>\n"
"Language-Team: \n"
"Language: fr_FR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: acl.py:42
msgid "You don't have the right to view this application."
msgstr "Vous n'avez pas le droit de voir cette application."
#: templates/logs/aff_stats_logs.html:36
msgid "Edited object"
msgstr "Objet modifié"
#: templates/logs/aff_stats_logs.html:37
#: templates/logs/aff_stats_models.html:32
msgid "Object type"
msgstr "Type d'objet"
#: templates/logs/aff_stats_logs.html:38
msgid "Edited by"
msgstr "Modifié par"
#: templates/logs/aff_stats_logs.html:40
msgid "Date of editing"
msgstr "Date de modification"
#: templates/logs/aff_stats_logs.html:42
msgid "Comment"
msgstr "Commentaire"
#: templates/logs/aff_stats_logs.html:58 templates/logs/aff_summary.html:62
#: templates/logs/aff_summary.html:85 templates/logs/aff_summary.html:104
#: templates/logs/aff_summary.html:123 templates/logs/aff_summary.html:142
msgid "Cancel"
msgstr "Annuler"
#: templates/logs/aff_stats_models.html:29
#, python-format
msgid "Statistics of the set %(key)s"
msgstr "Statistiques de l'ensemble %(key)s"
#: templates/logs/aff_stats_models.html:33
msgid "Number of stored entries"
msgstr "Nombre d'entrées enregistrées"
#: templates/logs/aff_stats_users.html:31
#, python-format
msgid "Statistics per %(key_dict)s of %(key)s"
msgstr "Statistiques par %(key_dict)s de %(key)s"
#: templates/logs/aff_stats_users.html:34
#, python-format
msgid "Number of %(key)s per %(key_dict)s"
msgstr "Nombre de %(key)s par %(key_dict)s"
#: templates/logs/aff_stats_users.html:35
msgid "Rank"
msgstr "Rang"
#: templates/logs/aff_summary.html:37
msgid "Date"
msgstr "Date"
#: templates/logs/aff_summary.html:39
msgid "Editing"
msgstr "Modification"
#: templates/logs/aff_summary.html:48
#, python-format
msgid "%(username)s has banned"
msgstr "%(username)s a banni"
#: templates/logs/aff_summary.html:52 templates/logs/aff_summary.html:75
msgid "No reason"
msgstr "Aucun motif"
#: templates/logs/aff_summary.html:71
#, python-format
msgid "%(username)s has graciously authorised"
msgstr "%(username)s a autorisé gracieusement"
#: templates/logs/aff_summary.html:94
#, python-format
msgid "%(username)s has updated"
msgstr "%(username)s a mis à jour"
#: templates/logs/aff_summary.html:113
#, python-format
msgid "%(username)s has sold %(number)sx %(name)s to"
msgstr "%(username)s a vendu %(number)sx %(name)s à"
#: templates/logs/aff_summary.html:116
#, python-format
msgid "+%(duration)s months"
msgstr "+%(duration)s mois"
#: templates/logs/aff_summary.html:132
#, python-format
msgid "%(username)s has edited an interface of"
msgstr "%(username)s a modifié une interface de"
#: templates/logs/delete.html:29
msgid "Deletion of actions"
msgstr "Suppression d'actions"
#: templates/logs/delete.html:35
#, python-format
msgid ""
"Warning: are you sure you want to delete this action %(objet_name)s "
"( %(objet)s )?"
msgstr ""
"Attention: voulez-vous vraiment supprimer cette action %(objet_name)s "
"( %(objet)s ) ?"
#: templates/logs/delete.html:36
msgid "Confirm"
msgstr "Confirmer"
#: templates/logs/index.html:29 templates/logs/stats_general.html:29
#: templates/logs/stats_logs.html:29 templates/logs/stats_models.html:29
#: templates/logs/stats_users.html:29
msgid "Statistics"
msgstr "Statistiques"
#: templates/logs/index.html:32 templates/logs/stats_logs.html:32 views.py:403
msgid "Actions performed"
msgstr "Actions effectuées"
#: templates/logs/sidebar.html:33
msgid "Summary"
msgstr "Résumé"
#: templates/logs/sidebar.html:37
msgid "Events"
msgstr "Évènements"
#: templates/logs/sidebar.html:41
msgid "General"
msgstr "Général"
#: templates/logs/sidebar.html:45
msgid "Database"
msgstr "Base de données"
#: templates/logs/sidebar.html:49
msgid "Wiring actions"
msgstr "Actions de câblage"
#: templates/logs/sidebar.html:53 views.py:325
msgid "Users"
msgstr "Utilisateurs"
#: templates/logs/stats_general.html:32
msgid "General statistics"
msgstr "Statistiques générales"
#: templates/logs/stats_models.html:32
msgid "Database statistics"
msgstr "Statistiques sur la base de données"
#: templates/logs/stats_users.html:32
msgid "Statistics about users"
msgstr "Statistiques sur les utilisateurs"
#: views.py:191
msgid "Nonexistent revision."
msgstr "Révision inexistante."
#: views.py:194
msgid "The action was deleted."
msgstr "L'action a été supprimée."
#: views.py:227
msgid "Category"
msgstr "Catégorie"
#: views.py:228
msgid "Number of users (members and clubs)"
msgstr "Nombre d'utilisateurs (adhérents et clubs)"
#: views.py:229
msgid "Number of members"
msgstr "Nombre d'adhérents"
#: views.py:230
msgid "Number of clubs"
msgstr "Nombre de clubs"
#: views.py:234
msgid "Activated users"
msgstr "Utilisateurs activés"
#: views.py:242
msgid "Disabled users"
msgstr "Utilisateurs désactivés"
#: views.py:250
msgid "Archived users"
msgstr "Utilisateurs archivés"
#: views.py:258
msgid "Contributing members"
msgstr "Adhérents cotisants"
#: views.py:264
msgid "Users benefiting from a connection"
msgstr "Utilisateurs bénéficiant d'une connexion"
#: views.py:270
msgid "Banned users"
msgstr "Utilisateurs bannis"
#: views.py:276
msgid "Users benefiting from a free connection"
msgstr "Utilisateurs bénéficiant d'une connexion gratuite"
#: views.py:282
msgid "Active interfaces (with access to the network)"
msgstr "Interfaces actives (ayant accès au réseau)"
#: views.py:292
msgid "Active interfaces assigned IPv4"
msgstr "Interfaces actives assignées IPv4"
#: views.py:305
msgid "IP range"
msgstr "Plage d'IP"
#: views.py:306
msgid "VLAN"
msgstr "VLAN"
#: views.py:307
msgid "Total number of IP addresses"
msgstr "Nombre total d'adresses IP"
#: views.py:308
msgid "Number of assigned IP addresses"
msgstr "Nombre d'adresses IP non assignées"
#: views.py:309
msgid "Number of IP address assigned to an activated machine"
msgstr "Nombre d'adresses IP assignées à une machine activée"
#: views.py:310
msgid "Number of nonassigned IP addresses"
msgstr "Nombre d'adresses IP non assignées"
#: views.py:337
msgid "Subscriptions"
msgstr "Cotisations"
#: views.py:359 views.py:420
msgid "Machines"
msgstr "Machines"
#: views.py:386
msgid "Topology"
msgstr "Topologie"
#: views.py:405
msgid "Number of actions"
msgstr "Nombre d'actions"
#: views.py:419 views.py:437 views.py:442 views.py:447 views.py:462
msgid "User"
msgstr "Utilisateur"
#: views.py:423
msgid "Invoice"
msgstr "Facture"
#: views.py:426
msgid "Ban"
msgstr "Bannissement"
#: views.py:429
msgid "Whitelist"
msgstr "Accès gracieux"
#: views.py:432
msgid "Rights"
msgstr "Droits"
#: views.py:436
msgid "School"
msgstr "Établissement"
#: views.py:441
msgid "Payment method"
msgstr "Moyen de paiement"
#: views.py:446
msgid "Bank"
msgstr "Banque"
#: views.py:463
msgid "Action"
msgstr "Action"
#: views.py:494
msgid "No model found."
msgstr "Aucun modèle trouvé."
#: views.py:500
msgid "Nonexistent entry."
msgstr "Entrée inexistante."
#: views.py:507
msgid "You don't have the right to access this menu."
msgstr "Vous n'avez pas le droit d'accéder à ce menu."

View file

@ -22,7 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
{% endcomment %} {% endcomment %}
{% for stats in stats_list %} {% for stats in stats_list %}
<table class="table table-striped"> <table class="table table-striped">
<thead> <thead>
<tr> <tr>
@ -32,11 +32,12 @@ with this program; if not, write to the Free Software Foundation, Inc.,
</tr> </tr>
</thead> </thead>
{% for key, stat in stats.1.items %} {% for key, stat in stats.1.items %}
<tr> <tr>
{% for item in stat %} {% for item in stat %}
<td>{{ item }}</td> <td>{{ item }}</td>
{% endfor %} {% endfor %}
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>
{% endfor %} {% endfor %}

View file

@ -28,39 +28,43 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% load logs_extra %} {% load logs_extra %}
{% load acl %} {% load acl %}
{% load i18n %}
<table class="table table-striped"> <table class="table table-striped">
<thead> <thead>
<tr>
<th>{% trans "Edited object" %}</th>
<th>{% trans "Object type" %}</th>
{% trans "Edited by" as tr_edited_by %}
<th>{% include "buttons/sort.html" with prefix='logs' col='author' text=tr_edited_by %}</th>
{% trans "Date of editing" as tr_date_of_editing %}
<th>{% include "buttons/sort.html" with prefix='logs' col='date' text=tr_date_of_editing %}</th>
<th>{% trans "Comment" %}</th>
<th></th>
</tr>
</thead>
{% for revision in revisions_list %}
{% for reversion in revision.version_set.all %}
<tr> <tr>
<th>Objet modifié</th> <td>{{ reversion.object|truncatechars:20 }}</td>
<th>Type de l'objet</th> <td>{{ reversion.object|classname }}</td>
<th>{% include "buttons/sort.html" with prefix='logs' col='author' text='Modification par' %}</th> <td>{{ revision.user }}</td>
<th>{% include "buttons/sort.html" with prefix='logs' col='date' text='Date de modification' %}</th> <td>{{ revision.date_created }}</td>
<th>Commentaire</th> <td>{{ revision.comment }}</td>
<th></th> {% can_edit_history %}
<td>
<a class="btn btn-danger btn-sm" role="button" href="{% url 'logs:revert-action' revision.id %}">
<i class="fa fa-times"></i>
{% trans "Cancel" %}
</a>
</td>
{% acl_end %}
</tr> </tr>
</thead>
{% for revision in revisions_list %}
{% for reversion in revision.version_set.all %}
<tr>
<td>{{ reversion.object|truncatechars:20 }}</td>
<td>{{ reversion.object|classname }}</td>
<td>{{ revision.user }}</td>
<td>{{ revision.date_created }}</td>
<td>{{ revision.comment }}</td>
{% can_edit_history %}
<td>
<a class="btn btn-danger btn-sm" role="button" href="{% url 'logs:revert-action' revision.id %}">
<i class="fa fa-times"></i>
Annuler
</a>
</td>
{% acl_end %}
</tr>
{% endfor %}
{% endfor %} {% endfor %}
</table> {% endfor %}
</table>
{% if revisions_list.paginator %} {% if revisions_list.paginator %}
{% include "pagination.html" with list=revisions_list %} {% include "pagination.html" with list=revisions_list %}
{% endif %} {% endif %}

View file

@ -22,20 +22,23 @@ with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
{% endcomment %} {% endcomment %}
{% for key, stats in stats_list.items %} {% load i18n %}
{% for key, stats in stats_list.items %}
<table class="table table-striped"> <table class="table table-striped">
<h4>Statistiques de l'ensemble {{ key }}</h4> <h4>{% blocktrans %}Statistics of the set {{ key }}{% endblocktrans %}</h4>
<thead> <thead>
<tr> <tr>
<th>Type d'objet</th> <th>{% trans "Object type" %}</th>
<th>Nombre d'entrée stockées</th> <th>{% trans "Number of stored entries" %}</th>
</tr> </tr>
</thead> </thead>
{% for key, stat in stats.items %} {% for key, stat in stats.items %}
<tr> <tr>
<td>{{ stat.0 }}</td> <td>{{ stat.0 }}</td>
<td>{{ stat.1 }}</td> <td>{{ stat.1 }}</td>
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>
{% endfor %} {% endfor %}

View file

@ -22,24 +22,27 @@ with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
{% endcomment %} {% endcomment %}
{% for key_dict, stats_dict in stats_list.items %} {% load i18n %}
{% for key_dict, stats_dict in stats_list.items %}
{% for key, stats in stats_dict.items %} {% for key, stats in stats_dict.items %}
<table class="table table-striped"> <table class="table table-striped">
<thead> <thead>
<h4>Statistiques par {{ key_dict }} de {{ key }}</h4> <h4>{% blocktrans %}Statistics per {{ key_dict }} of {{ key }}{% endblocktrans %}</h4>
<tr> <tr>
<th>{{ key_dict }}</th> <th>{{ key_dict }}</th>
<th>Nombre de {{ key }} par {{ key_dict }}</th> <th>{% blocktrans %}Number of {{ key }} per {{ key_dict }}{% endblocktrans %}</th>
<th>Rang</th> <th>{% trans "Rank" %}</th>
</tr> </tr>
</thead> </thead>
{% for stat in stats %} {% for stat in stats %}
<tr> <tr>
<td>{{ stat|truncatechars:25 }}</td> <td>{{ stat|truncatechars:25 }}</td>
<td>{{ stat.num }}</td> <td>{{ stat.num }}</td>
<td>{{ forloop.counter }}</td> <td>{{ forloop.counter }}</td>
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>
{% endfor %} {% endfor %}
{% endfor %} {% endfor %}

View file

@ -28,122 +28,127 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% load logs_extra %} {% load logs_extra %}
{% load acl %} {% load acl %}
<table class="table table-striped">
<thead> {% load i18n %}
<tr>
<th>{% include "buttons/sort.html" with prefix='sum' col='date' text='Date' %}</th> <table class="table table-striped">
<th>Modification</th> <thead>
<th></th> <tr>
</tr> {% trans "Date" as tr_date %}
</thead> <th>{% include "buttons/sort.html" with prefix='sum' col='date' text=tr_date %}</th>
<th>{% trans "Editing" %}</th>
<th></th>
</tr>
</thead>
{% for v in versions_list %} {% for v in versions_list %}
{% if v.version.content_type.model == 'ban' %} {% if v.version.content_type.model == 'ban' %}
<tr class="danger"> <tr class="danger">
<td>{{ v.datetime }}</td> <td>{{ v.datetime }}</td>
<td> <td>
{{ v.username }} a banni {% blocktrans with username=v.username %}{{ username }} has banned{% endblocktrans %}
<a href="{% url 'users:profil' v.version.object.user_id %}">{{ v.version.object.user.get_username }}</a> <a href="{% url 'users:profil' v.version.object.user_id %}">{{ v.version.object.user.get_username }}</a>
(<i> (<i>
{% if v.version.object.raison == '' %} {% if v.version.object.raison == '' %}
Aucune raison {% trans "No reason" %}
{% else %} {% else %}
{{ v.version.object.raison }} {{ v.version.object.raison }}
{% endif %} {% endif %}
</i>) </i>)
</td> </td>
{% can_edit_history %} {% can_edit_history %}
<td> <td>
<a class="btn btn-danger btn-sm" role="button" href="{% url 'logs:revert-action' v.rev_id %}"> <a class="btn btn-danger btn-sm" role="button" href="{% url 'logs:revert-action' v.rev_id %}">
<i class="fa fa-times"></i> <i class="fa fa-times"></i>
Annuler {% trans "Cancel" %}
</a> </a>
</td> </td>
{% acl_end %} {% acl_end %}
</tr> </tr>
{% elif v.version.content_type.model == 'whitelist' %} {% elif v.version.content_type.model == 'whitelist' %}
<tr class="success"> <tr class="success">
<td>{{ v.datetime }}</td> <td>{{ v.datetime }}</td>
<td> <td>
{{ v.username }} a autorisé gracieusement {% blocktrans with username=v.username %}{{ username }} has graciously authorised{% endblocktrans %}
<a href="{% url 'users:profil' v.version.object.user_id %}">{{ v.version.object.user.get_username }}</a> <a href="{% url 'users:profil' v.version.object.user_id %}">{{ v.version.object.user.get_username }}</a>
(<i> (<i>
{% if v.version.object.raison == '' %} {% if v.version.object.raison == '' %}
Aucune raison {% trans "No reason" %}
{% else %} {% else %}
{{ v.version.object.raison }} {{ v.version.object.raison }}
{% endif %} {% endif %}
</i>) </i>)
</td> </td>
{% can_edit_history%} {% can_edit_history%}
<td> <td>
<a class="btn btn-danger btn-sm" role="button" href="{% url 'logs:revert-action' v.rev_id %}"> <a class="btn btn-danger btn-sm" role="button" href="{% url 'logs:revert-action' v.rev_id %}">
<i class="fa fa-times"></i> <i class="fa fa-times"></i>
Annuler {% trans "Cancel" %}
</a> </a>
</td> </td>
{% acl_end %} {% acl_end %}
</tr> </tr>
{% elif v.version.content_type.model == 'user' %} {% elif v.version.content_type.model == 'user' %}
<tr> <tr>
<td>{{ v.datetime }}</td> <td>{{ v.datetime }}</td>
<td> <td>
{{ v.username }} a mis à jour {% blocktrans with username=v.username %}{{ username }} has updated{% endblocktrans %}
<a href="{% url 'users:profil' v.version.object.id %}">{{ v.version.object.get_username }}</a> <a href="{% url 'users:profil' v.version.object.id %}">{{ v.version.object.get_username }}</a>
{% if v.comment != '' %} {% if v.comment != '' %}
(<i>{{ v.comment }}</i>) (<i>{{ v.comment }}</i>)
{% endif %} {% endif %}
</td> </td>
{% can_edit_history %} {% can_edit_history %}
<td> <td>
<a class="btn btn-danger btn-sm" role="button" href="{% url 'logs:revert-action' v.rev_id %}"> <a class="btn btn-danger btn-sm" role="button" href="{% url 'logs:revert-action' v.rev_id %}">
<i class="fa fa-times"></i> <i class="fa fa-times"></i>
Annuler {% trans "Cancel" %}
</a> </a>
</td> </td>
{% acl_end %} {% acl_end %}
</tr> </tr>
{% elif v.version.content_type.model == 'vente' %} {% elif v.version.content_type.model == 'vente' %}
<tr> <tr>
<td>{{ v.datetime }}</td> <td>{{ v.datetime }}</td>
<td> <td>
{{ v.username }} a vendu {{ v.version.object.number }}x {{ v.version.object.name }} à {% blocktrans with username=v.username number=v.version.object.number name=v.version.object.name %}{{ username }} has sold {{ number }}x {{ name }} to{% endblocktrans %}
<a href="{% url 'users:profil' v.version.object.facture.user_id %}">{{ v.version.object.facture.user.get_username }}</a> <a href="{% url 'users:profil' v.version.object.facture.user_id %}">{{ v.version.object.facture.user.get_username }}</a>
{% if v.version.object.iscotisation %} {% if v.version.object.iscotisation %}
(<i>+{{ v.version.object.duration }} mois</i>) (<i>{% blocktrans with duration=v.version.object.duration %}+{{ duration }} months{% endblocktrans %}</i>)
{% endif %} {% endif %}
</td> </td>
{% can_edit_history %} {% can_edit_history %}
<td> <td>
<a class="btn btn-danger btn-sm" role="button" href="{% url 'logs:revert-action' v.rev_id %}"> <a class="btn btn-danger btn-sm" role="button" href="{% url 'logs:revert-action' v.rev_id %}">
<i class="fa fa-times"></i> <i class="fa fa-times"></i>
Annuler {% trans "Cancel" %}
</a> </a>
</td> </td>
{% acl_end %} {% acl_end %}
</tr> </tr>
{% elif v.version.content_type.model == 'interface' %} {% elif v.version.content_type.model == 'interface' %}
<tr> <tr>
<td>{{ v.datetime }}</td> <td>{{ v.datetime }}</td>
<td> <td>
{{ v.username }} a modifié une interface de {% blocktrans with username=v.username %}{{ username }} has edited an interface of{% endblocktrans %}
<a href="{% url 'users:profil' v.version.object.machine.user_id %}">{{ v.version.object.machine.user.get_username }}</a> <a href="{% url 'users:profil' v.version.object.machine.user_id %}">{{ v.version.object.machine.user.get_username }}</a>
{% if v.comment != '' %} {% if v.comment != '' %}
(<i>{{ v.comment }}</i>) (<i>{{ v.comment }}</i>)
{% endif %} {% endif %}
</td> </td>
{% can_edit_history %} {% can_edit_history %}
<td> <td>
<a class="btn btn-danger btn-sm" role="button" href="{% url 'logs:revert-action' v.rev_id %}"> <a class="btn btn-danger btn-sm" role="button" href="{% url 'logs:revert-action' v.rev_id %}">
<i class="fa fa-times"></i> <i class="fa fa-times"></i>
Annuler {% trans "Cancel" %}
</a> </a>
</td> </td>
{% acl_end %} {% acl_end %}
</tr> </tr>
{% endif %} {% endif %}
{% endfor %} {% endfor %}
</table> </table>
{% if versions_list.paginator %} {% if versions_list.paginator %}
{% include "pagination.html" with list=versions_list %} {% include "pagination.html" with list=versions_list %}
{% endif %} {% endif %}

View file

@ -24,17 +24,20 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% endcomment %} {% endcomment %}
{% load bootstrap3 %} {% load bootstrap3 %}
{% load i18n %}
{% block title %}Supression d'action{% endblock %} {% block title %}{% trans "Deletion of actions" %}{% endblock %}
{% block content %} {% block content %}
<form class="form" method="post"> <form class="form" method="post">
{% csrf_token %} {% csrf_token %}
<h4>Attention, voulez-vous vraiment annuler cette action {{ objet_name }} ( {{ objet }} ) ?</h4> <h4>{% blocktrans %}Warning: are you sure you want to delete this action {{ objet_name }} ( {{ objet }} )?{% endblocktrans %}</h4>
{% bootstrap_button "Confirmer" button_type="submit" icon="trash" %} {% trans "Confirm" as tr_confirm %}
{% bootstrap_button tr_confirm button_type="submit" icon="trash" %}
</form> </form>
<br /> <br />
<br /> <br />
<br /> <br />
{% endblock %} {% endblock %}

View file

@ -24,13 +24,15 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% endcomment %} {% endcomment %}
{% load bootstrap3 %} {% load bootstrap3 %}
{% load i18n %}
{% block title %}Statistiques{% endblock %} {% block title %}{%trans "Statistics" %}{% endblock %}
{% block content %} {% block content %}
<h2>Actions effectuées</h2> <h2>{% trans "Actions performed" %}</h2>
{% include "logs/aff_summary.html" with versions_list=versions_list %} {% include "logs/aff_summary.html" with versions_list=versions_list %}
<br /> <br />
<br /> <br />
<br /> <br />
{% endblock %} {% endblock %}

View file

@ -24,32 +24,34 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% endcomment %} {% endcomment %}
{% load acl %} {% load acl %}
{% load i18n %}
{% block sidebar %} {% block sidebar %}
{% can_view_app logs %} {% can_view_app logs %}
<a class="list-group-item list-group-item-info" href="{% url "logs:index" %}"> <a class="list-group-item list-group-item-info" href="{% url "logs:index" %}">
<i class="fa fa-clipboard-list"></i> <i class="fa fa-clipboard-list"></i>
Résumé {% trans "Summary" %}
</a> </a>
<a class="list-group-item list-group-item-info" href="{% url "logs:stats-logs" %}"> <a class="list-group-item list-group-item-info" href="{% url "logs:stats-logs" %}">
<i class="fa fa-calendar-alt"></i> <i class="fa fa-calendar-alt"></i>
Évènements {% trans "Events" %}
</a> </a>
<a class="list-group-item list-group-item-info" href="{% url "logs:stats-general" %}"> <a class="list-group-item list-group-item-info" href="{% url "logs:stats-general" %}">
<i class="fa fa-chart-area"></i> <i class="fa fa-chart-area"></i>
Général {% trans "General" %}
</a> </a>
<a class="list-group-item list-group-item-info" href="{% url "logs:stats-models" %}"> <a class="list-group-item list-group-item-info" href="{% url "logs:stats-models" %}">
<i class="fa fa-database"></i> <i class="fa fa-database"></i>
Base de données {% trans "Database" %}
</a> </a>
<a class="list-group-item list-group-item-info" href="{% url "logs:stats-actions" %}"> <a class="list-group-item list-group-item-info" href="{% url "logs:stats-actions" %}">
<i class="fa fa-plug"></i> <i class="fa fa-plug"></i>
Actions de cablage {% trans "Wiring actions" %}
</a> </a>
<a class="list-group-item list-group-item-info" href="{% url "logs:stats-users" %}"> <a class="list-group-item list-group-item-info" href="{% url "logs:stats-users" %}">
<i class="fa fa-users"></i> <i class="fa fa-users"></i>
Utilisateurs {% trans "Users" %}
</a> </a>
{% acl_end %} {% acl_end %}
{% endblock %} {% endblock %}

View file

@ -24,13 +24,15 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% endcomment %} {% endcomment %}
{% load bootstrap3 %} {% load bootstrap3 %}
{% load i18n %}
{% block title %}Statistiques générales{% endblock %} {% block title %}{% trans "Statistics" %}{% endblock %}
{% block content %} {% block content %}
<h2>Statistiques générales</h2> <h2>{% trans "General statistics" %}</h2>
{% include "logs/aff_stats_general.html" with stats_list=stats_list %} {% include "logs/aff_stats_general.html" with stats_list=stats_list %}
<br /> <br />
<br /> <br />
<br /> <br />
{% endblock %} {% endblock %}

View file

@ -24,13 +24,15 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% endcomment %} {% endcomment %}
{% load bootstrap3 %} {% load bootstrap3 %}
{% load i18n %}
{% block title %}Statistiques{% endblock %} {% block title %}{% trans "Statistics" %}{% endblock %}
{% block content %} {% block content %}
<h2>Actions effectuées</h2> <h2>{% trans "Actions performed" %}</h2>
{% include "logs/aff_stats_logs.html" with revisions_list=revisions_list %} {% include "logs/aff_stats_logs.html" with revisions_list=revisions_list %}
<br /> <br />
<br /> <br />
<br /> <br />
{% endblock %} {% endblock %}

View file

@ -24,13 +24,15 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% endcomment %} {% endcomment %}
{% load bootstrap3 %} {% load bootstrap3 %}
{% load i18n %}
{% block title %}Statistiques des objets base de données{% endblock %} {% block title %}{% trans "Statistics" %}{% endblock %}
{% block content %} {% block content %}
<h2>Statistiques bdd</h2> <h2>{% trans "Database statistics" %}</h2>
{% include "logs/aff_stats_models.html" with stats_list=stats_list %} {% include "logs/aff_stats_models.html" with stats_list=stats_list %}
<br /> <br />
<br /> <br />
<br /> <br />
{% endblock %} {% endblock %}

View file

@ -24,13 +24,15 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% endcomment %} {% endcomment %}
{% load bootstrap3 %} {% load bootstrap3 %}
{% load i18n %}
{% block title %}Statistiques par utilisateur{% endblock %} {% block title %}{% trans "Statistics" %}{% endblock %}
{% block content %} {% block content %}
<h2>Statistiques par utilisateur</h2> <h2>{% trans "Statistics about users" %}</h2>
{% include "logs/aff_stats_users.html" with stats_list=stats_list %} {% include "logs/aff_stats_users.html" with stats_list=stats_list %}
<br /> <br />
<br /> <br />
<br /> <br />
{% endblock %} {% endblock %}

View file

@ -188,10 +188,10 @@ def revert_action(request, revision_id):
try: try:
revision = Revision.objects.get(id=revision_id) revision = Revision.objects.get(id=revision_id)
except Revision.DoesNotExist: except Revision.DoesNotExist:
messages.error(request, u"Revision inexistante") messages.error(request, _("Nonexistent revision."))
if request.method == "POST": if request.method == "POST":
revision.revert() revision.revert()
messages.success(request, "L'action a été supprimée") messages.success(request, _("The action was deleted."))
return redirect(reverse('logs:index')) return redirect(reverse('logs:index'))
return form({ return form({
'objet': revision, 'objet': revision,
@ -224,14 +224,14 @@ def stats_general(request):
stats = [ stats = [
[ # First set of data (about users) [ # First set of data (about users)
[ # Headers [ # Headers
"Categorie", _("Category"),
"Nombre d'utilisateurs (total club et adhérents)", _("Number of users (members and clubs)"),
"Nombre d'adhérents", _("Number of members"),
"Nombre de clubs" _("Number of clubs")
], ],
{ # Data { # Data
'active_users': [ 'active_users': [
"Users actifs", _("Activated users"),
User.objects.filter(state=User.STATE_ACTIVE).count(), User.objects.filter(state=User.STATE_ACTIVE).count(),
(Adherent.objects (Adherent.objects
.filter(state=Adherent.STATE_ACTIVE) .filter(state=Adherent.STATE_ACTIVE)
@ -239,7 +239,7 @@ def stats_general(request):
Club.objects.filter(state=Club.STATE_ACTIVE).count() Club.objects.filter(state=Club.STATE_ACTIVE).count()
], ],
'inactive_users': [ 'inactive_users': [
"Users désactivés", _("Disabled users"),
User.objects.filter(state=User.STATE_DISABLED).count(), User.objects.filter(state=User.STATE_DISABLED).count(),
(Adherent.objects (Adherent.objects
.filter(state=Adherent.STATE_DISABLED) .filter(state=Adherent.STATE_DISABLED)
@ -247,7 +247,7 @@ def stats_general(request):
Club.objects.filter(state=Club.STATE_DISABLED).count() Club.objects.filter(state=Club.STATE_DISABLED).count()
], ],
'archive_users': [ 'archive_users': [
"Users archivés", _("Archived users"),
User.objects.filter(state=User.STATE_ARCHIVE).count(), User.objects.filter(state=User.STATE_ARCHIVE).count(),
(Adherent.objects (Adherent.objects
.filter(state=Adherent.STATE_ARCHIVE) .filter(state=Adherent.STATE_ARCHIVE)
@ -255,31 +255,31 @@ def stats_general(request):
Club.objects.filter(state=Club.STATE_ARCHIVE).count() Club.objects.filter(state=Club.STATE_ARCHIVE).count()
], ],
'adherent_users': [ 'adherent_users': [
"Cotisant à l'association", _("Contributing members"),
_all_adherent.count(), _all_adherent.count(),
_all_adherent.exclude(adherent__isnull=True).count(), _all_adherent.exclude(adherent__isnull=True).count(),
_all_adherent.exclude(club__isnull=True).count() _all_adherent.exclude(club__isnull=True).count()
], ],
'connexion_users': [ 'connexion_users': [
"Utilisateurs bénéficiant d'une connexion", _("Users benefiting from a connection"),
_all_has_access.count(), _all_has_access.count(),
_all_has_access.exclude(adherent__isnull=True).count(), _all_has_access.exclude(adherent__isnull=True).count(),
_all_has_access.exclude(club__isnull=True).count() _all_has_access.exclude(club__isnull=True).count()
], ],
'ban_users': [ 'ban_users': [
"Utilisateurs bannis", _("Banned users"),
_all_baned.count(), _all_baned.count(),
_all_baned.exclude(adherent__isnull=True).count(), _all_baned.exclude(adherent__isnull=True).count(),
_all_baned.exclude(club__isnull=True).count() _all_baned.exclude(club__isnull=True).count()
], ],
'whitelisted_user': [ 'whitelisted_user': [
"Utilisateurs bénéficiant d'une connexion gracieuse", _("Users benefiting from a free connection"),
_all_whitelisted.count(), _all_whitelisted.count(),
_all_whitelisted.exclude(adherent__isnull=True).count(), _all_whitelisted.exclude(adherent__isnull=True).count(),
_all_whitelisted.exclude(club__isnull=True).count() _all_whitelisted.exclude(club__isnull=True).count()
], ],
'actives_interfaces': [ 'actives_interfaces': [
"Interfaces actives (ayant accès au reseau)", _("Active interfaces (with access to the network)"),
_all_active_interfaces_count.count(), _all_active_interfaces_count.count(),
(_all_active_interfaces_count (_all_active_interfaces_count
.exclude(machine__user__adherent__isnull=True) .exclude(machine__user__adherent__isnull=True)
@ -289,7 +289,7 @@ def stats_general(request):
.count()) .count())
], ],
'actives_assigned_interfaces': [ 'actives_assigned_interfaces': [
"Interfaces actives et assignées ipv4", _("Active interfaces assigned IPv4"),
_all_active_assigned_interfaces_count.count(), _all_active_assigned_interfaces_count.count(),
(_all_active_assigned_interfaces_count (_all_active_assigned_interfaces_count
.exclude(machine__user__adherent__isnull=True) .exclude(machine__user__adherent__isnull=True)
@ -302,12 +302,12 @@ def stats_general(request):
], ],
[ # Second set of data (about ip adresses) [ # Second set of data (about ip adresses)
[ # Headers [ # Headers
"Range d'ip", _("IP range"),
"Vlan", _("VLAN"),
"Nombre d'ip totales", _("Total number of IP addresses"),
"Ip assignées", _("Number of assigned IP addresses"),
"Ip assignées à une machine active", _("Number of IP address assigned to an activated machine"),
"Ip non assignées" _("Number of nonassigned IP addresses")
], ],
ip_dict # Data already prepared ip_dict # Data already prepared
] ]
@ -322,79 +322,87 @@ def stats_models(request):
nombre d'users, d'écoles, de droits, de bannissements, nombre d'users, d'écoles, de droits, de bannissements,
de factures, de ventes, de banque, de machines, etc""" de factures, de ventes, de banque, de machines, etc"""
stats = { stats = {
'Users': { _("Users"): {
'users': [User.PRETTY_NAME, User.objects.count()], 'users': [User._meta.verbose_name, User.objects.count()],
'adherents': [Adherent.PRETTY_NAME, Adherent.objects.count()], 'adherents': [Adherent._meta.verbose_name, Adherent.objects.count()],
'clubs': [Club.PRETTY_NAME, Club.objects.count()], 'clubs': [Club._meta.verbose_name, Club.objects.count()],
'serviceuser': [ServiceUser.PRETTY_NAME, 'serviceuser': [ServiceUser._meta.verbose_name,
ServiceUser.objects.count()], ServiceUser.objects.count()],
'school': [School.PRETTY_NAME, School.objects.count()], 'school': [School._meta.verbose_name, School.objects.count()],
'listright': [ListRight.PRETTY_NAME, ListRight.objects.count()], 'listright': [ListRight._meta.verbose_name, ListRight.objects.count()],
'listshell': [ListShell.PRETTY_NAME, ListShell.objects.count()], 'listshell': [ListShell._meta.verbose_name, ListShell.objects.count()],
'ban': [Ban.PRETTY_NAME, Ban.objects.count()], 'ban': [Ban._meta.verbose_name, Ban.objects.count()],
'whitelist': [Whitelist.PRETTY_NAME, Whitelist.objects.count()] 'whitelist': [Whitelist._meta.verbose_name, Whitelist.objects.count()]
}, },
'Cotisations': { _("Subscriptions"): {
'factures': [ 'factures': [
Facture._meta.verbose_name.title(), Facture._meta.verbose_name,
Facture.objects.count() Facture.objects.count()
], ],
'vente': [ 'vente': [
Vente._meta.verbose_name.title(), Vente._meta.verbose_name,
Vente.objects.count() Vente.objects.count()
], ],
'cotisation': [ 'cotisation': [
Cotisation._meta.verbose_name.title(), Cotisation._meta.verbose_name,
Cotisation.objects.count() Cotisation.objects.count()
], ],
'article': [ 'article': [
Article._meta.verbose_name.title(), Article._meta.verbose_name,
Article.objects.count() Article.objects.count()
], ],
'banque': [ 'banque': [
Banque._meta.verbose_name.title(), Banque._meta.verbose_name,
Banque.objects.count() Banque.objects.count()
], ],
}, },
'Machines': { _("Machines"): {
'machine': [Machine.PRETTY_NAME, Machine.objects.count()], 'machine': [Machine._meta.verbose_name,
'typemachine': [MachineType.PRETTY_NAME, Machine.objects.count()],
'typemachine': [MachineType._meta.verbose_name,
MachineType.objects.count()], MachineType.objects.count()],
'typeip': [IpType.PRETTY_NAME, IpType.objects.count()], 'typeip': [IpType._meta.verbose_name,
'extension': [Extension.PRETTY_NAME, Extension.objects.count()], IpType.objects.count()],
'interface': [Interface.PRETTY_NAME, Interface.objects.count()], 'extension': [Extension._meta.verbose_name,
'alias': [Domain.PRETTY_NAME, Extension.objects.count()],
'interface': [Interface._meta.verbose_name,
Interface.objects.count()],
'alias': [Domain._meta.verbose_name,
Domain.objects.exclude(cname=None).count()], Domain.objects.exclude(cname=None).count()],
'iplist': [IpList.PRETTY_NAME, IpList.objects.count()], 'iplist': [IpList._meta.verbose_name,
'service': [Service.PRETTY_NAME, Service.objects.count()], IpList.objects.count()],
'service': [Service._meta.verbose_name,
Service.objects.count()],
'ouvertureportlist': [ 'ouvertureportlist': [
OuverturePortList.PRETTY_NAME, OuverturePortList._meta.verbose_name,
OuverturePortList.objects.count() OuverturePortList.objects.count()
], ],
'vlan': [Vlan.PRETTY_NAME, Vlan.objects.count()], 'vlan': [Vlan._meta.verbose_name, Vlan.objects.count()],
'SOA': [SOA.PRETTY_NAME, SOA.objects.count()], 'SOA': [SOA._meta.verbose_name, SOA.objects.count()],
'Mx': [Mx.PRETTY_NAME, Mx.objects.count()], 'Mx': [Mx._meta.verbose_name, Mx.objects.count()],
'Ns': [Ns.PRETTY_NAME, Ns.objects.count()], 'Ns': [Ns._meta.verbose_name, Ns.objects.count()],
'nas': [Nas.PRETTY_NAME, Nas.objects.count()], 'nas': [Nas._meta.verbose_name, Nas.objects.count()],
}, },
'Topologie': { _("Topology"): {
'switch': [Switch.PRETTY_NAME, Switch.objects.count()], 'switch': [Switch._meta.verbose_name,
'bornes': [AccessPoint.PRETTY_NAME, AccessPoint.objects.count()], Switch.objects.count()],
'port': [Port.PRETTY_NAME, Port.objects.count()], 'bornes': [AccessPoint._meta.verbose_name,
'chambre': [Room.PRETTY_NAME, Room.objects.count()], AccessPoint.objects.count()],
'stack': [Stack.PRETTY_NAME, Stack.objects.count()], 'port': [Port._meta.verbose_name, Port.objects.count()],
'chambre': [Room._meta.verbose_name, Room.objects.count()],
'stack': [Stack._meta.verbose_name, Stack.objects.count()],
'modelswitch': [ 'modelswitch': [
ModelSwitch.PRETTY_NAME, ModelSwitch._meta.verbose_name,
ModelSwitch.objects.count() ModelSwitch.objects.count()
], ],
'constructorswitch': [ 'constructorswitch': [
ConstructorSwitch.PRETTY_NAME, ConstructorSwitch._meta.verbose_name,
ConstructorSwitch.objects.count() ConstructorSwitch.objects.count()
], ],
}, },
'Actions effectuées sur la base': _("Actions performed"):
{ {
'revision': ["Nombre d'actions", Revision.objects.count()], 'revision': [_("Number of actions"), Revision.objects.count()],
}, },
} }
return render(request, 'logs/stats_models.html', {'stats_list': stats}) return render(request, 'logs/stats_models.html', {'stats_list': stats})
@ -408,35 +416,35 @@ def stats_users(request):
de moyens de paiements par user, de banque par user, de moyens de paiements par user, de banque par user,
de bannissement par user, etc""" de bannissement par user, etc"""
stats = { stats = {
'Utilisateur': { _("User"): {
'Machines': User.objects.annotate( _("Machines"): User.objects.annotate(
num=Count('machine') num=Count('machine')
).order_by('-num')[:10], ).order_by('-num')[:10],
'Facture': User.objects.annotate( _("Invoice"): User.objects.annotate(
num=Count('facture') num=Count('facture')
).order_by('-num')[:10], ).order_by('-num')[:10],
'Bannissement': User.objects.annotate( _("Ban"): User.objects.annotate(
num=Count('ban') num=Count('ban')
).order_by('-num')[:10], ).order_by('-num')[:10],
'Accès gracieux': User.objects.annotate( _("Whitelist"): User.objects.annotate(
num=Count('whitelist') num=Count('whitelist')
).order_by('-num')[:10], ).order_by('-num')[:10],
'Droits': User.objects.annotate( _("Rights"): User.objects.annotate(
num=Count('groups') num=Count('groups')
).order_by('-num')[:10], ).order_by('-num')[:10],
}, },
'Etablissement': { _("School"): {
'Utilisateur': School.objects.annotate( _("User"): School.objects.annotate(
num=Count('user') num=Count('user')
).order_by('-num')[:10], ).order_by('-num')[:10],
}, },
'Moyen de paiement': { _("Payment method"): {
'Utilisateur': Paiement.objects.annotate( _("User"): Paiement.objects.annotate(
num=Count('facture') num=Count('facture')
).order_by('-num')[:10], ).order_by('-num')[:10],
}, },
'Banque': { _("Bank"): {
'Utilisateur': Banque.objects.annotate( _("User"): Banque.objects.annotate(
num=Count('facture') num=Count('facture')
).order_by('-num')[:10], ).order_by('-num')[:10],
}, },
@ -451,8 +459,8 @@ def stats_actions(request):
utilisateurs. utilisateurs.
Affiche le nombre de modifications aggrégées par utilisateurs""" Affiche le nombre de modifications aggrégées par utilisateurs"""
stats = { stats = {
'Utilisateur': { _("User"): {
'Action': User.objects.annotate( _("Action"): User.objects.annotate(
num=Count('revision') num=Count('revision')
).order_by('-num')[:40], ).order_by('-num')[:40],
}, },
@ -489,14 +497,14 @@ def history(request, application, object_name, object_id):
try: try:
instance = model.get_instance(**kwargs) instance = model.get_instance(**kwargs)
except model.DoesNotExist: except model.DoesNotExist:
messages.error(request, _("No entry found.")) messages.error(request, _("Nonexistent entry."))
return redirect(reverse( return redirect(reverse(
'users:profil', 'users:profil',
kwargs={'userid': str(request.user.id)} kwargs={'userid': str(request.user.id)}
)) ))
can, msg = instance.can_view(request.user) can, msg = instance.can_view(request.user)
if not can: if not can:
messages.error(request, msg or _("You cannot acces to this menu")) messages.error(request, msg or _("You don't have the right to access this menu."))
return redirect(reverse( return redirect(reverse(
'users:profil', 'users:profil',
kwargs={'userid': str(request.user.id)} kwargs={'userid': str(request.user.id)}
@ -513,3 +521,4 @@ def history(request, application, object_name, object_id):
're2o/history.html', 're2o/history.html',
{'reversions': reversions, 'object': instance} {'reversions': reversions, 'object': instance}
) )

View file

@ -25,6 +25,7 @@
Here are defined some functions to check acl on the application. Here are defined some functions to check acl on the application.
""" """
from django.utils.translation import ugettext as _
def can_view(user): def can_view(user):
@ -38,4 +39,6 @@ def can_view(user):
viewing is granted and msg is a message (can be None). viewing is granted and msg is a message (can be None).
""" """
can = user.has_module_perms('machines') can = user.has_module_perms('machines')
return can, None if can else "Vous ne pouvez pas voir cette application." return can, None if can else _("You don't have the right to view this"
" application.")

View file

@ -37,7 +37,7 @@ from __future__ import unicode_literals
from django.forms import ModelForm, Form from django.forms import ModelForm, Form
from django import forms from django import forms
from django.utils.translation import ugettext_lazy as _l from django.utils.translation import ugettext_lazy as _
from re2o.field_permissions import FieldPermissionFormMixin from re2o.field_permissions import FieldPermissionFormMixin
from re2o.mixins import FormRevMixin from re2o.mixins import FormRevMixin
@ -75,7 +75,7 @@ class EditMachineForm(FormRevMixin, FieldPermissionFormMixin, ModelForm):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
prefix = kwargs.pop('prefix', self.Meta.model.__name__) prefix = kwargs.pop('prefix', self.Meta.model.__name__)
super(EditMachineForm, self).__init__(*args, prefix=prefix, **kwargs) super(EditMachineForm, self).__init__(*args, prefix=prefix, **kwargs)
self.fields['name'].label = 'Nom de la machine' self.fields['name'].label = _("Machine name")
class NewMachineForm(EditMachineForm): class NewMachineForm(EditMachineForm):
@ -94,12 +94,11 @@ class EditInterfaceForm(FormRevMixin, FieldPermissionFormMixin, ModelForm):
prefix = kwargs.pop('prefix', self.Meta.model.__name__) prefix = kwargs.pop('prefix', self.Meta.model.__name__)
user = kwargs.get('user') user = kwargs.get('user')
super(EditInterfaceForm, self).__init__(*args, prefix=prefix, **kwargs) super(EditInterfaceForm, self).__init__(*args, prefix=prefix, **kwargs)
self.fields['mac_address'].label = 'Adresse mac' self.fields['mac_address'].label = _("MAC address")
self.fields['type'].label = 'Type de machine' self.fields['type'].label = _("Machine type")
self.fields['type'].empty_label = "Séléctionner un type de machine" self.fields['type'].empty_label = _("Select a machine type")
if "ipv4" in self.fields: if "ipv4" in self.fields:
self.fields['ipv4'].empty_label = ("Assignation automatique de " self.fields['ipv4'].empty_label = _("Automatic IPv4 assignment")
"l'ipv4")
self.fields['ipv4'].queryset = IpList.objects.filter( self.fields['ipv4'].queryset = IpList.objects.filter(
interface__isnull=True interface__isnull=True
) )
@ -170,7 +169,7 @@ class DelAliasForm(FormRevMixin, Form):
"""Suppression d'un ou plusieurs objets alias""" """Suppression d'un ou plusieurs objets alias"""
alias = forms.ModelMultipleChoiceField( alias = forms.ModelMultipleChoiceField(
queryset=Domain.objects.all(), queryset=Domain.objects.all(),
label="Alias actuels", label=_("Current aliases"),
widget=forms.CheckboxSelectMultiple widget=forms.CheckboxSelectMultiple
) )
@ -191,15 +190,15 @@ class MachineTypeForm(FormRevMixin, ModelForm):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
prefix = kwargs.pop('prefix', self.Meta.model.__name__) prefix = kwargs.pop('prefix', self.Meta.model.__name__)
super(MachineTypeForm, self).__init__(*args, prefix=prefix, **kwargs) super(MachineTypeForm, self).__init__(*args, prefix=prefix, **kwargs)
self.fields['type'].label = 'Type de machine à ajouter' self.fields['type'].label = _("Machine type to add")
self.fields['ip_type'].label = "Type d'ip relié" self.fields['ip_type'].label = _("Related IP type")
class DelMachineTypeForm(FormRevMixin, Form): class DelMachineTypeForm(FormRevMixin, Form):
"""Suppression d'un ou plusieurs machinetype""" """Suppression d'un ou plusieurs machinetype"""
machinetypes = forms.ModelMultipleChoiceField( machinetypes = forms.ModelMultipleChoiceField(
queryset=MachineType.objects.none(), queryset=MachineType.objects.none(),
label="Types de machines actuelles", label=_("Current machine types"),
widget=forms.CheckboxSelectMultiple widget=forms.CheckboxSelectMultiple
) )
@ -222,7 +221,7 @@ class IpTypeForm(FormRevMixin, ModelForm):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
prefix = kwargs.pop('prefix', self.Meta.model.__name__) prefix = kwargs.pop('prefix', self.Meta.model.__name__)
super(IpTypeForm, self).__init__(*args, prefix=prefix, **kwargs) super(IpTypeForm, self).__init__(*args, prefix=prefix, **kwargs)
self.fields['type'].label = 'Type ip à ajouter' self.fields['type'].label = _("IP type to add")
class EditIpTypeForm(IpTypeForm): class EditIpTypeForm(IpTypeForm):
@ -239,7 +238,7 @@ class DelIpTypeForm(FormRevMixin, Form):
"""Suppression d'un ou plusieurs iptype""" """Suppression d'un ou plusieurs iptype"""
iptypes = forms.ModelMultipleChoiceField( iptypes = forms.ModelMultipleChoiceField(
queryset=IpType.objects.none(), queryset=IpType.objects.none(),
label="Types d'ip actuelles", label=_("Current IP types"),
widget=forms.CheckboxSelectMultiple widget=forms.CheckboxSelectMultiple
) )
@ -261,17 +260,17 @@ class ExtensionForm(FormRevMixin, ModelForm):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
prefix = kwargs.pop('prefix', self.Meta.model.__name__) prefix = kwargs.pop('prefix', self.Meta.model.__name__)
super(ExtensionForm, self).__init__(*args, prefix=prefix, **kwargs) super(ExtensionForm, self).__init__(*args, prefix=prefix, **kwargs)
self.fields['name'].label = 'Extension à ajouter' self.fields['name'].label = _("Extension to add")
self.fields['origin'].label = 'Enregistrement A origin' self.fields['origin'].label = _("A record origin")
self.fields['origin_v6'].label = 'Enregistrement AAAA origin' self.fields['origin_v6'].label = _("AAAA record origin")
self.fields['soa'].label = 'En-tête SOA à utiliser' self.fields['soa'].label = _("SOA record to use")
class DelExtensionForm(FormRevMixin, Form): class DelExtensionForm(FormRevMixin, Form):
"""Suppression d'une ou plusieurs extensions""" """Suppression d'une ou plusieurs extensions"""
extensions = forms.ModelMultipleChoiceField( extensions = forms.ModelMultipleChoiceField(
queryset=Extension.objects.none(), queryset=Extension.objects.none(),
label="Extensions actuelles", label=_("Current extensions"),
widget=forms.CheckboxSelectMultiple widget=forms.CheckboxSelectMultiple
) )
@ -310,7 +309,7 @@ class DelSOAForm(FormRevMixin, Form):
"""Suppression d'un ou plusieurs SOA""" """Suppression d'un ou plusieurs SOA"""
soa = forms.ModelMultipleChoiceField( soa = forms.ModelMultipleChoiceField(
queryset=SOA.objects.none(), queryset=SOA.objects.none(),
label="SOA actuels", label=_("Current SOA records"),
widget=forms.CheckboxSelectMultiple widget=forms.CheckboxSelectMultiple
) )
@ -341,7 +340,7 @@ class DelMxForm(FormRevMixin, Form):
"""Suppression d'un ou plusieurs MX""" """Suppression d'un ou plusieurs MX"""
mx = forms.ModelMultipleChoiceField( mx = forms.ModelMultipleChoiceField(
queryset=Mx.objects.none(), queryset=Mx.objects.none(),
label="MX actuels", label=_("Current MX records"),
widget=forms.CheckboxSelectMultiple widget=forms.CheckboxSelectMultiple
) )
@ -374,7 +373,7 @@ class DelNsForm(FormRevMixin, Form):
"""Suppresion d'un ou plusieurs NS""" """Suppresion d'un ou plusieurs NS"""
ns = forms.ModelMultipleChoiceField( ns = forms.ModelMultipleChoiceField(
queryset=Ns.objects.none(), queryset=Ns.objects.none(),
label="Enregistrements NS actuels", label=_("Current NS records"),
widget=forms.CheckboxSelectMultiple widget=forms.CheckboxSelectMultiple
) )
@ -402,7 +401,7 @@ class DelTxtForm(FormRevMixin, Form):
"""Suppression d'un ou plusieurs TXT""" """Suppression d'un ou plusieurs TXT"""
txt = forms.ModelMultipleChoiceField( txt = forms.ModelMultipleChoiceField(
queryset=Txt.objects.none(), queryset=Txt.objects.none(),
label="Enregistrements Txt actuels", label=_("Current TXT records"),
widget=forms.CheckboxSelectMultiple widget=forms.CheckboxSelectMultiple
) )
@ -430,7 +429,7 @@ class DelDNameForm(FormRevMixin, Form):
"""Delete a set of DNAME entries""" """Delete a set of DNAME entries"""
dnames = forms.ModelMultipleChoiceField( dnames = forms.ModelMultipleChoiceField(
queryset=Txt.objects.none(), queryset=Txt.objects.none(),
label="Existing DNAME entries", label=_("Current DNAME records"),
widget=forms.CheckboxSelectMultiple widget=forms.CheckboxSelectMultiple
) )
@ -458,7 +457,7 @@ class DelSrvForm(FormRevMixin, Form):
"""Suppression d'un ou plusieurs Srv""" """Suppression d'un ou plusieurs Srv"""
srv = forms.ModelMultipleChoiceField( srv = forms.ModelMultipleChoiceField(
queryset=Srv.objects.none(), queryset=Srv.objects.none(),
label="Enregistrements Srv actuels", label=_("Current SRV records"),
widget=forms.CheckboxSelectMultiple widget=forms.CheckboxSelectMultiple
) )
@ -487,7 +486,7 @@ class DelNasForm(FormRevMixin, Form):
"""Suppression d'un ou plusieurs nas""" """Suppression d'un ou plusieurs nas"""
nas = forms.ModelMultipleChoiceField( nas = forms.ModelMultipleChoiceField(
queryset=Nas.objects.none(), queryset=Nas.objects.none(),
label="Enregistrements Nas actuels", label=_("Current NAS devices"),
widget=forms.CheckboxSelectMultiple widget=forms.CheckboxSelectMultiple
) )
@ -519,7 +518,7 @@ class DelRoleForm(FormRevMixin, Form):
"""Deletion of one or several roles.""" """Deletion of one or several roles."""
role = forms.ModelMultipleChoiceField( role = forms.ModelMultipleChoiceField(
queryset=Role.objects.none(), queryset=Role.objects.none(),
label=_l("Current roles"), label=_("Current roles"),
widget=forms.CheckboxSelectMultiple widget=forms.CheckboxSelectMultiple
) )
@ -560,7 +559,7 @@ class DelServiceForm(FormRevMixin, Form):
"""Suppression d'un ou plusieurs service""" """Suppression d'un ou plusieurs service"""
service = forms.ModelMultipleChoiceField( service = forms.ModelMultipleChoiceField(
queryset=Service.objects.none(), queryset=Service.objects.none(),
label="Services actuels", label=_("Current services"),
widget=forms.CheckboxSelectMultiple widget=forms.CheckboxSelectMultiple
) )
@ -588,7 +587,7 @@ class DelVlanForm(FormRevMixin, Form):
"""Suppression d'un ou plusieurs vlans""" """Suppression d'un ou plusieurs vlans"""
vlan = forms.ModelMultipleChoiceField( vlan = forms.ModelMultipleChoiceField(
queryset=Vlan.objects.none(), queryset=Vlan.objects.none(),
label="Vlan actuels", label=_("Current VLANs"),
widget=forms.CheckboxSelectMultiple widget=forms.CheckboxSelectMultiple
) )
@ -646,3 +645,4 @@ class SshFpForm(FormRevMixin, ModelForm):
prefix=prefix, prefix=prefix,
**kwargs **kwargs
) )

Binary file not shown.

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,221 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.7 on 2018-08-15 17:18
from __future__ import unicode_literals
import datetime
import django.core.validators
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('machines', '0093_auto_20180807_1115'),
]
operations = [
migrations.AlterModelOptions(
name='dname',
options={'permissions': (('view_dname', 'Can view a DNAME record object'),), 'verbose_name': 'DNAME record', 'verbose_name_plural': 'DNAME records'},
),
migrations.AlterModelOptions(
name='domain',
options={'permissions': (('view_domain', 'Can view a domain object'),), 'verbose_name': 'domain', 'verbose_name_plural': 'domains'},
),
migrations.AlterModelOptions(
name='extension',
options={'permissions': (('view_extension', 'Can view an extension object'), ('use_all_extension', 'Can use all extensions')), 'verbose_name': 'DNS extension', 'verbose_name_plural': 'DNS extensions'},
),
migrations.AlterModelOptions(
name='interface',
options={'permissions': (('view_interface', 'Can view an interface object'), ('change_interface_machine', 'Can change the owner of an interface')), 'verbose_name': 'interface', 'verbose_name_plural': 'interfaces'},
),
migrations.AlterModelOptions(
name='iplist',
options={'permissions': (('view_iplist', 'Can view an IPv4 addresses list object'),), 'verbose_name': 'IPv4 addresses list', 'verbose_name_plural': 'IPv4 addresses lists'},
),
migrations.AlterModelOptions(
name='iptype',
options={'permissions': (('view_iptype', 'Can view an IP type object'), ('use_all_iptype', 'Can use all IP types')), 'verbose_name': 'IP type', 'verbose_name_plural': 'IP types'},
),
migrations.AlterModelOptions(
name='ipv6list',
options={'permissions': (('view_ipv6list', 'Can view an IPv6 addresses list object'), ('change_ipv6list_slaac_ip', 'Can change the SLAAC value of an IPv6 addresses list')), 'verbose_name': 'IPv6 addresses list', 'verbose_name_plural': 'IPv6 addresses lists'},
),
migrations.AlterModelOptions(
name='machine',
options={'permissions': (('view_machine', 'Can view a machine object'), ('change_machine_user', 'Can change the user of a machine')), 'verbose_name': 'machine', 'verbose_name_plural': 'machines'},
),
migrations.AlterModelOptions(
name='machinetype',
options={'permissions': (('view_machinetype', 'Can view a machine type object'), ('use_all_machinetype', 'Can use all machine types')), 'verbose_name': 'machine type', 'verbose_name_plural': 'machine types'},
),
migrations.AlterModelOptions(
name='mx',
options={'permissions': (('view_mx', 'Can view an MX record object'),), 'verbose_name': 'MX record', 'verbose_name_plural': 'MX records'},
),
migrations.AlterModelOptions(
name='nas',
options={'permissions': (('view_nas', 'Can view a NAS device object'),), 'verbose_name': 'NAS device', 'verbose_name_plural': 'NAS devices'},
),
migrations.AlterModelOptions(
name='ns',
options={'permissions': (('view_ns', 'Can view an NS record object'),), 'verbose_name': 'NS record', 'verbose_name_plural': 'NS records'},
),
migrations.AlterModelOptions(
name='ouvertureport',
options={'verbose_name': 'ports openings'},
),
migrations.AlterModelOptions(
name='ouvertureportlist',
options={'permissions': (('view_ouvertureportlist', 'Can view a ports opening list object'),), 'verbose_name': 'ports opening list', 'verbose_name_plural': 'ports opening lists'},
),
migrations.AlterModelOptions(
name='role',
options={'permissions': (('view_role', 'Can view a role object'),), 'verbose_name': 'server role', 'verbose_name_plural': 'server roles'},
),
migrations.AlterModelOptions(
name='service',
options={'permissions': (('view_service', 'Can view a service object'),), 'verbose_name': 'service to generate (DHCP, DNS, ...)', 'verbose_name_plural': 'services to generate (DHCP, DNS, ...)'},
),
migrations.AlterModelOptions(
name='service_link',
options={'permissions': (('view_service_link', 'Can view a service server link object'),), 'verbose_name': 'link between service and server', 'verbose_name_plural': 'links between service and server'},
),
migrations.AlterModelOptions(
name='soa',
options={'permissions': (('view_soa', 'Can view an SOA record object'),), 'verbose_name': 'SOA record', 'verbose_name_plural': 'SOA records'},
),
migrations.AlterModelOptions(
name='srv',
options={'permissions': (('view_srv', 'Can view an SRV record object'),), 'verbose_name': 'SRV record', 'verbose_name_plural': 'SRV records'},
),
migrations.AlterModelOptions(
name='sshfp',
options={'permissions': (('view_sshfp', 'Can view an SSHFP record object'),), 'verbose_name': 'SSHFP record', 'verbose_name_plural': 'SSHFP records'},
),
migrations.AlterModelOptions(
name='txt',
options={'permissions': (('view_txt', 'Can view a TXT record object'),), 'verbose_name': 'TXT record', 'verbose_name_plural': 'TXT records'},
),
migrations.AlterModelOptions(
name='vlan',
options={'permissions': (('view_vlan', 'Can view a VLAN object'),), 'verbose_name': 'VLAN', 'verbose_name_plural': 'VLANs'},
),
migrations.AlterField(
model_name='domain',
name='name',
field=models.CharField(help_text='Mandatory and unique, must not contain dots.', max_length=255),
),
migrations.AlterField(
model_name='extension',
name='name',
field=models.CharField(help_text='Zone name, must begin with a dot (.example.org)', max_length=255, unique=True),
),
migrations.AlterField(
model_name='extension',
name='origin',
field=models.ForeignKey(blank=True, help_text='A record associated with the zone', null=True, on_delete=django.db.models.deletion.PROTECT, to='machines.IpList'),
),
migrations.AlterField(
model_name='extension',
name='origin_v6',
field=models.GenericIPAddressField(blank=True, help_text='AAAA record associated with the zone', null=True, protocol='IPv6'),
),
migrations.AlterField(
model_name='iptype',
name='domaine_ip_netmask',
field=models.IntegerField(default=24, help_text="Netmask for the domain's IPv4 range", validators=[django.core.validators.MaxValueValidator(31), django.core.validators.MinValueValidator(8)]),
),
migrations.AlterField(
model_name='iptype',
name='domaine_ip_network',
field=models.GenericIPAddressField(blank=True, help_text="Network containing the domain's IPv4 range (optional)", null=True, protocol='IPv4'),
),
migrations.AlterField(
model_name='iptype',
name='reverse_v4',
field=models.BooleanField(default=False, help_text='Enable reverse DNS for IPv4'),
),
migrations.AlterField(
model_name='iptype',
name='reverse_v6',
field=models.BooleanField(default=False, help_text='Enable reverse DNS for IPv6'),
),
migrations.AlterField(
model_name='machine',
name='name',
field=models.CharField(blank=True, help_text='Optional', max_length=255, null=True),
),
migrations.AlterField(
model_name='ouvertureportlist',
name='name',
field=models.CharField(help_text='Name of the ports configuration', max_length=255),
),
migrations.AlterField(
model_name='role',
name='specific_role',
field=models.CharField(blank=True, choices=[('dhcp-server', 'DHCP server'), ('switch-conf-server', 'Switches configuration server'), ('dns-recursif-server', 'Recursive DNS server'), ('ntp-server', 'NTP server'), ('radius-server', 'RADIUS 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')], max_length=32, null=True),
),
migrations.AlterField(
model_name='service',
name='min_time_regen',
field=models.DurationField(default=datetime.timedelta(0, 60), help_text='Minimal time before regeneration of the service.'),
),
migrations.AlterField(
model_name='service',
name='regular_time_regen',
field=models.DurationField(default=datetime.timedelta(0, 3600), help_text='Maximal time before regeneration of the service.'),
),
migrations.AlterField(
model_name='soa',
name='expire',
field=models.PositiveIntegerField(default=3600000, help_text='Seconds before the secondary DNS stop answering requests in case of primary DNS timeout'),
),
migrations.AlterField(
model_name='soa',
name='mail',
field=models.EmailField(help_text='Contact email address for the zone', max_length=254),
),
migrations.AlterField(
model_name='soa',
name='refresh',
field=models.PositiveIntegerField(default=86400, help_text='Seconds before the secondary DNS have to ask the primary DNS serial to detect a modification'),
),
migrations.AlterField(
model_name='soa',
name='retry',
field=models.PositiveIntegerField(default=7200, help_text='Seconds before the secondary DNS ask the serial again in case of a primary DNS timeout'),
),
migrations.AlterField(
model_name='soa',
name='ttl',
field=models.PositiveIntegerField(default=172800, help_text='Time to Live'),
),
migrations.AlterField(
model_name='srv',
name='port',
field=models.PositiveIntegerField(help_text='TCP/UDP port', validators=[django.core.validators.MaxValueValidator(65535)]),
),
migrations.AlterField(
model_name='srv',
name='priority',
field=models.PositiveIntegerField(default=0, help_text='Priority of the target server (positive integer value, the lower it is, the more the server will be used if available)', validators=[django.core.validators.MaxValueValidator(65535)]),
),
migrations.AlterField(
model_name='srv',
name='target',
field=models.ForeignKey(help_text='Target server', on_delete=django.db.models.deletion.PROTECT, to='machines.Domain'),
),
migrations.AlterField(
model_name='srv',
name='ttl',
field=models.PositiveIntegerField(default=172800, help_text='Time to Live'),
),
migrations.AlterField(
model_name='srv',
name='weight',
field=models.PositiveIntegerField(default=0, help_text='Relative weight for records with the same priority (integer value between 0 and 65535)', validators=[django.core.validators.MaxValueValidator(65535)]),
),
]

File diff suppressed because it is too large Load diff

View file

@ -23,25 +23,26 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% endcomment %} {% endcomment %}
{% load acl %} {% load acl %}
{% load i18n %}
{% load logs_extra %} {% load logs_extra %}
<table class="table table-striped"> <table class="table table-striped">
<thead> <thead>
<tr> <tr>
<th>Alias</th> <th>{% trans "Aliases" %}</th>
<th></th> <th></th>
</tr> </tr>
</thead> </thead>
{% for alias in alias_list %} {% for alias in alias_list %}
<tr> <tr>
<td>{{ alias }}</td> <td>{{ alias }}</td>
<td class="text-right"> <td class="text-right">
{% can_edit alias %} {% can_edit alias %}
{% include 'buttons/edit.html' with href='machines:edit-alias' id=alias.id %} {% include 'buttons/edit.html' with href='machines:edit-alias' id=alias.id %}
{% acl_end %} {% acl_end %}
{% history_button alias %} {% history_button alias %}
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>

View file

@ -22,16 +22,17 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% load acl %} {% load acl %}
{% load logs_extra %} {% load logs_extra %}
{% load i18n %}
<table class="table table-striped"> <table class="table table-striped">
<thead> <thead>
<tr> <tr>
<th>Target zone</th> <th>{% trans "Target zone" %}</th>
<th>Record</th> <th>{% trans "Record" %}</th>
<th></th> <th></th>
</tr> </tr>
</thead> </thead>
{% for dname in dname_list %} {% for dname in dname_list %}
<tr> <tr>
<td>{{ dname.zone }}</td> <td>{{ dname.zone }}</td>
<td>{{ dname.dns_entry }}</td> <td>{{ dname.dns_entry }}</td>
@ -39,10 +40,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% can_edit dname %} {% can_edit dname %}
{% include 'buttons/edit.html' with href='machines:edit-dname' id=dname.id %} {% include 'buttons/edit.html' with href='machines:edit-dname' id=dname.id %}
{% acl_end %} {% acl_end %}
{% history_button dname %} {% history_button dname %}
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>

View file

@ -25,17 +25,18 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% load acl %} {% load acl %}
{% load logs_extra %} {% load logs_extra %}
{% load design %} {% load design %}
{% load i18n %}
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped"> <table class="table table-striped">
<thead> <thead>
<tr> <tr>
<th>Extension</th> <th>{% trans "Extension" %}</th>
<th>Droit infra pour utiliser ?</th> <th>{% trans "'infra' right required" %}</th>
<th>Enregistrement SOA</th> <th>{% trans "SOA record" %}</th>
<th>Enregistrement A origin</th> <th>{% trans "A record origin" %}</th>
{% if ipv6_enabled %} {% if ipv6_enabled %}
<th>Enregistrement AAAA origin</th> <th>{% trans "AAAA record origin" %}</th>
{% endif %} {% endif %}
<th></th> <th></th>
</tr> </tr>
@ -44,7 +45,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
<tr> <tr>
<td>{{ extension.name }}</td> <td>{{ extension.name }}</td>
<td>{{ extension.need_infra|tick }}</td> <td>{{ extension.need_infra|tick }}</td>
<td>{{ extension.soa}}</td> <td>{{ extension.soa }}</td>
<td>{{ extension.origin }}</td> <td>{{ extension.origin }}</td>
{% if ipv6_enabled %} {% if ipv6_enabled %}
<td>{{ extension.origin_v6 }}</td> <td>{{ extension.origin_v6 }}</td>
@ -59,3 +60,4 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% endfor %} {% endfor %}
</table> </table>
</div> </div>

View file

@ -26,18 +26,20 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% load acl %} {% load acl %}
{% load logs_extra %} {% load logs_extra %}
{% load i18n %}
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped"> <table class="table table-striped">
<thead> <thead>
<tr> <tr>
<th>Type d'ip</th> <th>{% trans "IP type" %}</th>
<th>Extension</th> <th>{% trans "Extension" %}</th>
<th>Nécessite l'autorisation infra</th> <th>{% trans "'infra' right required" %}</th>
<th>Plage ipv4</th> <th>{% trans "IPv4 range" %}</th>
<th>Préfixe v6</th> <th>{% trans "v6 prefix" %}</th>
<th>DNSSEC reverse v4/v6</th> <th>{% trans "DNSSEC reverse v4/v6" %}</th>
<th>Sur vlan</th> <th>{% trans "On VLAN(s)" %}</th>
<th>Ouverture ports par défault</th> <th>{% trans "Default ports opening" %}</th>
<th></th> <th></th>
</tr> </tr>
</thead> </thead>
@ -61,3 +63,4 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% endfor %} {% endfor %}
</table> </table>
</div> </div>

View file

@ -24,29 +24,30 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% load acl %} {% load acl %}
{% load logs_extra %} {% load logs_extra %}
{% load i18n %}
<table class="table table-striped"> <table class="table table-striped">
<thead> <thead>
<tr> <tr>
<th>Ipv6</th> <th>{% trans "IPv6 addresses" %}</th>
<th>Slaac</th> <th>{% trans "SLAAC" %}</th>
<th></th> <th></th>
</tr> </tr>
</thead> </thead>
{% for ipv6 in ipv6_list %} {% for ipv6 in ipv6_list %}
<tr> <tr>
<td>{{ ipv6.ipv6 }}</td> <td>{{ ipv6.ipv6 }}</td>
<td>{{ ipv6.slaac_ip }}</td> <td>{{ ipv6.slaac_ip }}</td>
<td class="text-right"> <td class="text-right">
{% can_edit ipv6 %} {% can_edit ipv6 %}
{% include 'buttons/edit.html' with href='machines:edit-ipv6list' id=ipv6.id %} {% include 'buttons/edit.html' with href='machines:edit-ipv6list' id=ipv6.id %}
{% acl_end %} {% acl_end %}
{% can_delete ipv6 %} {% can_delete ipv6 %}
{% include 'buttons/suppr.html' with href='machines:del-ipv6list' id=ipv6.id %} {% include 'buttons/suppr.html' with href='machines:del-ipv6list' id=ipv6.id %}
{% acl_end %} {% acl_end %}
{% history_button ipv6 %} {% history_button ipv6 %}
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>

View file

@ -24,6 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% load acl %} {% load acl %}
{% load logs_extra %} {% load logs_extra %}
{% load i18n %}
<div class="table-responsive"> <div class="table-responsive">
{% if machines_list.paginator %} {% if machines_list.paginator %}
@ -39,23 +40,27 @@ with this program; if not, write to the Free Software Foundation, Inc.,
<col width="144px"> <col width="144px">
</colgroup> </colgroup>
<thead> <thead>
<th>{% include "buttons/sort.html" with prefix='machine' col='name' text='Nom DNS' %}</th> {% trans "DNS name" as tr_dns_name %}
<th>Type</th> <th>{% include "buttons/sort.html" with prefix='machine' col='name' text=tr_dns_name %}</th>
<th>MAC</th> <th>{% trans "Type" %}</th>
<th>IP</th> <th>{% trans "MAC address" %}</th>
<th>Actions</th> <th>{% trans "IP address" %}</th>
<th>{% trans "Actions" %}</th>
<tbody> <tbody>
{% for machine in machines_list %} {% for machine in machines_list %}
<tr class="info"> <tr class="info">
<td colspan="4"> <td colspan="4">
<b>{{ machine.name|default:'<i>Pas de nom</i>' }}</b> <i class="fa-angle-right"></i> {% trans "No name" as tr_no_name %}
<a href="{% url 'users:profil' userid=machine.user.id %}" title="Voir le profil"> {% trans "View the profile" as tr_view_the_profile %}
<b>{{ machine.name|default:'<i>tr_no_name</i>' }}</b> <i class="fa-angle-right"></i>
<a href="{% url 'users:profil' userid=machine.user.id %}" title=tr_view_the_profile>
<i class="fa fa-user"></i> {{ machine.user }} <i class="fa fa-user"></i> {{ machine.user }}
</a> </a>
</td> </td>
<td class="text-right"> <td class="text-right">
{% can_create Interface machine.id %} {% can_create Interface machine.id %}
{% include 'buttons/add.html' with href='machines:new-interface' id=machine.id desc='Ajouter une interface' %} {% trans "Create an interface" as tr_create_an_interface %}
{% include 'buttons/add.html' with href='machines:new-interface' id=machine.id desc=tr_create_an_interface %}
{% acl_end %} {% acl_end %}
{% history_button machine %} {% history_button machine %}
{% can_delete machine %} {% can_delete machine %}
@ -68,8 +73,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
<td> <td>
{% if interface.domain.related_domain.all %} {% if interface.domain.related_domain.all %}
{{ interface.domain }} {{ interface.domain }}
<button class="btn btn-default btn-xs" type="button" data-toggle="collapse" data-target="#collapseDomain_{{interface.id}}" aria-expanded="true" aria-controls="collapseDomain_{{interface.id}}"> <button class="btn btn-default btn-xs" type="button" data-toggle="collapse" data-target="#collapseDomain_{{ interface.id }}" aria-expanded="true" aria-controls="collapseDomain_{{ interface.id }}">
Afficher les alias {% trans "Display the aliases" %}
</button> </button>
{% else %} {% else %}
{{ interface.domain }} {{ interface.domain }}
@ -77,7 +82,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
</td> </td>
<td> <td>
{{ interface.type }} {{ interface.type }}
</td> </td>
<td> <td>
{{ interface.mac_address }} {{ interface.mac_address }}
</td> </td>
@ -86,8 +91,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
<br> <br>
{% if ipv6_enabled and interface.ipv6 != 'None'%} {% if ipv6_enabled and interface.ipv6 != 'None'%}
<b>IPv6</b> <b>IPv6</b>
<button class="btn btn-default btn-xs" type="button" data-toggle="collapse" data-target="#collapseIpv6_{{interface.id}}" aria-expanded="true" aria-controls="collapseIpv6_{{interface.id}}"> <button class="btn btn-default btn-xs" type="button" data-toggle="collapse" data-target="#collapseIpv6_{{ interface.id }}" aria-expanded="true" aria-controls="collapseIpv6_{{ interface.id }}">
Afficher l'IPV6 {% trans "Display the IPv6 address" %}
</button> </button>
{% endif %} {% endif %}
</td> </td>
@ -97,39 +102,44 @@ with this program; if not, write to the Free Software Foundation, Inc.,
<button class="btn btn-primary btn-sm dropdown-toggle" type="button" id="editioninterface" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true"> <button class="btn btn-primary btn-sm dropdown-toggle" type="button" id="editioninterface" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
<i class="fa fa-edit"></i> <span class="caret"></span> <i class="fa fa-edit"></i> <span class="caret"></span>
</button> </button>
<ul class="dropdown-menu pull-right" aria-labelledby="editioninterface"> <ul class="dropdown-menu" aria-labelledby="editioninterface">
{% can_edit interface %} {% can_edit interface %}
<li> <li>
<a href="{% url 'machines:edit-interface' interface.id %}"> <a href="{% url 'machines:edit-interface' interface.id %}">
<i class="fa fa-edit"></i> Editer <i class="fa fa-edit"></i>
{% trans " Edit"%}
</a> </a>
</li> </li>
{% acl_end %} {% acl_end %}
{% can_create Domain interface.id %} {% can_create Domain interface.id %}
<li> <li>
<a href="{% url 'machines:index-alias' interface.id %}"> <a href="{% url 'machines:index-alias' interface.id %}">
<i class="fa fa-edit"></i> Gerer les alias <i class="fa fa-edit"></i>
{% trans " Manage the aliases" %}
</a> </a>
</li> </li>
{% acl_end %} {% acl_end %}
{% can_create Ipv6List interface.id %} {% can_create Ipv6List interface.id %}
<li> <li>
<a href="{% url 'machines:index-ipv6' interface.id %}"> <a href="{% url 'machines:index-ipv6' interface.id %}">
<i class="fa fa-edit"></i> Gerer les ipv6 <i class="fa fa-edit"></i>
{% trans " Manage the IPv6 addresses" %}
</a> </a>
</li> </li>
{% acl_end %} {% acl_end %}
{% can_create SshFp interface.machine.id %} {% can_create SshFp interface.machine.id %}
<li> <li>
<a href="{% url 'machines:index-sshfp' interface.machine.id %}"> <a href="{% url 'machines:index-sshfp' interface.machine.id %}">
<i class="fa fa-edit"></i> Manage the SSH fingerprints <i class="fa fa-edit"></i>
{% trans " Manage the SSH fingerprints" %}
</a> </a>
</li> </li>
{% acl_end %} {% acl_end %}
{% can_create OuverturePortList %} {% can_create OuverturePortList %}
<li> <li>
<a href="{% url 'machines:port-config' interface.id%}"> <a href="{% url 'machines:port-config' interface.id%}">
<i class="fa fa-edit"></i> Gerer la configuration des ports <i class="fa fa-edit"></i>
{% trans " Manage the ports configuration" %}
</a> </a>
</li> </li>
{% acl_end %} {% acl_end %}
@ -142,61 +152,57 @@ with this program; if not, write to the Free Software Foundation, Inc.,
</div> </div>
</td> </td>
</tr> </tr>
{% if ipv6_enabled and interface.ipv6 != 'None'%} {% if ipv6_enabled and interface.ipv6 != 'None'%}
<tr> <tr>
<td colspan=5 style="border-top: none; padding: 1px;"> <td colspan=5 style="border-top: none; padding: 1px;">
<div class="collapse in" id="collapseIpv6_{{interface.id}}"> <div class="collapse in" id="collapseIpv6_{{interface.id}}">
<ul class="list-group" style="margin-bottom: 0px;"> <ul class="list-group" style="margin-bottom: 0px;">
{% for ipv6 in interface.ipv6.all %} {% for ipv6 in interface.ipv6.all %}
<li class="list-group-item col-xs-6 col-sm-6 col-md-6" style="border: none;"> <li class="list-group-item col-xs-6 col-sm-6 col-md-6" style="border: none;">
{{ipv6}} {{ ipv6 }}
</li> </li>
{% endfor %} {% endfor %}
</ul> </ul>
</div> </div>
</td> </td>
<tr> </tr>
{% endif %} {% endif %}
{% if interface.domain.related_domain.all %}
<tr>
{% if interface.domain.related_domain.all %} <td colspan=5 style="border-top: none; padding: 1px;">
<tr> <div class="collapse in" id="collapseDomain_{{interface.id}}">
<td colspan=5 style="border-top: none; padding: 1px;"> <ul class="list-group" style="margin-bottom: 0px;">
<div class="collapse in" id="collapseDomain_{{interface.id}}"> {% for al in interface.domain.related_domain.all %}
<ul class="list-group" style="margin-bottom: 0px;"> <li class="list-group-item col-xs-6 col-sm-4 col-md-3" style="border: none;">
{% for al in interface.domain.related_domain.all %} <a href="http://{{ al }}">
<li class="list-group-item col-xs-6 col-sm-4 col-md-3" style="border: none;"> {{ al }}
<a href="http://{{ al }}"> <i class="fa fa-share"></i>
{{ al }} </a>
<i class="fa fa-share"></i> </li>
</a> {% endfor %}
</li> </ul>
{% endfor %} </div>
</ul> </td>
</div> </tr>
</td> {% endif %}
<tr> {% endfor %}
{% endif %} <tr>
{% endfor %} <td colspan="8"></td>
<tr> </tr>
<td colspan="8"></td> {% endfor %}
</tr>
{% endfor %}
</tbody> </tbody>
</thead>
</table> </table>
<script> <script>
$("#machines_table").ready( function() { $("#machines_table").ready( function() {
var alias_div = [{% for machine in machines_list %}{% for interface in machine.interface_set.all %}{% if interface.domain.related_domain.all %}$("#collapseDomain_{{interface.id}}"), {% endif %}{% endfor %}{% endfor %}]; var alias_div = [{% for machine in machines_list %}{% for interface in machine.interface_set.all %}{% if interface.domain.related_domain.all %}$("#collapseDomain_{{ interface.id }}"), {% endif %}{% endfor %}{% endfor %}];
for (var i=0 ; i<alias_div.length ; i++) { for (var i=0 ; i<alias_div.length ; i++) {
alias_div[i].collapse('hide'); alias_div[i].collapse('hide');
} }
} ); } );
$("#machines_table").ready( function() { $("#machines_table").ready( function() {
var ipv6_div = [{% for machine in machines_list %}{% for interface in machine.interface_set.all %}{% if interface.ipv6.all %}$("#collapseIpv6_{{interface.id}}"), {% endif %}{% endfor %}{% endfor %}]; var ipv6_div = [{% for machine in machines_list %}{% for interface in machine.interface_set.all %}{% if interface.ipv6.all %}$("#collapseIpv6_{{ interface.id }}"), {% endif %}{% endfor %}{% endfor %}];
for (var i=0 ; i<ipv6_div.length ; i++) { for (var i=0 ; i<ipv6_div.length ; i++) {
ipv6_div[i].collapse('hide'); ipv6_div[i].collapse('hide');
} }
@ -207,3 +213,4 @@ $("#machines_table").ready( function() {
{% include "pagination.html" with list=machines_list %} {% include "pagination.html" with list=machines_list %}
{% endif %} {% endif %}
</div> </div>

View file

@ -24,26 +24,27 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% load acl %} {% load acl %}
{% load logs_extra %} {% load logs_extra %}
{% load i18n %}
<table class="table table-striped"> <table class="table table-striped">
<thead> <thead>
<tr> <tr>
<th>Type de machine</th> <th>{% trans "Machine type" %}</th>
<th>Type d'ip correspondant</th> <th>{% trans "Matching IP type" %}</th>
<th></th> <th></th>
</tr> </tr>
</thead> </thead>
{% for type in machinetype_list %} {% for type in machinetype_list %}
<tr> <tr>
<td>{{ type.type }}</td> <td>{{ type.type }}</td>
<td>{{ type.ip_type }}</td> <td>{{ type.ip_type }}</td>
<td class="text-right"> <td class="text-right">
{% can_edit type %} {% can_edit type %}
{% include 'buttons/edit.html' with href='machines:edit-machinetype' id=type.id %} {% include 'buttons/edit.html' with href='machines:edit-machinetype' id=type.id %}
{% acl_end %} {% acl_end %}
{% history_button type %} {% history_button type %}
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>

View file

@ -24,30 +24,29 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% load acl %} {% load acl %}
{% load logs_extra %} {% load logs_extra %}
{% load i18n %}
<table class="table table-striped"> <table class="table table-striped">
<thead> <thead>
<tr> <tr>
<th>Zone concernée</th> <th>{% trans "Concerned zone" %}</th>
<th>Priorité</th> <th>{% trans "Priority" %}</th>
<th>Enregistrement</th> <th>{% trans "Record" %}</th>
<th></th>
<th></th> <th></th>
</tr> </tr>
</thead> </thead>
{% for mx in mx_list %} {% for mx in mx_list %}
<tr> <tr>
<td>{{ mx.zone }}</td> <td>{{ mx.zone }}</td>
<td>{{ mx.priority }}</td> <td>{{ mx.priority }}</td>
<td>{{ mx.name }}</td> <td>{{ mx.name }}</td>
<td class="text-right"> <td class="text-right">
{% can_edit mx %} {% can_edit mx %}
{% include 'buttons/edit.html' with href='machines:edit-mx' id=mx.id %} {% include 'buttons/edit.html' with href='machines:edit-mx' id=mx.id %}
{% acl_end %} {% acl_end %}
{% history_button mx %} {% history_button mx %}
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>

View file

@ -25,32 +25,33 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% load acl %} {% load acl %}
{% load logs_extra %} {% load logs_extra %}
{% load design %} {% load design %}
{% load i18n %}
<table class="table table-striped"> <table class="table table-striped">
<thead> <thead>
<tr> <tr>
<th>Nom</th> <th>{% trans "Name" %}</th>
<th>Type du nas</th> <th>{% trans "NAS device type" %}</th>
<th>Type de machine reliées au nas</th> <th>{% trans "Machine type linked to the NAS device" %}</th>
<th>Mode d'accès</th> <th>{% trans "Access mode" %}</th>
<th>Autocapture mac</th> <th>{% trans "MAC address auto capture" %}</th>
<th></th> <th></th>
</tr> </tr>
</thead> </thead>
{% for nas in nas_list %} {% for nas in nas_list %}
<tr> <tr>
<td>{{ nas.name }}</td> <td>{{ nas.name }}</td>
<td>{{ nas.nas_type }}</td> <td>{{ nas.nas_type }}</td>
<td>{{ nas.machine_type }}</td> <td>{{ nas.machine_type }}</td>
<td>{{ nas.port_access_mode }}</td> <td>{{ nas.port_access_mode }}</td>
<td>{{ nas.autocapture_mac|tick }}</td> <td>{{ nas.autocapture_mac|tick }}</td>
<td class="text-right"> <td class="text-right">
{% can_edit nas %} {% can_edit nas %}
{% include 'buttons/edit.html' with href='machines:edit-nas' id=nas.id %} {% include 'buttons/edit.html' with href='machines:edit-nas' id=nas.id %}
{% acl_end %} {% acl_end %}
{% history_button nas %} {% history_button nas %}
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>

View file

@ -24,28 +24,27 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% load acl %} {% load acl %}
{% load logs_extra %} {% load logs_extra %}
{% load i18n %}
<table class="table table-striped"> <table class="table table-striped">
<thead> <thead>
<tr> <tr>
<th>Zone concernée</th> <th>{% trans "Concerned zone" %}</th>
<th>Interface autoritaire de la zone</th> <th>{% trans "Authoritarian interface for the concerned zone" %}</th>
<th></th>
<th></th> <th></th>
</tr> </tr>
</thead> </thead>
{% for ns in ns_list %} {% for ns in ns_list %}
<tr> <tr>
<td>{{ ns.zone }}</td> <td>{{ ns.zone }}</td>
<td>{{ ns.ns }}</td> <td>{{ ns.ns }}</td>
<td class="text-right"> <td class="text-right">
{% can_edit ns %} {% can_edit ns %}
{% include 'buttons/edit.html' with href='machines:edit-ns' id=ns.id %} {% include 'buttons/edit.html' with href='machines:edit-ns' id=ns.id %}
{% acl_end %} {% acl_end %}
{% history_button ns %} {% history_button ns %}
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>

View file

@ -38,14 +38,14 @@ with this program; if not, write to the Free Software Foundation, Inc.,
</tr> </tr>
</thead> </thead>
{% for role in role_list %} {% for role in role_list %}
<tr> <tr>
<td>{{ role.role_type }}</td> <td>{{ role.role_type }}</td>
<td>{{ role.specific_role }}</td> <td>{{ role.specific_role }}</td>
<td>{% for serv in role.servers.all %}{{ serv }}, {% endfor %}</td> <td>{% for serv in role.servers.all %}{{ serv }}, {% endfor %}</td>
<td class="text-right"> <td class="text-right">
{% can_edit role %} {% can_edit role %}
{% include 'buttons/edit.html' with href='machines:edit-role' id=role.id %} {% include 'buttons/edit.html' with href='machines:edit-role' id=role.id %}
{% acl_end %} {% acl_end %}
{% history_button role %} {% history_button role %}
</td> </td>
</tr> </tr>

View file

@ -23,27 +23,28 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% endcomment %} {% endcomment %}
{% load design %} {% load design %}
{% load i18n %}
<table class="table table-striped"> <table class="table table-striped">
<thead> <thead>
<tr> <tr>
<th>Nom du service</th> <th>{% trans "Service name" %}</th>
<th>Serveur</th> <th>{% trans "Server" %}</th>
<th>Dernière régénération</th> <th>{% trans "Last regeneration" %}</th>
<th>Régénération nécessaire</th> <th>{% trans "Regeneration required" %}</th>
<th>Régénération activée</th> <th>{% trans "Regeneration activated" %}</th>
</tr> </tr>
</thead> </thead>
{% for server in servers_list %} {% for server in servers_list %}
<tr> <tr>
<td>{{ server.service }}</td> <td>{{ server.service }}</td>
<td>{{ server.server }}</td> <td>{{ server.server }}</td>
<td>{{ server.last_regen }}</td> <td>{{ server.last_regen }}</td>
<td>{{ server.asked_regen| tick }}</td> <td>{{ server.asked_regen|tick }}</td>
<td>{{ server.need_regen | tick }}</td> <td>{{ server.need_regen|tick }}</td>
<td class="text-right"> <td class="text-right">
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>

View file

@ -24,32 +24,33 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% load acl %} {% load acl %}
{% load logs_extra %} {% load logs_extra %}
{% load i18n %}
<table class="table table-striped"> <table class="table table-striped">
<thead> <thead>
<tr> <tr>
<th>Nom du service</th> <th>{% trans "Service name" %}</th>
<th>Temps minimum avant nouvelle régénération</th> <th>{% trans "Minimal time before regeneration" %}</th>
<th>Temps avant nouvelle génération obligatoire (max)</th> <th>{% trans "Maximal time before regeneration" %}</th>
<th>Serveurs inclus</th> <th>{% trans "Included servers" %}</th>
<th>Demander la regeneration</th> <th>{% trans "Ask for regeneration" %}</th>
<th></th> <th></th>
</tr> </tr>
</thead> </thead>
{% for service in service_list %} {% for service in service_list %}
<tr> <tr>
<td>{{ service.service_type }}</td> <td>{{ service.service_type }}</td>
<td>{{ service.min_time_regen }}</td> <td>{{ service.min_time_regen }}</td>
<td>{{ service.regular_time_regen }}</td> <td>{{ service.regular_time_regen }}</td>
<td>{% for serv in service.servers.all %}{{ serv }}, {% endfor %}</td> <td>{% for serv in service.servers.all %}{{ serv }}, {% endfor %}</td>
<td><a role="button" class="btn btn-danger" href="{% url 'machines:regen-service' service.id %}"><i class="fas fa-sync"></i></a></td> <td><a role="button" class="btn btn-danger" href="{% url 'machines:regen-service' service.id %}"><i class="fa fa-sync"></i></a></td>
<td class="text-right"> <td class="text-right">
{% can_edit service %} {% can_edit service %}
{% include 'buttons/edit.html' with href='machines:edit-service' id=service.id %} {% include 'buttons/edit.html' with href='machines:edit-service' id=service.id %}
{% acl_end %} {% acl_end %}
{% history_button service %} {% history_button service %}
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>

View file

@ -24,36 +24,35 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% load acl %} {% load acl %}
{% load logs_extra %} {% load logs_extra %}
{% load i18n %}
<table class="table table-striped"> <table class="table table-striped">
<thead> <thead>
<tr> <tr>
<th>Nom</th> <th>{% trans "Name" %}</th>
<th>Mail</th> <th>{% trans "Mail" %}</th>
<th>Refresh</th> <th>{% trans "Refresh" %}</th>
<th>Retry</th> <th>{% trans "Retry" %}</th>
<th>Expire</th> <th>{% trans "Expire" %}</th>
<th>TTL</th> <th>{% trans "TTL" %}</th>
<th></th>
<th></th> <th></th>
</tr> </tr>
</thead> </thead>
{% for soa in soa_list %} {% for soa in soa_list %}
<tr> <tr>
<td>{{ soa.name }}</td> <td>{{ soa.name }}</td>
<td>{{ soa.mail }}</td> <td>{{ soa.mail }}</td>
<td>{{ soa.refresh }}</td> <td>{{ soa.refresh }}</td>
<td>{{ soa.retry }}</td> <td>{{ soa.retry }}</td>
<td>{{ soa.expire }}</td> <td>{{ soa.expire }}</td>
<td>{{ soa.ttl }}</td> <td>{{ soa.ttl }}</td>
<td class="text-right"> <td class="text-right">
{% can_edit soa %} {% can_edit soa %}
{% include 'buttons/edit.html' with href='machines:edit-soa' id=soa.id %} {% include 'buttons/edit.html' with href='machines:edit-soa' id=soa.id %}
{% acl_end %} {% acl_end %}
{% history_button soa %} {% history_button soa %}
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>

View file

@ -24,40 +24,39 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% load acl %} {% load acl %}
{% load logs_extra %} {% load logs_extra %}
{% load i18n %}
<table class="table table-striped"> <table class="table table-striped">
<thead> <thead>
<tr> <tr>
<th>Service</th> <th>{% trans "Service" %}</th>
<th>Protocole</th> <th>{% trans "Protocol" %}</th>
<th>Extension</th> <th>{% trans "Extension" %}</th>
<th>TTL</th> <th>{% trans "TTL" %}</th>
<th>Priorité</th> <th>{% trans "Priority" %}</th>
<th>Poids</th> <th>{% trans "Weight" %}</th>
<th>Port</th> <th>{% trans "Port" %}</th>
<th>Cible</th> <th>{% trans "Target" %}</th>
<th></th>
<th></th> <th></th>
</tr> </tr>
</thead> </thead>
{% for srv in srv_list %} {% for srv in srv_list %}
<tr> <tr>
<td>{{ srv.service }}</td> <td>{{ srv.service }}</td>
<td>{{ srv.protocole }}</td> <td>{{ srv.protocole }}</td>
<td>{{ srv.extension }}</td> <td>{{ srv.extension }}</td>
<td>{{ srv.ttl }}</td> <td>{{ srv.ttl }}</td>
<td>{{ srv.priority }}</td> <td>{{ srv.priority }}</td>
<td>{{ srv.weight }}</td> <td>{{ srv.weight }}</td>
<td>{{ srv.port }}</td> <td>{{ srv.port }}</td>
<td>{{ srv.target }}</td> <td>{{ srv.target }}</td>
<td class="text-right"> <td class="text-right">
{% can_edit srv %} {% can_edit srv %}
{% include 'buttons/edit.html' with href='machines:edit-srv' id=srv.id %} {% include 'buttons/edit.html' with href='machines:edit-srv' id=srv.id %}
{% acl_end %} {% acl_end %}
{% history_button srv %} {% history_button srv %}
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>

View file

@ -21,33 +21,34 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% endcomment %} {% endcomment %}
{% load acl %} {% load acl %}
{% load i18n %}
{% load logs_extra %} {% load logs_extra %}
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped long_text"> <table class="table table-striped long_text">
<thead> <thead>
<tr> <tr>
<th class="long_text">SSH public key</th> <th class="long_text">{% trans "SSH public key" %}</th>
<th>Algorithm used</th> <th>{% trans "Algorithm used" %}</th>
<th>Comment</th> <th>{% trans "Comment" %}</th>
<th></th> <th></th>
</tr> </tr>
</thead> </thead>
{% for sshfp in sshfp_list %} {% for sshfp in sshfp_list %}
<tr> <tr>
<td class="long_text">{{ sshfp.pub_key_entry }}</td> <td class="long_text">{{ sshfp.pub_key_entry }}</td>
<td>{{ sshfp.algo }}</td> <td>{{ sshfp.algo }}</td>
<td>{{ sshfp.comment }}</td> <td>{{ sshfp.comment }}</td>
<td class="text-right"> <td class="text-right">
{% can_edit sshfp %} {% can_edit sshfp %}
{% include 'buttons/edit.html' with href='machines:edit-sshfp' id=sshfp.id %} {% include 'buttons/edit.html' with href='machines:edit-sshfp' id=sshfp.id %}
{% acl_end %} {% acl_end %}
{% can_delete sshfp %} {% history_button sshfp %}
{% include 'buttons/suppr.html' with href='machines:del-sshfp' id=sshfp.id %} {% can_delete sshfp %}
{% acl_end %} {% include 'buttons/suppr.html' with href='machines:del-sshfp' id=sshfp.id %}
{% history_button sshfp %} {% acl_end %}
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>
</div> </div>

View file

@ -24,28 +24,27 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% load acl %} {% load acl %}
{% load logs_extra %} {% load logs_extra %}
{% load i18n %}
<table class="table table-striped"> <table class="table table-striped">
<thead> <thead>
<tr> <tr>
<th>Zone concernée</th> <th>{% trans "Concerned zone" %}</th>
<th>Enregistrement</th> <th>{% trans "Record" %}</th>
<th></th>
<th></th> <th></th>
</tr> </tr>
</thead> </thead>
{% for txt in text_list %} {% for txt in txt_list %}
<tr> <tr>
<td>{{ txt.zone }}</td> <td>{{ txt.zone }}</td>
<td>{{ txt.dns_entry }}</td> <td>{{ txt.dns_entry }}</td>
<td class="text-right"> <td class="text-right">
{% can_edit txt %} {% can_edit txt %}
{% include 'buttons/edit.html' with href='machines:edit-txt' id=txt.id %} {% include 'buttons/edit.html' with href='machines:edit-txt' id=txt.id %}
{% acl_end %} {% acl_end %}
{% history_button txt %} {% history_button txt %}
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>

View file

@ -24,31 +24,33 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% load acl %} {% load acl %}
{% load logs_extra %} {% load logs_extra %}
{% load i18n %}
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped"> <table class="table table-striped">
<thead> <thead>
<tr> <tr>
<th>Id</th> <th>{% trans "ID" %}</th>
<th>Nom</th> <th>{% trans "Name" %}</th>
<th>Commentaire</th> <th>{% trans "Comment" %}</th>
<th>Ranges ip</th> <th>{% trans "IP ranges" %}</th>
<th></th> <th></th>
</tr> </tr>
</thead> </thead>
{% for vlan in vlan_list %} {% for vlan in vlan_list %}
<tr> <tr>
<td>{{ vlan.vlan_id }}</td> <td>{{ vlan.vlan_id }}</td>
<td>{{ vlan.name }}</td> <td>{{ vlan.name }}</td>
<td>{{ vlan.comment }}</td> <td>{{ vlan.comment }}</td>
<td>{% for range in vlan.iptype_set.all %}{{ range }}, {% endfor%}</td> <td>{% for range in vlan.iptype_set.all %}{{ range }}, {% endfor%}</td>
<td class="text-right"> <td class="text-right">
{% can_edit vlan %} {% can_edit vlan %}
{% include 'buttons/edit.html' with href='machines:edit-vlan' id=vlan.id %} {% include 'buttons/edit.html' with href='machines:edit-vlan' id=vlan.id %}
{% acl_end %} {% acl_end %}
{% history_button vlan %} {% history_button vlan %}
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>
</div> </div>

View file

@ -24,17 +24,20 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% endcomment %} {% endcomment %}
{% load bootstrap3 %} {% load bootstrap3 %}
{% load i18n %}
{% block title %}Création et modification de machines{% endblock %} {% block title %}{% trans "Creation and editing of machines" %}{% endblock %}
{% block content %} {% block content %}
<form class="form" method="post"> <form class="form" method="post">
{% csrf_token %} {% csrf_token %}
<h4>Attention, voulez-vous vraiment supprimer cet objet {{ objet_name }} ( {{ objet }} ) ?</h4> <h4>{% blocktrans %}Warning: are you sure you want to delete this object {{ objet_name }} ( {{ objet }} )?{% endblocktrans %}</h4>
{% bootstrap_button "Confirmer" button_type="submit" icon="trash" %} {% trans "Confirm" as tr_confirm %}
{% bootstrap_button tr_confirm button_type="submit" icon="trash" %}
</form> </form>
<br /> <br />
<br /> <br />
<br /> <br />
{% endblock %} {% endblock %}

View file

@ -24,8 +24,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% endcomment %} {% endcomment %}
{% load bootstrap3 %} {% load bootstrap3 %}
{% load i18n %}
{% block title %}Création et modification de machines{% endblock %} {% block title %}{% trans "Machines" %}{% endblock %}
{% block content %} {% block content %}
{% bootstrap_form_errors port_list %} {% bootstrap_form_errors port_list %}
@ -46,10 +47,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
</div> </div>
<p> <p>
<input class="btn btn-primary btn-sm" role="button" value="Ajouter un port" id="add_one"> {% trans "Add a port" as value %}
<input class="btn btn-primary btn-sm" role="button" value=value id="add_one">
</p> </p>
{% trans "Create or edit" as tr_create_or_edit %}
{% bootstrap_button "Créer ou modifier" button_type="submit" icon="star" %} {% bootstrap_button tr_create_or_edit button_type="submit" icon="star" %}
</form> </form>
<script type="text/javascript"> <script type="text/javascript">
var template = `{{ports.empty_form}}`; var template = `{{ports.empty_form}}`;
@ -67,3 +69,4 @@ with this program; if not, write to the Free Software Foundation, Inc.,
</script> </script>
{% endblock %} {% endblock %}

View file

@ -24,11 +24,12 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% endcomment %} {% endcomment %}
{% load bootstrap3 %} {% load bootstrap3 %}
{% load i18n %}
{% block title %}Machines{% endblock %} {% block title %}{% trans "Machines" %}{% endblock %}
{% block content %} {% block content %}
<h2>Machines</h2> <h2>{% trans "Machines" %}</h2>
{% include "machines/aff_machines.html" with machines_list=machines_list %} {% include "machines/aff_machines.html" with machines_list=machines_list %}
<br /> <br />
<br /> <br />

View file

@ -24,16 +24,17 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% endcomment %} {% endcomment %}
{% load bootstrap3 %} {% load bootstrap3 %}
{% load i18n %}
{% block title %}Machines{% endblock %} {% block title %}{% trans "Machines" %}{% endblock %}
{% block content %} {% block content %}
<h2>Liste des alias de l'interface</h2> <h2>{% trans "List of the aliases of the interface" %}</h2>
<a class="btn btn-primary btn-sm" role="button" href="{% url 'machines:add-alias' interface_id %}"><i class="fa fa-plus"></i> Ajouter un alias</a> <a class="btn btn-primary btn-sm" role="button" href="{% url 'machines:add-alias' interface_id %}"><i class="fa fa-plus"></i>{% trans " Add an alias" %}</a>
<a class="btn btn-danger btn-sm" role="button" href="{% url 'machines:del-alias' interface_id %}"><i class="fa fa-trash"></i> Supprimer un ou plusieurs alias</a> <a class="btn btn-danger btn-sm" role="button" href="{% url 'machines:del-alias' interface_id %}"><i class="fa fa-trash"></i>{% trans " Delete one or several aliases" %}</a>
{% include "machines/aff_alias.html" with alias_list=alias_list %} {% include "machines/aff_alias.html" with alias_list=alias_list %}
<br /> <br />
<br /> <br />
<br /> <br />
{% endblock %} {% endblock %}

View file

@ -28,57 +28,60 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% load acl %} {% load acl %}
{% load i18n %} {% load i18n %}
{% block title %}Machines{% endblock %} {% block title %}{% trans "Machines" %}{% endblock %}
{% block content %} {% block content %}
<h2>Liste des extensions</h2> <h2>{% trans "List of extensions" %}</h2>
{% can_create Extension %} {% can_create Extension %}
<a class="btn btn-primary btn-sm" role="button" href="{% url 'machines:add-extension' %}"><i class="fa fa-plus"></i> Ajouter une extension</a> <a class="btn btn-primary btn-sm" role="button" href="{% url 'machines:add-extension' %}"><i class="fa fa-plus"></i>{% trans " Add an extension" %}</a>
{% acl_end %} {% acl_end %}
<a class="btn btn-danger btn-sm" role="button" href="{% url 'machines:del-extension' %}"><i class="fa fa-trash"></i> Supprimer une ou plusieurs extensions</a> <a class="btn btn-danger btn-sm" role="button" href="{% url 'machines:del-extension' %}"><i class="fa fa-trash"></i>{% trans " Delete one or several extensions" %}</a>
{% include "machines/aff_extension.html" with extension_list=extension_list %} {% include "machines/aff_extension.html" with extension_list=extension_list %}
<h2>Liste des enregistrements SOA</h2> <h2>{% trans "List of SOA records" %}</h2>
{% can_create SOA %} {% can_create SOA %}
<a class="btn btn-primary btn-sm" role="button" href="{% url 'machines:add-soa' %}"><i class="fa fa-plus"></i> Ajouter un enregistrement SOA</a> <a class="btn btn-primary btn-sm" role="button" href="{% url 'machines:add-soa' %}"><i class="fa fa-plus"></i>{% trans " Add an SOA record" %}</a>
{% acl_end %} {% acl_end %}
<a class="btn btn-danger btn-sm" role="button" href="{% url 'machines:del-soa' %}"><i class="fa fa-trash"></i> Supprimer un enregistrement SOA</a> <a class="btn btn-danger btn-sm" role="button" href="{% url 'machines:del-soa' %}"><i class="fa fa-trash"></i>{% trans " Delete one or several SOA records" %}</a>
{% include "machines/aff_soa.html" with soa_list=soa_list %} {% include "machines/aff_soa.html" with soa_list=soa_list %}
<h2>Liste des enregistrements MX</h2>
<h2>{% trans "List of MX records" %}</h2>
{% can_create Mx %} {% can_create Mx %}
<a class="btn btn-primary btn-sm" role="button" href="{% url 'machines:add-mx' %}"><i class="fa fa-plus"></i> Ajouter un enregistrement MX</a> <a class="btn btn-primary btn-sm" role="button" href="{% url 'machines:add-mx' %}"><i class="fa fa-plus"></i>{% trans " Add an MX record" %}</a>
{% acl_end %} {% acl_end %}
<a class="btn btn-danger btn-sm" role="button" href="{% url 'machines:del-mx' %}"><i class="fa fa-trash"></i> Supprimer un enregistrement MX</a> <a class="btn btn-danger btn-sm" role="button" href="{% url 'machines:del-mx' %}"><i class="fa fa-trash"></i>{% trans " Delete one or several MX records" %}</a>
{% include "machines/aff_mx.html" with mx_list=mx_list %} {% include "machines/aff_mx.html" with mx_list=mx_list %}
<h2>Liste des enregistrements NS</h2>
<h2>{% trans "List of NS records" %}</h2>
{% can_create Ns %} {% can_create Ns %}
<a class="btn btn-primary btn-sm" role="button" href="{% url 'machines:add-ns' %}"><i class="fa fa-plus"></i> Ajouter un enregistrement NS</a> <a class="btn btn-primary btn-sm" role="button" href="{% url 'machines:add-ns' %}"><i class="fa fa-plus"></i>{% trans " Add an NS record" %}</a>
{% acl_end %} {% acl_end %}
<a class="btn btn-danger btn-sm" role="button" href="{% url 'machines:del-ns' %}"><i class="fa fa-trash"></i> Supprimer un enregistrement NS</a> <a class="btn btn-danger btn-sm" role="button" href="{% url 'machines:del-ns' %}"><i class="fa fa-trash"></i>{% trans " Delete one or several NS records" %}</a>
{% include "machines/aff_ns.html" with ns_list=ns_list %} {% include "machines/aff_ns.html" with ns_list=ns_list %}
<h2>Liste des enregistrements TXT</h2>
<h2>{% trans "List of TXT records" %}</h2>
{% can_create Txt %} {% can_create Txt %}
<a class="btn btn-primary btn-sm" role="button" href="{% url 'machines:add-txt' %}"><i class="fa fa-plus"></i> Ajouter un enregistrement TXT</a> <a class="btn btn-primary btn-sm" role="button" href="{% url 'machines:add-txt' %}"><i class="fa fa-plus"></i>{% trans " Add a TXT record" %}</a>
{% acl_end %} {% acl_end %}
<a class="btn btn-danger btn-sm" role="button" href="{% url 'machines:del-txt' %}"><i class="fa fa-trash"></i> Supprimer un enregistrement TXT</a> <a class="btn btn-danger btn-sm" role="button" href="{% url 'machines:del-txt' %}"><i class="fa fa-trash"></i>{% trans " Delete one or several TXT records" %}</a>
{% include "machines/aff_txt.html" with txt_list=txt_list %} {% include "machines/aff_txt.html" with txt_list=txt_list %}
<h2>DNAME records</h2> <h2>{% trans "List of DNAME records" %}</h2>
{% can_create DName %} {% can_create DName %}
<a class="btn btn-primary btn-sm" role="button" href="{% url 'machines:add-dname' %}"> <a class="btn btn-primary btn-sm" role="button" href="{% url 'machines:add-dname' %}">
<i class="fa fa-plus"></i> {% trans "Add a DNAME record" %} <i class="fa fa-plus"></i> {% trans " Add a DNAME record" %}
</a> </a>
{% acl_end %} {% acl_end %}
<a class="btn btn-danger btn-sm" role="button" href="{% url 'machines:del-dname' %}"> <a class="btn btn-danger btn-sm" role="button" href="{% url 'machines:del-dname' %}">
<i class="fa fa-trash"></i> {% trans "Delete DNAME records" %} <i class="fa fa-trash"></i> {% trans " Delete one or several DNAME records" %}
</a> </a>
{% include "machines/aff_dname.html" with dname_list=dname_list %} {% include "machines/aff_dname.html" with dname_list=dname_list %}
<h2>Liste des enregistrements SRV</h2> <h2>{% trans "List of SRV records" %}</h2>
{% can_create Srv %} {% can_create Srv %}
<a class="btn btn-primary btn-sm" role="button" href="{% url 'machines:add-srv' %}"><i class="fa fa-plus"></i> Ajouter un enregistrement SRV</a> <a class="btn btn-primary btn-sm" role="button" href="{% url 'machines:add-srv' %}"><i class="fa fa-plus"></i>{% trans " Add an SRV record" %}</a>
{% acl_end %} {% acl_end %}
<a class="btn btn-danger btn-sm" role="button" href="{% url 'machines:del-srv' %}"><i class="fa fa-trash"></i> Supprimer un enregistrement SRV</a> <a class="btn btn-danger btn-sm" role="button" href="{% url 'machines:del-srv' %}"><i class="fa fa-trash"></i>{% trans " Delete one or several SRV records" %}</a>
{% include "machines/aff_srv.html" with srv_list=srv_list %} {% include "machines/aff_srv.html" with srv_list=srv_list %}
<br /> <br />
<br /> <br />

View file

@ -26,15 +26,16 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% load bootstrap3 %} {% load bootstrap3 %}
{% load acl %} {% load acl %}
{% load i18n %}
{% block title %}Ip{% endblock %} {% block title %}{% trans "Machines" %}{% endblock %}
{% block content %} {% block content %}
<h2>Liste des types d'ip</h2> <h2>{% trans "List of IP types" %}</h2>
{% can_create IpType %} {% can_create IpType %}
<a class="btn btn-primary btn-sm" role="button" href="{% url 'machines:add-iptype' %}"><i class="fa fa-plus"></i> Ajouter un type d'ip</a> <a class="btn btn-primary btn-sm" role="button" href="{% url 'machines:add-iptype' %}"><i class="fa fa-plus"></i>{% trans " Add an IP type" %}</a>
{% acl_end %} {% acl_end %}
<a class="btn btn-danger btn-sm" role="button" href="{% url 'machines:del-iptype' %}"><i class="fa fa-trash"></i> Supprimer un ou plusieurs types d'ip</a> <a class="btn btn-danger btn-sm" role="button" href="{% url 'machines:del-iptype' %}"><i class="fa fa-trash"></i>{% trans " Delete one or several IP types" %}</a>
{% include "machines/aff_iptype.html" with iptype_list=iptype_list %} {% include "machines/aff_iptype.html" with iptype_list=iptype_list %}
<br /> <br />
<br /> <br />

View file

@ -25,13 +25,14 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% load bootstrap3 %} {% load bootstrap3 %}
{% load acl %} {% load acl %}
{% load i18n %}
{% block title %}Machines{% endblock %} {% block title %}{% trans "Machines" %}{% endblock %}
{% block content %} {% block content %}
<h2>Liste des ipv6 de l'interface</h2> <h2>{% trans "List of the IPv6 addresses of the interface" %}</h2>
{% can_create Ipv6List interface_id %} {% can_create Ipv6List interface_id %}
<a class="btn btn-primary btn-sm" role="button" href="{% url 'machines:new-ipv6list' interface_id %}"><i class="fa fa-plus"></i> Ajouter une ipv6</a> <a class="btn btn-primary btn-sm" role="button" href="{% url 'machines:new-ipv6list' interface_id %}"><i class="fa fa-plus"></i>{% trans " Add an IPv6 address" %}</a>
{% acl_end %} {% acl_end %}
{% include "machines/aff_ipv6.html" with ipv6_list=ipv6_list %} {% include "machines/aff_ipv6.html" with ipv6_list=ipv6_list %}
<br /> <br />

View file

@ -26,15 +26,16 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% load bootstrap3 %} {% load bootstrap3 %}
{% load acl %} {% load acl %}
{% load i18n %}
{% block title %}Machines{% endblock %} {% block title %}{% trans "Machines" %}{% endblock %}
{% block content %} {% block content %}
<h2>Liste des types de machines</h2> <h2>{% trans "List of machine types" %}</h2>
{% can_create MachineType %} {% can_create MachineType %}
<a class="btn btn-primary btn-sm" role="button" href="{% url 'machines:add-machinetype' %}"><i class="fa fa-plus"></i> Ajouter un type de machine</a> <a class="btn btn-primary btn-sm" role="button" href="{% url 'machines:add-machinetype' %}"><i class="fa fa-plus"></i>{% trans " Add a machine type" %}</a>
{% acl_end %} {% acl_end %}
<a class="btn btn-danger btn-sm" role="button" href="{% url 'machines:del-machinetype' %}"><i class="fa fa-trash"></i> Supprimer un ou plusieurs types de machines</a> <a class="btn btn-danger btn-sm" role="button" href="{% url 'machines:del-machinetype' %}"><i class="fa fa-trash"></i>{% trans " Delete one or several machine types" %}</a>
{% include "machines/aff_machinetype.html" with machinetype_list=machinetype_list %} {% include "machines/aff_machinetype.html" with machinetype_list=machinetype_list %}
<br /> <br />
<br /> <br />

View file

@ -26,17 +26,17 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% load bootstrap3 %} {% load bootstrap3 %}
{% load acl %} {% load acl %}
{% load i18n %}
{% block title %}Machines{% endblock %} {% block title %}{% trans "Machines" %}{% endblock %}
{% block content %} {% block content %}
<h2>Liste des nas</h2> <h2>{% trans "List of NAS devices" %}</h2>
<h5>La correpondance nas-machinetype relie le type de nas à un type de machine. <h5>{% trans "The NAS device type and machine type are linked. It is useful for MAC address auto capture by RADIUS, and allows to choose the machine type to assign to the machines according to the NAS device type." %}</h5>
Elle est utile pour l'autoenregistrement des macs par radius, et permet de choisir le type de machine à affecter aux machines en fonction du type de nas</h5>
{% can_create Nas %} {% can_create Nas %}
<a class="btn btn-primary btn-sm" role="button" href="{% url 'machines:add-nas' %}"><i class="fa fa-plus"></i> Ajouter un type de nas</a> <a class="btn btn-primary btn-sm" role="button" href="{% url 'machines:add-nas' %}"><i class="fa fa-plus"></i>{% trans " Add a NAS device type" %}</a>
{% acl_end %} {% acl_end %}
<a class="btn btn-danger btn-sm" role="button" href="{% url 'machines:del-nas' %}"><i class="fa fa-trash"></i> Supprimer un ou plusieurs types nas</a> <a class="btn btn-danger btn-sm" role="button" href="{% url 'machines:del-nas' %}"><i class="fa fa-trash"></i>{% trans " Delete one or several NAS device types" %}</a>
{% include "machines/aff_nas.html" with nas_list=nas_list %} {% include "machines/aff_nas.html" with nas_list=nas_list %}
<br /> <br />
<br /> <br />

View file

@ -3,23 +3,24 @@
{% load bootstrap3 %} {% load bootstrap3 %}
{% load acl %} {% load acl %}
{% load i18n %}
{% block title %}Configuration de ports{% endblock %} {% block title %}{% trans "Machines" %}{% endblock %}
{% block content %} {% block content %}
<h2>Liste des configurations de ports</h2> <h2>{% trans "List of ports configurations" %}</h2>
{% can_create OuverturePortList %} {% can_create OuverturePortList %}
<a class="btn btn-primary btn-sm" role="button" href="{% url 'machines:add-portlist' %}"><i class="fa fa-plus"></i>Ajouter une configuration</a> <a class="btn btn-primary btn-sm" role="button" href="{% url 'machines:add-portlist' %}"><i class="fa fa-plus"></i>{% trans " Add a configuration" %}</a>
{% acl_end %} {% acl_end %}
<table class="table table-striped"> <table class="table table-striped">
<thead> <thead>
<tr> <tr>
<th>Nom</th> <th>{% trans "Name" %}</th>
<th>TCP (entrée)</th> <th>{% trans "TCP (input)" %}</th>
<th>TCP (sortie)</th> <th>{% trans "TCP (output)" %}</th>
<th>UDP (entrée)</th> <th>{% trans "UDP (input)" %}</th>
<th>UDP (sortie)</th> <th>{% trans "UDP (output)" %}</th>
<th>Machines</th> <th>{% trans "Machines" %}</th>
<th></th> <th></th>
</tr> </tr>
</thead> </thead>
@ -48,13 +49,13 @@
</div> </div>
{% endif %} {% endif %}
<td class="text-right"> <td class="text-right">
{% can_delete pl %}
{% include 'buttons/suppr.html' with href='machines:del-portlist' id=pl.id %}
{% acl_end %}
{% can_edit pl %} {% can_edit pl %}
{% include 'buttons/edit.html' with href='machines:edit-portlist' id=pl.id %} {% include 'buttons/edit.html' with href='machines:edit-portlist' id=pl.id %}
{% acl_end %} {% acl_end %}
</td> {% can_delete pl %}
{% include 'buttons/suppr.html' with href='machines:del-portlist' id=pl.id %}
{% acl_end %}
</td>
</tr> </tr>
{%endfor%} {%endfor%}
</table> </table>
@ -63,3 +64,4 @@
<br /> <br />
{% endblock %} {% endblock %}

View file

@ -27,14 +27,14 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% load acl %} {% load acl %}
{% load i18n %} {% load i18n %}
{% block title %}Machines{% endblock %} {% block title %}{% trans "Machines" %}{% endblock %}
{% block content %} {% block content %}
<h2>{% trans "Roles list" %}</h2> <h2>{% trans "List of roles" %}</h2>
{% can_create Role %} {% can_create Role %}
<a class="btn btn-primary btn-sm" role="button" href="{% url 'machines:add-role' %}"><i class="fa fa-plus"></i> {% trans "Add role"%}</a> <a class="btn btn-primary btn-sm" role="button" href="{% url 'machines:add-role' %}"><i class="fa fa-plus"></i>{% trans " Add a role"%}</a>
{% acl_end %} {% acl_end %}
<a class="btn btn-danger btn-sm" role="button" href="{% url 'machines:del-role' %}"><i class="fa fa-trash"></i> {% trans "Delete one or several roles" %}</a> <a class="btn btn-danger btn-sm" role="button" href="{% url 'machines:del-role' %}"><i class="fa fa-trash"></i>{% trans " Delete one or several roles" %}</a>
{% include "machines/aff_role.html" with role_list=role_list %} {% include "machines/aff_role.html" with role_list=role_list %}
<br /> <br />
<br /> <br />

View file

@ -25,17 +25,18 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% load bootstrap3 %} {% load bootstrap3 %}
{% load acl %} {% load acl %}
{% load i18n %}
{% block title %}Machines{% endblock %} {% block title %}{% trans "Machines" %}{% endblock %}
{% block content %} {% block content %}
<h2>Liste des services</h2> <h2>{% trans "List of services" %}</h2>
{% can_create machines.Service %} {% can_create machines.Service %}
<a class="btn btn-primary btn-sm" role="button" href="{% url 'machines:add-service' %}"><i class="fa fa-plus"></i> Ajouter un service</a> <a class="btn btn-primary btn-sm" role="button" href="{% url 'machines:add-service' %}"><i class="fa fa-plus"></i>{% trans " Add a service" %}</a>
{% acl_end %} {% acl_end %}
<a class="btn btn-danger btn-sm" role="button" href="{% url 'machines:del-service' %}"><i class="fa fa-trash"></i> Supprimer un ou plusieurs service</a> <a class="btn btn-danger btn-sm" role="button" href="{% url 'machines:del-service' %}"><i class="fa fa-trash"></i>{% trans " Delete one or several services" %}</a>
{% include "machines/aff_service.html" with service_list=service_list %} {% include "machines/aff_service.html" with service_list=service_list %}
<h2>Etat des serveurs</h2> <h2>{% trans "States of servers" %}</h2>
{% include "machines/aff_servers.html" with servers_list=servers_list %} {% include "machines/aff_servers.html" with servers_list=servers_list %}
<br /> <br />
<br /> <br />

View file

@ -23,16 +23,17 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% load bootstrap3 %} {% load bootstrap3 %}
{% load acl %} {% load acl %}
{% load i18n %}
{% block title %}Machines{% endblock %} {% block title %}{% trans "Machines" %}{% endblock %}
{% block content %} {% block content %}
<h2>SSH fingerprints</h2> <h2>{% trans "SSH fingerprints" %}</h2>
{% can_create SshFp machine_id %} {% can_create SshFp machine_id %}
<a class="btn btn-primary btn-sm" role="button" href="{% url 'machines:new-sshfp' machine_id %}"> <a class="btn btn-primary btn-sm" role="button" href="{% url 'machines:new-sshfp' machine_id %}">
<i class="fa fa-plus"></i> Add an SSH fingerprint <i class="fa fa-plus"></i>{% trans " Add an SSH fingerprint" %}
</a> </a>
{% acl_end %} {% acl_end %}
{% include "machines/aff_sshfp.html" with sshfp_list=sshfp_list %} {% include "machines/aff_sshfp.html" with sshfp_list=sshfp_list %}
{% endblock %} {% endblock %}

View file

@ -26,15 +26,16 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% load bootstrap3 %} {% load bootstrap3 %}
{% load acl %} {% load acl %}
{% load i18n %}
{% block title %}Machines{% endblock %} {% block title %}{% trans "Machines" %}{% endblock %}
{% block content %} {% block content %}
<h2>Liste des vlans</h2> <h2>{% trans "List of VLANs" %}</h2>
{% can_create Vlan %} {% can_create Vlan %}
<a class="btn btn-primary btn-sm" role="button" href="{% url 'machines:add-vlan' %}"><i class="fa fa-plus"></i> Ajouter un vlan</a> <a class="btn btn-primary btn-sm" role="button" href="{% url 'machines:add-vlan' %}"><i class="fa fa-plus"></i>{% trans " Add a VLAN" %}</a>
{% acl_end %} {% acl_end %}
<a class="btn btn-danger btn-sm" role="button" href="{% url 'machines:del-vlan' %}"><i class="fa fa-trash"></i> Supprimer un ou plusieurs vlan</a> <a class="btn btn-danger btn-sm" role="button" href="{% url 'machines:del-vlan' %}"><i class="fa fa-trash"></i>{% trans " Delete one or several VLANs" %}</a>
{% include "machines/aff_vlan.html" with vlan_list=vlan_list %} {% include "machines/aff_vlan.html" with vlan_list=vlan_list %}
<br /> <br />
<br /> <br />

View file

@ -26,8 +26,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% load bootstrap3 %} {% load bootstrap3 %}
{% load massive_bootstrap_form %} {% load massive_bootstrap_form %}
{% load i18n %}
{% block title %}Création et modification de machines{% endblock %} {% block title %}{% trans "Machines" %}{% endblock %}
{% block content %} {% block content %}
{% if machineform %} {% if machineform %}
@ -88,11 +89,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
<form class="form" method="post"> <form class="form" method="post">
{% csrf_token %} {% csrf_token %}
{% if machineform %} {% if machineform %}
<h3>Machine</h3> <h3>{% trans "Machine" %}</h3>
{% massive_bootstrap_form machineform 'user' %} {% massive_bootstrap_form machineform 'user' %}
{% endif %} {% endif %}
{% if interfaceform %} {% if interfaceform %}
<h3>Interface</h3> <h3>{% trans "Interface" %}</h3>
{% if i_mbf_param %} {% if i_mbf_param %}
{% massive_bootstrap_form interfaceform 'ipv4,machine' mbf_param=i_mbf_param %} {% massive_bootstrap_form interfaceform 'ipv4,machine' mbf_param=i_mbf_param %}
{% else %} {% else %}
@ -100,55 +101,55 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% endif %} {% endif %}
{% endif %} {% endif %}
{% if domainform %} {% if domainform %}
<h3>Domaine</h3> <h3>{% trans "Domain" %}</h3>
{% bootstrap_form domainform %} {% bootstrap_form domainform %}
{% endif %} {% endif %}
{% if iptypeform %} {% if iptypeform %}
<h3>Type d'IP</h3> <h3>{% trans "IP type" %}</h3>
{% bootstrap_form iptypeform %} {% bootstrap_form iptypeform %}
{% endif %} {% endif %}
{% if machinetypeform %} {% if machinetypeform %}
<h3>Type de machine</h3> <h3>{% trans "Machine type" %}</h3>
{% bootstrap_form machinetypeform %} {% bootstrap_form machinetypeform %}
{% endif %} {% endif %}
{% if extensionform %} {% if extensionform %}
<h3>Extension</h3> <h3>{% trans "Extension" %}</h3>
{% massive_bootstrap_form extensionform 'origin' %} {% massive_bootstrap_form extensionform 'origin' %}
{% endif %} {% endif %}
{% if soaform %} {% if soaform %}
<h3>Enregistrement SOA</h3> <h3>{% trans "SOA record" %}</h3>
{% bootstrap_form soaform %} {% bootstrap_form soaform %}
{% endif %} {% endif %}
{% if mxform %} {% if mxform %}
<h3>Enregistrement MX</h3> <h3>{% trans "MX record" %}</h3>
{% massive_bootstrap_form mxform 'name' %} {% massive_bootstrap_form mxform 'name' %}
{% endif %} {% endif %}
{% if nsform %} {% if nsform %}
<h3>Enregistrement NS</h3> <h3>{% trans "NS record" %}</h3>
{% massive_bootstrap_form nsform 'ns' %} {% massive_bootstrap_form nsform 'ns' %}
{% endif %} {% endif %}
{% if txtform %} {% if txtform %}
<h3>Enregistrement TXT</h3> <h3>{% trans "TXT record" %}</h3>
{% bootstrap_form txtform %} {% bootstrap_form txtform %}
{% endif %} {% endif %}
{% if dnameform %} {% if dnameform %}
<h3>DNAME record</h3> <h3>{% trans "DNAME record" %}</h3>
{% bootstrap_form dnameform %} {% bootstrap_form dnameform %}
{% endif %} {% endif %}
{% if srvform %} {% if srvform %}
<h3>Enregistrement SRV</h3> <h3>{% trans "SRV record" %}</h3>
{% massive_bootstrap_form srvform 'target' %} {% massive_bootstrap_form srvform 'target' %}
{% endif %} {% endif %}
{% if sshfpform %} {% if sshfpform %}
<h3>SSHFP record</h3> <h3>{% trans "SSHFP record" %}</h3>
{% bootstrap_form sshfpform %} {% bootstrap_form sshfpform %}
{% endif %} {% endif %}
{% if aliasform %} {% if aliasform %}
<h3>Alias</h3> <h3>{% trans "Alias" %}</h3>
{% bootstrap_form aliasform %} {% bootstrap_form aliasform %}
{% endif %} {% endif %}
{% if serviceform %} {% if serviceform %}
<h3>Service</h3> <h3>{% trans "Service" %}</h3>
{% massive_bootstrap_form serviceform 'servers' %} {% massive_bootstrap_form serviceform 'servers' %}
{% endif %} {% endif %}
{% if roleform %} {% if roleform %}
@ -156,15 +157,15 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% massive_bootstrap_form roleform 'servers' %} {% massive_bootstrap_form roleform 'servers' %}
{% endif %} {% endif %}
{% if vlanform %} {% if vlanform %}
<h3>Vlan</h3> <h3>{% trans "VLAN" %}</h3>
{% bootstrap_form vlanform %} {% bootstrap_form vlanform %}
{% endif %} {% endif %}
{% if nasform %} {% if nasform %}
<h3>NAS</h3> <h3>{% trans "NAS device" %}</h3>
{% bootstrap_form nasform %} {% bootstrap_form nasform %}
{% endif %} {% endif %}
{% if ipv6form %} {% if ipv6form %}
<h3>Ipv6</h3> <h3>{% trans "IPv6 address" %}</h3>
{% bootstrap_form ipv6form %} {% bootstrap_form ipv6form %}
{% endif %} {% endif %}
{% bootstrap_button action_name button_type="submit" icon="star" %} {% bootstrap_button action_name button_type="submit" icon="star" %}
@ -173,3 +174,4 @@ with this program; if not, write to the Free Software Foundation, Inc.,
<br /> <br />
<br /> <br />
{% endblock %} {% endblock %}

View file

@ -30,43 +30,43 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% can_view_all Machine %} {% can_view_all Machine %}
<a class="list-group-item list-group-item-info" href="{% url "machines:index" %}"> <a class="list-group-item list-group-item-info" href="{% url "machines:index" %}">
<i class="fa fa-list-ul"></i> <i class="fa fa-list-ul"></i>
Machines {% trans "Machines" %}
</a> </a>
{% acl_end %} {% acl_end %}
{% can_view_all MachineType %} {% can_view_all MachineType %}
<a class="list-group-item list-group-item-info" href="{% url "machines:index-machinetype" %}"> <a class="list-group-item list-group-item-info" href="{% url "machines:index-machinetype" %}">
<i class="fa fa-list-ul"></i> <i class="fa fa-list-ul"></i>
Types de machines {% trans "Machine types" %}
</a> </a>
{% acl_end %} {% acl_end %}
{% can_view_all Extension %} {% can_view_all Extension %}
<a class="list-group-item list-group-item-info" href="{% url "machines:index-extension" %}"> <a class="list-group-item list-group-item-info" href="{% url "machines:index-extension" %}">
<i class="fa fa-list-ul"></i> <i class="fa fa-list-ul"></i>
Extensions et zones {% trans "Extensions and zones" %}
</a> </a>
{% acl_end %} {% acl_end %}
{% can_view_all IpType %} {% can_view_all IpType %}
<a class="list-group-item list-group-item-info" href="{% url "machines:index-iptype" %}"> <a class="list-group-item list-group-item-info" href="{% url "machines:index-iptype" %}">
<i class="fa fa-list-ul"></i> <i class="fa fa-list-ul"></i>
Plages d'IP {% trans "IP ranges" %}
</a> </a>
{% acl_end %} {% acl_end %}
{% can_view_all Vlan %} {% can_view_all Vlan %}
<a class="list-group-item list-group-item-info" href="{% url "machines:index-vlan" %}"> <a class="list-group-item list-group-item-info" href="{% url "machines:index-vlan" %}">
<i class="fa fa-list-ul"></i> <i class="fa fa-list-ul"></i>
Vlans {% trans "VLANs" %}
</a> </a>
{% acl_end %} {% acl_end %}
{% can_view_all Nas %} {% can_view_all Nas %}
<a class="list-group-item list-group-item-info" href="{% url "machines:index-nas" %}"> <a class="list-group-item list-group-item-info" href="{% url "machines:index-nas" %}">
<i class="fa fa-list-ul"></i> <i class="fa fa-list-ul"></i>
Gestion des nas {% trans "NAS devices" %}
</a> </a>
{% acl_end %} {% acl_end %}
{% can_view_all machines.Service %} {% can_view_all machines.Service %}
<a class="list-group-item list-group-item-info" href="{% url "machines:index-service" %}"> <a class="list-group-item list-group-item-info" href="{% url "machines:index-service" %}">
<i class="fa fa-list-ul"></i> <i class="fa fa-list-ul"></i>
Services (dhcp, dns...) {% trans "Services (DHCP, DNS, ...)" %}
</a> </a>
{% acl_end %} {% acl_end %}
{% can_view_all Role %} {% can_view_all Role %}
@ -78,7 +78,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% can_view_all OuverturePortList %} {% can_view_all OuverturePortList %}
<a class="list-group-item list-group-item-info" href="{% url "machines:index-portlist" %}"> <a class="list-group-item list-group-item-info" href="{% url "machines:index-portlist" %}">
<i class="fa fa-list-ul"></i> <i class="fa fa-list-ul"></i>
Ouverture de ports {% trans "Ports openings" %}
</a> </a>
{% acl_end %} {% acl_end %}
{% endblock %} {% endblock %}

View file

@ -153,7 +153,7 @@ def generate_ipv4_choices(form_obj):
""" """
f_ipv4 = form_obj.fields['ipv4'] f_ipv4 = form_obj.fields['ipv4']
used_mtype_id = [] used_mtype_id = []
choices = '{"":[{key:"",value:"Choisissez d\'abord un type de machine"},' choices = '{"":[{key:"",value:'+_("Select a machine type first.},")
mtype_id = -1 mtype_id = -1
for ip in (f_ipv4.queryset for ip in (f_ipv4.queryset
@ -255,7 +255,7 @@ def new_machine(request, user, **_kwargs):
new_interface_obj.save() new_interface_obj.save()
new_domain.interface_parent = new_interface_obj new_domain.interface_parent = new_interface_obj
new_domain.save() new_domain.save()
messages.success(request, "La machine a été créée") messages.success(request, _("The machine was created."))
return redirect(reverse( return redirect(reverse(
'users:profil', 'users:profil',
kwargs={'userid': str(user.id)} kwargs={'userid': str(user.id)}
@ -267,7 +267,7 @@ def new_machine(request, user, **_kwargs):
'interfaceform': interface, 'interfaceform': interface,
'domainform': domain, 'domainform': domain,
'i_mbf_param': i_mbf_param, 'i_mbf_param': i_mbf_param,
'action_name': 'Créer une machine' 'action_name': _("Create a machine")
}, },
'machines/machine.html', 'machines/machine.html',
request request
@ -307,7 +307,7 @@ def edit_interface(request, interface_instance, **_kwargs):
new_interface_obj.save() new_interface_obj.save()
if domain_form.changed_data: if domain_form.changed_data:
new_domain_obj.save() new_domain_obj.save()
messages.success(request, "La machine a été modifiée") messages.success(request, _("The machine was edited."))
return redirect(reverse( return redirect(reverse(
'users:profil', 'users:profil',
kwargs={'userid': str(interface_instance.machine.user.id)} kwargs={'userid': str(interface_instance.machine.user.id)}
@ -319,7 +319,7 @@ def edit_interface(request, interface_instance, **_kwargs):
'interfaceform': interface_form, 'interfaceform': interface_form,
'domainform': domain_form, 'domainform': domain_form,
'i_mbf_param': i_mbf_param, 'i_mbf_param': i_mbf_param,
'action_name': 'Editer une interface' 'action_name': _("Edit")
}, },
'machines/machine.html', 'machines/machine.html',
request request
@ -332,7 +332,7 @@ def del_machine(request, machine, **_kwargs):
""" Supprime une machine, interfaces en mode cascade""" """ Supprime une machine, interfaces en mode cascade"""
if request.method == "POST": if request.method == "POST":
machine.delete() machine.delete()
messages.success(request, "La machine a été détruite") messages.success(request, _("The machine was deleted."))
return redirect(reverse( return redirect(reverse(
'users:profil', 'users:profil',
kwargs={'userid': str(machine.user.id)} kwargs={'userid': str(machine.user.id)}
@ -361,7 +361,7 @@ def new_interface(request, machine, **_kwargs):
new_interface_obj.save() new_interface_obj.save()
new_domain_obj.interface_parent = new_interface_obj new_domain_obj.interface_parent = new_interface_obj
new_domain_obj.save() new_domain_obj.save()
messages.success(request, "L'interface a été ajoutée") messages.success(request, _("The interface was created."))
return redirect(reverse( return redirect(reverse(
'users:profil', 'users:profil',
kwargs={'userid': str(machine.user.id)} kwargs={'userid': str(machine.user.id)}
@ -372,7 +372,7 @@ def new_interface(request, machine, **_kwargs):
'interfaceform': interface_form, 'interfaceform': interface_form,
'domainform': domain_form, 'domainform': domain_form,
'i_mbf_param': i_mbf_param, 'i_mbf_param': i_mbf_param,
'action_name': 'Créer une interface' 'action_name': _("Create an interface")
}, },
'machines/machine.html', 'machines/machine.html',
request request
@ -388,7 +388,7 @@ def del_interface(request, interface, **_kwargs):
interface.delete() interface.delete()
if not machine.interface_set.all(): if not machine.interface_set.all():
machine.delete() machine.delete()
messages.success(request, "L'interface a été détruite") messages.success(request, _("The interface was deleted."))
return redirect(reverse( return redirect(reverse(
'users:profil', 'users:profil',
kwargs={'userid': str(request.user.id)} kwargs={'userid': str(request.user.id)}
@ -413,13 +413,13 @@ def new_ipv6list(request, interface, **_kwargs):
) )
if ipv6.is_valid(): if ipv6.is_valid():
ipv6.save() ipv6.save()
messages.success(request, "Ipv6 ajoutée") messages.success(request, _("The IPv6 addresses list was created."))
return redirect(reverse( return redirect(reverse(
'machines:index-ipv6', 'machines:index-ipv6',
kwargs={'interfaceid': str(interface.id)} kwargs={'interfaceid': str(interface.id)}
)) ))
return form( return form(
{'ipv6form': ipv6, 'action_name': 'Créer'}, {'ipv6form': ipv6, 'action_name': _("Create an IPv6 addresses list")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -437,13 +437,13 @@ def edit_ipv6list(request, ipv6list_instance, **_kwargs):
if ipv6.is_valid(): if ipv6.is_valid():
if ipv6.changed_data: if ipv6.changed_data:
ipv6.save() ipv6.save()
messages.success(request, "Ipv6 modifiée") messages.success(request, _("The IPv6 addresses list was edited."))
return redirect(reverse( return redirect(reverse(
'machines:index-ipv6', 'machines:index-ipv6',
kwargs={'interfaceid': str(ipv6list_instance.interface.id)} kwargs={'interfaceid': str(ipv6list_instance.interface.id)}
)) ))
return form( return form(
{'ipv6form': ipv6, 'action_name': 'Editer'}, {'ipv6form': ipv6, 'action_name': _("Edit")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -456,7 +456,7 @@ def del_ipv6list(request, ipv6list, **_kwargs):
if request.method == "POST": if request.method == "POST":
interfaceid = ipv6list.interface.id interfaceid = ipv6list.interface.id
ipv6list.delete() ipv6list.delete()
messages.success(request, "L'ipv6 a été détruite") messages.success(request, _("The IPv6 addresses list was deleted."))
return redirect(reverse( return redirect(reverse(
'machines:index-ipv6', 'machines:index-ipv6',
kwargs={'interfaceid': str(interfaceid)} kwargs={'interfaceid': str(interfaceid)}
@ -480,13 +480,13 @@ def new_sshfp(request, machine, **_kwargs):
) )
if sshfp.is_valid(): if sshfp.is_valid():
sshfp.save() sshfp.save()
messages.success(request, "The SSHFP record was added") messages.success(request, _("The SSHFP record was created."))
return redirect(reverse( return redirect(reverse(
'machines:index-sshfp', 'machines:index-sshfp',
kwargs={'machineid': str(machine.id)} kwargs={'machineid': str(machine.id)}
)) ))
return form( return form(
{'sshfpform': sshfp, 'action_name': 'Create'}, {'sshfpform': sshfp, 'action_name': _("Create a SSHFP record")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -503,13 +503,13 @@ def edit_sshfp(request, sshfp_instance, **_kwargs):
if sshfp.is_valid(): if sshfp.is_valid():
if sshfp.changed_data: if sshfp.changed_data:
sshfp.save() sshfp.save()
messages.success(request, "The SSHFP record was edited") messages.success(request, _("The SSHFP record was edited."))
return redirect(reverse( return redirect(reverse(
'machines:index-sshfp', 'machines:index-sshfp',
kwargs={'machineid': str(sshfp_instance.machine.id)} kwargs={'machineid': str(sshfp_instance.machine.id)}
)) ))
return form( return form(
{'sshfpform': sshfp, 'action_name': 'Edit'}, {'sshfpform': sshfp, 'action_name': _("Edit")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -522,7 +522,7 @@ def del_sshfp(request, sshfp, **_kwargs):
if request.method == "POST": if request.method == "POST":
machineid = sshfp.machine.id machineid = sshfp.machine.id
sshfp.delete() sshfp.delete()
messages.success(request, "The SSHFP record was deleted") messages.success(request, _("The SSHFP record was deleted."))
return redirect(reverse( return redirect(reverse(
'machines:index-sshfp', 'machines:index-sshfp',
kwargs={'machineid': str(machineid)} kwargs={'machineid': str(machineid)}
@ -543,10 +543,10 @@ def add_iptype(request):
iptype = IpTypeForm(request.POST or None) iptype = IpTypeForm(request.POST or None)
if iptype.is_valid(): if iptype.is_valid():
iptype.save() iptype.save()
messages.success(request, "Ce type d'ip a été ajouté") messages.success(request, _("The IP type was created."))
return redirect(reverse('machines:index-iptype')) return redirect(reverse('machines:index-iptype'))
return form( return form(
{'iptypeform': iptype, 'action_name': 'Créer'}, {'iptypeform': iptype, 'action_name': _("Create an IP type")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -562,10 +562,10 @@ def edit_iptype(request, iptype_instance, **_kwargs):
if iptype.is_valid(): if iptype.is_valid():
if iptype.changed_data: if iptype.changed_data:
iptype.save() iptype.save()
messages.success(request, "Type d'ip modifié") messages.success(request, _("The IP type was edited."))
return redirect(reverse('machines:index-iptype')) return redirect(reverse('machines:index-iptype'))
return form( return form(
{'iptypeform': iptype, 'action_name': 'Editer'}, {'iptypeform': iptype, 'action_name': _("Edit")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -581,16 +581,16 @@ def del_iptype(request, instances):
for iptype_del in iptype_dels: for iptype_del in iptype_dels:
try: try:
iptype_del.delete() iptype_del.delete()
messages.success(request, "Le type d'ip a été supprimé") messages.success(request, _("The IP type was deleted."))
except ProtectedError: except ProtectedError:
messages.error( messages.error(
request, request,
("Le type d'ip %s est affectée à au moins une machine, " (_("The IP type %s is assigned to at least one machine,"
"vous ne pouvez pas le supprimer" % iptype_del) " you can't delete it.") % iptype_del)
) )
return redirect(reverse('machines:index-iptype')) return redirect(reverse('machines:index-iptype'))
return form( return form(
{'iptypeform': iptype, 'action_name': 'Supprimer'}, {'iptypeform': iptype, 'action_name': _("Delete")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -603,10 +603,11 @@ def add_machinetype(request):
machinetype = MachineTypeForm(request.POST or None) machinetype = MachineTypeForm(request.POST or None)
if machinetype.is_valid(): if machinetype.is_valid():
machinetype.save() machinetype.save()
messages.success(request, "Ce type de machine a été ajouté") messages.success(request, _("The machine type was created."))
return redirect(reverse('machines:index-machinetype')) return redirect(reverse('machines:index-machinetype'))
return form( return form(
{'machinetypeform': machinetype, 'action_name': 'Créer'}, {'machinetypeform': machinetype, 'action_name': _("Create a machine"
" type")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -623,10 +624,10 @@ def edit_machinetype(request, machinetype_instance, **_kwargs):
if machinetype.is_valid(): if machinetype.is_valid():
if machinetype.changed_data: if machinetype.changed_data:
machinetype.save() machinetype.save()
messages.success(request, "Type de machine modifié") messages.success(request, _("The machine type was edited."))
return redirect(reverse('machines:index-machinetype')) return redirect(reverse('machines:index-machinetype'))
return form( return form(
{'machinetypeform': machinetype, 'action_name': 'Editer'}, {'machinetypeform': machinetype, 'action_name': _("Edit")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -642,17 +643,16 @@ def del_machinetype(request, instances):
for machinetype_del in machinetype_dels: for machinetype_del in machinetype_dels:
try: try:
machinetype_del.delete() machinetype_del.delete()
messages.success(request, "Le type de machine a été supprimé") messages.success(request, _("The machine type was deleted."))
except ProtectedError: except ProtectedError:
messages.error( messages.error(
request, request,
("Le type de machine %s est affectée à au moins une " (_("The machine type %s is assigned to at least one"
"machine, vous ne pouvez pas le supprimer" " machine, you can't delete it.") % machinetype_del)
% machinetype_del)
) )
return redirect(reverse('machines:index-machinetype')) return redirect(reverse('machines:index-machinetype'))
return form( return form(
{'machinetypeform': machinetype, 'action_name': 'Supprimer'}, {'machinetypeform': machinetype, 'action_name': _("Delete")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -665,10 +665,10 @@ def add_extension(request):
extension = ExtensionForm(request.POST or None) extension = ExtensionForm(request.POST or None)
if extension.is_valid(): if extension.is_valid():
extension.save() extension.save()
messages.success(request, "Cette extension a été ajoutée") messages.success(request, _("The extension was created."))
return redirect(reverse('machines:index-extension')) return redirect(reverse('machines:index-extension'))
return form( return form(
{'extensionform': extension, 'action_name': 'Créer'}, {'extensionform': extension, 'action_name': _("Create an extension")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -685,10 +685,10 @@ def edit_extension(request, extension_instance, **_kwargs):
if extension.is_valid(): if extension.is_valid():
if extension.changed_data: if extension.changed_data:
extension.save() extension.save()
messages.success(request, "Extension modifiée") messages.success(request, _("The extension was edited."))
return redirect(reverse('machines:index-extension')) return redirect(reverse('machines:index-extension'))
return form( return form(
{'extensionform': extension, 'action_name': 'Editer'}, {'extensionform': extension, 'action_name': _("Edit")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -704,17 +704,16 @@ def del_extension(request, instances):
for extension_del in extension_dels: for extension_del in extension_dels:
try: try:
extension_del.delete() extension_del.delete()
messages.success(request, "L'extension a été supprimée") messages.success(request, _("The extension was deleted."))
except ProtectedError: except ProtectedError:
messages.error( messages.error(
request, request,
("L'extension %s est affectée à au moins un type de " (_("The extension %s is assigned to at least one machine"
"machine, vous ne pouvez pas la supprimer" " type, you can't delete it." % extension_del))
% extension_del)
) )
return redirect(reverse('machines:index-extension')) return redirect(reverse('machines:index-extension'))
return form( return form(
{'extensionform': extension, 'action_name': 'Supprimer'}, {'extensionform': extension, 'action_name': _("Delete")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -727,10 +726,10 @@ def add_soa(request):
soa = SOAForm(request.POST or None) soa = SOAForm(request.POST or None)
if soa.is_valid(): if soa.is_valid():
soa.save() soa.save()
messages.success(request, "Cet enregistrement SOA a été ajouté") messages.success(request, _("The SOA record was created."))
return redirect(reverse('machines:index-extension')) return redirect(reverse('machines:index-extension'))
return form( return form(
{'soaform': soa, 'action_name': 'Créer'}, {'soaform': soa, 'action_name': _("Create an SOA record")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -744,10 +743,10 @@ def edit_soa(request, soa_instance, **_kwargs):
if soa.is_valid(): if soa.is_valid():
if soa.changed_data: if soa.changed_data:
soa.save() soa.save()
messages.success(request, "SOA modifié") messages.success(request, _("The SOA record was edited."))
return redirect(reverse('machines:index-extension')) return redirect(reverse('machines:index-extension'))
return form( return form(
{'soaform': soa, 'action_name': 'Editer'}, {'soaform': soa, 'action_name': _("Edit")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -763,16 +762,15 @@ def del_soa(request, instances):
for soa_del in soa_dels: for soa_del in soa_dels:
try: try:
soa_del.delete() soa_del.delete()
messages.success(request, "Le SOA a été supprimée") messages.success(request, _("The SOA record was deleted."))
except ProtectedError: except ProtectedError:
messages.error( messages.error(
request, request,
("Erreur le SOA suivant %s ne peut être supprimé" (_("Error: the SOA record %s can't be deleted.") % soa_del)
% soa_del)
) )
return redirect(reverse('machines:index-extension')) return redirect(reverse('machines:index-extension'))
return form( return form(
{'soaform': soa, 'action_name': 'Supprimer'}, {'soaform': soa, 'action_name': _("Delete")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -785,10 +783,10 @@ def add_mx(request):
mx = MxForm(request.POST or None) mx = MxForm(request.POST or None)
if mx.is_valid(): if mx.is_valid():
mx.save() mx.save()
messages.success(request, "Cet enregistrement mx a été ajouté") messages.success(request, _("The MX record was created."))
return redirect(reverse('machines:index-extension')) return redirect(reverse('machines:index-extension'))
return form( return form(
{'mxform': mx, 'action_name': 'Créer'}, {'mxform': mx, 'action_name': _("Create an MX record")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -802,10 +800,10 @@ def edit_mx(request, mx_instance, **_kwargs):
if mx.is_valid(): if mx.is_valid():
if mx.changed_data: if mx.changed_data:
mx.save() mx.save()
messages.success(request, "Mx modifié") messages.success(request, _("The MX record was edited."))
return redirect(reverse('machines:index-extension')) return redirect(reverse('machines:index-extension'))
return form( return form(
{'mxform': mx, 'action_name': 'Editer'}, {'mxform': mx, 'action_name': _("Edit")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -821,16 +819,15 @@ def del_mx(request, instances):
for mx_del in mx_dels: for mx_del in mx_dels:
try: try:
mx_del.delete() mx_del.delete()
messages.success(request, "L'mx a été supprimée") messages.success(request, _("The MX record was deleted."))
except ProtectedError: except ProtectedError:
messages.error( messages.error(
request, request,
("Erreur le Mx suivant %s ne peut être supprimé" (_("Error: the MX record %s can't be deleted.") % mx_del)
% mx_del)
) )
return redirect(reverse('machines:index-extension')) return redirect(reverse('machines:index-extension'))
return form( return form(
{'mxform': mx, 'action_name': 'Supprimer'}, {'mxform': mx, 'action_name': _("Delete")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -843,10 +840,10 @@ def add_ns(request):
ns = NsForm(request.POST or None) ns = NsForm(request.POST or None)
if ns.is_valid(): if ns.is_valid():
ns.save() ns.save()
messages.success(request, "Cet enregistrement ns a été ajouté") messages.success(request, _("The NS record was created."))
return redirect(reverse('machines:index-extension')) return redirect(reverse('machines:index-extension'))
return form( return form(
{'nsform': ns, 'action_name': 'Créer'}, {'nsform': ns, 'action_name': _("Create an NS record")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -860,10 +857,10 @@ def edit_ns(request, ns_instance, **_kwargs):
if ns.is_valid(): if ns.is_valid():
if ns.changed_data: if ns.changed_data:
ns.save() ns.save()
messages.success(request, "Ns modifié") messages.success(request, _("The NS record was edited."))
return redirect(reverse('machines:index-extension')) return redirect(reverse('machines:index-extension'))
return form( return form(
{'nsform': ns, 'action_name': 'Editer'}, {'nsform': ns, 'action_name': _("Edit")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -879,16 +876,15 @@ def del_ns(request, instances):
for ns_del in ns_dels: for ns_del in ns_dels:
try: try:
ns_del.delete() ns_del.delete()
messages.success(request, "Le ns a été supprimée") messages.success(request, _("The NS record was deleted."))
except ProtectedError: except ProtectedError:
messages.error( messages.error(
request, request,
("Erreur le Ns suivant %s ne peut être supprimé" (_("Error: the NS record %s can't be deleted.") % ns_del)
% ns_del)
) )
return redirect(reverse('machines:index-extension')) return redirect(reverse('machines:index-extension'))
return form( return form(
{'nsform': ns, 'action_name': 'Supprimer'}, {'nsform': ns, 'action_name': _("Delete")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -900,10 +896,10 @@ def add_dname(request):
dname = DNameForm(request.POST or None) dname = DNameForm(request.POST or None)
if dname.is_valid(): if dname.is_valid():
dname.save() dname.save()
messages.success(request, "This DNAME record has been added") messages.success(request, _("The DNAME record was created."))
return redirect(reverse('machines:index-extension')) return redirect(reverse('machines:index-extension'))
return form( return form(
{'dnameform': dname, 'action_name': "Create"}, {'dnameform': dname, 'action_name': _("Create a DNAME record")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -917,10 +913,10 @@ def edit_dname(request, dname_instance, **_kwargs):
if dname.is_valid(): if dname.is_valid():
if dname.changed_data: if dname.changed_data:
dname.save() dname.save()
messages.success(request, "DName successfully edited") messages.success(request, _("The DNAME record was edited."))
return redirect(reverse('machines:index-extension')) return redirect(reverse('machines:index-extension'))
return form( return form(
{'dnameform': dname, 'action_name': "Edit"}, {'dnameform': dname, 'action_name': _("Edit")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -936,16 +932,16 @@ def del_dname(request, instances):
for dname_del in dname_dels: for dname_del in dname_dels:
try: try:
dname_del.delete() dname_del.delete()
messages.success(request, messages.success(request, _("The DNAME record was deleted."))
"The DNAME %s has been deleted" % dname_del)
except ProtectedError: except ProtectedError:
messages.error( messages.error(
request, request,
"The DNAME %s can not be deleted" % dname_del _("Error: the DNAME record %s can't be deleted.")
% dname_del
) )
return redirect(reverse('machines:index-extension')) return redirect(reverse('machines:index-extension'))
return form( return form(
{'dnameform': dname, 'action_name': 'Delete'}, {'dnameform': dname, 'action_name': _("Delete")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -958,10 +954,10 @@ def add_txt(request):
txt = TxtForm(request.POST or None) txt = TxtForm(request.POST or None)
if txt.is_valid(): if txt.is_valid():
txt.save() txt.save()
messages.success(request, "Cet enregistrement text a été ajouté") messages.success(request, _("The TXT record was created."))
return redirect(reverse('machines:index-extension')) return redirect(reverse('machines:index-extension'))
return form( return form(
{'txtform': txt, 'action_name': 'Créer'}, {'txtform': txt, 'action_name': _("Create a TXT record")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -975,10 +971,10 @@ def edit_txt(request, txt_instance, **_kwargs):
if txt.is_valid(): if txt.is_valid():
if txt.changed_data: if txt.changed_data:
txt.save() txt.save()
messages.success(request, "Txt modifié") messages.success(request, _("The TXT record was edited."))
return redirect(reverse('machines:index-extension')) return redirect(reverse('machines:index-extension'))
return form( return form(
{'txtform': txt, 'action_name': 'Editer'}, {'txtform': txt, 'action_name': _("Edit")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -994,16 +990,15 @@ def del_txt(request, instances):
for txt_del in txt_dels: for txt_del in txt_dels:
try: try:
txt_del.delete() txt_del.delete()
messages.success(request, "Le txt a été supprimé") messages.success(request, _("The TXT record was deleted."))
except ProtectedError: except ProtectedError:
messages.error( messages.error(
request, request,
("Erreur le Txt suivant %s ne peut être supprimé" (_("Error: the TXT record %s can't be deleted.") % txt_del)
% txt_del)
) )
return redirect(reverse('machines:index-extension')) return redirect(reverse('machines:index-extension'))
return form( return form(
{'txtform': txt, 'action_name': 'Supprimer'}, {'txtform': txt, 'action_name': _("Delete")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -1016,10 +1011,10 @@ def add_srv(request):
srv = SrvForm(request.POST or None) srv = SrvForm(request.POST or None)
if srv.is_valid(): if srv.is_valid():
srv.save() srv.save()
messages.success(request, "Cet enregistrement srv a été ajouté") messages.success(request, _("The SRV record was created."))
return redirect(reverse('machines:index-extension')) return redirect(reverse('machines:index-extension'))
return form( return form(
{'srvform': srv, 'action_name': 'Créer'}, {'srvform': srv, 'action_name': _("Create an SRV record")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -1033,10 +1028,10 @@ def edit_srv(request, srv_instance, **_kwargs):
if srv.is_valid(): if srv.is_valid():
if srv.changed_data: if srv.changed_data:
srv.save() srv.save()
messages.success(request, "Srv modifié") messages.success(request, _("The SRV record was edited."))
return redirect(reverse('machines:index-extension')) return redirect(reverse('machines:1index-extension'))
return form( return form(
{'srvform': srv, 'action_name': 'Editer'}, {'srvform': srv, 'action_name': _("Edit")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -1052,16 +1047,15 @@ def del_srv(request, instances):
for srv_del in srv_dels: for srv_del in srv_dels:
try: try:
srv_del.delete() srv_del.delete()
messages.success(request, "L'srv a été supprimée") messages.success(request, _("The SRV record was deleted."))
except ProtectedError: except ProtectedError:
messages.error( messages.error(
request, request,
("Erreur le Srv suivant %s ne peut être supprimé" (_("Error: the SRV record %s can't be deleted.") % srv_del)
% srv_del)
) )
return redirect(reverse('machines:index-extension')) return redirect(reverse('machines:index-extension'))
return form( return form(
{'srvform': srv, 'action_name': 'Supprimer'}, {'srvform': srv, 'action_name': _("Delete")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -1077,13 +1071,13 @@ def add_alias(request, interface, interfaceid):
alias = alias.save(commit=False) alias = alias.save(commit=False)
alias.cname = interface.domain alias.cname = interface.domain
alias.save() alias.save()
messages.success(request, "Cet alias a été ajouté") messages.success(request, _("The alias was created."))
return redirect(reverse( return redirect(reverse(
'machines:index-alias', 'machines:index-alias',
kwargs={'interfaceid': str(interfaceid)} kwargs={'interfaceid': str(interfaceid)}
)) ))
return form( return form(
{'aliasform': alias, 'action_name': 'Créer'}, {'aliasform': alias, 'action_name': _("Create an alias")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -1101,7 +1095,7 @@ def edit_alias(request, domain_instance, **_kwargs):
if alias.is_valid(): if alias.is_valid():
if alias.changed_data: if alias.changed_data:
domain_instance = alias.save() domain_instance = alias.save()
messages.success(request, "Alias modifié") messages.success(request, _("The alias was edited."))
return redirect(reverse( return redirect(reverse(
'machines:index-alias', 'machines:index-alias',
kwargs={ kwargs={
@ -1109,7 +1103,7 @@ def edit_alias(request, domain_instance, **_kwargs):
} }
)) ))
return form( return form(
{'aliasform': alias, 'action_name': 'Editer'}, {'aliasform': alias, 'action_name': _("Edit")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -1127,20 +1121,19 @@ def del_alias(request, interface, interfaceid):
alias_del.delete() alias_del.delete()
messages.success( messages.success(
request, request,
"L'alias %s a été supprimé" % alias_del _("The alias %s was deleted.") % alias_del
) )
except ProtectedError: except ProtectedError:
messages.error( messages.error(
request, request,
("Erreur l'alias suivant %s ne peut être supprimé" (_("Error: the alias %s can't be deleted.") % alias_del)
% alias_del)
) )
return redirect(reverse( return redirect(reverse(
'machines:index-alias', 'machines:index-alias',
kwargs={'interfaceid': str(interfaceid)} kwargs={'interfaceid': str(interfaceid)}
)) ))
return form( return form(
{'aliasform': alias, 'action_name': 'Supprimer'}, {'aliasform': alias, 'action_name': _("Delete")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -1153,10 +1146,10 @@ def add_role(request):
role = RoleForm(request.POST or None) role = RoleForm(request.POST or None)
if role.is_valid(): if role.is_valid():
role.save() role.save()
messages.success(request, "Cet enregistrement role a été ajouté") messages.success(request, _("The role was created."))
return redirect(reverse('machines:index-role')) return redirect(reverse('machines:index-role'))
return form( return form(
{'roleform': role, 'action_name': 'Créer'}, {'roleform': role, 'action_name': _("Create a role")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -1170,10 +1163,10 @@ def edit_role(request, role_instance, **_kwargs):
if role.is_valid(): if role.is_valid():
if role.changed_data: if role.changed_data:
role.save() role.save()
messages.success(request, _("Role updated")) messages.success(request, _("The role was edited."))
return redirect(reverse('machines:index-role')) return redirect(reverse('machines:index-role'))
return form( return form(
{'roleform': role, 'action_name': _('Edit')}, {'roleform': role, 'action_name': _("Edit")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -1189,17 +1182,15 @@ def del_role(request, instances):
for role_del in role_dels: for role_del in role_dels:
try: try:
role_del.delete() role_del.delete()
messages.success(request, _("The role has been deleted.")) messages.success(request, _("The role was deleted."))
except ProtectedError: except ProtectedError:
messages.error( messages.error(
request, request,
(_("Error: The following role cannot be deleted: %(role)") (_("Error: the role %s can't be deleted.") % role_del)
% {'role': role_del}
)
) )
return redirect(reverse('machines:index-role')) return redirect(reverse('machines:index-role'))
return form( return form(
{'roleform': role, 'action_name': _('Delete')}, {'roleform': role, 'action_name': _("Delete")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -1212,10 +1203,10 @@ def add_service(request):
service = ServiceForm(request.POST or None) service = ServiceForm(request.POST or None)
if service.is_valid(): if service.is_valid():
service.save() service.save()
messages.success(request, "Cet enregistrement service a été ajouté") messages.success(request, _("The service was created."))
return redirect(reverse('machines:index-service')) return redirect(reverse('machines:index-service'))
return form( return form(
{'serviceform': service, 'action_name': 'Créer'}, {'serviceform': service, 'action_name': _("Create a service")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -1229,10 +1220,10 @@ def edit_service(request, service_instance, **_kwargs):
if service.is_valid(): if service.is_valid():
if service.changed_data: if service.changed_data:
service.save() service.save()
messages.success(request, "Service modifié") messages.success(request, _("The service was edited."))
return redirect(reverse('machines:index-service')) return redirect(reverse('machines:index-service'))
return form( return form(
{'serviceform': service, 'action_name': 'Editer'}, {'serviceform': service, 'action_name': _("Edit")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -1248,16 +1239,15 @@ def del_service(request, instances):
for service_del in service_dels: for service_del in service_dels:
try: try:
service_del.delete() service_del.delete()
messages.success(request, "Le service a été supprimée") messages.success(request, _("The service was deleted."))
except ProtectedError: except ProtectedError:
messages.error( messages.error(
request, request,
("Erreur le service suivant %s ne peut être supprimé" (_("Error: the service %s can't be deleted.") % service_del)
% service_del)
) )
return redirect(reverse('machines:index-service')) return redirect(reverse('machines:index-service'))
return form( return form(
{'serviceform': service, 'action_name': 'Supprimer'}, {'serviceform': service, 'action_name': _("Delete")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -1279,10 +1269,10 @@ def add_vlan(request):
vlan = VlanForm(request.POST or None) vlan = VlanForm(request.POST or None)
if vlan.is_valid(): if vlan.is_valid():
vlan.save() vlan.save()
messages.success(request, "Cet enregistrement vlan a été ajouté") messages.success(request, _("The VLAN was created."))
return redirect(reverse('machines:index-vlan')) return redirect(reverse('machines:index-vlan'))
return form( return form(
{'vlanform': vlan, 'action_name': 'Créer'}, {'vlanform': vlan, 'action_name': _("Create a VLAN")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -1296,10 +1286,10 @@ def edit_vlan(request, vlan_instance, **_kwargs):
if vlan.is_valid(): if vlan.is_valid():
if vlan.changed_data: if vlan.changed_data:
vlan.save() vlan.save()
messages.success(request, "Vlan modifié") messages.success(request, _("The VLAN was edited."))
return redirect(reverse('machines:index-vlan')) return redirect(reverse('machines:index-vlan'))
return form( return form(
{'vlanform': vlan, 'action_name': 'Editer'}, {'vlanform': vlan, 'action_name': _("Edit")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -1315,16 +1305,15 @@ def del_vlan(request, instances):
for vlan_del in vlan_dels: for vlan_del in vlan_dels:
try: try:
vlan_del.delete() vlan_del.delete()
messages.success(request, "Le vlan a été supprimée") messages.success(request, _("The VLAN was deleted."))
except ProtectedError: except ProtectedError:
messages.error( messages.error(
request, request,
("Erreur le Vlan suivant %s ne peut être supprimé" (_("Error: the VLAN %s can't be deleted.") % vlan_del)
% vlan_del)
) )
return redirect(reverse('machines:index-vlan')) return redirect(reverse('machines:index-vlan'))
return form( return form(
{'vlanform': vlan, 'action_name': 'Supprimer'}, {'vlanform': vlan, 'action_name': _("Delete")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -1337,10 +1326,10 @@ def add_nas(request):
nas = NasForm(request.POST or None) nas = NasForm(request.POST or None)
if nas.is_valid(): if nas.is_valid():
nas.save() nas.save()
messages.success(request, "Cet enregistrement nas a été ajouté") messages.success(request, _("The NAS device was created."))
return redirect(reverse('machines:index-nas')) return redirect(reverse('machines:index-nas'))
return form( return form(
{'nasform': nas, 'action_name': 'Créer'}, {'nasform': nas, 'action_name': _("Create a NAS device")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -1354,10 +1343,10 @@ def edit_nas(request, nas_instance, **_kwargs):
if nas.is_valid(): if nas.is_valid():
if nas.changed_data: if nas.changed_data:
nas.save() nas.save()
messages.success(request, "Nas modifié") messages.success(request, _("The NAS device was edited."))
return redirect(reverse('machines:index-nas')) return redirect(reverse('machines:index-nas'))
return form( return form(
{'nasform': nas, 'action_name': 'Editer'}, {'nasform': nas, 'action_name': _("Edit")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -1373,16 +1362,15 @@ def del_nas(request, instances):
for nas_del in nas_dels: for nas_del in nas_dels:
try: try:
nas_del.delete() nas_del.delete()
messages.success(request, "Le nas a été supprimé") messages.success(request, _("The NAS device was deleted."))
except ProtectedError: except ProtectedError:
messages.error( messages.error(
request, request,
("Erreur le Nas suivant %s ne peut être supprimé" (_("Error: the NAS device %s can't be deleted.") % nas_del)
% nas_del)
) )
return redirect(reverse('machines:index-nas')) return redirect(reverse('machines:index-nas'))
return form( return form(
{'nasform': nas, 'action_name': 'Supprimer'}, {'nasform': nas, 'action_name': _("Delete")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -1634,7 +1622,7 @@ def edit_portlist(request, ouvertureportlist_instance, **_kwargs):
for port in instances: for port in instances:
port.port_list = pl port.port_list = pl
port.save() port.save()
messages.success(request, "Liste de ports modifiée") messages.success(request, _("The ports list was edited."))
return redirect(reverse('machines:index-portlist')) return redirect(reverse('machines:index-portlist'))
return form( return form(
{'port_list': port_list, 'ports': port_formset}, {'port_list': port_list, 'ports': port_formset},
@ -1648,7 +1636,7 @@ def edit_portlist(request, ouvertureportlist_instance, **_kwargs):
def del_portlist(request, port_list_instance, **_kwargs): def del_portlist(request, port_list_instance, **_kwargs):
""" View used to delete a port policy """ """ View used to delete a port policy """
port_list_instance.delete() port_list_instance.delete()
messages.success(request, "La liste de ports a été supprimée") messages.success(request, _("The ports list was deleted."))
return redirect(reverse('machines:index-portlist')) return redirect(reverse('machines:index-portlist'))
@ -1673,7 +1661,7 @@ def add_portlist(request):
for port in instances: for port in instances:
port.port_list = pl port.port_list = pl
port.save() port.save()
messages.success(request, "Liste de ports créée") messages.success(request, _("The ports list was created."))
return redirect(reverse('machines:index-portlist')) return redirect(reverse('machines:index-portlist'))
return form( return form(
{'port_list': port_list, 'ports': port_formset}, {'port_list': port_list, 'ports': port_formset},
@ -1691,8 +1679,8 @@ def configure_ports(request, interface_instance, **_kwargs):
if not interface_instance.may_have_port_open(): if not interface_instance.may_have_port_open():
messages.error( messages.error(
request, request,
("Attention, l'ipv4 n'est pas publique, l'ouverture n'aura pas " (_("Warning: the IPv4 isn't public, the opening won't have effect"
"d'effet en v4") " in v4."))
) )
interface = EditOuverturePortConfigForm( interface = EditOuverturePortConfigForm(
request.POST or None, request.POST or None,
@ -1701,10 +1689,11 @@ def configure_ports(request, interface_instance, **_kwargs):
if interface.is_valid(): if interface.is_valid():
if interface.changed_data: if interface.changed_data:
interface.save() interface.save()
messages.success(request, "Configuration des ports mise à jour.") messages.success(request, _("The ports configuration was edited."))
return redirect(reverse('machines:index')) return redirect(reverse('machines:index'))
return form( return form(
{'interfaceform': interface, 'action_name': 'Editer la configuration'}, {'interfaceform': interface, 'action_name': _("Edit the"
" configuration")},
'machines/machine.html', 'machines/machine.html',
request request
) )
@ -1950,3 +1939,4 @@ def regen_achieved(request):
if obj: if obj:
obj.first().done_regen() obj.first().done_regen()
return HttpResponse("Ok") return HttpResponse("Ok")

View file

@ -25,6 +25,7 @@
Here are defined some functions to check acl on the application. Here are defined some functions to check acl on the application.
""" """
from django.utils.translation import ugettext as _
def can_view(user): def can_view(user):
@ -38,4 +39,6 @@ def can_view(user):
viewing is granted and msg is a message (can be None). viewing is granted and msg is a message (can be None).
""" """
can = user.has_module_perms('preferences') can = user.has_module_perms('preferences')
return can, None if can else "Vous ne pouvez pas voir cette application." return can, None if can else _("You don't have the right to view this"
" application.")

View file

@ -27,7 +27,7 @@ from __future__ import unicode_literals
from django.forms import ModelForm, Form from django.forms import ModelForm, Form
from django import forms from django import forms
from django.utils.translation import ugettext_lazy as _
from re2o.mixins import FormRevMixin from re2o.mixins import FormRevMixin
from .models import ( from .models import (
OptionalUser, OptionalUser,
@ -56,9 +56,13 @@ class EditOptionalUserForm(ModelForm):
**kwargs **kwargs
) )
self.fields['is_tel_mandatory'].label = ( self.fields['is_tel_mandatory'].label = (
'Exiger un numéro de téléphone' _("Telephone number required")
) )
self.fields['self_adhesion'].label = 'Auto inscription' self.fields['gpg_fingerprint'].label = _("GPG fingerprint")
self.fields['all_can_create_club'].label = _("All can create a club")
self.fields['all_can_create_adherent'].label = _("All can create a member")
self.fields['self_adhesion'].label = _("Self registration")
self.fields['shell_default'].label = _("Default shell")
class EditOptionalMachineForm(ModelForm): class EditOptionalMachineForm(ModelForm):
@ -74,12 +78,17 @@ class EditOptionalMachineForm(ModelForm):
prefix=prefix, prefix=prefix,
**kwargs **kwargs
) )
self.fields['password_machine'].label = "Possibilité d'attribuer\ self.fields['password_machine'].label = _("Possibility to set a"
un mot de passe par interface" " password per machine")
self.fields['max_lambdauser_interfaces'].label = "Maximum\ self.fields['max_lambdauser_interfaces'].label = _("Maximum number of"
d'interfaces autorisées pour un user normal" " interfaces"
self.fields['max_lambdauser_aliases'].label = "Maximum d'alias\ " allowed for a"
dns autorisés pour un user normal" " standard user")
self.fields['max_lambdauser_aliases'].label = _("Maximum number of DNS"
" aliases allowed for"
" a standard user")
self.fields['ipv6_mode'].label = _("IPv6 mode")
self.fields['create_machine'].label = _("Can create a machine")
class EditOptionalTopologieForm(ModelForm): class EditOptionalTopologieForm(ModelForm):
@ -95,10 +104,11 @@ class EditOptionalTopologieForm(ModelForm):
prefix=prefix, prefix=prefix,
**kwargs **kwargs
) )
self.fields['vlan_decision_ok'].label = "Vlan où placer les\ self.fields['radius_general_policy'].label = _("RADIUS general policy")
machines après acceptation RADIUS" self.fields['vlan_decision_ok'].label = _("VLAN for machines accepted"
self.fields['vlan_decision_nok'].label = "Vlan où placer les\ " by RADIUS")
machines après rejet RADIUS" self.fields['vlan_decision_nok'].label = _("VLAN for machines rejected"
" by RADIUS")
class EditGeneralOptionForm(ModelForm): class EditGeneralOptionForm(ModelForm):
@ -114,18 +124,25 @@ class EditGeneralOptionForm(ModelForm):
prefix=prefix, prefix=prefix,
**kwargs **kwargs
) )
self.fields['search_display_page'].label = 'Resultats\ self.fields['general_message'].label = _("General message")
affichés dans une recherche' self.fields['search_display_page'].label = _("Number of results"
self.fields['pagination_number'].label = 'Items par page,\ " displayed when"
taille normale (ex users)' " searching")
self.fields['pagination_large_number'].label = 'Items par page,\ self.fields['pagination_number'].label = _("Number of items per page,"
taille élevée (machines)' " standard size (e.g."
self.fields['req_expire_hrs'].label = 'Temps avant expiration du lien\ " users)")
de reinitialisation de mot de passe (en heures)' self.fields['pagination_large_number'].label = _("Number of items per"
self.fields['site_name'].label = 'Nom du site web' " page, large size"
self.fields['email_from'].label = "Adresse mail d\ " (e.g. machines)")
'expedition automatique" self.fields['req_expire_hrs'].label = _("Time before expiration of the"
self.fields['GTU_sum_up'].label = "Résumé des CGU" " reset password link (in"
" hours)")
self.fields['site_name'].label = _("Website name")
self.fields['email_from'].label = _("Email address for automatic"
" emailing")
self.fields['GTU_sum_up'].label = _("Summary of the General Terms of"
" Use")
self.fields['GTU'].label = _("General Terms of Use")
class EditAssoOptionForm(ModelForm): class EditAssoOptionForm(ModelForm):
@ -141,15 +158,19 @@ class EditAssoOptionForm(ModelForm):
prefix=prefix, prefix=prefix,
**kwargs **kwargs
) )
self.fields['name'].label = 'Nom de l\'asso' self.fields['name'].label = _("Organisation name")
self.fields['siret'].label = 'SIRET' self.fields['siret'].label = _("SIRET number")
self.fields['adresse1'].label = 'Adresse (ligne 1)' self.fields['adresse1'].label = _("Address (line 1)")
self.fields['adresse2'].label = 'Adresse (ligne 2)' self.fields['adresse2'].label = _("Address (line 2)")
self.fields['contact'].label = 'Email de contact' self.fields['contact'].label = _("Contact email address")
self.fields['telephone'].label = 'Numéro de téléphone' self.fields['telephone'].label = _("Telephone number")
self.fields['pseudo'].label = 'Pseudo d\'usage' self.fields['pseudo'].label = _("Usual name")
self.fields['utilisateur_asso'].label = 'Compte utilisé pour\ self.fields['utilisateur_asso'].label = _("Account used for editing"
faire les modifications depuis /admin' " from /admin")
self.fields['payment'].label = _("Payment")
self.fields['payment_id'].label = _("Payment ID")
self.fields['payment_pass'].label = _("Payment password")
self.fields['description'].label = _("Description")
class EditMailMessageOptionForm(ModelForm): class EditMailMessageOptionForm(ModelForm):
@ -165,10 +186,10 @@ class EditMailMessageOptionForm(ModelForm):
prefix=prefix, prefix=prefix,
**kwargs **kwargs
) )
self.fields['welcome_mail_fr'].label = 'Message dans le\ self.fields['welcome_mail_fr'].label = _("Message for the French"
mail de bienvenue en français' " welcome email")
self.fields['welcome_mail_en'].label = 'Message dans le\ self.fields['welcome_mail_en'].label = _("Message for the English"
mail de bienvenue en anglais' " welcome email")
class EditHomeOptionForm(ModelForm): class EditHomeOptionForm(ModelForm):
@ -184,6 +205,9 @@ class EditHomeOptionForm(ModelForm):
prefix=prefix, prefix=prefix,
**kwargs **kwargs
) )
self.fields['facebook_url'].label = _("Facebook URL")
self.fields['twitter_url'].label = _("Twitter URL")
self.fields['twitter_account_name'].label = _("Twitter account name")
class ServiceForm(ModelForm): class ServiceForm(ModelForm):
@ -195,13 +219,17 @@ class ServiceForm(ModelForm):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
prefix = kwargs.pop('prefix', self.Meta.model.__name__) prefix = kwargs.pop('prefix', self.Meta.model.__name__)
super(ServiceForm, self).__init__(*args, prefix=prefix, **kwargs) super(ServiceForm, self).__init__(*args, prefix=prefix, **kwargs)
self.fields['name'].label = _("Name")
self.fields['url'].label = _("URL")
self.fields['description'].label = _("Description")
self.fields['image'].label = _("Image")
class DelServiceForm(Form): class DelServiceForm(Form):
"""Suppression de services sur la page d'accueil""" """Suppression de services sur la page d'accueil"""
services = forms.ModelMultipleChoiceField( services = forms.ModelMultipleChoiceField(
queryset=Service.objects.none(), queryset=Service.objects.none(),
label="Enregistrements service actuels", label=_("Current services"),
widget=forms.CheckboxSelectMultiple widget=forms.CheckboxSelectMultiple
) )
@ -239,3 +267,4 @@ class DelMailContactForm(Form):
self.fields['mailcontacts'].queryset = instances self.fields['mailcontacts'].queryset = instances
else: else:
self.fields['mailcontacts'].queryset = MailContact.objects.all() self.fields['mailcontacts'].queryset = MailContact.objects.all()

View file

@ -1,70 +1,609 @@
# SOME DESCRIPTIVE TITLE. # Re2o est un logiciel d'administration développé initiallement au rezometz. Il
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # se veut agnostique au réseau considéré, de manière à être installable en
# This file is distributed under the same license as the PACKAGE package. # quelques clics.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
# #
#, fuzzy # Copyright © 2018 Maël Kervella
#
# 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.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: 2.5\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-07-26 21:49+0200\n" "POT-Creation-Date: 2018-08-18 13:26+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: 2018-06-24 15:54+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: Laouen Fernet <laouen.fernet@supelec.fr>\n"
"Language: \n" "Language-Team: \n"
"Language: fr_FR\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: models.py:256 #: acl.py:42
msgid "Contact email adress" msgid "You don't have the right to view this application."
msgstr "Adresse email de contact" msgstr "Vous n'avez pas le droit de voir cette application."
#: models.py:263 #: forms.py:59 templates/preferences/display_preferences.html:41
msgid "Description of the associated email adress." msgid "Telephone number required"
msgstr "Numéro de téléphone requis"
#: forms.py:61
msgid "GPG fingerprint"
msgstr "Empreinte GPG"
#: forms.py:62
msgid "All can create a club"
msgstr "Tous peuvent créer un club"
#: forms.py:63
msgid "All can create a member"
msgstr "Tous peuvent créer un adhérent"
#: forms.py:64 templates/preferences/display_preferences.html:43
msgid "Self registration"
msgstr "Autoinscription"
#: forms.py:65
msgid "Default shell"
msgstr "Interface système par défaut"
#: forms.py:81
msgid "Possibility to set a password per machine"
msgstr "Possibilité de mettre un mot de passe par machine"
#: forms.py:83 templates/preferences/display_preferences.html:87
msgid "Maximum number of interfaces allowed for a standard user"
msgstr "Nombre maximum d'interfaces autorisé pour un utilisateur standard"
#: forms.py:87 templates/preferences/display_preferences.html:91
msgid "Maximum number of DNS aliases allowed for a standard user"
msgstr "Nombre maximum d'alias DNS autorisé pour un utilisateur standard"
#: forms.py:90
msgid "IPv6 mode"
msgstr "Mode IPv6"
#: forms.py:91
msgid "Can create a machine"
msgstr "Peut créer une machine"
#: forms.py:107
msgid "RADIUS general policy"
msgstr "Politique générale de RADIUS"
#: forms.py:108 templates/preferences/display_preferences.html:116
msgid "VLAN for machines accepted by RADIUS"
msgstr "VLAN pour les machines acceptées par RADIUS"
#: forms.py:110 templates/preferences/display_preferences.html:118
msgid "VLAN for machines rejected by RADIUS"
msgstr "VLAN pour les machines rejetées par RADIUS"
#: forms.py:127
msgid "General message"
msgstr "Message général"
#: forms.py:128 templates/preferences/display_preferences.html:137
msgid "Number of results displayed when searching"
msgstr "Nombre de résultats affichés lors de la recherche"
#: forms.py:131
msgid "Number of items per page, standard size (e.g. users)"
msgstr "Nombre d'éléments par page, taille standard (ex : utilisateurs)"
#: forms.py:134
msgid "Number of items per page, large size (e.g. machines)"
msgstr "Nombre d'éléments par page, taille importante (ex : machines)"
#: forms.py:137 templates/preferences/display_preferences.html:145
msgid "Time before expiration of the reset password link (in hours)"
msgstr ""
"Temps avant expiration du lien de réinitialisation de mot de passe (en "
"heures)"
#: forms.py:140 templates/preferences/display_preferences.html:131
msgid "Website name"
msgstr "Nom du site"
#: forms.py:141 templates/preferences/display_preferences.html:133
msgid "Email address for automatic emailing"
msgstr "Adresse mail pour les mails automatiques"
#: forms.py:143 templates/preferences/display_preferences.html:151
msgid "Summary of the General Terms of Use"
msgstr "Résumé des Conditions Générales d'Utilisation"
#: forms.py:145 templates/preferences/display_preferences.html:155
msgid "General Terms of Use"
msgstr "Conditions Générales d'Utilisation"
#: forms.py:161
msgid "Organisation name"
msgstr "Nom de l'association"
#: forms.py:162 templates/preferences/display_preferences.html:170
msgid "SIRET number"
msgstr "Numéro SIRET"
#: forms.py:163
msgid "Address (line 1)"
msgstr "Adresse (ligne 1)"
#: forms.py:164
msgid "Address (line 2)"
msgstr "Adresse (ligne 2)"
#: forms.py:165 models.py:288
#: templates/preferences/display_preferences.html:178
msgid "Contact email address"
msgstr "Adresse mail de contact"
#: forms.py:166 templates/preferences/display_preferences.html:182
msgid "Telephone number"
msgstr "Numéro de téléphone"
#: forms.py:167 templates/preferences/display_preferences.html:184
msgid "Usual name"
msgstr "Nom d'usage"
#: forms.py:168
msgid "Account used for editing from /admin"
msgstr "Compte utilisé pour les modifications depuis /admin"
#: forms.py:170
msgid "Payment"
msgstr "Paiement"
#: forms.py:171
msgid "Payment ID"
msgstr "ID de paiement"
#: forms.py:172
msgid "Payment password"
msgstr "Mot de passe de paiement"
#: forms.py:173 forms.py:224 templates/preferences/aff_service.html:33
msgid "Description"
msgstr "Description"
#: forms.py:189
msgid "Message for the French welcome email"
msgstr "Message pour le mail de bienvenue en français"
#: forms.py:191
msgid "Message for the English welcome email"
msgstr "Message pour le mail de bienvenue en anglais"
#: forms.py:208
msgid "Facebook URL"
msgstr "URL du compte Facebook"
#: forms.py:209
msgid "Twitter URL"
msgstr "URL du compte Twitter"
#: forms.py:210 templates/preferences/display_preferences.html:233
msgid "Twitter account name"
msgstr "Nom du compte Twitter"
#: forms.py:222 templates/preferences/aff_service.html:31
#: templates/preferences/display_preferences.html:168
msgid "Name"
msgstr "Nom"
#: forms.py:223 templates/preferences/aff_service.html:32
msgid "URL"
msgstr "URL"
#: forms.py:225 templates/preferences/aff_service.html:34
msgid "Image"
msgstr "Image"
#: forms.py:232
msgid "Current services"
msgstr "Services actuels"
#: models.py:71
msgid "Users can create a club"
msgstr "Les utilisateurs peuvent créer un club"
#: models.py:75
msgid "Users can create a member"
msgstr "Les utilisateurs peuvent créer un adhérent"
#: models.py:79
msgid "A new user can create their account on Re2o"
msgstr "Un nouvel utilisateur peut créer son compte sur Re2o"
#: models.py:89 templates/preferences/display_preferences.html:49
msgid "Users can edit their shell"
msgstr "Les utilisateurs peuvent modifier leur interface système"
#: models.py:93
msgid "Enable local email accounts for users"
msgstr "Active les comptes mail locaux pour les utilisateurs"
#: models.py:98
msgid "Domain to use for local email accounts"
msgstr "Domaine à utiliser pour les comptes mail locaux"
#: models.py:102
msgid "Maximum number of local email addresses for a standard user"
msgstr ""
"Nombre maximum d'adresses mail locales autorisé pour un utilisateur standard"
#: models.py:108
msgid "Can view the user options"
msgstr "Peut voir les options d'utilisateur"
#: models.py:110
msgid "user options"
msgstr "options d'utilisateur"
#: models.py:117
msgid "Email domain must begin with @"
msgstr "Un domaine mail doit commencer par @"
#: models.py:135
msgid "Autoconfiguration by RA"
msgstr "Configuration automatique par RA"
#: models.py:136
msgid "IP addresses assigning by DHCPv6"
msgstr "Attribution d'adresses IP par DHCPv6"
#: models.py:137
msgid "Disabled"
msgstr "Désactivé"
#: models.py:159
msgid "Can view the machine options"
msgstr "Peut voir les options de machine"
#: models.py:161
msgid "machine options"
msgstr "options de machine"
#: models.py:180
msgid "On the IP range's VLAN of the machine"
msgstr "Sur le VLAN de la plage d'IP de la machine"
#: models.py:181
msgid "Preset in 'VLAN for machines accepted by RADIUS'"
msgstr "Prédéfinie dans 'VLAN pour les machines acceptées par RADIUS'"
#: models.py:206
msgid "Can view the topology options"
msgstr "Peut voir les options de topologie"
#: models.py:208
msgid "topology options"
msgstr "options de topologie"
#: models.py:225
msgid ""
"General message displayed on the French version of the website (e.g. in case "
"of maintenance)"
msgstr ""
"Message général affiché sur la version française du site (ex : en cas de "
"maintenance)"
#: models.py:231
msgid ""
"General message displayed on the English version of the website (e.g. in "
"case of maintenance)"
msgstr ""
"Message général affiché sur la version anglaise du site (ex : en cas de "
"maintenance)"
#: models.py:253
msgid "Can view the general options"
msgstr "Peut voir les options générales"
#: models.py:255
msgid "general options"
msgstr "options générales"
#: models.py:275
msgid "Can view the service options"
msgstr "Peut voir les options de service"
#: models.py:277
msgid "service"
msgstr "service"
#: models.py:278
msgid "services"
msgstr "services"
#: models.py:295
msgid "Description of the associated email address."
msgstr "Description de l'adresse mail associée." msgstr "Description de l'adresse mail associée."
#: models.py:273 #: models.py:305
msgid "Can see contact email" msgid "Can view a contact email address object"
msgstr "Peut voir un mail de contact" msgstr "Peut voir un objet adresse mail de contact"
#: templates/preferences/aff_mailcontact.html:30 #: models.py:307
msgid "Adress" msgid "contact email address"
msgstr "Adresse" msgstr "adresse mail de contact"
#: models.py:308
msgid "contact email addresses"
msgstr "adresses mail de contact"
#: models.py:318
msgid "Networking organisation school Something"
msgstr "Association de réseau de l'école Machin"
#: models.py:322
msgid "Threadneedle Street"
msgstr "1 rue de la Vrillière"
#: models.py:323
msgid "London EC2R 8AH"
msgstr "75001 Paris"
#: models.py:326
msgid "Organisation"
msgstr "Association"
#: models.py:340
msgid "Can view the organisation options"
msgstr "Peut voir les options d'association"
#: models.py:342
msgid "organisation options"
msgstr "options d'association"
#: models.py:371
msgid "Can view the homepage options"
msgstr "Peut voir les options de page d'accueil"
#: models.py:373
msgid "homepage options"
msgstr "options de page d'accueil"
#: models.py:391
msgid "Can view the email message options"
msgstr "Peut voir les options de message pour les mails"
#: models.py:394
msgid "email message options"
msgstr "options de messages pour les mails"
#: templates/preferences/aff_mailcontact.html:31 #: templates/preferences/aff_mailcontact.html:31
msgid "Remark" #: templates/preferences/display_preferences.html:174
msgid "Address"
msgstr "Adresse"
#: templates/preferences/aff_mailcontact.html:32
msgid "Comment"
msgstr "Commentaire" msgstr "Commentaire"
#: templates/preferences/display_preferences.html:205 #: templates/preferences/display_preferences.html:31
msgid "Contact email adresses list" #: templates/preferences/edit_preferences.html:30
msgstr "Liste des adresses email de contact" #: templates/preferences/preferences.html:29
msgid "Preferences"
msgstr "Préférences"
#: templates/preferences/display_preferences.html:34
msgid "User preferences"
msgstr "Préférences d'utilisateur"
#: templates/preferences/display_preferences.html:37
#: templates/preferences/display_preferences.html:79
#: templates/preferences/display_preferences.html:104
#: templates/preferences/display_preferences.html:125
#: templates/preferences/display_preferences.html:162
#: templates/preferences/display_preferences.html:197
#: templates/preferences/display_preferences.html:219
#: templates/preferences/edit_preferences.html:40 views.py:170 views.py:234
msgid "Edit"
msgstr "Modifier"
#: templates/preferences/display_preferences.html:47
msgid "Default shell for users"
msgstr "Interface système par défaut pour les utilisateurs"
#: templates/preferences/display_preferences.html:53
msgid "Creation of members by everyone"
msgstr "Création d'adhérents par tous"
#: templates/preferences/display_preferences.html:55
msgid "Creation of clubs by everyone"
msgstr "Création de clubs par tous"
#: templates/preferences/display_preferences.html:59
msgid "GPG fingerprint field"
msgstr "Champ empreinte GPG"
#: templates/preferences/display_preferences.html:63
msgid "Email accounts preferences"
msgstr "Préférences de comptes mail"
#: templates/preferences/display_preferences.html:66
msgid "Local email accounts enabled"
msgstr "Comptes mail locaux activés"
#: templates/preferences/display_preferences.html:68
msgid "Local email domain"
msgstr "Domaine de mail local"
#: templates/preferences/display_preferences.html:72
msgid "Maximum number of email aliases allowed"
msgstr "Nombre maximum d'alias mail autorisé pour un utilisateur standard"
#: templates/preferences/display_preferences.html:76
msgid "Machines preferences"
msgstr "Préférences de machines"
#: templates/preferences/display_preferences.html:85
msgid "Password per machine"
msgstr "Mot de passe par machine"
#: templates/preferences/display_preferences.html:93
msgid "IPv6 support"
msgstr "Support de l'IPv6"
#: templates/preferences/display_preferences.html:97
msgid "Creation of machines"
msgstr "Création de machines"
#: templates/preferences/display_preferences.html:101
msgid "Topology preferences"
msgstr "Préférences de topologie"
#: templates/preferences/display_preferences.html:110
msgid "General policy for VLAN setting"
msgstr "Politique générale pour le placement sur un VLAN"
#: templates/preferences/display_preferences.html:112
msgid ""
"This setting defines the VLAN policy after acceptance by RADIUS: either on "
"the IP range's VLAN of the machine, or a VLAN preset in 'VLAN for machines "
"accepted by RADIUS'"
msgstr ""
"Ce réglage définit la politique de placement sur un VLAN après acceptation "
"par RADIUS: soit sur le VLAN de la plage d'IP de la machine, soit sur le "
"VLAN prédéfini dans 'VLAN pour les machines acceptées par RADIUS'"
#: templates/preferences/display_preferences.html:122
msgid "General preferences"
msgstr "Préférences générales"
#: templates/preferences/display_preferences.html:139
msgid "Number of items per page (standard size)"
msgstr "Nombre d'éléments par page (taille standard)"
#: templates/preferences/display_preferences.html:143
msgid "Number of items per page (large size)"
msgstr "Nombre d'éléments par page (taille importante)"
#: templates/preferences/display_preferences.html:149
msgid "General message displayed on the website"
msgstr "Message général affiché sur le site"
#: templates/preferences/display_preferences.html:159
msgid "Information about the organisation"
msgstr "Informations sur l'association"
#: templates/preferences/display_preferences.html:188
msgid "User object of the organisation"
msgstr "Objet utilisateur de l'association"
#: templates/preferences/display_preferences.html:190
msgid "Description of the organisation"
msgstr "Description de l'association"
#: templates/preferences/display_preferences.html:194
msgid "Custom email message"
msgstr "Message personnalisé pour les mails"
#: templates/preferences/display_preferences.html:203
msgid "Welcome email (in French)"
msgstr "Mail de bienvenue (en français)"
#: templates/preferences/display_preferences.html:207 #: templates/preferences/display_preferences.html:207
msgid "Add an adress" msgid "Welcome email (in English)"
msgstr "Mail de bienvenue (en anglais)"
#: templates/preferences/display_preferences.html:211
msgid "List of services and homepage preferences"
msgstr "Liste des services et préférences de page d'accueil"
#: templates/preferences/display_preferences.html:213
msgid " Add a service"
msgstr " Ajouter un service"
#: templates/preferences/display_preferences.html:215
msgid " Delete one or several services"
msgstr " Supprimer un ou plusieurs services"
#: templates/preferences/display_preferences.html:221
msgid "List of contact email addresses"
msgstr "Liste des adresses mail de contact"
#: templates/preferences/display_preferences.html:223
msgid "Add an address"
msgstr "Ajouter une adresse" msgstr "Ajouter une adresse"
#: templates/preferences/display_preferences.html:209 #: templates/preferences/display_preferences.html:225
msgid "Delete one or multiple adresses" msgid "Delete one or several addresses"
msgstr "Supprimer une ou plusieurs adresses" msgstr " Supprimer une ou plusieurs adresses"
#: views.py:210 #: templates/preferences/display_preferences.html:231
msgid "The adress was created." msgid "Twitter account URL"
msgstr "L'adresse a été créée." msgstr "URL du compte Twitter"
#: views.py:230 #: templates/preferences/display_preferences.html:237
msgid "Email adress updated." msgid "Facebook account URL"
msgstr "L'adresse email a été mise à jour." msgstr "URL du compte Facebook"
#: views.py:233 #: templates/preferences/edit_preferences.html:35
msgid "Edit" msgid "Editing of preferences"
msgstr "Éditer" msgstr "Modification des préférences"
#: views.py:251 #: views.py:98
msgid "The email adress was deleted." msgid "Unknown object"
msgstr "L'adresse email a été supprimée." msgstr "Objet inconnu"
#: views.py:254 #: views.py:104
msgid "You don't have the right to edit this option."
msgstr "Vous n'avez pas le droit de modifier cette option."
#: views.py:121
msgid "The preferences were edited."
msgstr "Les préférences ont été modifiées."
#: views.py:140
msgid "The service was added."
msgstr "Le service a été ajouté."
#: views.py:143
msgid "Add a service"
msgstr " Ajouter un service"
#: views.py:167
msgid "The service was edited."
msgstr "Le service a été modifié."
#: views.py:188
msgid "The service was deleted."
msgstr "Le service a été supprimé."
#: views.py:190
#, python-format
msgid "Error: the service %s can't be deleted."
msgstr "Erreur : le service %s ne peut pas être supprimé."
#: views.py:194 views.py:256
msgid "Delete" msgid "Delete"
msgstr "Supprimer" msgstr "Supprimer"
#: views.py:210
msgid "The contact email address was created."
msgstr "L'adresse mail de contact a été supprimée."
#: views.py:214
msgid "Add a contact email address"
msgstr "Ajouter une adresse mail de contact"
#: views.py:231
msgid "The contact email address was edited."
msgstr "L'adresse mail de contact a été modifiée."
#: views.py:253
msgid "The contact email adress was deleted."
msgstr "L'adresse mail de contact a été supprimée."

View file

@ -0,0 +1,146 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.7 on 2018-08-18 11:29
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('preferences', '0049_optionaluser_self_change_shell'),
]
operations = [
migrations.AlterModelOptions(
name='assooption',
options={'permissions': (('view_assooption', 'Can view the organisation options'),), 'verbose_name': 'organisation options'},
),
migrations.AlterModelOptions(
name='generaloption',
options={'permissions': (('view_generaloption', 'Can view the general options'),), 'verbose_name': 'general options'},
),
migrations.AlterModelOptions(
name='homeoption',
options={'permissions': (('view_homeoption', 'Can view the homepage options'),), 'verbose_name': 'homepage options'},
),
migrations.AlterModelOptions(
name='mailcontact',
options={'permissions': (('view_mailcontact', 'Can view a contact email address object'),), 'verbose_name': 'contact email address', 'verbose_name_plural': 'contact email addresses'},
),
migrations.AlterModelOptions(
name='mailmessageoption',
options={'permissions': (('view_mailmessageoption', 'Can view the email message options'),), 'verbose_name': 'email message options'},
),
migrations.AlterModelOptions(
name='optionalmachine',
options={'permissions': (('view_optionalmachine', 'Can view the machine options'),), 'verbose_name': 'machine options'},
),
migrations.AlterModelOptions(
name='optionaltopologie',
options={'permissions': (('view_optionaltopologie', 'Can view the topology options'),), 'verbose_name': 'topology options'},
),
migrations.AlterModelOptions(
name='optionaluser',
options={'permissions': (('view_optionaluser', 'Can view the user options'),), 'verbose_name': 'user options'},
),
migrations.AlterModelOptions(
name='service',
options={'permissions': (('view_service', 'Can view the service options'),), 'verbose_name': 'service', 'verbose_name_plural': 'services'},
),
migrations.AlterField(
model_name='assooption',
name='adresse1',
field=models.CharField(default='Threadneedle Street', max_length=128),
),
migrations.AlterField(
model_name='assooption',
name='adresse2',
field=models.CharField(default='London EC2R 8AH', max_length=128),
),
migrations.AlterField(
model_name='assooption',
name='name',
field=models.CharField(default='Networking organisation school Something', max_length=256),
),
migrations.AlterField(
model_name='assooption',
name='pseudo',
field=models.CharField(default='Organisation', max_length=32),
),
migrations.AlterField(
model_name='generaloption',
name='general_message_en',
field=models.TextField(blank=True, default='', help_text='General message displayed on the English version of the website (e.g. in case of maintenance)'),
),
migrations.AlterField(
model_name='generaloption',
name='general_message_fr',
field=models.TextField(blank=True, default='', help_text='General message displayed on the French version of the website (e.g. in case of maintenance)'),
),
migrations.AlterField(
model_name='homeoption',
name='facebook_url',
field=models.URLField(blank=True, null=True),
),
migrations.AlterField(
model_name='homeoption',
name='twitter_account_name',
field=models.CharField(blank=True, max_length=32, null=True),
),
migrations.AlterField(
model_name='homeoption',
name='twitter_url',
field=models.URLField(blank=True, null=True),
),
migrations.AlterField(
model_name='mailcontact',
name='address',
field=models.EmailField(default='contact@example.org', help_text='Contact email address', max_length=254),
),
migrations.AlterField(
model_name='mailcontact',
name='commentary',
field=models.CharField(blank=True, help_text='Description of the associated email address.', max_length=256, null=True),
),
migrations.AlterField(
model_name='optionalmachine',
name='create_machine',
field=models.BooleanField(default=True),
),
migrations.AlterField(
model_name='optionalmachine',
name='ipv6_mode',
field=models.CharField(choices=[('SLAAC', 'Autoconfiguration by RA'), ('DHCPV6', 'IP addresses assigning by DHCPv6'), ('DISABLED', 'Disabled')], default='DISABLED', max_length=32),
),
migrations.AlterField(
model_name='optionaltopologie',
name='radius_general_policy',
field=models.CharField(choices=[('MACHINE', "On the IP range's VLAN of the machine"), ('DEFINED', "Preset in 'VLAN for machines accepted by RADIUS'")], default='DEFINED', max_length=32),
),
migrations.AlterField(
model_name='optionaluser',
name='all_can_create_adherent',
field=models.BooleanField(default=False, help_text='Users can create a member'),
),
migrations.AlterField(
model_name='optionaluser',
name='all_can_create_club',
field=models.BooleanField(default=False, help_text='Users can create a club'),
),
migrations.AlterField(
model_name='optionaluser',
name='max_email_address',
field=models.IntegerField(default=15, help_text='Maximum number of local email addresses for a standard user'),
),
migrations.AlterField(
model_name='optionaluser',
name='self_adhesion',
field=models.BooleanField(default=False, help_text='A new user can create their account on Re2o'),
),
migrations.AlterField(
model_name='optionaluser',
name='self_change_shell',
field=models.BooleanField(default=False, help_text='Users can edit their shell'),
),
]

View file

@ -63,21 +63,20 @@ class PreferencesModel(models.Model):
class OptionalUser(AclMixin, PreferencesModel): class OptionalUser(AclMixin, PreferencesModel):
"""Options pour l'user : obligation ou nom du telephone, """Options pour l'user : obligation ou nom du telephone,
activation ou non du solde, autorisation du negatif, fingerprint etc""" activation ou non du solde, autorisation du negatif, fingerprint etc"""
PRETTY_NAME = "Options utilisateur"
is_tel_mandatory = models.BooleanField(default=True) is_tel_mandatory = models.BooleanField(default=True)
gpg_fingerprint = models.BooleanField(default=True) gpg_fingerprint = models.BooleanField(default=True)
all_can_create_club = models.BooleanField( all_can_create_club = models.BooleanField(
default=False, default=False,
help_text="Les users peuvent créer un club" help_text=_("Users can create a club")
) )
all_can_create_adherent = models.BooleanField( all_can_create_adherent = models.BooleanField(
default=False, default=False,
help_text="Les users peuvent créer d'autres adhérents", help_text=_("Users can create a member"),
) )
self_adhesion = models.BooleanField( self_adhesion = models.BooleanField(
default=False, default=False,
help_text="Un nouvel utilisateur peut se créer son compte sur re2o" help_text=_("A new user can create their account on Re2o")
) )
shell_default = models.OneToOneField( shell_default = models.OneToOneField(
'users.ListShell', 'users.ListShell',
@ -87,33 +86,35 @@ class OptionalUser(AclMixin, PreferencesModel):
) )
self_change_shell = models.BooleanField( self_change_shell = models.BooleanField(
default=False, default=False,
help_text="Users can change their shell" help_text=_("Users can edit their shell")
) )
local_email_accounts_enabled = models.BooleanField( local_email_accounts_enabled = models.BooleanField(
default=False, default=False,
help_text="Enable local email accounts for users" help_text=_("Enable local email accounts for users")
) )
local_email_domain = models.CharField( local_email_domain = models.CharField(
max_length = 32, max_length=32,
default = "@example.org", default="@example.org",
help_text="Domain to use for local email accounts", help_text=_("Domain to use for local email accounts")
) )
max_email_address = models.IntegerField( max_email_address = models.IntegerField(
default = 15, default=15,
help_text = "Maximum number of local email address for a standard user" help_text=_("Maximum number of local email addresses for a standard"
" user")
) )
class Meta: class Meta:
permissions = ( permissions = (
("view_optionaluser", "Peut voir les options de l'user"), ("view_optionaluser", _("Can view the user options")),
) )
verbose_name = _("user options")
def clean(self): def clean(self):
"""Clean model: """Clean model:
Check the mail_extension Check the mail_extension
""" """
if self.local_email_domain[0] != "@": if self.local_email_domain[0] != "@":
raise ValidationError("Mail domain must begin with @") raise ValidationError(_("Email domain must begin with @"))
@receiver(post_save, sender=OptionalUser) @receiver(post_save, sender=OptionalUser)
@ -126,15 +127,14 @@ def optionaluser_post_save(**kwargs):
class OptionalMachine(AclMixin, PreferencesModel): class OptionalMachine(AclMixin, PreferencesModel):
"""Options pour les machines : maximum de machines ou d'alias par user """Options pour les machines : maximum de machines ou d'alias par user
sans droit, activation de l'ipv6""" sans droit, activation de l'ipv6"""
PRETTY_NAME = "Options machines"
SLAAC = 'SLAAC' SLAAC = 'SLAAC'
DHCPV6 = 'DHCPV6' DHCPV6 = 'DHCPV6'
DISABLED = 'DISABLED' DISABLED = 'DISABLED'
CHOICE_IPV6 = ( CHOICE_IPV6 = (
(SLAAC, 'Autoconfiguration par RA'), (SLAAC, _("Autoconfiguration by RA")),
(DHCPV6, 'Attribution des ip par dhcpv6'), (DHCPV6, _("IP addresses assigning by DHCPv6")),
(DISABLED, 'Désactivé'), (DISABLED, _("Disabled")),
) )
password_machine = models.BooleanField(default=False) password_machine = models.BooleanField(default=False)
@ -146,8 +146,7 @@ class OptionalMachine(AclMixin, PreferencesModel):
default='DISABLED' default='DISABLED'
) )
create_machine = models.BooleanField( create_machine = models.BooleanField(
default=True, default=True
help_text="Permet à l'user de créer une machine"
) )
@cached_property @cached_property
@ -157,8 +156,9 @@ class OptionalMachine(AclMixin, PreferencesModel):
class Meta: class Meta:
permissions = ( permissions = (
("view_optionalmachine", "Peut voir les options de machine"), ("view_optionalmachine", _("Can view the machine options")),
) )
verbose_name = _("machine options")
@receiver(post_save, sender=OptionalMachine) @receiver(post_save, sender=OptionalMachine)
@ -174,13 +174,11 @@ def optionalmachine_post_save(**kwargs):
class OptionalTopologie(AclMixin, PreferencesModel): class OptionalTopologie(AclMixin, PreferencesModel):
"""Reglages pour la topologie : mode d'accès radius, vlan où placer """Reglages pour la topologie : mode d'accès radius, vlan où placer
les machines en accept ou reject""" les machines en accept ou reject"""
PRETTY_NAME = "Options topologie"
MACHINE = 'MACHINE' MACHINE = 'MACHINE'
DEFINED = 'DEFINED' DEFINED = 'DEFINED'
CHOICE_RADIUS = ( CHOICE_RADIUS = (
(MACHINE, 'Sur le vlan de la plage ip machine'), (MACHINE, _("On the IP range's VLAN of the machine")),
(DEFINED, 'Prédéfini dans "Vlan où placer les machines\ (DEFINED, _("Preset in 'VLAN for machines accepted by RADIUS'")),
après acceptation RADIUS"'),
) )
radius_general_policy = models.CharField( radius_general_policy = models.CharField(
@ -205,8 +203,9 @@ class OptionalTopologie(AclMixin, PreferencesModel):
class Meta: class Meta:
permissions = ( permissions = (
("view_optionaltopologie", "Peut voir les options de topologie"), ("view_optionaltopologie", _("Can view the topology options")),
) )
verbose_name = _("topology options")
@receiver(post_save, sender=OptionalTopologie) @receiver(post_save, sender=OptionalTopologie)
@ -219,17 +218,18 @@ def optionaltopologie_post_save(**kwargs):
class GeneralOption(AclMixin, PreferencesModel): class GeneralOption(AclMixin, PreferencesModel):
"""Options générales : nombre de resultats par page, nom du site, """Options générales : nombre de resultats par page, nom du site,
temps les liens sont valides""" temps les liens sont valides"""
PRETTY_NAME = "Options générales"
general_message_fr = models.TextField( general_message_fr = models.TextField(
default="", default="",
blank=True, blank=True,
help_text="Message général affiché sur le site (maintenance, etc)" help_text=_("General message displayed on the French version of the"
" website (e.g. in case of maintenance)")
) )
general_message_en = models.TextField( general_message_en = models.TextField(
default="", default="",
blank=True, blank=True,
help_text="General message displayed on the English version of the website." help_text=_("General message displayed on the English version of the"
" website (e.g. in case of maintenance)")
) )
search_display_page = models.IntegerField(default=15) search_display_page = models.IntegerField(default=15)
pagination_number = models.IntegerField(default=25) pagination_number = models.IntegerField(default=25)
@ -250,8 +250,9 @@ class GeneralOption(AclMixin, PreferencesModel):
class Meta: class Meta:
permissions = ( permissions = (
("view_generaloption", "Peut voir les options générales"), ("view_generaloption", _("Can view the general options")),
) )
verbose_name = _("general options")
@receiver(post_save, sender=GeneralOption) @receiver(post_save, sender=GeneralOption)
@ -271,8 +272,10 @@ class Service(AclMixin, models.Model):
class Meta: class Meta:
permissions = ( permissions = (
("view_service", "Peut voir les options de service"), ("view_service", _("Can view the service options")),
) )
verbose_name = _("service")
verbose_name_plural =_("services")
def __str__(self): def __str__(self):
return str(self.name) return str(self.name)
@ -282,14 +285,14 @@ class MailContact(AclMixin, models.Model):
address = models.EmailField( address = models.EmailField(
default = "contact@example.org", default = "contact@example.org",
help_text = _("Contact email adress") help_text = _("Contact email address")
) )
commentary = models.CharField( commentary = models.CharField(
blank = True, blank = True,
null = True, null = True,
help_text = _( help_text = _(
"Description of the associated email adress."), "Description of the associated email address."),
max_length = 256 max_length = 256
) )
@ -299,8 +302,10 @@ class MailContact(AclMixin, models.Model):
class Meta: class Meta:
permissions = ( permissions = (
("view_mailcontact", _("Can see contact email")), ("view_mailcontact", _("Can view a contact email address object")),
) )
verbose_name = _("contact email address")
verbose_name_plural = _("contact email addresses")
def __str__(self): def __str__(self):
return(self.address) return(self.address)
@ -308,18 +313,17 @@ class MailContact(AclMixin, models.Model):
class AssoOption(AclMixin, PreferencesModel): class AssoOption(AclMixin, PreferencesModel):
"""Options générales de l'asso : siret, addresse, nom, etc""" """Options générales de l'asso : siret, addresse, nom, etc"""
PRETTY_NAME = "Options de l'association"
name = models.CharField( name = models.CharField(
default="Association réseau école machin", default=_("Networking organisation school Something"),
max_length=256 max_length=256
) )
siret = models.CharField(default="00000000000000", max_length=32) siret = models.CharField(default="00000000000000", max_length=32)
adresse1 = models.CharField(default="1 Rue de exemple", max_length=128) adresse1 = models.CharField(default=_("Threadneedle Street"), max_length=128)
adresse2 = models.CharField(default="94230 Cachan", max_length=128) adresse2 = models.CharField(default=_("London EC2R 8AH"), max_length=128)
contact = models.EmailField(default="contact@example.org") contact = models.EmailField(default="contact@example.org")
telephone = models.CharField(max_length=15, default="0000000000") telephone = models.CharField(max_length=15, default="0000000000")
pseudo = models.CharField(default="Asso", max_length=32) pseudo = models.CharField(default=_("Organisation"), max_length=32)
utilisateur_asso = models.OneToOneField( utilisateur_asso = models.OneToOneField(
'users.User', 'users.User',
on_delete=models.PROTECT, on_delete=models.PROTECT,
@ -333,8 +337,9 @@ class AssoOption(AclMixin, PreferencesModel):
class Meta: class Meta:
permissions = ( permissions = (
("view_assooption", "Peut voir les options de l'asso"), ("view_assooption", _("Can view the organisation options")),
) )
verbose_name = _("organisation options")
@receiver(post_save, sender=AssoOption) @receiver(post_save, sender=AssoOption)
@ -346,29 +351,26 @@ def assooption_post_save(**kwargs):
class HomeOption(AclMixin, PreferencesModel): class HomeOption(AclMixin, PreferencesModel):
"""Settings of the home page (facebook/twitter etc)""" """Settings of the home page (facebook/twitter etc)"""
PRETTY_NAME = "Options de la page d'accueil"
facebook_url = models.URLField( facebook_url = models.URLField(
null=True, null=True,
blank=True, blank=True
help_text="Url du compte facebook"
) )
twitter_url = models.URLField( twitter_url = models.URLField(
null=True, null=True,
blank=True, blank=True
help_text="Url du compte twitter"
) )
twitter_account_name = models.CharField( twitter_account_name = models.CharField(
max_length=32, max_length=32,
null=True, null=True,
blank=True, blank=True
help_text="Nom du compte à afficher"
) )
class Meta: class Meta:
permissions = ( permissions = (
("view_homeoption", "Peut voir les options de l'accueil"), ("view_homeoption", _("Can view the homepage options")),
) )
verbose_name = _("homepage options")
@receiver(post_save, sender=HomeOption) @receiver(post_save, sender=HomeOption)
@ -380,12 +382,14 @@ def homeoption_post_save(**kwargs):
class MailMessageOption(AclMixin, models.Model): class MailMessageOption(AclMixin, models.Model):
"""Reglages, mail de bienvenue et autre""" """Reglages, mail de bienvenue et autre"""
PRETTY_NAME = "Options de corps de mail"
welcome_mail_fr = models.TextField(default="") welcome_mail_fr = models.TextField(default="")
welcome_mail_en = models.TextField(default="") welcome_mail_en = models.TextField(default="")
class Meta: class Meta:
permissions = ( permissions = (
("view_mailmessageoption", "Peut voir les options de mail"), ("view_mailmessageoption", _("Can view the email message"
" options")),
) )
verbose_name = _("email message options")

View file

@ -24,24 +24,26 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% load i18n %} {% load i18n %}
{% load acl %} {% load acl %}
{% load logs_extra %} {% load logs_extra %}
<table class="table table-striped">
<thead> <table class="table table-striped">
<tr> <thead>
<th>{% trans "Adress" %}</th> <tr>
<th>{% trans "Remark" %}</th> <th>{% trans "Address" %}</th>
<th></th> <th>{% trans "Comment" %}</th>
</tr> <th></th>
</thead> </tr>
{% for mailcontact in mailcontact_list %} </thead>
{% for mailcontact in mailcontact_list %}
<tr> <tr>
<td>{{ mailcontact.address }}</td> <td>{{ mailcontact.address }}</td>
<td>{{ mailcontact.commentary }}</td> <td>{{ mailcontact.commentary }}</td>
<td class="text-right"> <td class="text-right">
{% can_edit mailcontact %} {% can_edit mailcontact %}
{% include 'buttons/edit.html' with href='preferences:edit-mailcontact' id=mailcontact.id %} {% include 'buttons/edit.html' with href='preferences:edit-mailcontact' id=mailcontact.id %}
{% acl_end %} {% acl_end %}
{% history_button mailcontact %} {% history_button mailcontact %}
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>

View file

@ -23,30 +23,31 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% endcomment %} {% endcomment %}
{% load acl %} {% load acl %}
{% load logs_extra %} {% load logs_extra %}
<table class="table table-striped"> {% load i18n %}
<thead>
<tr> <table class="table table-striped">
<th>Nom</th> <thead>
<th>Url</th> <tr>
<th>Description</th> <th>{% trans "Name" %}</th>
<th>Image</th> <th>{% trans "URL" %}</th>
<th></th> <th>{% trans "Description" %}</th>
<th></th> <th>{% trans "Image" %}</th>
</tr> <th></th>
</thead> </tr>
{% for service in service_list %} </thead>
{% for service in service_list %}
<tr> <tr>
<td>{{ service.name }}</td> <td>{{ service.name }}</td>
<td>{{ service.url }}</td> <td>{{ service.url }}</td>
<td>{{ service.description }}</td> <td>{{ service.description }}</td>
<td>{{ service.image }}</td> <td>{{ service.image }}</td>
<td class="text-right"> <td class="text-right">
{% can_edit service%} {% can_edit service%}
{% include 'buttons/edit.html' with href='preferences:edit-service' id=service.id %} {% include 'buttons/edit.html' with href='preferences:edit-service' id=service.id %}
{% acl_end %} {% acl_end %}
{% history_button service %} {% history_button service %}
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>

View file

@ -28,223 +28,215 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% load design %} {% load design %}
{% load i18n %} {% load i18n %}
{% block title %}Création et modification des préférences{% endblock %} {% block title %}{% trans "Preferences" %}{% endblock %}
{% block content %} {% block content %}
<h4>Préférences utilisateur</h4> <h4>{% trans "User preferences" %}</h4>
<a class="btn btn-primary btn-sm" role="button" href="{% url 'preferences:edit-options' 'OptionalUser' %}"> <a class="btn btn-primary btn-sm" role="button" href="{% url 'preferences:edit-options' 'OptionalUser' %}">
<i class="fa fa-edit"></i> Editer <i class="fa fa-edit"></i>
</a> {% trans "Edit" %}
</a>
<h5>Généralités</h5> <table class="table table-striped">
<table class="table table-striped"> <tr>
<tr> <th>{% trans "Telephone number required" %}</th>
<th>Téléphone obligatoirement requis</th> <td>{{ useroptions.is_tel_mandatory|tick }}</td>
<td>{{ useroptions.is_tel_mandatory|tick }}</td> <th>{% trans "Self registration" %}</th>
<th>Auto inscription</th> <td>{{ useroptions.self_adhesion|tick }}</td>
<td>{{ useroptions.self_adhesion|tick }}</td> </tr>
</tr> <tr>
<tr> <th>{% trans "Default shell for users" %}</th>
<td>{{ useroptions.shell_default }}</td>
<th>Shell par défaut des utilisateurs</th> <th>{% trans "Users can edit their shell" %}</th>
<td>{{ useroptions.shell_default }}</td> <td>{{ useroptions.self_change_shell|tick }}</td>
<th>Les utilisateurs peuvent changer leur shell</th> </tr>
<td>{{ useroptions.self_change_shell|tick }}</td> <tr>
</tr> <th>{% trans "Creation of members by everyone" %}</th>
<tr> <td>{{ useroptions.all_can_create_adherent|tick }}</td>
<th>Creations d'adhérents par tous</th> <th>{% trans "Creation of clubs by everyone" %}</th>
<td>{{ useroptions.all_can_create_adherent|tick }}</td> <td>{{ useroptions.all_can_create_club|tick }}</td>
<th>Creations de clubs par tous</th> </tr>
<td>{{ useroptions.all_can_create_club|tick }}</td> <tr>
</tr> <th>{% trans "GPG fingerprint field" %}</th>
<tr> <td>{{ useroptions.gpg_fingerprint|tick }}</td>
<th>Champ gpg fingerprint</th> </tr>
<td>{{ useroptions.gpg_fingerprint|tick }}</td> </table>
</tr> <h5>{% trans "Email accounts preferences" %}
</table> <table class="table table-striped">
<tr>
<h5>Comptes mails</h5> <th>{% trans "Local email accounts enabled" %}</th>
<table class="table table-striped"> <td>{{ useroptions.local_email_accounts_enabled|tick }}</td>
<tr> <th>{% trans "Local email domain" %}</th>
<th>Gestion des comptes mails</th> <td>{{ useroptions.local_email_domain }}</td>
<td>{{ useroptions.local_email_accounts_enabled | tick }}</td> </tr>
<th>Extension mail interne</th> <tr>
<td>{{ useroptions.local_email_domain }}</td> <th>{% trans "Maximum number of email aliases allowed" %}</th>
</tr> <td>{{ useroptions.max_email_address }}</td>
<tr> </tr>
<th>Nombre d'alias mail max</th> </table>
<td>{{ useroptions.max_email_address }}</td> <h4>{% trans "Machines preferences" %}</h4>
</tr> <a class="btn btn-primary btn-sm" role="button" href="{% url 'preferences:edit-options' 'OptionalMachine' %}">
</table> <i class="fa fa-edit"></i>
{% trans "Edit" %}
</a>
<h4>Préférences machines</h4> <p>
<a class="btn btn-primary btn-sm" role="button" href="{% url 'preferences:edit-options' 'OptionalMachine' %}"> </p>
<i class="fa fa-edit"></i> Editer <table class="table table-striped">
</a> <tr>
<table class="table table-striped"> <th>{% trans "Password per machine" %}</th>
<tr> <td>{{ machineoptions.password_machine|tick }}</td>
<th>Mot de passe par machine</th> <th>{% trans "Maximum number of interfaces allowed for a standard user" %}</th>
<td>{{ machineoptions.password_machine|tick }}</td> <td>{{ machineoptions.max_lambdauser_interfaces }}</td>
<th>Machines/interfaces autorisées par utilisateurs</th> </tr>
<td>{{ machineoptions.max_lambdauser_interfaces }}</td> <tr>
</tr> <th>{% trans "Maximum number of DNS aliases allowed for a standard user" %}</th>
<tr> <td>{{ machineoptions.max_lambdauser_aliases }}</td>
<th>Alias dns autorisé par utilisateur</th> <th>{% trans "IPv6 support" %}</th>
<td>{{ machineoptions.max_lambdauser_aliases }}</td> <td>{{ machineoptions.ipv6_mode }}</td>
<th>Support de l'ipv6</th> </tr>
<td>{{ machineoptions.ipv6_mode }}</td> <tr>
</tr> <th>{% trans "Creation of machines" %}</th>
<tr> <td>{{ machineoptions.create_machine|tick }}</td>
<th>Creation de machines</th> </tr>
<td>{{ machineoptions.create_machine|tick }}</td> </table>
</tr> <h4>{% trans "Topology preferences" %}</h4>
</table> <a class="btn btn-primary btn-sm" role="button" href="{% url 'preferences:edit-options' 'OptionalTopologie' %}">
<i class="fa fa-edit"></i>
{% trans "Edit" %}
<h4>Préférences topologie</h4> </a>
<a class="btn btn-primary btn-sm" role="button" href="{% url 'preferences:edit-options' 'OptionalTopologie' %}"> <p>
<i class="fa fa-edit"></i> Editer </p>
</a> <table class="table table-striped">
<table class="table table-striped"> <tr>
<tr> <th>{% trans "General policy for VLAN setting" %}</th>
<th>Politique générale de placement de vlan</th> <td>{{ topologieoptions.radius_general_policy }}</td>
<td>{{ topologieoptions.radius_general_policy }}</td> <th>{% trans "This setting defines the VLAN policy after acceptance by RADIUS: either on the IP range's VLAN of the machine, or a VLAN preset in 'VLAN for machines accepted by RADIUS'" %}</th>
<th> <td></td>
Ce réglage défini la politique vlan après acceptation radius : </tr>
soit sur le vlan de la plage d'ip de la machine, soit sur un <tr>
vlan prédéfini dans "Vlan où placer les machines après acceptation <th>{% trans "VLAN for machines accepted by RADIUS" %}</th>
RADIUS" <td>{{ topologieoptions.vlan_decision_ok }}</td>
</th> <th>{% trans "VLAN for machines rejected by RADIUS" %}</th>
<td></td> <td>{{ topologieoptions.vlan_decision_nok }}</td>
</tr> </tr>
<tr> </table>
<th>Vlan où placer les machines après acceptation RADIUS</th> <h4>{% trans "General preferences" %}</h4>
<td>{{ topologieoptions.vlan_decision_ok }}</td> <a class="btn btn-primary btn-sm" role="button" href="{% url 'preferences:edit-options' 'GeneralOption' %}">
<th>Vlan où placer les machines après rejet RADIUS</th> <i class="fa fa-edit"></i>
<td>{{ topologieoptions.vlan_decision_nok }}</td> {% trans "Edit" %}
</tr> </a>
</table> <p>
</p>
<table class="table table-striped">
<h4>Préférences generales</h4> <tr>
<a class="btn btn-primary btn-sm" role="button" href="{% url 'preferences:edit-options' 'GeneralOption' %}"> <th>{% trans "Website name" %}</th>
<i class="fa fa-edit"></i> Editer <td>{{ generaloptions.site_name }}</td>
</a> <th>{% trans "Email address for automatic emailing" %}</th>
<table class="table table-striped"> <td>{{ generaloptions.email_from }}</td>
<tr> </tr>
<th>Nom du site web</th> <tr>
<td>{{ generaloptions.site_name }}</td> <th>{% trans "Number of results displayed when searching" %}</th>
<th>Adresse mail d'expedition automatique</th> <td>{{ generaloptions.search_display_page }}</td>
<td>{{ generaloptions.email_from }}</td> <th>{% trans "Number of items per page (standard size)" %}</th>
</tr> <td>{{ generaloptions.pagination_number }}</td>
<tr> </tr>
<th>Affichage de résultats dans le champ de recherche</th> <tr>
<td>{{ generaloptions.search_display_page }}</td> <th>{% trans "Number of items per page (large size)" %}</th>
<th>Nombre d'items affichés en liste (taille normale)</th> <td>{{ generaloptions.pagination_large_number }}</td>
<td>{{ generaloptions.pagination_number }}</td> <th>{% trans "Time before expiration of the reset password link (in hours)" %}</th>
</tr> <td>{{ generaloptions.req_expire_hrs }}</td>
<tr> </tr>
<th>Nombre d'items affichés en liste (taille élevée)</th> <tr>
<td>{{ generaloptions.pagination_large_number }}</td> <th>{% trans "General message displayed on the website" %}</th>
<th>Temps avant expiration du lien de reinitialisation de mot de passe (en heures)</th> <td>{{ generaloptions.general_message }}</td>
<td>{{ generaloptions.req_expire_hrs }}</td> <th>{% trans "Summary of the General Terms of Use" %}</th>
</tr> <td>{{ generaloptions.GTU_sum_up }}</td>
<tr> </tr>
<th>Message global affiché sur le site</th> <tr>
<td>{{ generaloptions.general_message }}</td> <th>{% trans "General Terms of Use" %}</th>
<th>Résumé des CGU</th> <td>{{ generaloptions.GTU }}</th>
<td>{{ generaloptions.GTU_sum_up }}</td> </tr>
<tr> </table>
<tr> <h4>{% trans "Information about the organisation" %}</h4>
<th>CGU</th> <a class="btn btn-primary btn-sm" role="button" href="{% url 'preferences:edit-options' 'AssoOption' %}">
<td>{{generaloptions.GTU}}</th> <i class="fa fa-edit"></i>
</tr> {% trans "Edit" %}
</table> </a>
<p>
</p>
<h4>Données de l'association</h4> <table class="table table-striped">
<a class="btn btn-primary btn-sm" role="button" href="{% url 'preferences:edit-options' 'AssoOption' %}"> <tr>
<i class="fa fa-edit"></i> Editer <th>{% trans "Name" %}</th>
</a> <td>{{ assooptions.name }}</td>
<table class="table table-striped"> <th>{% trans "SIRET number" %}</th>
<tr> <td>{{ assooptions.siret }}</td>
<th>Nom</th> </tr>
<td>{{ assooptions.name }}</td> <tr>
<th>SIRET</th> <th>{% trans "Address" %}</th>
<td>{{ assooptions.siret }}</td> <td>{{ assooptions.adresse1 }}<br>
</tr> {{ assooptions.adresse2 }}
<tr> </td>
<th>Adresse</th> <th>{% trans "Contact email address" %}</th>
<td>{{ assooptions.adresse1 }}<br> <td>{{ assooptions.contact }}</td>
{{ assooptions.adresse2 }}</td> </tr>
<th>Contact mail</th> <tr>
<td>{{ assooptions.contact }}</td> <th>{% trans "Telephone number" %}</th>
</tr> <td>{{ assooptions.telephone }}</td>
<tr> <th>{% trans "Usual name" %}</th>
<th>Telephone</th> <td>{{ assooptions.pseudo }}</td>
<td>{{ assooptions.telephone }}</td> </tr>
<th>Pseudo d'usage</th> <tr>
<td>{{ assooptions.pseudo }}</td> <th>{% trans "User object of the organisation" %}</th>
</tr> <td>{{ assooptions.utilisateur_asso }}</td>
<tr> <th>{% trans "Description of the organisation" %}</th>
<th>Objet utilisateur de l'association</th> <td>{{ assooptions.description|safe }}</td>
<td>{{ assooptions.utilisateur_asso }}</td> </tr>
<th>Description de l'association</th> </table>
<td>{{ assooptions.description | safe }}</td> <h4>{% trans "Custom email message" %}</h4>
</tr> <a class="btn btn-primary btn-sm" role="button" href="{% url 'preferences:edit-options' 'MailMessageOption' %}">
</table> <i class="fa fa-edit"></i>
{% trans "Edit" %}
</a>
<h4>Messages personalisé dans les mails</h4> <p>
<a class="btn btn-primary btn-sm" role="button" href="{% url 'preferences:edit-options' 'MailMessageOption' %}"> </p>
<i class="fa fa-edit"></i> Editer <table class="table table-striped">
</a> <tr>
<table class="table table-striped"> <th>{% trans "Welcome email (in French)" %}</th>
<tr> <td>{{ mailmessageoptions.welcome_mail_fr|safe }}</td>
<th>Mail de bienvenue (Français)</th> </tr>
<td>{{ mailmessageoptions.welcome_mail_fr | safe }}</td> <tr>
</tr> <th>{% trans "Welcome email (in English)" %}</th>
<tr> <td>{{ mailmessageoptions.welcome_mail_en|safe }}</td>
<th>Mail de bienvenue (Anglais)</th> </tr>
<td>{{ mailmessageoptions.welcome_mail_en | safe }}</td> </table>
</tr> <h4>{% trans "List of services and homepage preferences" %}</h4>
</table> {% can_create preferences.Service%}
<a class="btn btn-primary btn-sm" role="button" href="{% url 'preferences:add-service' %}"><i class="fa fa-plus"></i>{% trans " Add a service" %}</a>
{% acl_end %}
<h4>Liste des services et préférences page d'accueil</h4> <a class="btn btn-danger btn-sm" role="button" href="{% url 'preferences:del-service' %}"><i class="fa fa-trash"></i>{% trans " Delete one or several services" %}</a>
{% can_create preferences.Service%} {% include "preferences/aff_service.html" with service_list=service_list %}
<a class="btn btn-primary btn-sm" role="button" href="{% url 'preferences:add-service' %}"><i class="fa fa-plus"> <a class="btn btn-primary btn-sm" role="button" href="{% url 'preferences:edit-options' 'HomeOption' %}">
</i> Ajouter un service <i class="fa fa-edit"></i>
</a> {% trans "Edit" %}
{% acl_end %} </a>
<a class="btn btn-danger btn-sm" role="button" href="{% url 'preferences:del-service' %}"><i class="fa fa-trash"> <h2>{% trans "List of contact email addresses" %}</h2>
</i> Supprimer un ou plusieurs service {% can_create preferences.MailContact %}
</a> <a class="btn btn-primary btn-sm" role="button" href="{% url 'preferences:add-mailcontact' %}"><i class="fa fa-plus"></i>{% trans "Add an address" %}</a>
{% include "preferences/aff_service.html" with service_list=service_list %} {% acl_end %}
<a class="btn btn-danger btn-sm" role="button" href="{% url 'preferences:del-mailcontact' %}"><i class="fa fa-trash"></i>{% trans "Delete one or several addresses" %}</a>
<a class="btn btn-primary btn-sm" role="button" href="{% url 'preferences:edit-options' 'HomeOption' %}"> {% include "preferences/aff_mailcontact.html" with mailcontact_list=mailcontact_list %}
<i class="fa fa-edit"></i> Editer <p>
</a> </p>
<table class="table table-striped">
<h2>{% trans "Contact email adresses list" %}</h2> <tr>
{% can_create preferences.MailContact%} <th>{% trans "Twitter account URL" %}</th>
<a class="btn btn-primary btn-sm" role="button" href="{% url 'preferences:add-mailcontact' %}"><i class="fa fa-plus"></i>{% trans "Add an adress" %}</a> <td>{{ homeoptions.twitter_url }}</td>
{% acl_end %} <th>{% trans "Twitter account name" %}</th>
<a class="btn btn-danger btn-sm" role="button" href="{% url 'preferences:del-mailcontact' %}"><i class="fa fa-trash"></i>{% trans "Delete one or multiple adresses" %}</a> <td>{{ homeoptions.twitter_account_name }}</td>
{% include "preferences/aff_mailcontact.html" with mailcontact_list=mailcontact_list %} </tr>
<p> <tr>
<th>{% trans "Facebook account URL" %}</th>
<table class="table table-striped"> <td>{{ homeoptions.facebook_url }}</td>
<tr> </tr>
<th>Url du compte twitter</th> </table>
<td>{{ homeoptions.twitter_url }}</td>
<th>Nom utilisé pour afficher le compte</th>
<td>{{ homeoptions.twitter_account_name }}</td>
</tr>
<tr>
<th>Url du compte facebook</th>
<td>{{ homeoptions.facebook_url }}</td>
</tr>
</table>
{% endblock %} {% endblock %}

View file

@ -25,20 +25,23 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% load bootstrap3 %} {% load bootstrap3 %}
{% load massive_bootstrap_form %} {% load massive_bootstrap_form %}
{% load i18n %}
{% block title %}Création et modification des préférences{% endblock %} {% block title %}{% trans "Preferences" %}{% endblock %}
{% block content %} {% block content %}
{% bootstrap_form_errors options %} {% bootstrap_form_errors options %}
<h3>Edition des préférences</h3> <h3>{% trans "Editing of preferences" %}</h3>
<form class="form" method="post" enctype="multipart/form-data"> <form class="form" method="post" enctype="multipart/form-data">
{% csrf_token %} {% csrf_token %}
{% massive_bootstrap_form options 'utilisateur_asso' %} {% massive_bootstrap_form options 'utilisateur_asso' %}
{% bootstrap_button "Modifier" button_type="submit" icon="star" %} {% trans "Edit" as tr_edit %}
{% bootstrap_button tr_edit button_type="submit" icon="star" %}
</form> </form>
<br /> <br />
<br /> <br />
<br /> <br />
{% endblock %} {% endblock %}

View file

@ -24,8 +24,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% endcomment %} {% endcomment %}
{% load bootstrap3 %} {% load bootstrap3 %}
{% load i18n %}
{% block title %}Création et modification des preferences{% endblock %} {% block title %}{% trans "Preferences" %}{% endblock %}
{% block content %} {% block content %}
{% if preferenceform %} {% if preferenceform %}
@ -44,3 +45,4 @@ with this program; if not, write to the Free Software Foundation, Inc.,
<br /> <br />
<br /> <br />
{% endblock %} {% endblock %}

View file

@ -95,14 +95,14 @@ def edit_options(request, section):
model = getattr(models, section, None) model = getattr(models, section, None)
form_instance = getattr(forms, 'Edit' + section + 'Form', None) form_instance = getattr(forms, 'Edit' + section + 'Form', None)
if not (model or form_instance): if not (model or form_instance):
messages.error(request, "Objet inconnu") messages.error(request, _("Unknown object"))
return redirect(reverse('preferences:display-options')) return redirect(reverse('preferences:display-options'))
options_instance, _created = model.objects.get_or_create() options_instance, _created = model.objects.get_or_create()
can, msg = options_instance.can_edit(request.user) can, msg = options_instance.can_edit(request.user)
if not can: if not can:
messages.error(request, msg or "Vous ne pouvez pas éditer cette\ messages.error(request, msg or _("You don't have the right to edit"
option.") " this option."))
return redirect(reverse('index')) return redirect(reverse('index'))
options = form_instance( options = form_instance(
request.POST or None, request.POST or None,
@ -114,11 +114,11 @@ def edit_options(request, section):
options.save() options.save()
reversion.set_user(request.user) reversion.set_user(request.user)
reversion.set_comment( reversion.set_comment(
"Champs modifié(s) : %s" % ', '.join( "Field(s) edited: %s" % ', '.join(
field for field in options.changed_data field for field in options.changed_data
) )
) )
messages.success(request, "Préférences modifiées") messages.success(request, _("The preferences were edited."))
return redirect(reverse('preferences:display-options')) return redirect(reverse('preferences:display-options'))
return form( return form(
{'options': options}, {'options': options},
@ -136,11 +136,11 @@ def add_service(request):
with transaction.atomic(), reversion.create_revision(): with transaction.atomic(), reversion.create_revision():
service.save() service.save()
reversion.set_user(request.user) reversion.set_user(request.user)
reversion.set_comment("Création") reversion.set_comment("Creation")
messages.success(request, "Ce service a été ajouté") messages.success(request, _("The service was added."))
return redirect(reverse('preferences:display-options')) return redirect(reverse('preferences:display-options'))
return form( return form(
{'preferenceform': service, 'action_name': 'Ajouter'}, {'preferenceform': service, 'action_name': _("Add a service")},
'preferences/preferences.html', 'preferences/preferences.html',
request request
) )
@ -160,14 +160,14 @@ def edit_service(request, service_instance, **_kwargs):
service.save() service.save()
reversion.set_user(request.user) reversion.set_user(request.user)
reversion.set_comment( reversion.set_comment(
"Champs modifié(s) : %s" % ', '.join( "Field(s) edited: %s" % ', '.join(
field for field in service.changed_data field for field in service.changed_data
) )
) )
messages.success(request, "Service modifié") messages.success(request, _("The service was edited."))
return redirect(reverse('preferences:display-options')) return redirect(reverse('preferences:display-options'))
return form( return form(
{'preferenceform': service, 'action_name': 'Editer'}, {'preferenceform': service, 'action_name': _("Edit")},
'preferences/preferences.html', 'preferences/preferences.html',
request request
) )
@ -185,13 +185,13 @@ def del_service(request, instances):
with transaction.atomic(), reversion.create_revision(): with transaction.atomic(), reversion.create_revision():
services_del.delete() services_del.delete()
reversion.set_user(request.user) reversion.set_user(request.user)
messages.success(request, "Le service a été supprimé") messages.success(request, _("The service was deleted."))
except ProtectedError: except ProtectedError:
messages.error(request, "Erreur le service\ messages.error(request, _("Error: the service %s can't be"
suivant %s ne peut être supprimé" % services_del) " deleted.") % services_del)
return redirect(reverse('preferences:display-options')) return redirect(reverse('preferences:display-options'))
return form( return form(
{'preferenceform': services, 'action_name': 'Supprimer'}, {'preferenceform': services, 'action_name': _("Delete")},
'preferences/preferences.html', 'preferences/preferences.html',
request request
) )
@ -207,10 +207,11 @@ def add_mailcontact(request):
) )
if mailcontact.is_valid(): if mailcontact.is_valid():
mailcontact.save() mailcontact.save()
messages.success(request, _("The adress was created.")) messages.success(request, _("The contact email address was created."))
return redirect(reverse('preferences:display-options')) return redirect(reverse('preferences:display-options'))
return form( return form(
{'preferenceform': mailcontact, 'action_name': 'Ajouter'}, {'preferenceform': mailcontact,
'action_name': _("Add a contact email address")},
'preferences/preferences.html', 'preferences/preferences.html',
request request
) )
@ -227,10 +228,10 @@ def edit_mailcontact(request, mailcontact_instance, **_kwargs):
) )
if mailcontact.is_valid(): if mailcontact.is_valid():
mailcontact.save() mailcontact.save()
messages.success(request, _("Email adress updated.")) messages.success(request, _("The contact email address was edited."))
return redirect(reverse('preferences:display-options')) return redirect(reverse('preferences:display-options'))
return form( return form(
{'preferenceform': mailcontact, 'action_name': _('Edit')}, {'preferenceform': mailcontact, 'action_name': _("Edit")},
'preferences/preferences.html', 'preferences/preferences.html',
request request
) )
@ -248,10 +249,12 @@ def del_mailcontact(request, instances):
mailcontacts_dels = mailcontacts.cleaned_data['mailcontacts'] mailcontacts_dels = mailcontacts.cleaned_data['mailcontacts']
for mailcontacts_del in mailcontacts_dels: for mailcontacts_del in mailcontacts_dels:
mailcontacts_del.delete() mailcontacts_del.delete()
messages.success(request, _("The email adress was deleted.")) messages.success(request,
_("The contact email adress was deleted."))
return redirect(reverse('preferences:display-options')) return redirect(reverse('preferences:display-options'))
return form( return form(
{'preferenceform': mailcontacts, 'action_name': _('Delete')}, {'preferenceform': mailcontacts, 'action_name': _("Delete")},
'preferences/preferences.html', 'preferences/preferences.html',
request request
) )

View file

@ -34,6 +34,7 @@ from django.db.models import Model
from django.contrib import messages from django.contrib import messages
from django.shortcuts import redirect from django.shortcuts import redirect
from django.urls import reverse from django.urls import reverse
from django.utils.translation import ugettext as _
def acl_base_decorator(method_name, *targets, on_instance=True): def acl_base_decorator(method_name, *targets, on_instance=True):
@ -138,7 +139,7 @@ ModelC)
target = target.get_instance(*args, **kwargs) target = target.get_instance(*args, **kwargs)
instances.append(target) instances.append(target)
except target.DoesNotExist: except target.DoesNotExist:
yield False, u"Entrée inexistante" yield False, _("Nonexistent entry.")
return return
if hasattr(target, method_name): if hasattr(target, method_name):
can_fct = getattr(target, method_name) can_fct = getattr(target, method_name)
@ -155,7 +156,8 @@ ModelC)
if error_messages: if error_messages:
for msg in error_messages: for msg in error_messages:
messages.error( messages.error(
request, msg or "Vous ne pouvez pas accéder à ce menu") request, msg or _("You don't have the right to access"
" this menu."))
return redirect(reverse( return redirect(reverse(
'users:profil', 'users:profil',
kwargs={'userid': str(request.user.id)} kwargs={'userid': str(request.user.id)}
@ -219,7 +221,8 @@ def can_delete_set(model):
instances = model.objects.filter(id__in=instances_id) instances = model.objects.filter(id__in=instances_id)
if not instances: if not instances:
messages.error( messages.error(
request, "Vous ne pouvez pas accéder à ce menu") request, _("You don't have the right to access this menu.")
)
return redirect(reverse( return redirect(reverse(
'users:profil', 'users:profil',
kwargs={'userid': str(request.user.id)} kwargs={'userid': str(request.user.id)}
@ -268,10 +271,11 @@ def can_edit_history(view):
return view(request, *args, **kwargs) return view(request, *args, **kwargs)
messages.error( messages.error(
request, request,
"Vous ne pouvez pas éditer l'historique." _("You don't have the right to edit the history.")
) )
return redirect(reverse( return redirect(reverse(
'users:profil', 'users:profil',
kwargs={'userid': str(request.user.id)} kwargs={'userid': str(request.user.id)}
)) ))
return wrapper return wrapper

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show more