mirror of
https://gitlab2.federez.net/re2o/re2o
synced 2024-11-25 22:03:10 +00:00
Merge branch 'translation' into 'dev'
Translation See merge request federez/re2o!471
This commit is contained in:
commit
9afe81b9e2
163 changed files with 4398 additions and 3322 deletions
|
@ -74,6 +74,6 @@ def can_view(user):
|
||||||
can = user.has_perm(permission)
|
can = user.has_perm(permission)
|
||||||
return (
|
return (
|
||||||
can,
|
can,
|
||||||
None if can else _("You don't have the right to see this" " application."),
|
None if can else _("You don't have the right to view this application."),
|
||||||
(permission,),
|
(permission,),
|
||||||
)
|
)
|
||||||
|
|
|
@ -21,7 +21,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: 2.5\n"
|
"Project-Id-Version: 2.5\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2019-09-05 19:48+0200\n"
|
"POT-Creation-Date: 2019-11-19 23:43+0100\n"
|
||||||
"PO-Revision-Date: 2019-01-07 01:37+0100\n"
|
"PO-Revision-Date: 2019-01-07 01:37+0100\n"
|
||||||
"Last-Translator: Laouen Fernet <laouen.fernet@supelec.fr>\n"
|
"Last-Translator: Laouen Fernet <laouen.fernet@supelec.fr>\n"
|
||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
|
@ -31,10 +31,10 @@ msgstr ""
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||||
|
|
||||||
#: api/acl.py:74
|
#: api/acl.py:77
|
||||||
msgid "You don't have the right to see this application."
|
msgid "You don't have the right to view this application."
|
||||||
msgstr "Vous n'avez pas le droit de voir cette application."
|
msgstr "Vous n'avez pas le droit de voir cette application."
|
||||||
|
|
||||||
#: api/authentication.py:49
|
#: api/authentication.py:47
|
||||||
msgid "The token has expired."
|
msgid "The token has expired."
|
||||||
msgstr "Le jeton a expiré."
|
msgstr "Le jeton a expiré."
|
||||||
|
|
|
@ -116,7 +116,7 @@ class DiscountForm(Form):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
is_relative = forms.BooleanField(
|
is_relative = forms.BooleanField(
|
||||||
label=_("Discount is on percentage."), required=False
|
label=_("Discount is in percentage."), required=False
|
||||||
)
|
)
|
||||||
discount = forms.DecimalField(
|
discount = forms.DecimalField(
|
||||||
label=_("Discount"),
|
label=_("Discount"),
|
||||||
|
@ -136,7 +136,7 @@ class DiscountForm(Form):
|
||||||
else:
|
else:
|
||||||
amount = discount
|
amount = discount
|
||||||
if amount:
|
if amount:
|
||||||
name = _("{}% discount") if is_relative else _("{}€ discount")
|
name = _("{}% discount") if is_relative else _("{} € discount")
|
||||||
name = name.format(discount)
|
name = name.format(discount)
|
||||||
Vente.objects.create(facture=invoice, name=name, prix=-amount, number=1)
|
Vente.objects.create(facture=invoice, name=name, prix=-amount, number=1)
|
||||||
|
|
||||||
|
@ -184,7 +184,7 @@ class DelArticleForm(FormRevMixin, Form):
|
||||||
|
|
||||||
articles = forms.ModelMultipleChoiceField(
|
articles = forms.ModelMultipleChoiceField(
|
||||||
queryset=Article.objects.none(),
|
queryset=Article.objects.none(),
|
||||||
label=_("Available articles"),
|
label=_("Current articles"),
|
||||||
widget=forms.CheckboxSelectMultiple,
|
widget=forms.CheckboxSelectMultiple,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -226,7 +226,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=_("Available payment methods"),
|
label=_("Current payment methods"),
|
||||||
widget=forms.CheckboxSelectMultiple,
|
widget=forms.CheckboxSelectMultiple,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -266,7 +266,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=_("Available banks"),
|
label=_("Current banks"),
|
||||||
widget=forms.CheckboxSelectMultiple,
|
widget=forms.CheckboxSelectMultiple,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load diff
79
cotisations/migrations/0042_auto_20191120_0159.py
Normal file
79
cotisations/migrations/0042_auto_20191120_0159.py
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.11.23 on 2019-11-20 00:59
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('cotisations', '0041_auto_20191103_2131'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterModelOptions(
|
||||||
|
name='chequepayment',
|
||||||
|
options={'verbose_name': 'cheque'},
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='balancepayment',
|
||||||
|
name='credit_balance_allowed',
|
||||||
|
field=models.BooleanField(default=False, verbose_name='allow user to credit their balance'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='balancepayment',
|
||||||
|
name='maximum_balance',
|
||||||
|
field=models.DecimalField(blank=True, decimal_places=2, default=50, help_text='The maximal amount of money allowed for the balance.', max_digits=5, null=True, verbose_name='maximum balance'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='balancepayment',
|
||||||
|
name='minimum_balance',
|
||||||
|
field=models.DecimalField(decimal_places=2, default=0, help_text='The minimal amount of money allowed for the balance at the end of a payment. You can specify a negative amount.', max_digits=5, verbose_name='minimum balance'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='baseinvoice',
|
||||||
|
name='date',
|
||||||
|
field=models.DateTimeField(auto_now_add=True, verbose_name='date'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='comnpaypayment',
|
||||||
|
name='minimum_payment',
|
||||||
|
field=models.DecimalField(decimal_places=2, default=1, help_text='The minimal amount of money you have to use when paying with ComNpay.', max_digits=5, verbose_name='minimum payment'),
|
||||||
|
),
|
||||||
|
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='costestimate',
|
||||||
|
name='validity',
|
||||||
|
field=models.DurationField(help_text='DD HH:MM:SS', verbose_name='period of validity'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='custominvoice',
|
||||||
|
name='address',
|
||||||
|
field=models.CharField(max_length=255, verbose_name='address'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='custominvoice',
|
||||||
|
name='paid',
|
||||||
|
field=models.BooleanField(default=False, verbose_name='paid'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='custominvoice',
|
||||||
|
name='payment',
|
||||||
|
field=models.CharField(max_length=255, verbose_name='payment type'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='custominvoice',
|
||||||
|
name='recipient',
|
||||||
|
field=models.CharField(max_length=255, verbose_name='recipient'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='custominvoice',
|
||||||
|
name='remark',
|
||||||
|
field=models.TextField(blank=True, null=True, verbose_name='remark'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -56,7 +56,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(auto_now_add=True, verbose_name=_("Date"))
|
date = models.DateTimeField(auto_now_add=True, verbose_name=_("date"))
|
||||||
|
|
||||||
# TODO : change prix to price
|
# TODO : change prix to price
|
||||||
def prix(self):
|
def prix(self):
|
||||||
|
@ -138,7 +138,7 @@ class Facture(BaseInvoice):
|
||||||
abstract = False
|
abstract = False
|
||||||
permissions = (
|
permissions = (
|
||||||
# TODO : change facture to invoice
|
# TODO : change facture to invoice
|
||||||
("change_facture_control", _('Can edit the "controlled" state')),
|
("change_facture_control", _("Can edit the \"controlled\" state")),
|
||||||
("view_facture", _("Can view an invoice object")),
|
("view_facture", _("Can view an invoice object")),
|
||||||
("change_all_facture", _("Can edit all the previous invoices")),
|
("change_all_facture", _("Can edit all the previous invoices")),
|
||||||
)
|
)
|
||||||
|
@ -174,8 +174,8 @@ class Facture(BaseInvoice):
|
||||||
return (
|
return (
|
||||||
False,
|
False,
|
||||||
_(
|
_(
|
||||||
"You don't have the right to edit an invoice "
|
"You don't have the right to edit an invoice"
|
||||||
"already controlled or invalidated."
|
" already controlled or invalidated."
|
||||||
),
|
),
|
||||||
("cotisations.change_all_facture",),
|
("cotisations.change_all_facture",),
|
||||||
)
|
)
|
||||||
|
@ -206,8 +206,8 @@ class Facture(BaseInvoice):
|
||||||
return (
|
return (
|
||||||
False,
|
False,
|
||||||
_(
|
_(
|
||||||
"You don't have the right to delete an invoice "
|
"You don't have the right to delete an invoice"
|
||||||
"already controlled or invalidated."
|
" already controlled or invalidated."
|
||||||
),
|
),
|
||||||
("cotisations.change_all_facture",),
|
("cotisations.change_all_facture",),
|
||||||
)
|
)
|
||||||
|
@ -220,8 +220,8 @@ class Facture(BaseInvoice):
|
||||||
return (
|
return (
|
||||||
False,
|
False,
|
||||||
_(
|
_(
|
||||||
"You don't have the right to view someone else's "
|
"You don't have the right to view someone else's"
|
||||||
"invoices history."
|
" invoices history."
|
||||||
),
|
),
|
||||||
("cotisations.view_facture",),
|
("cotisations.view_facture",),
|
||||||
)
|
)
|
||||||
|
@ -243,7 +243,7 @@ class Facture(BaseInvoice):
|
||||||
can = user_request.has_perm("cotisations.change_facture_control")
|
can = user_request.has_perm("cotisations.change_facture_control")
|
||||||
return (
|
return (
|
||||||
can,
|
can,
|
||||||
_('You don\'t have the right to edit the "controlled" state.')
|
_("You don't have the right to edit the \"controlled\" state.")
|
||||||
if not can
|
if not can
|
||||||
else None,
|
else None,
|
||||||
("cotisations.change_facture_control",),
|
("cotisations.change_facture_control",),
|
||||||
|
@ -262,13 +262,13 @@ class Facture(BaseInvoice):
|
||||||
if len(Paiement.find_allowed_payments(user_request)) <= 0:
|
if len(Paiement.find_allowed_payments(user_request)) <= 0:
|
||||||
return (
|
return (
|
||||||
False,
|
False,
|
||||||
_("There are no payment method which you can use."),
|
_("There are no payment methods that you can use."),
|
||||||
("cotisations.add_facture",),
|
("cotisations.add_facture",),
|
||||||
)
|
)
|
||||||
if len(Article.find_allowed_articles(user_request, user_request)) <= 0:
|
if len(Article.find_allowed_articles(user_request, user_request)) <= 0:
|
||||||
return (
|
return (
|
||||||
False,
|
False,
|
||||||
_("There are no article that you can buy."),
|
_("There are no articles that you can buy."),
|
||||||
("cotisations.add_facture",),
|
("cotisations.add_facture",),
|
||||||
)
|
)
|
||||||
return True, None, None
|
return True, None, None
|
||||||
|
@ -346,11 +346,11 @@ class CustomInvoice(BaseInvoice):
|
||||||
class Meta:
|
class Meta:
|
||||||
permissions = (("view_custominvoice", _("Can view a custom invoice object")),)
|
permissions = (("view_custominvoice", _("Can view a custom invoice object")),)
|
||||||
|
|
||||||
recipient = models.CharField(max_length=255, verbose_name=_("Recipient"))
|
recipient = models.CharField(max_length=255, verbose_name=_("recipient"))
|
||||||
payment = models.CharField(max_length=255, verbose_name=_("Payment type"))
|
payment = models.CharField(max_length=255, verbose_name=_("payment type"))
|
||||||
address = models.CharField(max_length=255, verbose_name=_("Address"))
|
address = models.CharField(max_length=255, verbose_name=_("address"))
|
||||||
paid = models.BooleanField(verbose_name=_("Paid"), default=False)
|
paid = models.BooleanField(verbose_name=_("paid"), default=False)
|
||||||
remark = models.TextField(verbose_name=_("Remark"), blank=True, null=True)
|
remark = models.TextField(verbose_name=_("remark"), blank=True, null=True)
|
||||||
|
|
||||||
|
|
||||||
class CostEstimate(CustomInvoice):
|
class CostEstimate(CustomInvoice):
|
||||||
|
@ -358,7 +358,7 @@ class CostEstimate(CustomInvoice):
|
||||||
permissions = (("view_costestimate", _("Can view a cost estimate object")),)
|
permissions = (("view_costestimate", _("Can view a cost estimate object")),)
|
||||||
|
|
||||||
validity = models.DurationField(
|
validity = models.DurationField(
|
||||||
verbose_name=_("Period of validity"), help_text="DD HH:MM:SS"
|
verbose_name=_("period of validity"), help_text="DD HH:MM:SS"
|
||||||
)
|
)
|
||||||
final_invoice = models.ForeignKey(
|
final_invoice = models.ForeignKey(
|
||||||
CustomInvoice,
|
CustomInvoice,
|
||||||
|
@ -547,7 +547,7 @@ class Vente(RevMixin, AclMixin, models.Model):
|
||||||
if not user_request.has_perm("cotisations.change_vente"):
|
if not user_request.has_perm("cotisations.change_vente"):
|
||||||
return (
|
return (
|
||||||
False,
|
False,
|
||||||
_("You don't have the right to edit the purchases."),
|
_("You don't have the right to edit a purchase."),
|
||||||
("cotisations.change_vente",),
|
("cotisations.change_vente",),
|
||||||
)
|
)
|
||||||
elif not (user_request.has_perm("cotisations.change_all_facture") or user_can):
|
elif not (user_request.has_perm("cotisations.change_all_facture") or user_can):
|
||||||
|
@ -562,8 +562,8 @@ class Vente(RevMixin, AclMixin, models.Model):
|
||||||
return (
|
return (
|
||||||
False,
|
False,
|
||||||
_(
|
_(
|
||||||
"You don't have the right to edit a purchase "
|
"You don't have the right to edit a purchase"
|
||||||
"already controlled or invalidated."
|
" already controlled or invalidated."
|
||||||
),
|
),
|
||||||
("cotisations.change_all_vente",),
|
("cotisations.change_all_vente",),
|
||||||
)
|
)
|
||||||
|
@ -590,8 +590,8 @@ class Vente(RevMixin, AclMixin, models.Model):
|
||||||
return (
|
return (
|
||||||
False,
|
False,
|
||||||
_(
|
_(
|
||||||
"You don't have the right to delete a purchase "
|
"You don't have the right to delete a purchase"
|
||||||
"already controlled or invalidated."
|
" already controlled or invalidated."
|
||||||
),
|
),
|
||||||
None,
|
None,
|
||||||
)
|
)
|
||||||
|
@ -606,8 +606,8 @@ class Vente(RevMixin, AclMixin, models.Model):
|
||||||
return (
|
return (
|
||||||
False,
|
False,
|
||||||
_(
|
_(
|
||||||
"You don't have the right to view someone "
|
"You don't have the right to view someone"
|
||||||
"else's purchase history."
|
" else's purchase history."
|
||||||
),
|
),
|
||||||
("cotisations.view_vente",),
|
("cotisations.view_vente",),
|
||||||
)
|
)
|
||||||
|
@ -731,7 +731,7 @@ class Article(RevMixin, AclMixin, models.Model):
|
||||||
|
|
||||||
def clean(self):
|
def clean(self):
|
||||||
if self.name.lower() == "solde":
|
if self.name.lower() == "solde":
|
||||||
raise ValidationError(_("Balance is a reserved article name."))
|
raise ValidationError(_("Solde is a reserved article name."))
|
||||||
if self.type_cotisation and not (self.duration or self.duration_days):
|
if self.type_cotisation and not (self.duration or self.duration_days):
|
||||||
raise ValidationError(_("Duration must be specified for a subscription."))
|
raise ValidationError(_("Duration must be specified for a subscription."))
|
||||||
|
|
||||||
|
@ -921,7 +921,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 methods.")
|
||||||
|
|
||||||
|
|
||||||
class Cotisation(RevMixin, AclMixin, models.Model):
|
class Cotisation(RevMixin, AclMixin, models.Model):
|
||||||
|
@ -976,8 +976,8 @@ class Cotisation(RevMixin, AclMixin, models.Model):
|
||||||
return (
|
return (
|
||||||
False,
|
False,
|
||||||
_(
|
_(
|
||||||
"You don't have the right to edit a subscription "
|
"You don't have the right to edit a subscription"
|
||||||
"already controlled or invalidated."
|
" already controlled or invalidated."
|
||||||
),
|
),
|
||||||
("cotisations.change_all_cotisation",),
|
("cotisations.change_all_cotisation",),
|
||||||
)
|
)
|
||||||
|
@ -995,8 +995,8 @@ class Cotisation(RevMixin, AclMixin, models.Model):
|
||||||
return (
|
return (
|
||||||
False,
|
False,
|
||||||
_(
|
_(
|
||||||
"You don't have the right to delete a subscription "
|
"You don't have the right to delete a subscription"
|
||||||
"already controlled or invalidated."
|
" already controlled or invalidated."
|
||||||
),
|
),
|
||||||
None,
|
None,
|
||||||
)
|
)
|
||||||
|
@ -1011,8 +1011,8 @@ class Cotisation(RevMixin, AclMixin, models.Model):
|
||||||
return (
|
return (
|
||||||
False,
|
False,
|
||||||
_(
|
_(
|
||||||
"You don't have the right to view someone else's "
|
"You don't have the right to view someone else's"
|
||||||
"subscription history."
|
" subscription history."
|
||||||
),
|
),
|
||||||
("cotisations.view_cotisation",),
|
("cotisations.view_cotisation",),
|
||||||
)
|
)
|
||||||
|
|
|
@ -44,18 +44,17 @@ class BalancePayment(PaymentMethodMixin, models.Model):
|
||||||
editable=False,
|
editable=False,
|
||||||
)
|
)
|
||||||
minimum_balance = models.DecimalField(
|
minimum_balance = models.DecimalField(
|
||||||
verbose_name=_("Minimum balance"),
|
verbose_name=_("minimum balance"),
|
||||||
help_text=_(
|
help_text=_(
|
||||||
"The minimal amount of money allowed for the balance"
|
"The minimal amount of money allowed for the balance at the end"
|
||||||
" at the end of a payment. You can specify negative "
|
" of a payment. You can specify a negative amount."
|
||||||
"amount."
|
|
||||||
),
|
),
|
||||||
max_digits=5,
|
max_digits=5,
|
||||||
decimal_places=2,
|
decimal_places=2,
|
||||||
default=0,
|
default=0,
|
||||||
)
|
)
|
||||||
maximum_balance = models.DecimalField(
|
maximum_balance = models.DecimalField(
|
||||||
verbose_name=_("Maximum balance"),
|
verbose_name=_("maximum balance"),
|
||||||
help_text=_("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,
|
||||||
|
@ -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=_("Allow user to credit their balance"), default=False
|
verbose_name=_("allow user to credit their balance"), default=False
|
||||||
)
|
)
|
||||||
|
|
||||||
def end_payment(self, invoice, request):
|
def end_payment(self, invoice, request):
|
||||||
|
|
|
@ -33,7 +33,7 @@ class ChequePayment(PaymentMethodMixin, models.Model):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = _("Cheque")
|
verbose_name = _("cheque")
|
||||||
|
|
||||||
payment = models.OneToOneField(
|
payment = models.OneToOneField(
|
||||||
Paiement,
|
Paiement,
|
||||||
|
|
|
@ -51,9 +51,10 @@ class ComnpayPayment(PaymentMethodMixin, models.Model):
|
||||||
max_length=255, null=True, blank=True, verbose_name=_("ComNpay secret key")
|
max_length=255, null=True, blank=True, verbose_name=_("ComNpay secret key")
|
||||||
)
|
)
|
||||||
minimum_payment = models.DecimalField(
|
minimum_payment = models.DecimalField(
|
||||||
verbose_name=_("Minimum payment"),
|
verbose_name=_("minimum payment"),
|
||||||
help_text=_(
|
help_text=_(
|
||||||
"The minimal amount of money you have to use when paying" " with ComNpay"
|
"The minimal amount of money you have to use when paying with"
|
||||||
|
" ComNpay."
|
||||||
),
|
),
|
||||||
max_digits=5,
|
max_digits=5,
|
||||||
decimal_places=2,
|
decimal_places=2,
|
||||||
|
@ -62,7 +63,7 @@ class ComnpayPayment(PaymentMethodMixin, models.Model):
|
||||||
production = models.BooleanField(
|
production = models.BooleanField(
|
||||||
default=True,
|
default=True,
|
||||||
verbose_name=_(
|
verbose_name=_(
|
||||||
"Production mode enabled (production URL, instead of homologation)"
|
"production mode enabled (production URL, instead of homologation)"
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -58,9 +58,9 @@ class PaymentMethodForm(forms.Form):
|
||||||
payment_method = forms.ChoiceField(
|
payment_method = forms.ChoiceField(
|
||||||
label=_("Special payment method"),
|
label=_("Special payment method"),
|
||||||
help_text=_(
|
help_text=_(
|
||||||
"Warning: you will not be able to change the payment "
|
"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."
|
||||||
),
|
),
|
||||||
required=False,
|
required=False,
|
||||||
)
|
)
|
||||||
|
@ -71,7 +71,7 @@ class PaymentMethodForm(forms.Form):
|
||||||
self.fields["payment_method"].choices = [
|
self.fields["payment_method"].choices = [
|
||||||
(i, p.NAME) for (i, p) in enumerate(PAYMENT_METHODS)
|
(i, p.NAME) for (i, p) in enumerate(PAYMENT_METHODS)
|
||||||
]
|
]
|
||||||
self.fields["payment_method"].choices.insert(0, ("", _("no")))
|
self.fields["payment_method"].choices.insert(0, ("", _("No")))
|
||||||
self.fields["payment_method"].widget.attrs = {"id": "paymentMethodSelect"}
|
self.fields["payment_method"].widget.attrs = {"id": "paymentMethodSelect"}
|
||||||
self.templates = [
|
self.templates = [
|
||||||
forms.modelform_factory(p.PaymentMethod, fields="__all__")(prefix=prefix)
|
forms.modelform_factory(p.PaymentMethod, fields="__all__")(prefix=prefix)
|
||||||
|
|
|
@ -51,4 +51,4 @@ class FreePayment(PaymentMethodMixin, models.Model):
|
||||||
"""Checks that the price meets the requirement to be paid with user
|
"""Checks that the price meets the requirement to be paid with user
|
||||||
balance.
|
balance.
|
||||||
"""
|
"""
|
||||||
return (price == 0, _("You cannot validate this invoice for free."))
|
return (price == 0, _("You can't pay this invoice for free."))
|
||||||
|
|
|
@ -30,5 +30,5 @@ class NoteCredentialForm(forms.Form):
|
||||||
object.
|
object.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
login = forms.CharField(label=_("pseudo note"))
|
login = forms.CharField(label=_("Username"))
|
||||||
password = forms.CharField(label=_("Password"), widget=forms.PasswordInput)
|
password = forms.CharField(label=_("Password"), widget=forms.PasswordInput)
|
||||||
|
|
|
@ -31,7 +31,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>{% trans "Payment type" %}</th>
|
<th>{% trans "Payment type" %}</th>
|
||||||
<th>{% trans "Is available for everyone" %}</th>
|
<th>{% trans "Available for everyone" %}</th>
|
||||||
<th>{% trans "Custom payment method" %}</th>
|
<th>{% trans "Custom payment method" %}</th>
|
||||||
<th></th>
|
<th></th>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
|
@ -45,12 +45,12 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<tr>
|
<tr>
|
||||||
<th>{% trans "Profile" %}</th>
|
<th>{% trans "Profile" %}</th>
|
||||||
<th>
|
<th>
|
||||||
{% trans "Last name" as tr_last_name %}
|
{% trans "First name" as tr_first_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_first_name %}
|
||||||
</th>
|
</th>
|
||||||
<th>
|
<th>
|
||||||
{% trans "First name" as tr_first_name %}
|
{% trans "Surname" as tr_surname %}
|
||||||
{% include 'buttons/sort.html' with prefix='control' col='surname' text=tr_first_name %}
|
{% include 'buttons/sort.html' with prefix='control' col='surname' text=tr_surname %}
|
||||||
</th>
|
</th>
|
||||||
<th>
|
<th>
|
||||||
{% trans "Invoice ID" as tr_invoice_id %}
|
{% trans "Invoice ID" as tr_invoice_id %}
|
||||||
|
@ -104,8 +104,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</table>
|
</table>
|
||||||
{% trans "Edit" as tr_edit %}
|
{% trans "Confirm" as tr_confirm %}
|
||||||
{% bootstrap_button tr_edit button_type='submit' icon='ok' button_class='btn-success' %}
|
{% bootstrap_button tr_confirm button_type='submit' icon='ok' button_class='btn-success' %}
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -33,7 +33,7 @@ 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 %}
|
||||||
<h4>
|
<h4>
|
||||||
{% blocktrans %}Warning: are you sure you really want to delete this {{ object_name }} object ( {{ objet }} )?{% endblocktrans %}
|
{% blocktrans %}Warning: are you sure you really want to delete this {{ objet_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' button_class='btn-danger' %}
|
{% bootstrap_button tr_confirm button_type='submit' icon='trash' button_class='btn-danger' %}
|
||||||
|
|
|
@ -6,17 +6,17 @@ Nous vous remercions pour votre achat auprès de {{asso_name}} et nous vous en j
|
||||||
|
|
||||||
En cas de question, n’hésitez pas à nous contacter par mail à {{contact_mail}}.
|
En cas de question, n’hésitez pas à nous contacter par mail à {{contact_mail}}.
|
||||||
|
|
||||||
Cordialement,
|
Respectueusement,
|
||||||
L’équipe de {{asso_name}}
|
L’équipe de {{asso_name}}.
|
||||||
|
|
||||||
|
|
||||||
=== English version ===
|
=== English version ===
|
||||||
|
|
||||||
Dear {{name}},
|
Hello {{name}},
|
||||||
|
|
||||||
Thank you for your purchase. Here is your invoice.
|
Thank you for your purchase at {{asso_name}}. Here is your invoice.
|
||||||
|
|
||||||
Should you need extra information, you can email us at {{contact_mail}}.
|
Should you need extra information, do not hesitate to email us at {{contact_mail}}.
|
||||||
|
|
||||||
Best regards,
|
Regards,
|
||||||
{{ asso_name }}'s team
|
The {{ asso_name }} team.
|
||||||
|
|
|
@ -6,17 +6,18 @@ Vous trouverez en pièce jointe un reçu.
|
||||||
|
|
||||||
Pour nous faire part de toute remarque, suggestion ou problème vous pouvez nous envoyer un mail à {{asso_email}}.
|
Pour nous faire part de toute remarque, suggestion ou problème vous pouvez nous envoyer un mail à {{asso_email}}.
|
||||||
|
|
||||||
À bientôt,
|
Respectueusement,
|
||||||
L'équipe de {{asso_name}}.
|
L'équipe de {{asso_name}}.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
Hello {{name}}!
|
||||||
|
|
||||||
Your subscription to {{asso_name}} has just been accepted. You are now a full member of {{asso_name}} until {{ date_end|date:"d/m/Y" }}.
|
Your subscription to {{asso_name}} has just been accepted. You are now a full member of {{asso_name}} until {{ date_end|date:"d/m/Y" }}.
|
||||||
|
|
||||||
You will find with this email a subscription voucher.
|
You will find with this email a subscription voucher.
|
||||||
|
|
||||||
For any information, suggestion or problem, you can contact us via email at
|
To express any comment, suggestion or problem, you can send us an email to {{asso_email}}.
|
||||||
{{asso_email}}.
|
|
||||||
|
|
||||||
Regards,
|
Regards,
|
||||||
The {{asso_name}} team.
|
The {{asso_name}} team.
|
||||||
|
|
|
@ -30,14 +30,14 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
{% block title %}{% trans "Articles" %}{% endblock %}
|
{% block title %}{% trans "Articles" %}{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<h2>{% trans "List of article types" %}</h2>
|
<h2>{% trans "List of articles" %}</h2>
|
||||||
{% can_create Article %}
|
{% can_create Article %}
|
||||||
<a class="btn btn-primary btn-sm" role="button" href="{% url 'cotisations:add-article' %}">
|
<a class="btn btn-primary btn-sm" role="button" href="{% url 'cotisations:add-article' %}">
|
||||||
<i class="fa fa-cart-plus"></i> {% trans "Add an article type" %}
|
<i class="fa fa-plus"></i> {% trans "Add an article" %}
|
||||||
</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 one or several article types" %}
|
<i class="fa fa-trash"></i> {% trans "Delete one or several articles" %}
|
||||||
</a>
|
</a>
|
||||||
{% include 'cotisations/aff_article.html' with article_list=article_list %}
|
{% include 'cotisations/aff_article.html' with article_list=article_list %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -33,7 +33,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<h2>{% trans "List of banks" %}</h2>
|
<h2>{% trans "List of banks" %}</h2>
|
||||||
{% can_create Banque %}
|
{% can_create Banque %}
|
||||||
<a class="btn btn-primary btn-sm" role="button" href="{% url 'cotisations:add-banque' %}">
|
<a class="btn btn-primary btn-sm" role="button" href="{% url 'cotisations:add-banque' %}">
|
||||||
<i class="fa fa-cart-plus"></i> {% trans "Add a bank" %}
|
<i class="fa fa-plus"></i> {% trans "Add a bank" %}
|
||||||
</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' %}">
|
||||||
|
|
|
@ -33,7 +33,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<h2>{% trans "List of payment methods" %}</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 method" %}
|
<i class="fa fa-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' %}">
|
||||||
|
|
|
@ -52,7 +52,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
{% acl_end %}
|
{% acl_end %}
|
||||||
{% can_view_all Article %}
|
{% can_view_all Article %}
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'cotisations:index-article' %}">
|
<a class="list-group-item list-group-item-info" href="{% url 'cotisations:index-article' %}">
|
||||||
<i class="fa fa-list-ul"></i> {% trans "Available articles" %}
|
<i class="fa fa-list-ul"></i> {% trans "Articles" %}
|
||||||
</a>
|
</a>
|
||||||
{% acl_end %}
|
{% acl_end %}
|
||||||
{% can_view_all Banque %}
|
{% can_view_all Banque %}
|
||||||
|
|
|
@ -36,7 +36,6 @@ from django.template.loader import get_template
|
||||||
from django.http import HttpResponse
|
from django.http import HttpResponse
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.utils.text import slugify
|
from django.utils.text import slugify
|
||||||
from django.utils.translation import ugettext_lazy as _
|
|
||||||
|
|
||||||
from re2o.mixins import AclMixin, RevMixin
|
from re2o.mixins import AclMixin, RevMixin
|
||||||
from preferences.models import CotisationsOption
|
from preferences.models import CotisationsOption
|
||||||
|
|
|
@ -166,6 +166,7 @@ def new_facture(request, user, userid):
|
||||||
"articlelist": article_list,
|
"articlelist": article_list,
|
||||||
"balance": balance,
|
"balance": balance,
|
||||||
"action_name": _("Confirm"),
|
"action_name": _("Confirm"),
|
||||||
|
"title": _("New invoice"),
|
||||||
},
|
},
|
||||||
"cotisations/facture.html",
|
"cotisations/facture.html",
|
||||||
request,
|
request,
|
||||||
|
@ -222,7 +223,7 @@ def new_cost_estimate(request):
|
||||||
"articlesformset": articles_formset,
|
"articlesformset": articles_formset,
|
||||||
"articlelist": articles,
|
"articlelist": articles,
|
||||||
"discount_form": discount_form,
|
"discount_form": discount_form,
|
||||||
"title": _("Cost estimate"),
|
"title": _("New cost estimate"),
|
||||||
},
|
},
|
||||||
"cotisations/facture.html",
|
"cotisations/facture.html",
|
||||||
request,
|
request,
|
||||||
|
@ -278,6 +279,7 @@ def new_custom_invoice(request):
|
||||||
"articlesformset": articles_formset,
|
"articlesformset": articles_formset,
|
||||||
"articlelist": articles,
|
"articlelist": articles,
|
||||||
"discount_form": discount_form,
|
"discount_form": discount_form,
|
||||||
|
"title": _("New custom invoice"),
|
||||||
},
|
},
|
||||||
"cotisations/facture.html",
|
"cotisations/facture.html",
|
||||||
request,
|
request,
|
||||||
|
@ -373,7 +375,7 @@ def del_facture(request, facture, **_kwargs):
|
||||||
messages.success(request, _("The invoice was deleted."))
|
messages.success(request, _("The invoice was deleted."))
|
||||||
return redirect(reverse("cotisations:index"))
|
return redirect(reverse("cotisations:index"))
|
||||||
return form(
|
return form(
|
||||||
{"objet": facture, "objet_name": _("Invoice")},
|
{"objet": facture, "objet_name": _("invoice")},
|
||||||
"cotisations/delete.html",
|
"cotisations/delete.html",
|
||||||
request,
|
request,
|
||||||
)
|
)
|
||||||
|
@ -437,7 +439,11 @@ def edit_custom_invoice(request, invoice, **kwargs):
|
||||||
return redirect(reverse("cotisations:index-custom-invoice"))
|
return redirect(reverse("cotisations:index-custom-invoice"))
|
||||||
|
|
||||||
return form(
|
return form(
|
||||||
{"factureform": invoice_form, "venteform": purchase_form},
|
{
|
||||||
|
"factureform": invoice_form,
|
||||||
|
"venteform": purchase_form,
|
||||||
|
"title": _("Edit custom invoice"),
|
||||||
|
},
|
||||||
"cotisations/edit_facture.html",
|
"cotisations/edit_facture.html",
|
||||||
request,
|
request,
|
||||||
)
|
)
|
||||||
|
@ -501,7 +507,7 @@ def del_cost_estimate(request, estimate, **_kwargs):
|
||||||
messages.success(request, _("The cost estimate was deleted."))
|
messages.success(request, _("The cost estimate was deleted."))
|
||||||
return redirect(reverse("cotisations:index-cost-estimate"))
|
return redirect(reverse("cotisations:index-cost-estimate"))
|
||||||
return form(
|
return form(
|
||||||
{"objet": estimate, "objet_name": _("Cost estimate")},
|
{"objet": estimate, "objet_name": _("cost estimate")},
|
||||||
"cotisations/delete.html",
|
"cotisations/delete.html",
|
||||||
request,
|
request,
|
||||||
)
|
)
|
||||||
|
@ -564,7 +570,7 @@ def del_custom_invoice(request, invoice, **_kwargs):
|
||||||
messages.success(request, _("The invoice was deleted."))
|
messages.success(request, _("The invoice was deleted."))
|
||||||
return redirect(reverse("cotisations:index-custom-invoice"))
|
return redirect(reverse("cotisations:index-custom-invoice"))
|
||||||
return form(
|
return form(
|
||||||
{"objet": invoice, "objet_name": _("Invoice")},
|
{"objet": invoice, "objet_name": _("invoice")},
|
||||||
"cotisations/delete.html",
|
"cotisations/delete.html",
|
||||||
request,
|
request,
|
||||||
)
|
)
|
||||||
|
@ -588,7 +594,11 @@ def add_article(request):
|
||||||
messages.success(request, _("The article was created."))
|
messages.success(request, _("The article was created."))
|
||||||
return redirect(reverse("cotisations:index-article"))
|
return redirect(reverse("cotisations:index-article"))
|
||||||
return form(
|
return form(
|
||||||
{"factureform": article, "action_name": _("Add"), "title": _("New article")},
|
{
|
||||||
|
"factureform": article,
|
||||||
|
"action_name": _("Add"),
|
||||||
|
"title": _("New article"),
|
||||||
|
},
|
||||||
"cotisations/facture.html",
|
"cotisations/facture.html",
|
||||||
request,
|
request,
|
||||||
)
|
)
|
||||||
|
@ -607,7 +617,11 @@ def edit_article(request, article_instance, **_kwargs):
|
||||||
messages.success(request, _("The article was edited."))
|
messages.success(request, _("The article was edited."))
|
||||||
return redirect(reverse("cotisations:index-article"))
|
return redirect(reverse("cotisations:index-article"))
|
||||||
return form(
|
return form(
|
||||||
{"factureform": article, "action_name": _("Edit"), "title": _("Edit article")},
|
{
|
||||||
|
"factureform": article,
|
||||||
|
"action_name": _("Edit"),
|
||||||
|
"title": _("Edit article"),
|
||||||
|
},
|
||||||
"cotisations/facture.html",
|
"cotisations/facture.html",
|
||||||
request,
|
request,
|
||||||
)
|
)
|
||||||
|
@ -718,8 +732,8 @@ def del_paiement(request, instances):
|
||||||
messages.error(
|
messages.error(
|
||||||
request,
|
request,
|
||||||
_(
|
_(
|
||||||
"The payment method %(method_name)s can't be deleted \
|
"The payment method %(method_name)s can't be deleted"
|
||||||
because there are invoices using it."
|
" because there are invoices using it."
|
||||||
)
|
)
|
||||||
% {"method_name": payment_del},
|
% {"method_name": payment_del},
|
||||||
)
|
)
|
||||||
|
@ -748,7 +762,11 @@ def add_banque(request):
|
||||||
messages.success(request, _("The bank was created."))
|
messages.success(request, _("The bank was created."))
|
||||||
return redirect(reverse("cotisations:index-banque"))
|
return redirect(reverse("cotisations:index-banque"))
|
||||||
return form(
|
return form(
|
||||||
{"factureform": bank, "action_name": _("Add"), "title": _("New bank")},
|
{
|
||||||
|
"factureform": bank,
|
||||||
|
"action_name": _("Add"),
|
||||||
|
"title": _("New bank"),
|
||||||
|
},
|
||||||
"cotisations/facture.html",
|
"cotisations/facture.html",
|
||||||
request,
|
request,
|
||||||
)
|
)
|
||||||
|
@ -768,7 +786,11 @@ def edit_banque(request, banque_instance, **_kwargs):
|
||||||
messages.success(request, _("The bank was edited."))
|
messages.success(request, _("The bank was edited."))
|
||||||
return redirect(reverse("cotisations:index-banque"))
|
return redirect(reverse("cotisations:index-banque"))
|
||||||
return form(
|
return form(
|
||||||
{"factureform": bank, "action_name": _("Edit"), "title": _("Edit bank")},
|
{
|
||||||
|
"factureform": bank,
|
||||||
|
"action_name": _("Edit"),
|
||||||
|
"title": _("Edit bank"),
|
||||||
|
},
|
||||||
"cotisations/facture.html",
|
"cotisations/facture.html",
|
||||||
request,
|
request,
|
||||||
)
|
)
|
||||||
|
@ -802,7 +824,11 @@ def del_banque(request, instances):
|
||||||
)
|
)
|
||||||
return redirect(reverse("cotisations:index-banque"))
|
return redirect(reverse("cotisations:index-banque"))
|
||||||
return form(
|
return form(
|
||||||
{"factureform": bank, "action_name": _("Delete"), "title": _("Delete bank")},
|
{
|
||||||
|
"factureform": bank,
|
||||||
|
"action_name": _("Delete"),
|
||||||
|
"title": _("Delete bank"),
|
||||||
|
},
|
||||||
"cotisations/facture.html",
|
"cotisations/facture.html",
|
||||||
request,
|
request,
|
||||||
)
|
)
|
||||||
|
@ -833,7 +859,7 @@ def control(request):
|
||||||
)
|
)
|
||||||
if control_invoices_form.is_valid():
|
if control_invoices_form.is_valid():
|
||||||
control_invoices_form.save()
|
control_invoices_form.save()
|
||||||
reversion.set_comment("Controle")
|
reversion.set_comment("Control")
|
||||||
messages.success(
|
messages.success(
|
||||||
request, _("Your changes have been properly taken into account.")
|
request, _("Your changes have been properly taken into account.")
|
||||||
)
|
)
|
||||||
|
|
|
@ -41,6 +41,7 @@ def can_view(user):
|
||||||
can = user.has_module_perms("admin")
|
can = user.has_module_perms("admin")
|
||||||
return (
|
return (
|
||||||
can,
|
can,
|
||||||
None if can else _("You don't have the right to view this" " application."),
|
None if can else _("You don't have the right to view this"
|
||||||
|
" application."),
|
||||||
"admin",
|
"admin",
|
||||||
)
|
)
|
||||||
|
|
|
@ -21,7 +21,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: 2.5\n"
|
"Project-Id-Version: 2.5\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2019-09-05 19:48+0200\n"
|
"POT-Creation-Date: 2019-11-19 23:43+0100\n"
|
||||||
"PO-Revision-Date: 2018-06-23 16:01+0200\n"
|
"PO-Revision-Date: 2018-06-23 16:01+0200\n"
|
||||||
"Last-Translator: Laouen Fernet <laouen.fernet@supelec.fr>\n"
|
"Last-Translator: Laouen Fernet <laouen.fernet@supelec.fr>\n"
|
||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
|
@ -30,7 +30,7 @@ msgstr ""
|
||||||
"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"
|
||||||
|
|
||||||
#: logs/acl.py:42
|
#: logs/acl.py:44
|
||||||
msgid "You don't have the right to view this application."
|
msgid "You don't have the right to view this application."
|
||||||
msgstr "Vous n'avez pas le droit de voir cette application."
|
msgstr "Vous n'avez pas le droit de voir cette application."
|
||||||
|
|
||||||
|
@ -121,8 +121,8 @@ msgid "%(username)s has sold %(number)sx %(name)s"
|
||||||
msgstr "%(username)s a vendu %(number)sx %(name)s"
|
msgstr "%(username)s a vendu %(number)sx %(name)s"
|
||||||
|
|
||||||
#: logs/templates/logs/aff_summary.html:116
|
#: logs/templates/logs/aff_summary.html:116
|
||||||
msgid " to"
|
msgid "to"
|
||||||
msgstr " à"
|
msgstr "à"
|
||||||
|
|
||||||
#: logs/templates/logs/aff_summary.html:119
|
#: logs/templates/logs/aff_summary.html:119
|
||||||
#, python-format
|
#, python-format
|
||||||
|
@ -159,7 +159,7 @@ msgid "Statistics"
|
||||||
msgstr "Statistiques"
|
msgstr "Statistiques"
|
||||||
|
|
||||||
#: logs/templates/logs/index.html:32 logs/templates/logs/stats_logs.html:32
|
#: logs/templates/logs/index.html:32 logs/templates/logs/stats_logs.html:32
|
||||||
#: logs/views.py:422
|
#: logs/views.py:400
|
||||||
msgid "Actions performed"
|
msgid "Actions performed"
|
||||||
msgstr "Actions effectuées"
|
msgstr "Actions effectuées"
|
||||||
|
|
||||||
|
@ -183,7 +183,7 @@ msgstr "Base de données"
|
||||||
msgid "Wiring actions"
|
msgid "Wiring actions"
|
||||||
msgstr "Actions de câblage"
|
msgstr "Actions de câblage"
|
||||||
|
|
||||||
#: logs/templates/logs/sidebar.html:53 logs/views.py:344
|
#: logs/templates/logs/sidebar.html:53
|
||||||
msgid "Users"
|
msgid "Users"
|
||||||
msgstr "Utilisateurs"
|
msgstr "Utilisateurs"
|
||||||
|
|
||||||
|
@ -199,161 +199,126 @@ msgstr "Statistiques sur la base de données"
|
||||||
msgid "Statistics about users"
|
msgid "Statistics about users"
|
||||||
msgstr "Statistiques sur les utilisateurs"
|
msgstr "Statistiques sur les utilisateurs"
|
||||||
|
|
||||||
#: logs/views.py:194
|
#: logs/views.py:175
|
||||||
msgid "Nonexistent revision."
|
msgid "Nonexistent revision."
|
||||||
msgstr "Révision inexistante."
|
msgstr "Révision inexistante."
|
||||||
|
|
||||||
#: logs/views.py:197
|
#: logs/views.py:178
|
||||||
msgid "The action was deleted."
|
msgid "The action was deleted."
|
||||||
msgstr "L'action a été supprimée."
|
msgstr "L'action a été supprimée."
|
||||||
|
|
||||||
#: logs/views.py:230
|
#: logs/views.py:219
|
||||||
msgid "Category"
|
msgid "Category"
|
||||||
msgstr "Catégorie"
|
msgstr "Catégorie"
|
||||||
|
|
||||||
#: logs/views.py:231
|
#: logs/views.py:220
|
||||||
msgid "Number of users (members and clubs)"
|
msgid "Number of users (members and clubs)"
|
||||||
msgstr "Nombre d'utilisateurs (adhérents et clubs)"
|
msgstr "Nombre d'utilisateurs (adhérents et clubs)"
|
||||||
|
|
||||||
#: logs/views.py:232
|
#: logs/views.py:221
|
||||||
msgid "Number of members"
|
msgid "Number of members"
|
||||||
msgstr "Nombre d'adhérents"
|
msgstr "Nombre d'adhérents"
|
||||||
|
|
||||||
#: logs/views.py:233
|
#: logs/views.py:222
|
||||||
msgid "Number of clubs"
|
msgid "Number of clubs"
|
||||||
msgstr "Nombre de clubs"
|
msgstr "Nombre de clubs"
|
||||||
|
|
||||||
#: logs/views.py:237
|
#: logs/views.py:226
|
||||||
msgid "Activated users"
|
msgid "Activated users"
|
||||||
msgstr "Utilisateurs activés"
|
msgstr "Utilisateurs activés"
|
||||||
|
|
||||||
#: logs/views.py:245
|
#: logs/views.py:232
|
||||||
msgid "Disabled users"
|
msgid "Disabled users"
|
||||||
msgstr "Utilisateurs désactivés"
|
msgstr "Utilisateurs désactivés"
|
||||||
|
|
||||||
#: logs/views.py:253
|
#: logs/views.py:238
|
||||||
msgid "Archived users"
|
msgid "Archived users"
|
||||||
msgstr "Utilisateurs archivés"
|
msgstr "Utilisateurs archivés"
|
||||||
|
|
||||||
#: logs/views.py:261
|
#: logs/views.py:244
|
||||||
#, fuzzy
|
msgid "Fully archived users"
|
||||||
#| msgid "Archived users"
|
msgstr "Utilisateurs complètement archivés"
|
||||||
msgid "Full Archived users"
|
|
||||||
msgstr "Utilisateurs archivés"
|
|
||||||
|
|
||||||
#: logs/views.py:269
|
#: logs/views.py:254
|
||||||
msgid "Not yet active users"
|
msgid "Not yet active users"
|
||||||
msgstr "Utilisateurs pas encore actifs"
|
msgstr "Utilisateurs pas encore actifs"
|
||||||
|
|
||||||
#: logs/views.py:277
|
#: logs/views.py:264
|
||||||
msgid "Contributing members"
|
msgid "Contributing members"
|
||||||
msgstr "Adhérents cotisants"
|
msgstr "Adhérents cotisants"
|
||||||
|
|
||||||
#: logs/views.py:283
|
#: logs/views.py:270
|
||||||
msgid "Users benefiting from a connection"
|
msgid "Users benefiting from a connection"
|
||||||
msgstr "Utilisateurs bénéficiant d'une connexion"
|
msgstr "Utilisateurs bénéficiant d'une connexion"
|
||||||
|
|
||||||
#: logs/views.py:289
|
#: logs/views.py:276
|
||||||
msgid "Banned users"
|
msgid "Banned users"
|
||||||
msgstr "Utilisateurs bannis"
|
msgstr "Utilisateurs bannis"
|
||||||
|
|
||||||
#: logs/views.py:295
|
#: logs/views.py:282
|
||||||
msgid "Users benefiting from a free connection"
|
msgid "Users benefiting from a free connection"
|
||||||
msgstr "Utilisateurs bénéficiant d'une connexion gratuite"
|
msgstr "Utilisateurs bénéficiant d'une connexion gratuite"
|
||||||
|
|
||||||
#: logs/views.py:301
|
#: logs/views.py:288
|
||||||
msgid "Active interfaces (with access to the network)"
|
msgid "Active interfaces (with access to the network)"
|
||||||
msgstr "Interfaces actives (ayant accès au réseau)"
|
msgstr "Interfaces actives (ayant accès au réseau)"
|
||||||
|
|
||||||
#: logs/views.py:311
|
#: logs/views.py:302
|
||||||
msgid "Active interfaces assigned IPv4"
|
msgid "Active interfaces assigned IPv4"
|
||||||
msgstr "Interfaces actives assignées IPv4"
|
msgstr "Interfaces actives assignées IPv4"
|
||||||
|
|
||||||
#: logs/views.py:324
|
#: logs/views.py:319
|
||||||
msgid "IP range"
|
msgid "IP range"
|
||||||
msgstr "Plage d'IP"
|
msgstr "Plage d'IP"
|
||||||
|
|
||||||
#: logs/views.py:325
|
#: logs/views.py:320
|
||||||
msgid "VLAN"
|
msgid "VLAN"
|
||||||
msgstr "VLAN"
|
msgstr "VLAN"
|
||||||
|
|
||||||
#: logs/views.py:326
|
#: logs/views.py:321
|
||||||
msgid "Total number of IP addresses"
|
msgid "Total number of IP addresses"
|
||||||
msgstr "Nombre total d'adresses IP"
|
msgstr "Nombre total d'adresses IP"
|
||||||
|
|
||||||
#: logs/views.py:327
|
#: logs/views.py:322
|
||||||
msgid "Number of assigned IP addresses"
|
msgid "Number of assigned IP addresses"
|
||||||
msgstr "Nombre d'adresses IP non assignées"
|
msgstr "Nombre d'adresses IP assignées"
|
||||||
|
|
||||||
#: logs/views.py:328
|
#: logs/views.py:323
|
||||||
msgid "Number of IP address assigned to an activated machine"
|
msgid "Number of IP address assigned to an activated machine"
|
||||||
msgstr "Nombre d'adresses IP assignées à une machine activée"
|
msgstr "Nombre d'adresses IP assignées à une machine activée"
|
||||||
|
|
||||||
#: logs/views.py:329
|
#: logs/views.py:324
|
||||||
msgid "Number of nonassigned IP addresses"
|
msgid "Number of unassigned IP addresses"
|
||||||
msgstr "Nombre d'adresses IP non assignées"
|
msgstr "Nombre d'adresses IP non assignées"
|
||||||
|
|
||||||
#: logs/views.py:356
|
#: logs/views.py:339
|
||||||
msgid "Subscriptions"
|
msgid "Users (members and clubs)"
|
||||||
msgstr "Cotisations"
|
msgstr "Utilisateurs (adhérents et clubs)"
|
||||||
|
|
||||||
#: logs/views.py:378 logs/views.py:439
|
#: logs/views.py:385
|
||||||
msgid "Machines"
|
|
||||||
msgstr "Machines"
|
|
||||||
|
|
||||||
#: logs/views.py:405
|
|
||||||
msgid "Topology"
|
msgid "Topology"
|
||||||
msgstr "Topologie"
|
msgstr "Topologie"
|
||||||
|
|
||||||
#: logs/views.py:424
|
#: logs/views.py:401
|
||||||
msgid "Number of actions"
|
msgid "Number of actions"
|
||||||
msgstr "Nombre d'actions"
|
msgstr "Nombre d'actions"
|
||||||
|
|
||||||
#: logs/views.py:438 logs/views.py:456 logs/views.py:461 logs/views.py:466
|
#: logs/views.py:426
|
||||||
#: logs/views.py:481
|
msgid "rights"
|
||||||
msgid "User"
|
msgstr "droits"
|
||||||
msgstr "Utilisateur"
|
|
||||||
|
|
||||||
#: logs/views.py:442
|
|
||||||
msgid "Invoice"
|
|
||||||
msgstr "Facture"
|
|
||||||
|
|
||||||
#: logs/views.py:445
|
|
||||||
msgid "Ban"
|
|
||||||
msgstr "Bannissement"
|
|
||||||
|
|
||||||
#: logs/views.py:448
|
|
||||||
msgid "Whitelist"
|
|
||||||
msgstr "Accès gracieux"
|
|
||||||
|
|
||||||
#: logs/views.py:451
|
|
||||||
msgid "Rights"
|
|
||||||
msgstr "Droits"
|
|
||||||
|
|
||||||
#: logs/views.py:455
|
#: logs/views.py:455
|
||||||
msgid "School"
|
msgid "actions"
|
||||||
msgstr "Établissement"
|
msgstr "actions"
|
||||||
|
|
||||||
#: logs/views.py:460
|
#: logs/views.py:486
|
||||||
msgid "Payment method"
|
|
||||||
msgstr "Moyen de paiement"
|
|
||||||
|
|
||||||
#: logs/views.py:465
|
|
||||||
msgid "Bank"
|
|
||||||
msgstr "Banque"
|
|
||||||
|
|
||||||
#: logs/views.py:482
|
|
||||||
msgid "Action"
|
|
||||||
msgstr "Action"
|
|
||||||
|
|
||||||
#: logs/views.py:513
|
|
||||||
msgid "No model found."
|
msgid "No model found."
|
||||||
msgstr "Aucun modèle trouvé."
|
msgstr "Aucun modèle trouvé."
|
||||||
|
|
||||||
#: logs/views.py:519
|
#: logs/views.py:492
|
||||||
msgid "Nonexistent entry."
|
msgid "Nonexistent entry."
|
||||||
msgstr "Entrée inexistante."
|
msgstr "Entrée inexistante."
|
||||||
|
|
||||||
#: logs/views.py:526
|
#: logs/views.py:499
|
||||||
msgid "You don't have the right to access this menu."
|
msgid "You don't have the right to access this menu."
|
||||||
msgstr "Vous n'avez pas le droit d'accéder à ce menu."
|
msgstr "Vous n'avez pas le droit d'accéder à ce menu."
|
||||||
|
|
|
@ -113,7 +113,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
{% blocktrans with username=v.username number=v.version.object.number name=v.version.object.name %}{{ username }} has sold {{ number }}x {{ name }}{% endblocktrans %}
|
{% blocktrans with username=v.username number=v.version.object.number name=v.version.object.name %}{{ username }} has sold {{ number }}x {{ name }}{% endblocktrans %}
|
||||||
{% with invoice=v.version.object.facture %}
|
{% with invoice=v.version.object.facture %}
|
||||||
{% if invoice|is_facture %}
|
{% if invoice|is_facture %}
|
||||||
{% trans " to" %}
|
{% trans "to" %}
|
||||||
<a href="{% url 'users:profil' v.version.object.facture.facture.user_id %}">{{ v.version.object.facture.facture.user.get_username }}</a>
|
<a href="{% url 'users:profil' v.version.object.facture.facture.user_id %}">{{ v.version.object.facture.facture.user.get_username }}</a>
|
||||||
{% if v.version.object.iscotisation %}
|
{% if v.version.object.iscotisation %}
|
||||||
(<i>{% blocktrans with duration=v.version.object.duration %}+{{ duration }} months{% endblocktrans %}</i>)
|
(<i>{% blocktrans with duration=v.version.object.duration %}+{{ duration }} months{% endblocktrans %}</i>)
|
||||||
|
|
|
@ -241,7 +241,7 @@ def stats_general(request):
|
||||||
Club.objects.filter(state=Club.STATE_ARCHIVE).count(),
|
Club.objects.filter(state=Club.STATE_ARCHIVE).count(),
|
||||||
],
|
],
|
||||||
"full_archive_users": [
|
"full_archive_users": [
|
||||||
_("Full Archived users"),
|
_("Fully archived users"),
|
||||||
User.objects.filter(state=User.STATE_FULL_ARCHIVE).count(),
|
User.objects.filter(state=User.STATE_FULL_ARCHIVE).count(),
|
||||||
(
|
(
|
||||||
Adherent.objects.filter(
|
Adherent.objects.filter(
|
||||||
|
@ -321,7 +321,7 @@ def stats_general(request):
|
||||||
_("Total number of IP addresses"),
|
_("Total number of IP addresses"),
|
||||||
_("Number of assigned IP addresses"),
|
_("Number of assigned IP addresses"),
|
||||||
_("Number of IP address assigned to an activated machine"),
|
_("Number of IP address assigned to an activated machine"),
|
||||||
_("Number of nonassigned IP addresses"),
|
_("Number of unassigned IP addresses"),
|
||||||
],
|
],
|
||||||
ip_dict, # Data already prepared
|
ip_dict, # Data already prepared
|
||||||
],
|
],
|
||||||
|
@ -336,7 +336,7 @@ 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 (members and clubs)"): {
|
||||||
"users": [User._meta.verbose_name, User.objects.count()],
|
"users": [User._meta.verbose_name, User.objects.count()],
|
||||||
"adherents": [Adherent._meta.verbose_name, Adherent.objects.count()],
|
"adherents": [Adherent._meta.verbose_name, Adherent.objects.count()],
|
||||||
"clubs": [Club._meta.verbose_name, Club.objects.count()],
|
"clubs": [Club._meta.verbose_name, Club.objects.count()],
|
||||||
|
@ -350,14 +350,14 @@ def stats_models(request):
|
||||||
"ban": [Ban._meta.verbose_name, Ban.objects.count()],
|
"ban": [Ban._meta.verbose_name, Ban.objects.count()],
|
||||||
"whitelist": [Whitelist._meta.verbose_name, Whitelist.objects.count()],
|
"whitelist": [Whitelist._meta.verbose_name, Whitelist.objects.count()],
|
||||||
},
|
},
|
||||||
_("Subscriptions"): {
|
Cotisation._meta.verbose_name_plural.title(): {
|
||||||
"factures": [Facture._meta.verbose_name, Facture.objects.count()],
|
"factures": [Facture._meta.verbose_name, Facture.objects.count()],
|
||||||
"vente": [Vente._meta.verbose_name, Vente.objects.count()],
|
"vente": [Vente._meta.verbose_name, Vente.objects.count()],
|
||||||
"cotisation": [Cotisation._meta.verbose_name, Cotisation.objects.count()],
|
"cotisation": [Cotisation._meta.verbose_name, Cotisation.objects.count()],
|
||||||
"article": [Article._meta.verbose_name, Article.objects.count()],
|
"article": [Article._meta.verbose_name, Article.objects.count()],
|
||||||
"banque": [Banque._meta.verbose_name, Banque.objects.count()],
|
"banque": [Banque._meta.verbose_name, Banque.objects.count()],
|
||||||
},
|
},
|
||||||
_("Machines"): {
|
Machine._meta.verbose_name_plural.title(): {
|
||||||
"machine": [Machine._meta.verbose_name, Machine.objects.count()],
|
"machine": [Machine._meta.verbose_name, Machine.objects.count()],
|
||||||
"typemachine": [
|
"typemachine": [
|
||||||
MachineType._meta.verbose_name,
|
MachineType._meta.verbose_name,
|
||||||
|
@ -412,31 +412,31 @@ 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 = {
|
||||||
_("User"): {
|
User._meta.verbose_name: {
|
||||||
_("Machines"): User.objects.annotate(num=Count("machine")).order_by("-num")[
|
Machine._meta.verbose_name_plural: User.objects.annotate(num=Count("machine")).order_by("-num")[
|
||||||
:10
|
:10
|
||||||
],
|
],
|
||||||
_("Invoice"): User.objects.annotate(num=Count("facture")).order_by("-num")[
|
Facture._meta.verbose_name_plural: User.objects.annotate(num=Count("facture")).order_by("-num")[
|
||||||
:10
|
:10
|
||||||
],
|
],
|
||||||
_("Ban"): User.objects.annotate(num=Count("ban")).order_by("-num")[:10],
|
Ban._meta.verbose_name_plural: User.objects.annotate(num=Count("ban")).order_by("-num")[:10],
|
||||||
_("Whitelist"): User.objects.annotate(num=Count("whitelist")).order_by(
|
Whitelist._meta.verbose_name_plural: User.objects.annotate(num=Count("whitelist")).order_by(
|
||||||
"-num"
|
"-num"
|
||||||
)[:10],
|
)[:10],
|
||||||
_("Rights"): User.objects.annotate(num=Count("groups")).order_by("-num")[
|
_("rights"): User.objects.annotate(num=Count("groups")).order_by("-num")[
|
||||||
:10
|
:10
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
_("School"): {
|
School._meta.verbose_name: {
|
||||||
_("User"): School.objects.annotate(num=Count("user")).order_by("-num")[:10]
|
User._meta.verbose_name_plural: School.objects.annotate(num=Count("user")).order_by("-num")[:10]
|
||||||
},
|
},
|
||||||
_("Payment method"): {
|
Paiement._meta.verbose_name: {
|
||||||
_("User"): Paiement.objects.annotate(num=Count("facture")).order_by("-num")[
|
User._meta.verbose_name_plural: Paiement.objects.annotate(num=Count("facture")).order_by("-num")[
|
||||||
:10
|
:10
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
_("Bank"): {
|
Banque._meta.verbose_name: {
|
||||||
_("User"): Banque.objects.annotate(num=Count("facture")).order_by("-num")[
|
User._meta.verbose_name_plural: Banque.objects.annotate(num=Count("facture")).order_by("-num")[
|
||||||
:10
|
:10
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -451,8 +451,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 = {
|
||||||
_("User"): {
|
User._meta.verbose_name: {
|
||||||
_("Action"): User.objects.annotate(num=Count("revision")).order_by("-num")[
|
_("actions"): User.objects.annotate(num=Count("revision")).order_by("-num")[
|
||||||
:40
|
:40
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,6 +41,7 @@ def can_view(user):
|
||||||
can = user.has_module_perms("machines")
|
can = user.has_module_perms("machines")
|
||||||
return (
|
return (
|
||||||
can,
|
can,
|
||||||
None if can else _("You don't have the right to view this" " application."),
|
None if can else _("You don't have the right to view this"
|
||||||
|
" application."),
|
||||||
("machines",),
|
("machines",),
|
||||||
)
|
)
|
||||||
|
|
File diff suppressed because it is too large
Load diff
136
machines/migrations/0106_auto_20191120_0159.py
Normal file
136
machines/migrations/0106_auto_20191120_0159.py
Normal file
|
@ -0,0 +1,136 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.11.23 on 2019-11-20 00:59
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
import django.core.validators
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('machines', '0105_dname_ttl'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterModelOptions(
|
||||||
|
name='domain',
|
||||||
|
options={'permissions': (('view_domain', 'Can view a domain object'), ('change_ttl', 'Can change the TTL of a domain object')), 'verbose_name': 'domain', 'verbose_name_plural': 'domains'},
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='extension',
|
||||||
|
name='dnssec',
|
||||||
|
field=models.BooleanField(default=False, help_text='Should the zone be signed with DNSSEC.'),
|
||||||
|
),
|
||||||
|
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='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)]),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='sshfp',
|
||||||
|
name='comment',
|
||||||
|
field=models.CharField(blank=True, help_text='Comment.', max_length=255, null=True),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='sshfp',
|
||||||
|
name='pub_key_entry',
|
||||||
|
field=models.TextField(help_text='SSH public key.', max_length=2048),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='vlan',
|
||||||
|
name='igmp',
|
||||||
|
field=models.BooleanField(default=False, help_text='v4 multicast management.'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='vlan',
|
||||||
|
name='mld',
|
||||||
|
field=models.BooleanField(default=False, help_text='v6 multicast management.'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -68,7 +68,7 @@ class Machine(RevMixin, FieldPermissionModelMixin, models.Model):
|
||||||
|
|
||||||
user = models.ForeignKey("users.User", on_delete=models.CASCADE)
|
user = models.ForeignKey("users.User", on_delete=models.CASCADE)
|
||||||
name = models.CharField(
|
name = models.CharField(
|
||||||
max_length=255, help_text=_("Optional"), blank=True, null=True
|
max_length=255, help_text=_("Optional."), blank=True, null=True
|
||||||
)
|
)
|
||||||
active = models.BooleanField(default=True)
|
active = models.BooleanField(default=True)
|
||||||
|
|
||||||
|
@ -157,7 +157,8 @@ class Machine(RevMixin, FieldPermissionModelMixin, models.Model):
|
||||||
if user != user_request:
|
if user != user_request:
|
||||||
return (
|
return (
|
||||||
False,
|
False,
|
||||||
_("You don't have the right to add a machine" " to another user."),
|
_("You don't have the right to add a machine to another"
|
||||||
|
" user."),
|
||||||
("machines.add_machine",),
|
("machines.add_machine",),
|
||||||
)
|
)
|
||||||
if user.user_interfaces().count() >= max_lambdauser_interfaces:
|
if user.user_interfaces().count() >= max_lambdauser_interfaces:
|
||||||
|
@ -185,7 +186,8 @@ class Machine(RevMixin, FieldPermissionModelMixin, models.Model):
|
||||||
if not (user_request.has_perm("machines.change_interface") and can_user):
|
if not (user_request.has_perm("machines.change_interface") and can_user):
|
||||||
return (
|
return (
|
||||||
False,
|
False,
|
||||||
_("You don't have the right to edit a machine" " of another user."),
|
_("You don't have the right to edit a machine of another"
|
||||||
|
" user."),
|
||||||
("machines.change_interface",) + permissions,
|
("machines.change_interface",) + permissions,
|
||||||
)
|
)
|
||||||
return True, None, None
|
return True, None, None
|
||||||
|
@ -223,7 +225,8 @@ class Machine(RevMixin, FieldPermissionModelMixin, models.Model):
|
||||||
):
|
):
|
||||||
return (
|
return (
|
||||||
False,
|
False,
|
||||||
_("You don't have the right to view other machines" " than yours."),
|
_("You don't have the right to view other machines than"
|
||||||
|
" yours."),
|
||||||
("machines.view_machine",),
|
("machines.view_machine",),
|
||||||
)
|
)
|
||||||
return True, None, None
|
return True, None, None
|
||||||
|
@ -358,22 +361,22 @@ class IpType(RevMixin, AclMixin, models.Model):
|
||||||
protocol="IPv4",
|
protocol="IPv4",
|
||||||
null=True,
|
null=True,
|
||||||
blank=True,
|
blank=True,
|
||||||
help_text=_("Network containing the domain's IPv4 range (optional)"),
|
help_text=_("Network containing the domain's IPv4 range (optional)."),
|
||||||
)
|
)
|
||||||
domaine_ip_netmask = models.IntegerField(
|
domaine_ip_netmask = models.IntegerField(
|
||||||
default=24,
|
default=24,
|
||||||
validators=[MaxValueValidator(31), MinValueValidator(8)],
|
validators=[MaxValueValidator(31), MinValueValidator(8)],
|
||||||
help_text=_("Netmask for the domain's IPv4 range"),
|
help_text=_("Netmask for the domain's IPv4 range."),
|
||||||
)
|
)
|
||||||
reverse_v4 = models.BooleanField(
|
reverse_v4 = models.BooleanField(
|
||||||
default=False, help_text=_("Enable reverse DNS for IPv4")
|
default=False, help_text=_("Enable reverse DNS for IPv4.")
|
||||||
)
|
)
|
||||||
prefix_v6 = models.GenericIPAddressField(protocol="IPv6", null=True, blank=True)
|
prefix_v6 = models.GenericIPAddressField(protocol="IPv6", null=True, blank=True)
|
||||||
prefix_v6_length = models.IntegerField(
|
prefix_v6_length = models.IntegerField(
|
||||||
default=64, validators=[MaxValueValidator(128), MinValueValidator(0)]
|
default=64, validators=[MaxValueValidator(128), MinValueValidator(0)]
|
||||||
)
|
)
|
||||||
reverse_v6 = models.BooleanField(
|
reverse_v6 = models.BooleanField(
|
||||||
default=False, help_text=_("Enable reverse DNS for IPv6")
|
default=False, help_text=_("Enable reverse DNS for IPv6.")
|
||||||
)
|
)
|
||||||
vlan = models.ForeignKey("Vlan", on_delete=models.PROTECT, blank=True, null=True)
|
vlan = models.ForeignKey("Vlan", on_delete=models.PROTECT, blank=True, null=True)
|
||||||
ouverture_ports = models.ForeignKey("OuverturePortList", blank=True, null=True)
|
ouverture_ports = models.ForeignKey("OuverturePortList", blank=True, null=True)
|
||||||
|
@ -553,7 +556,8 @@ class IpType(RevMixin, AclMixin, models.Model):
|
||||||
for element in IpType.objects.all().exclude(pk=self.pk):
|
for element in IpType.objects.all().exclude(pk=self.pk):
|
||||||
if not self.ip_set.isdisjoint(element.ip_set):
|
if not self.ip_set.isdisjoint(element.ip_set):
|
||||||
raise ValidationError(
|
raise ValidationError(
|
||||||
_("The specified range is not disjoint" " from existing ranges.")
|
_("The specified range is not disjoint from existing"
|
||||||
|
" ranges.")
|
||||||
)
|
)
|
||||||
# On formate le prefix v6
|
# On formate le prefix v6
|
||||||
if self.prefix_v6:
|
if self.prefix_v6:
|
||||||
|
@ -604,8 +608,8 @@ class Vlan(RevMixin, AclMixin, models.Model):
|
||||||
arp_protect = models.BooleanField(default=False)
|
arp_protect = models.BooleanField(default=False)
|
||||||
dhcp_snooping = models.BooleanField(default=False)
|
dhcp_snooping = models.BooleanField(default=False)
|
||||||
dhcpv6_snooping = models.BooleanField(default=False)
|
dhcpv6_snooping = models.BooleanField(default=False)
|
||||||
igmp = models.BooleanField(default=False, help_text=_("v4 multicast management"))
|
igmp = models.BooleanField(default=False, help_text=_("v4 multicast management."))
|
||||||
mld = models.BooleanField(default=False, help_text=_("v6 multicast management"))
|
mld = models.BooleanField(default=False, help_text=_("v6 multicast management."))
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
permissions = (("view_vlan", _("Can view a VLAN object")),)
|
permissions = (("view_vlan", _("Can view a VLAN object")),)
|
||||||
|
@ -653,30 +657,30 @@ class SOA(RevMixin, AclMixin, models.Model):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
name = models.CharField(max_length=255)
|
name = models.CharField(max_length=255)
|
||||||
mail = models.EmailField(help_text=_("Contact email address for the zone"))
|
mail = models.EmailField(help_text=_("Contact email address for the zone."))
|
||||||
refresh = models.PositiveIntegerField(
|
refresh = models.PositiveIntegerField(
|
||||||
default=86400, # 24 hours
|
default=86400, # 24 hours
|
||||||
help_text=_(
|
help_text=_(
|
||||||
"Seconds before the secondary DNS have to ask the primary"
|
"Seconds before the secondary DNS have to ask the primary"
|
||||||
" DNS serial to detect a modification"
|
" DNS serial to detect a modification."
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
retry = models.PositiveIntegerField(
|
retry = models.PositiveIntegerField(
|
||||||
default=7200, # 2 hours
|
default=7200, # 2 hours
|
||||||
help_text=_(
|
help_text=_(
|
||||||
"Seconds before the secondary DNS ask the serial again in"
|
"Seconds before the secondary DNS ask the serial again in"
|
||||||
" case of a primary DNS timeout"
|
" case of a primary DNS timeout."
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
expire = models.PositiveIntegerField(
|
expire = models.PositiveIntegerField(
|
||||||
default=3600000, # 1000 hours
|
default=3600000, # 1000 hours
|
||||||
help_text=_(
|
help_text=_(
|
||||||
"Seconds before the secondary DNS stop answering requests"
|
"Seconds before the secondary DNS stop answering requests"
|
||||||
" in case of primary DNS timeout"
|
" in case of primary DNS timeout."
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
ttl = models.PositiveIntegerField(
|
ttl = models.PositiveIntegerField(
|
||||||
default=172800, help_text=_("Time to Live") # 2 days
|
default=172800, help_text=_("Time To Live.") # 2 days
|
||||||
)
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
@ -732,7 +736,7 @@ class Extension(RevMixin, AclMixin, models.Model):
|
||||||
name = models.CharField(
|
name = models.CharField(
|
||||||
max_length=255,
|
max_length=255,
|
||||||
unique=True,
|
unique=True,
|
||||||
help_text=_("Zone name, must begin with a dot (.example.org)"),
|
help_text=_("Zone name, must begin with a dot (.example.org)."),
|
||||||
)
|
)
|
||||||
need_infra = models.BooleanField(default=False)
|
need_infra = models.BooleanField(default=False)
|
||||||
origin = models.ForeignKey(
|
origin = models.ForeignKey(
|
||||||
|
@ -740,17 +744,17 @@ class Extension(RevMixin, AclMixin, models.Model):
|
||||||
on_delete=models.PROTECT,
|
on_delete=models.PROTECT,
|
||||||
blank=True,
|
blank=True,
|
||||||
null=True,
|
null=True,
|
||||||
help_text=_("A record associated with the zone"),
|
help_text=_("A record associated with the zone."),
|
||||||
)
|
)
|
||||||
origin_v6 = models.GenericIPAddressField(
|
origin_v6 = models.GenericIPAddressField(
|
||||||
protocol="IPv6",
|
protocol="IPv6",
|
||||||
null=True,
|
null=True,
|
||||||
blank=True,
|
blank=True,
|
||||||
help_text=_("AAAA record associated with the zone"),
|
help_text=_("AAAA record associated with the zone."),
|
||||||
)
|
)
|
||||||
soa = models.ForeignKey("SOA", on_delete=models.CASCADE)
|
soa = models.ForeignKey("SOA", on_delete=models.CASCADE)
|
||||||
dnssec = models.BooleanField(
|
dnssec = models.BooleanField(
|
||||||
default=False, help_text=_("Should the zone be signed with DNSSEC")
|
default=False, help_text=_("Should the zone be signed with DNSSEC.")
|
||||||
)
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
@ -819,7 +823,7 @@ class Extension(RevMixin, AclMixin, models.Model):
|
||||||
can = user_request.has_perm("machines.use_all_extension")
|
can = user_request.has_perm("machines.use_all_extension")
|
||||||
return (
|
return (
|
||||||
can,
|
can,
|
||||||
_("You cannot use all extensions.") if not can else None,
|
_("You don't have the right to use all extensions.") if not can else None,
|
||||||
("machines.use_all_extension",),
|
("machines.use_all_extension",),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -943,7 +947,7 @@ class Srv(RevMixin, AclMixin, models.Model):
|
||||||
)
|
)
|
||||||
extension = models.ForeignKey("Extension", on_delete=models.PROTECT)
|
extension = models.ForeignKey("Extension", on_delete=models.PROTECT)
|
||||||
ttl = models.PositiveIntegerField(
|
ttl = models.PositiveIntegerField(
|
||||||
default=172800, help_text=_("Time to Live") # 2 days
|
default=172800, help_text=_("Time To Live.") # 2 days
|
||||||
)
|
)
|
||||||
priority = models.PositiveIntegerField(
|
priority = models.PositiveIntegerField(
|
||||||
default=0,
|
default=0,
|
||||||
|
@ -951,7 +955,7 @@ class Srv(RevMixin, AclMixin, models.Model):
|
||||||
help_text=_(
|
help_text=_(
|
||||||
"Priority of the target server (positive integer value,"
|
"Priority of the target server (positive integer value,"
|
||||||
" the lower it is, the more the server will be used if"
|
" the lower it is, the more the server will be used if"
|
||||||
" available)"
|
" available)."
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
weight = models.PositiveIntegerField(
|
weight = models.PositiveIntegerField(
|
||||||
|
@ -959,14 +963,14 @@ class Srv(RevMixin, AclMixin, models.Model):
|
||||||
validators=[MaxValueValidator(65535)],
|
validators=[MaxValueValidator(65535)],
|
||||||
help_text=_(
|
help_text=_(
|
||||||
"Relative weight for records with the same priority"
|
"Relative weight for records with the same priority"
|
||||||
" (integer value between 0 and 65535)"
|
" (integer value between 0 and 65535)."
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
port = models.PositiveIntegerField(
|
port = models.PositiveIntegerField(
|
||||||
validators=[MaxValueValidator(65535)], help_text=_("TCP/UDP port")
|
validators=[MaxValueValidator(65535)], help_text=_("TCP/UDP port.")
|
||||||
)
|
)
|
||||||
target = models.ForeignKey(
|
target = models.ForeignKey(
|
||||||
"Domain", on_delete=models.PROTECT, help_text=_("Target server")
|
"Domain", on_delete=models.PROTECT, help_text=_("Target server.")
|
||||||
)
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
@ -1023,10 +1027,10 @@ class SshFp(RevMixin, AclMixin, models.Model):
|
||||||
)
|
)
|
||||||
|
|
||||||
machine = models.ForeignKey("Machine", on_delete=models.CASCADE)
|
machine = models.ForeignKey("Machine", on_delete=models.CASCADE)
|
||||||
pub_key_entry = models.TextField(help_text=_("SSH public key"), max_length=2048)
|
pub_key_entry = models.TextField(help_text=_("SSH public key."), max_length=2048)
|
||||||
algo = models.CharField(choices=ALGO, max_length=32)
|
algo = models.CharField(choices=ALGO, max_length=32)
|
||||||
comment = models.CharField(
|
comment = models.CharField(
|
||||||
help_text=_("Comment"), max_length=255, null=True, blank=True
|
help_text=_("Comment."), max_length=255, null=True, blank=True
|
||||||
)
|
)
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
|
@ -1128,7 +1132,7 @@ class Interface(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model):
|
||||||
oui = mac.oui
|
oui = mac.oui
|
||||||
vendor = oui.registration().org
|
vendor = oui.registration().org
|
||||||
except NotRegisteredError:
|
except NotRegisteredError:
|
||||||
vendor = "Unknown vendor"
|
vendor = _("Unknown vendor.")
|
||||||
return vendor
|
return vendor
|
||||||
|
|
||||||
def sync_ipv6_dhcpv6(self):
|
def sync_ipv6_dhcpv6(self):
|
||||||
|
@ -1201,7 +1205,7 @@ class Interface(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model):
|
||||||
self.ipv4 = free_ips[0]
|
self.ipv4 = free_ips[0]
|
||||||
else:
|
else:
|
||||||
raise ValidationError(
|
raise ValidationError(
|
||||||
_("There is no IP address available in the" " slash.")
|
_("There are no IP addresses available in the slash.")
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -1214,7 +1218,7 @@ class Interface(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model):
|
||||||
"""Unassign ipv4 to multiple interfaces"""
|
"""Unassign ipv4 to multiple interfaces"""
|
||||||
with transaction.atomic(), reversion.create_revision():
|
with transaction.atomic(), reversion.create_revision():
|
||||||
interface_list.update(ipv4=None)
|
interface_list.update(ipv4=None)
|
||||||
reversion.set_comment(_("IPv4 unassigning"))
|
reversion.set_comment("IPv4 unassignment")
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def mass_assign_ipv4(cls, interface_list):
|
def mass_assign_ipv4(cls, interface_list):
|
||||||
|
@ -1222,7 +1226,7 @@ class Interface(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model):
|
||||||
with transaction.atomic(), reversion.create_revision():
|
with transaction.atomic(), reversion.create_revision():
|
||||||
interface.assign_ipv4()
|
interface.assign_ipv4()
|
||||||
interface.save()
|
interface.save()
|
||||||
reversion.set_comment(_("IPv4 assigning"))
|
reversion.set_comment("IPv4 assignment")
|
||||||
|
|
||||||
def update_type(self):
|
def update_type(self):
|
||||||
""" Lorsque le machinetype est changé de type d'ip, on réassigne"""
|
""" Lorsque le machinetype est changé de type d'ip, on réassigne"""
|
||||||
|
@ -1267,7 +1271,7 @@ class Interface(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model):
|
||||||
)
|
)
|
||||||
if interfaces_similar and interfaces_similar.first() != self:
|
if interfaces_similar and interfaces_similar.first() != self:
|
||||||
raise ValidationError(
|
raise ValidationError(
|
||||||
_("Mac address already registered in this Machine Type/Subnet")
|
_("MAC address already registered in this machine type/subnet.")
|
||||||
)
|
)
|
||||||
|
|
||||||
def save(self, *args, **kwargs):
|
def save(self, *args, **kwargs):
|
||||||
|
@ -1276,7 +1280,7 @@ class Interface(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model):
|
||||||
if self.ipv4:
|
if self.ipv4:
|
||||||
if self.machine_type.ip_type != self.ipv4.ip_type:
|
if self.machine_type.ip_type != self.ipv4.ip_type:
|
||||||
raise ValidationError(
|
raise ValidationError(
|
||||||
_("The IPv4 address and the machine type" " don't match.")
|
_("The IPv4 address and the machine type don't match.")
|
||||||
)
|
)
|
||||||
self.validate_unique()
|
self.validate_unique()
|
||||||
super(Interface, self).save(*args, **kwargs)
|
super(Interface, self).save(*args, **kwargs)
|
||||||
|
@ -1296,7 +1300,7 @@ class Interface(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model):
|
||||||
if not (
|
if not (
|
||||||
preferences.models.OptionalMachine.get_cached_value("create_machine")
|
preferences.models.OptionalMachine.get_cached_value("create_machine")
|
||||||
):
|
):
|
||||||
return False, _("You can't add a machine."), ("machines.add_interface",)
|
return False, _("You don't have the right to add a machine."), ("machines.add_interface",)
|
||||||
max_lambdauser_interfaces = preferences.models.OptionalMachine.get_cached_value(
|
max_lambdauser_interfaces = preferences.models.OptionalMachine.get_cached_value(
|
||||||
"max_lambdauser_interfaces"
|
"max_lambdauser_interfaces"
|
||||||
)
|
)
|
||||||
|
@ -1328,7 +1332,7 @@ class Interface(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model):
|
||||||
can = user_request.has_perm("machines.change_interface_machine")
|
can = user_request.has_perm("machines.change_interface_machine")
|
||||||
return (
|
return (
|
||||||
can,
|
can,
|
||||||
_("Permission required to edit the machine.") if not can else None,
|
_("You don't have the right to edit the machine.") if not can else None,
|
||||||
("machines.change_interface_machine",),
|
("machines.change_interface_machine",),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -1345,7 +1349,8 @@ class Interface(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model):
|
||||||
if not (user_request.has_perm("machines.change_interface") and can_user):
|
if not (user_request.has_perm("machines.change_interface") and can_user):
|
||||||
return (
|
return (
|
||||||
False,
|
False,
|
||||||
_("You don't have the right to edit a machine of" " another user."),
|
_("You don't have the right to edit a machine of another"
|
||||||
|
" user."),
|
||||||
("machines.change_interface",) + permissions,
|
("machines.change_interface",) + permissions,
|
||||||
)
|
)
|
||||||
return True, None, None
|
return True, None, None
|
||||||
|
@ -1363,7 +1368,8 @@ class Interface(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model):
|
||||||
if not (user_request.has_perm("machines.change_interface") and can_user):
|
if not (user_request.has_perm("machines.change_interface") and can_user):
|
||||||
return (
|
return (
|
||||||
False,
|
False,
|
||||||
_("You don't have the right to edit a machine of" " another user."),
|
_("You don't have the right to edit a machine of another"
|
||||||
|
" user."),
|
||||||
("machines.change_interface",) + permissions,
|
("machines.change_interface",) + permissions,
|
||||||
)
|
)
|
||||||
return True, None, None
|
return True, None, None
|
||||||
|
@ -1411,7 +1417,7 @@ class Ipv6List(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model):
|
||||||
("view_ipv6list", _("Can view an IPv6 addresses list object")),
|
("view_ipv6list", _("Can view an IPv6 addresses list object")),
|
||||||
(
|
(
|
||||||
"change_ipv6list_slaac_ip",
|
"change_ipv6list_slaac_ip",
|
||||||
_("Can change the SLAAC value of an" " IPv6 addresses list"),
|
_("Can change the SLAAC value of an IPv6 addresses list"),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
verbose_name = _("IPv6 addresses list")
|
verbose_name = _("IPv6 addresses list")
|
||||||
|
@ -1446,7 +1452,7 @@ class Ipv6List(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model):
|
||||||
can = user_request.has_perm("machines.change_ipv6list_slaac_ip")
|
can = user_request.has_perm("machines.change_ipv6list_slaac_ip")
|
||||||
return (
|
return (
|
||||||
can,
|
can,
|
||||||
_("Permission required to change the SLAAC value of an IPv6" " address")
|
_("You don't have the right to change the SLAAC value of an IPv6 address.")
|
||||||
if not can
|
if not can
|
||||||
else None,
|
else None,
|
||||||
("machines.change_ipv6list_slaac_ip",),
|
("machines.change_ipv6list_slaac_ip",),
|
||||||
|
@ -1465,7 +1471,7 @@ class Ipv6List(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model):
|
||||||
if not (user_request.has_perm("machines.change_ipv6list") and can_user):
|
if not (user_request.has_perm("machines.change_ipv6list") and can_user):
|
||||||
return (
|
return (
|
||||||
False,
|
False,
|
||||||
_("You don't have the right to edit a machine of" " another user."),
|
_("You don't have the right to edit a machine of another user."),
|
||||||
("machines.change_ipv6list",),
|
("machines.change_ipv6list",),
|
||||||
)
|
)
|
||||||
return True, None, None
|
return True, None, None
|
||||||
|
@ -1483,7 +1489,7 @@ class Ipv6List(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model):
|
||||||
if not (user_request.has_perm("machines.change_ipv6list") and can_user):
|
if not (user_request.has_perm("machines.change_ipv6list") and can_user):
|
||||||
return (
|
return (
|
||||||
False,
|
False,
|
||||||
_("You don't have the right to edit a machine of" " another user."),
|
_("You don't have the right to edit a machine of another user."),
|
||||||
("machines.change_ipv6list",) + permissions,
|
("machines.change_ipv6list",) + permissions,
|
||||||
)
|
)
|
||||||
return True, None, None
|
return True, None, None
|
||||||
|
@ -1587,7 +1593,7 @@ class Domain(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model):
|
||||||
unique_together = (("name", "extension"),)
|
unique_together = (("name", "extension"),)
|
||||||
permissions = (
|
permissions = (
|
||||||
("view_domain", _("Can view a domain object")),
|
("view_domain", _("Can view a domain object")),
|
||||||
("change_ttl", _("Can change TTL of a domain object")),
|
("change_ttl", _("Can change the TTL of a domain object")),
|
||||||
)
|
)
|
||||||
verbose_name = _("domain")
|
verbose_name = _("domain")
|
||||||
verbose_name_plural = _("domains")
|
verbose_name_plural = _("domains")
|
||||||
|
@ -1612,20 +1618,20 @@ class Domain(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model):
|
||||||
if self.get_extension():
|
if self.get_extension():
|
||||||
self.extension = self.get_extension()
|
self.extension = self.get_extension()
|
||||||
if self.interface_parent and self.cname:
|
if self.interface_parent and self.cname:
|
||||||
raise ValidationError(_("You can't create a both A and CNAME" " record."))
|
raise ValidationError(_("You can't create a both A and CNAME record."))
|
||||||
if self.cname == self:
|
if self.cname == self:
|
||||||
raise ValidationError(
|
raise ValidationError(
|
||||||
_("You can't create a CNAME record pointing" " to itself.")
|
_("You can't create a CNAME record pointing to itself.")
|
||||||
)
|
)
|
||||||
HOSTNAME_LABEL_PATTERN = re.compile(r"(?!-)[A-Z\d-]+(?<!-)$", re.IGNORECASE)
|
HOSTNAME_LABEL_PATTERN = re.compile(r"(?!-)[A-Z\d-]+(?<!-)$", re.IGNORECASE)
|
||||||
dns = self.name.lower()
|
dns = self.name.lower()
|
||||||
if len(dns) > 63:
|
if len(dns) > 63:
|
||||||
raise ValidationError(
|
raise ValidationError(
|
||||||
_("The domain name %s is too long (over 63" " characters).") % dns
|
_("The domain name %s is too long (over 63 characters).") % dns
|
||||||
)
|
)
|
||||||
if not HOSTNAME_LABEL_PATTERN.match(dns):
|
if not HOSTNAME_LABEL_PATTERN.match(dns):
|
||||||
raise ValidationError(
|
raise ValidationError(
|
||||||
_("The domain name %s contains forbidden" " characters.") % dns
|
_("The domain name %s contains forbidden characters.") % dns
|
||||||
)
|
)
|
||||||
self.validate_unique()
|
self.validate_unique()
|
||||||
super(Domain, self).clean()
|
super(Domain, self).clean()
|
||||||
|
@ -1753,7 +1759,8 @@ class Domain(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model):
|
||||||
):
|
):
|
||||||
return (
|
return (
|
||||||
False,
|
False,
|
||||||
_("You don't have the right to view machines other than yours."),
|
_("You don't have the right to view other machines than"
|
||||||
|
" yours."),
|
||||||
("machines.view_domain",),
|
("machines.view_domain",),
|
||||||
)
|
)
|
||||||
return True, None, None
|
return True, None, None
|
||||||
|
@ -1794,7 +1801,7 @@ class IpList(RevMixin, AclMixin, models.Model):
|
||||||
""" Erreur si l'ip_type est incorrect"""
|
""" Erreur si l'ip_type est incorrect"""
|
||||||
if not str(self.ipv4) in self.ip_type.ip_set_as_str:
|
if not str(self.ipv4) in self.ip_type.ip_set_as_str:
|
||||||
raise ValidationError(
|
raise ValidationError(
|
||||||
_("The IPv4 address and the range of the IP" " type don't match.")
|
_("The IPv4 address and the range of the IP type don't match.")
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -1970,7 +1977,8 @@ class OuverturePortList(RevMixin, AclMixin, models.Model):
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
permissions = (
|
permissions = (
|
||||||
("view_ouvertureportlist", _("Can view a ports opening list" " object")),
|
("view_ouvertureportlist", _("Can view a ports opening list"
|
||||||
|
" object")),
|
||||||
)
|
)
|
||||||
verbose_name = _("ports opening list")
|
verbose_name = _("ports opening list")
|
||||||
verbose_name_plural = _("ports opening lists")
|
verbose_name_plural = _("ports opening lists")
|
||||||
|
|
|
@ -32,7 +32,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>{% trans "Extension" %}</th>
|
<th>{% trans "Extension" %}</th>
|
||||||
<th>{% trans "'infra' right required" %}</th>
|
<th>{% blocktrans %}"infra" right required{% endblocktrans %}</th>
|
||||||
<th>{% trans "SOA record" %}</th>
|
<th>{% trans "SOA record" %}</th>
|
||||||
<th>{% trans "A record origin" %}</th>
|
<th>{% trans "A record origin" %}</th>
|
||||||
{% if ipv6_enabled %}
|
{% if ipv6_enabled %}
|
||||||
|
|
|
@ -34,7 +34,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<tr>
|
<tr>
|
||||||
<th>{% trans "IP type" %}</th>
|
<th>{% trans "IP type" %}</th>
|
||||||
<th>{% trans "Extension" %}</th>
|
<th>{% trans "Extension" %}</th>
|
||||||
<th>{% trans "'infra' right required" %}</th>
|
<th>{% blocktrans %}"infra" right required{% endblocktrans %}</th>
|
||||||
<th>{% trans "IPv4 range" %}</th>
|
<th>{% trans "IPv4 range" %}</th>
|
||||||
<th>{% trans "v6 prefix" %}</th>
|
<th>{% trans "v6 prefix" %}</th>
|
||||||
<th>{% trans "DNSSEC reverse v4/v6" %}</th>
|
<th>{% trans "DNSSEC reverse v4/v6" %}</th>
|
||||||
|
|
|
@ -123,7 +123,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<li>
|
<li>
|
||||||
<a href="{% url 'machines:edit-interface' interface.id %}">
|
<a href="{% url 'machines:edit-interface' interface.id %}">
|
||||||
<i class="fa fa-edit"></i>
|
<i class="fa fa-edit"></i>
|
||||||
{% trans " Edit" %}
|
{% trans "Edit" %}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
{% acl_end %}
|
{% acl_end %}
|
||||||
|
@ -131,7 +131,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<li>
|
<li>
|
||||||
<a href="{% url 'machines:index-alias' interface.id %}">
|
<a href="{% url 'machines:index-alias' interface.id %}">
|
||||||
<i class="fa fa-edit"></i>
|
<i class="fa fa-edit"></i>
|
||||||
{% trans " Manage the aliases" %}
|
{% trans "Manage the aliases" %}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
{% acl_end %}
|
{% acl_end %}
|
||||||
|
@ -139,7 +139,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<li>
|
<li>
|
||||||
<a href="{% url 'machines:index-ipv6' interface.id %}">
|
<a href="{% url 'machines:index-ipv6' interface.id %}">
|
||||||
<i class="fa fa-edit"></i>
|
<i class="fa fa-edit"></i>
|
||||||
{% trans " Manage the IPv6 addresses" %}
|
{% trans "Manage the IPv6 addresses" %}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
{% acl_end %}
|
{% acl_end %}
|
||||||
|
@ -147,7 +147,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<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>
|
<i class="fa fa-edit"></i>
|
||||||
{% trans " Manage the SSH fingerprints" %}
|
{% trans "Manage the SSH fingerprints" %}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
{% acl_end %}
|
{% acl_end %}
|
||||||
|
@ -155,7 +155,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<li>
|
<li>
|
||||||
<a href="{% url 'machines:port-config' interface.id %}">
|
<a href="{% url 'machines:port-config' interface.id %}">
|
||||||
<i class="fa fa-edit"></i>
|
<i class="fa fa-edit"></i>
|
||||||
{% trans " Manage the ports configuration" %}
|
{% trans "Manage the ports configuration" %}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
{% acl_end %}
|
{% acl_end %}
|
||||||
|
|
|
@ -31,8 +31,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<th>{% trans "Service name" %}</th>
|
<th>{% trans "Service name" %}</th>
|
||||||
<th>{% trans "Server" %}</th>
|
<th>{% trans "Server" %}</th>
|
||||||
<th>{% trans "Last regeneration" %}</th>
|
<th>{% trans "Last regeneration" %}</th>
|
||||||
<th>{% trans "Regeneration required" %}</th>
|
<th>{% trans "Regeneration asked" %}</th>
|
||||||
<th>{% trans "Regeneration activated" %}</th>
|
<th>{% trans "Regeneration needed" %}</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
{% for server in servers_list %}
|
{% for server in servers_list %}
|
||||||
|
|
|
@ -47,11 +47,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
{% trans "Add a port" as value %}
|
<input class="btn btn-primary btn-sm" role="button" value="{% trans "Add a port" %}" id="add_one">
|
||||||
<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 %}
|
{% trans "Confirm" as tr_confirm %}
|
||||||
{% bootstrap_button tr_create_or_edit icon='ok' button_class='btn-success' %}
|
{% bootstrap_button tr_confirm icon='ok' button_class='btn-success' %}
|
||||||
</form>
|
</form>
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
var template = `{{ports.empty_form}}`;
|
var template = `{{ports.empty_form}}`;
|
||||||
|
|
|
@ -31,9 +31,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<h2>{% trans "List of the aliases of the 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
|
<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>
|
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
|
<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>
|
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/>
|
||||||
|
|
|
@ -33,77 +33,76 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<h2>{% trans "List of 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' %}">
|
<a class="btn btn-primary btn-sm" role="button" href="{% url 'machines:add-extension' %}">
|
||||||
<i class="fa fa-plus"></i>
|
<i class="fa fa-plus"></i> {% trans "Add an extension" %}</a>
|
||||||
{% trans " Add an extension" %}</a>
|
|
||||||
{% acl_end %}
|
{% acl_end %}
|
||||||
<a class="btn btn-danger btn-sm" role="button" href="{% url 'machines:del-extension' %}">
|
<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" %}
|
<i class="fa fa-trash"></i> {% trans "Delete one or several extensions" %}
|
||||||
</a>
|
</a>
|
||||||
{% include 'machines/aff_extension.html' with extension_list=extension_list %}
|
{% include 'machines/aff_extension.html' with extension_list=extension_list %}
|
||||||
|
|
||||||
<h2>{% trans "List of SOA records" %}</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' %}">
|
<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" %}
|
<i class="fa fa-plus"></i> {% trans "Add an SOA record" %}
|
||||||
</a>
|
</a>
|
||||||
{% acl_end %}
|
{% acl_end %}
|
||||||
<a class="btn btn-danger btn-sm" role="button" href="{% url 'machines:del-soa' %}">
|
<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" %}
|
<i class="fa fa-trash"></i> {% trans "Delete one or several SOA records" %}
|
||||||
</a>
|
</a>
|
||||||
{% include 'machines/aff_soa.html' with soa_list=soa_list %}
|
{% include 'machines/aff_soa.html' with soa_list=soa_list %}
|
||||||
|
|
||||||
<h2>{% trans "List of MX records" %}</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' %}">
|
<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" %}
|
<i class="fa fa-plus"></i> {% trans "Add an MX record" %}
|
||||||
</a>
|
</a>
|
||||||
{% acl_end %}
|
{% acl_end %}
|
||||||
<a class="btn btn-danger btn-sm" role="button" href="{% url 'machines:del-mx' %}">
|
<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" %}
|
<i class="fa fa-trash"></i> {% trans "Delete one or several MX records" %}
|
||||||
</a>
|
</a>
|
||||||
{% include 'machines/aff_mx.html' with mx_list=mx_list %}
|
{% include 'machines/aff_mx.html' with mx_list=mx_list %}
|
||||||
|
|
||||||
<h2>{% trans "List of NS records" %}</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' %}">
|
<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" %}
|
<i class="fa fa-plus"></i> {% trans "Add an NS record" %}
|
||||||
</a>
|
</a>
|
||||||
{% acl_end %}
|
{% acl_end %}
|
||||||
<a class="btn btn-danger btn-sm" role="button" href="{% url 'machines:del-ns' %}">
|
<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" %}
|
<i class="fa fa-trash"></i> {% trans "Delete one or several NS records" %}
|
||||||
</a>
|
</a>
|
||||||
{% include 'machines/aff_ns.html' with ns_list=ns_list %}
|
{% include 'machines/aff_ns.html' with ns_list=ns_list %}
|
||||||
|
|
||||||
<h2>{% trans "List of TXT records" %}</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' %}">
|
<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" %}
|
<i class="fa fa-plus"></i> {% trans "Add a TXT record" %}
|
||||||
</a>
|
</a>
|
||||||
{% acl_end %}
|
{% acl_end %}
|
||||||
<a class="btn btn-danger btn-sm" role="button" href="{% url 'machines:del-txt' %}">
|
<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" %}
|
<i class="fa fa-trash"></i> {% trans "Delete one or several TXT records" %}
|
||||||
</a>
|
</a>
|
||||||
{% include 'machines/aff_txt.html' with txt_list=txt_list %}
|
{% include 'machines/aff_txt.html' with txt_list=txt_list %}
|
||||||
|
|
||||||
<h2>{% trans "List of 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 one or several 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>{% trans "List of SRV records" %}</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' %}">
|
<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" %}
|
<i class="fa fa-plus"></i> {% trans "Add an SRV record" %}
|
||||||
</a>
|
</a>
|
||||||
{% acl_end %}
|
{% acl_end %}
|
||||||
<a class="btn btn-danger btn-sm" role="button" href="{% url 'machines:del-srv' %}">
|
<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" %}
|
<i class="fa fa-trash"></i> {% trans "Delete one or several SRV records" %}
|
||||||
</a>
|
</a>
|
||||||
{% include 'machines/aff_srv.html' with srv_list=srv_list %}
|
{% include 'machines/aff_srv.html' with srv_list=srv_list %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -33,11 +33,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<h2>{% trans "List of IP types" %}</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' %}">
|
<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" %}
|
<i class="fa fa-plus"></i> {% trans "Add an IP type" %}
|
||||||
</a>
|
</a>
|
||||||
{% acl_end %}
|
{% acl_end %}
|
||||||
<a class="btn btn-danger btn-sm" role="button" href="{% url 'machines:del-iptype' %}">
|
<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" %}
|
<i class="fa fa-trash"></i> {% trans "Delete one or several IP types" %}
|
||||||
</a>
|
</a>
|
||||||
{% include 'machines/aff_iptype.html' with iptype_list=iptype_list %}
|
{% include 'machines/aff_iptype.html' with iptype_list=iptype_list %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -33,7 +33,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<h2>{% trans "List of the IPv6 addresses of the 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 %}">
|
<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" %}
|
<i class="fa fa-plus"></i> {% trans "Add an IPv6 address" %}
|
||||||
</a>
|
</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 %}
|
||||||
|
|
|
@ -34,11 +34,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<h2>{% trans "List of machine types" %}</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' %}">
|
<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" %}
|
<i class="fa fa-plus"></i> {% trans "Add a machine type" %}
|
||||||
</a>
|
</a>
|
||||||
{% acl_end %}
|
{% acl_end %}
|
||||||
<a class="btn btn-danger btn-sm" role="button" href="{% url 'machines:del-machinetype' %}">
|
<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" %}
|
<i class="fa fa-trash"></i> {% trans "Delete one or several machine types" %}
|
||||||
</a>
|
</a>
|
||||||
{% include 'machines/aff_machinetype.html' with machinetype_list=machinetype_list %}
|
{% include 'machines/aff_machinetype.html' with machinetype_list=machinetype_list %}
|
||||||
<br/>
|
<br/>
|
||||||
|
|
|
@ -35,11 +35,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<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>
|
<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>
|
||||||
{% can_create Nas %}
|
{% can_create Nas %}
|
||||||
<a class="btn btn-primary btn-sm" role="button" href="{% url 'machines:add-nas' %}">
|
<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" %}
|
<i class="fa fa-plus"></i> {% trans "Add a NAS device type" %}
|
||||||
</a>
|
</a>
|
||||||
{% acl_end %}
|
{% acl_end %}
|
||||||
<a class="btn btn-danger btn-sm" role="button" href="{% url 'machines:del-nas' %}">
|
<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" %}
|
<i class="fa fa-trash"></i> {% trans "Delete one or several NAS device types" %}
|
||||||
</a>
|
</a>
|
||||||
{% include 'machines/aff_nas.html' with nas_list=nas_list %}
|
{% include 'machines/aff_nas.html' with nas_list=nas_list %}
|
||||||
<br/>
|
<br/>
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
<h2>{% trans "List of ports configurations" %}</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' %}">
|
<a class="btn btn-primary btn-sm" role="button" href="{% url 'machines:add-portlist' %}">
|
||||||
<i class="fa fa-plus"></i>{% trans " Add a configuration" %}
|
<i class="fa fa-plus"></i> {% trans "Add a configuration" %}
|
||||||
</a>
|
</a>
|
||||||
{% acl_end %}
|
{% acl_end %}
|
||||||
<table class="table table-striped">
|
<table class="table table-striped">
|
||||||
|
|
|
@ -33,9 +33,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<h2>{% trans "List of roles" %}</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
|
<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>
|
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
|
<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>
|
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 %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -33,10 +33,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<h2>{% trans "List of 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
|
<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>
|
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
|
<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>
|
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>{% trans "States of servers" %}</h2>
|
<h2>{% trans "States of servers" %}</h2>
|
||||||
|
|
|
@ -31,7 +31,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<h2>{% trans "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>{% trans " 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 %}
|
||||||
|
|
|
@ -33,9 +33,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<h2>{% trans "List of 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
|
<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>
|
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
|
<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>
|
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 %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -60,7 +60,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
{% 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>
|
||||||
{% trans "NAS devices" %}
|
{% trans "NAS devices" %}
|
||||||
</a>
|
</a>
|
||||||
{% acl_end %}
|
{% acl_end %}
|
||||||
{% can_view_all machines.Service %}
|
{% can_view_all machines.Service %}
|
||||||
|
|
|
@ -250,7 +250,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": _("Create a machine"),
|
"action_name": _("Add"),
|
||||||
},
|
},
|
||||||
"machines/machine.html",
|
"machines/machine.html",
|
||||||
request,
|
request,
|
||||||
|
@ -314,7 +314,7 @@ def del_machine(request, machine, **_kwargs):
|
||||||
reverse("users:profil", kwargs={"userid": str(machine.user.id)})
|
reverse("users:profil", kwargs={"userid": str(machine.user.id)})
|
||||||
)
|
)
|
||||||
return form(
|
return form(
|
||||||
{"objet": machine, "objet_name": "machine"}, "machines/delete.html", request
|
{"objet": machine, "objet_name": _("machine")}, "machines/delete.html", request
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -345,7 +345,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": _("Create an interface"),
|
"action_name": _("Add"),
|
||||||
},
|
},
|
||||||
"machines/machine.html",
|
"machines/machine.html",
|
||||||
request,
|
request,
|
||||||
|
@ -366,7 +366,7 @@ def del_interface(request, interface, **_kwargs):
|
||||||
reverse("users:profil", kwargs={"userid": str(request.user.id)})
|
reverse("users:profil", kwargs={"userid": str(request.user.id)})
|
||||||
)
|
)
|
||||||
return form(
|
return form(
|
||||||
{"objet": interface, "objet_name": "interface"}, "machines/delete.html", request
|
{"objet": interface, "objet_name": _("interface")}, "machines/delete.html", request
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -386,7 +386,7 @@ def new_ipv6list(request, interface, **_kwargs):
|
||||||
reverse("machines:index-ipv6", kwargs={"interfaceid": str(interface.id)})
|
reverse("machines:index-ipv6", kwargs={"interfaceid": str(interface.id)})
|
||||||
)
|
)
|
||||||
return form(
|
return form(
|
||||||
{"ipv6form": ipv6, "action_name": _("Create an IPv6 addresses list")},
|
{"ipv6form": ipv6, "action_name": _("Add")},
|
||||||
"machines/machine.html",
|
"machines/machine.html",
|
||||||
request,
|
request,
|
||||||
)
|
)
|
||||||
|
@ -426,7 +426,7 @@ def del_ipv6list(request, ipv6list, **_kwargs):
|
||||||
reverse("machines:index-ipv6", kwargs={"interfaceid": str(interfaceid)})
|
reverse("machines:index-ipv6", kwargs={"interfaceid": str(interfaceid)})
|
||||||
)
|
)
|
||||||
return form(
|
return form(
|
||||||
{"objet": ipv6list, "objet_name": "ipv6"}, "machines/delete.html", request
|
{"objet": ipv6list, "objet_name": _("IPv6 addresses list")}, "machines/delete.html", request
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -444,7 +444,7 @@ def new_sshfp(request, machine, **_kwargs):
|
||||||
reverse("machines:index-sshfp", kwargs={"machineid": str(machine.id)})
|
reverse("machines:index-sshfp", kwargs={"machineid": str(machine.id)})
|
||||||
)
|
)
|
||||||
return form(
|
return form(
|
||||||
{"sshfpform": sshfp, "action_name": _("Create a SSHFP record")},
|
{"sshfpform": sshfp, "action_name": _("Add")},
|
||||||
"machines/machine.html",
|
"machines/machine.html",
|
||||||
request,
|
request,
|
||||||
)
|
)
|
||||||
|
@ -482,7 +482,7 @@ def del_sshfp(request, sshfp, **_kwargs):
|
||||||
reverse("machines:index-sshfp", kwargs={"machineid": str(machineid)})
|
reverse("machines:index-sshfp", kwargs={"machineid": str(machineid)})
|
||||||
)
|
)
|
||||||
return form(
|
return form(
|
||||||
{"objet": sshfp, "objet_name": "sshfp"}, "machines/delete.html", request
|
{"objet": sshfp, "objet_name": _("SSHFP record")}, "machines/delete.html", request
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -498,7 +498,7 @@ def add_iptype(request):
|
||||||
messages.success(request, _("The IP type was created."))
|
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": _("Create an IP type")},
|
{"iptypeform": iptype, "action_name": _("Add")},
|
||||||
"machines/machine.html",
|
"machines/machine.html",
|
||||||
request,
|
request,
|
||||||
)
|
)
|
||||||
|
@ -563,7 +563,7 @@ def add_machinetype(request):
|
||||||
messages.success(request, _("The machine type was created."))
|
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": _("Create a machine" " type")},
|
{"machinetypeform": machinetype, "action_name": _("Add")},
|
||||||
"machines/machine.html",
|
"machines/machine.html",
|
||||||
request,
|
request,
|
||||||
)
|
)
|
||||||
|
@ -626,7 +626,7 @@ def add_extension(request):
|
||||||
messages.success(request, _("The extension was created."))
|
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": _("Create an extension")},
|
{"extensionform": extension, "action_name": _("Add")},
|
||||||
"machines/machine.html",
|
"machines/machine.html",
|
||||||
request,
|
request,
|
||||||
)
|
)
|
||||||
|
@ -688,7 +688,7 @@ def add_soa(request):
|
||||||
messages.success(request, _("The SOA record was created."))
|
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": _("Create an SOA record")},
|
{"soaform": soa, "action_name": _("Add")},
|
||||||
"machines/machine.html",
|
"machines/machine.html",
|
||||||
request,
|
request,
|
||||||
)
|
)
|
||||||
|
@ -740,7 +740,7 @@ def add_mx(request):
|
||||||
messages.success(request, _("The MX record was created."))
|
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": _("Create an MX record")},
|
{"mxform": mx, "action_name": _("Add")},
|
||||||
"machines/machine.html",
|
"machines/machine.html",
|
||||||
request,
|
request,
|
||||||
)
|
)
|
||||||
|
@ -792,7 +792,7 @@ def add_ns(request):
|
||||||
messages.success(request, _("The NS record was created."))
|
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": _("Create an NS record")},
|
{"nsform": ns, "action_name": _("Add")},
|
||||||
"machines/machine.html",
|
"machines/machine.html",
|
||||||
request,
|
request,
|
||||||
)
|
)
|
||||||
|
@ -844,7 +844,7 @@ def add_dname(request):
|
||||||
messages.success(request, _("The DNAME record was created."))
|
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 a DNAME record")},
|
{"dnameform": dname, "action_name": _("Add")},
|
||||||
"machines/machine.html",
|
"machines/machine.html",
|
||||||
request,
|
request,
|
||||||
)
|
)
|
||||||
|
@ -899,7 +899,7 @@ def add_txt(request):
|
||||||
messages.success(request, _("The TXT record was created."))
|
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": _("Create a TXT record")},
|
{"txtform": txt, "action_name": _("Add")},
|
||||||
"machines/machine.html",
|
"machines/machine.html",
|
||||||
request,
|
request,
|
||||||
)
|
)
|
||||||
|
@ -951,7 +951,7 @@ def add_srv(request):
|
||||||
messages.success(request, _("The SRV record was created."))
|
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": _("Create an SRV record")},
|
{"srvform": srv, "action_name": _("Add")},
|
||||||
"machines/machine.html",
|
"machines/machine.html",
|
||||||
request,
|
request,
|
||||||
)
|
)
|
||||||
|
@ -1008,7 +1008,7 @@ def add_alias(request, interface, interfaceid):
|
||||||
reverse("machines:index-alias", kwargs={"interfaceid": str(interfaceid)})
|
reverse("machines:index-alias", kwargs={"interfaceid": str(interfaceid)})
|
||||||
)
|
)
|
||||||
return form(
|
return form(
|
||||||
{"aliasform": alias, "action_name": _("Create an alias")},
|
{"aliasform": alias, "action_name": _("Add")},
|
||||||
"machines/machine.html",
|
"machines/machine.html",
|
||||||
request,
|
request,
|
||||||
)
|
)
|
||||||
|
@ -1069,7 +1069,7 @@ def add_role(request):
|
||||||
messages.success(request, _("The role was created."))
|
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": _("Create a role")},
|
{"roleform": role, "action_name": _("Add")},
|
||||||
"machines/machine.html",
|
"machines/machine.html",
|
||||||
request,
|
request,
|
||||||
)
|
)
|
||||||
|
@ -1121,7 +1121,7 @@ def add_service(request):
|
||||||
messages.success(request, _("The service was created."))
|
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": _("Create a service")},
|
{"serviceform": service, "action_name": _("Add")},
|
||||||
"machines/machine.html",
|
"machines/machine.html",
|
||||||
request,
|
request,
|
||||||
)
|
)
|
||||||
|
@ -1187,7 +1187,7 @@ def add_vlan(request):
|
||||||
messages.success(request, _("The VLAN was created."))
|
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": _("Create a VLAN")},
|
{"vlanform": vlan, "action_name": _("Add")},
|
||||||
"machines/machine.html",
|
"machines/machine.html",
|
||||||
request,
|
request,
|
||||||
)
|
)
|
||||||
|
@ -1239,7 +1239,7 @@ def add_nas(request):
|
||||||
messages.success(request, _("The NAS device was created."))
|
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": _("Create a NAS device")},
|
{"nasform": nas, "action_name": _("Add")},
|
||||||
"machines/machine.html",
|
"machines/machine.html",
|
||||||
request,
|
request,
|
||||||
)
|
)
|
||||||
|
@ -1558,8 +1558,8 @@ def configure_ports(request, interface_instance, **_kwargs):
|
||||||
request,
|
request,
|
||||||
(
|
(
|
||||||
_(
|
_(
|
||||||
"Warning: the IPv4 isn't public, the opening won't have effect"
|
"Warning: the IP address is not public, the opening won't"
|
||||||
" in v4."
|
" have any effect in v4."
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
@ -1572,7 +1572,7 @@ def configure_ports(request, interface_instance, **_kwargs):
|
||||||
messages.success(request, _("The ports configuration was edited."))
|
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": _("Edit the" " configuration")},
|
{"interfaceform": interface, "action_name": _("Edit")},
|
||||||
"machines/machine.html",
|
"machines/machine.html",
|
||||||
request,
|
request,
|
||||||
)
|
)
|
||||||
|
|
128
multi_op/locale/fr/LC_MESSAGES/django.po
Normal file
128
multi_op/locale/fr/LC_MESSAGES/django.po
Normal file
|
@ -0,0 +1,128 @@
|
||||||
|
# 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: 2019-11-20 01:24+0100\n"
|
||||||
|
"PO-Revision-Date: 2019-11-16 00:22+0100\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"
|
||||||
|
|
||||||
|
#: multi_op/forms.py:43
|
||||||
|
msgid "Dormitory"
|
||||||
|
msgstr "Résidence"
|
||||||
|
|
||||||
|
#: multi_op/preferences/models.py:37
|
||||||
|
msgid "enabled dorm"
|
||||||
|
msgstr "résidence activée"
|
||||||
|
|
||||||
|
#: multi_op/preferences/models.py:41
|
||||||
|
msgid "dormitories preferences"
|
||||||
|
msgstr "préférences de résidences"
|
||||||
|
|
||||||
|
#: multi_op/templates/multi_op/aff_room_state.html:36
|
||||||
|
msgid "Room"
|
||||||
|
msgstr "Chambre"
|
||||||
|
|
||||||
|
#: multi_op/templates/multi_op/aff_room_state.html:37
|
||||||
|
msgid "Building"
|
||||||
|
msgstr "Bâtiment"
|
||||||
|
|
||||||
|
#: multi_op/templates/multi_op/aff_room_state.html:40
|
||||||
|
msgid "Connnected to"
|
||||||
|
msgstr "Connectée à"
|
||||||
|
|
||||||
|
#: multi_op/templates/multi_op/aff_room_state.html:41
|
||||||
|
msgid "User"
|
||||||
|
msgstr "Utilisateur"
|
||||||
|
|
||||||
|
#: multi_op/templates/multi_op/aff_room_state.html:42
|
||||||
|
msgid "Details"
|
||||||
|
msgstr "Détails"
|
||||||
|
|
||||||
|
#: multi_op/templates/multi_op/aff_room_state.html:43
|
||||||
|
msgid "End of subscription on"
|
||||||
|
msgstr "Fin de cotisation le"
|
||||||
|
|
||||||
|
#: multi_op/templates/multi_op/aff_room_state.html:44
|
||||||
|
msgid "Internet access"
|
||||||
|
msgstr "Accès Internet"
|
||||||
|
|
||||||
|
#: multi_op/templates/multi_op/aff_room_state.html:45
|
||||||
|
msgid "Action"
|
||||||
|
msgstr "Action"
|
||||||
|
|
||||||
|
#: multi_op/templates/multi_op/aff_room_state.html:52
|
||||||
|
msgid "Other operator"
|
||||||
|
msgstr "Autre opérateur"
|
||||||
|
|
||||||
|
#: multi_op/templates/multi_op/aff_room_state.html:53
|
||||||
|
msgid "None"
|
||||||
|
msgstr "Aucun"
|
||||||
|
|
||||||
|
#: multi_op/templates/multi_op/aff_room_state.html:55
|
||||||
|
msgid "Non member"
|
||||||
|
msgstr "Non adhérent"
|
||||||
|
|
||||||
|
#: multi_op/templates/multi_op/aff_room_state.html:58
|
||||||
|
msgid "Active"
|
||||||
|
msgstr "Actif"
|
||||||
|
|
||||||
|
#: multi_op/templates/multi_op/aff_room_state.html:60
|
||||||
|
msgid "Disabled"
|
||||||
|
msgstr "Désactivé"
|
||||||
|
|
||||||
|
#: multi_op/templates/multi_op/index_room_state.html:30
|
||||||
|
msgid "Multiple operators"
|
||||||
|
msgstr "Opérateurs multiples"
|
||||||
|
|
||||||
|
#: multi_op/templates/multi_op/index_room_state.html:38
|
||||||
|
msgid "Room connections"
|
||||||
|
msgstr "Connexions de chambre"
|
||||||
|
|
||||||
|
#: multi_op/templates/multi_op/index_room_state.html:44
|
||||||
|
msgid "Select dormitory"
|
||||||
|
msgstr "Sélectionnez la résidence"
|
||||||
|
|
||||||
|
#: multi_op/templates/multi_op/navbar.html:2
|
||||||
|
msgid "Manage the operators"
|
||||||
|
msgstr "Gérer les opérateurs"
|
||||||
|
|
||||||
|
#: multi_op/templates/multi_op/sidebar.html:31
|
||||||
|
msgid "Room connections state"
|
||||||
|
msgstr "État des connexions de chambre"
|
||||||
|
|
||||||
|
#: multi_op/templates/multi_op/sidebar.html:35
|
||||||
|
msgid "Sockets to connect"
|
||||||
|
msgstr "Prises à connecter"
|
||||||
|
|
||||||
|
#: multi_op/templates/multi_op/sidebar.html:39
|
||||||
|
msgid "Sockets to disconnect"
|
||||||
|
msgstr "Prises à déconnecter"
|
||||||
|
|
||||||
|
#: multi_op/views.py:169
|
||||||
|
#, python-format
|
||||||
|
msgid "The room %s was disconnected."
|
||||||
|
msgstr "La chambre %s a été déconnectée."
|
|
@ -34,8 +34,8 @@ class Preferences(models.Model):
|
||||||
"topologie.Dormitory",
|
"topologie.Dormitory",
|
||||||
related_name="vlan_tagged",
|
related_name="vlan_tagged",
|
||||||
blank=True,
|
blank=True,
|
||||||
verbose_name=_("Enabled dorm"),
|
verbose_name=_("enabled dorm"),
|
||||||
)
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = _("Dormitory of connection settings")
|
verbose_name = _("dormitories preferences")
|
||||||
|
|
|
@ -37,7 +37,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
{% trans "Building" as tr_building %}
|
{% trans "Building" as tr_building %}
|
||||||
<th>{% include 'buttons/sort.html' with prefix='building' col='name' text=tr_building %}</th>
|
<th>{% include 'buttons/sort.html' with prefix='building' col='name' text=tr_building %}</th>
|
||||||
<th>{% include 'buttons/sort.html' with prefix='room' col='name' text=tr_room %}</th>
|
<th>{% include 'buttons/sort.html' with prefix='room' col='name' text=tr_room %}</th>
|
||||||
<th>{% trans "Connnected on" %}</th>
|
<th>{% trans "Connnected to" %}</th>
|
||||||
<th>{% trans "User" %}</th>
|
<th>{% trans "User" %}</th>
|
||||||
<th>{% trans "Details" %}</th>
|
<th>{% trans "Details" %}</th>
|
||||||
<th>{% trans "End of subscription on" %}</th>
|
<th>{% trans "End of subscription on" %}</th>
|
||||||
|
@ -49,10 +49,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{ room.building }}</td>
|
<td>{{ room.building }}</td>
|
||||||
<td>{{ room.name }}</td>
|
<td>{{ room.name }}</td>
|
||||||
<td>{% if room.port_set.all %}<span class="label label-success">AURORE{% else %}<span class="label label-danger">{% trans "Other operator" %}{% endif %}</span></td>
|
<td>{% if room.port_set.all %}<span class="label label-success">{{ asso_name }}{% else %}<span class="label label-danger">{% trans "Other operator" %}{% endif %}</span></td>
|
||||||
<td>{% if room.adherent %}<a href="{% url 'users:profil' room.adherent.id%}">{{ room.adherent }}</a>{% else %} {% trans "Aucun" %}{% endif %}</td>
|
<td>{% if room.adherent %}<a href="{% url 'users:profil' room.adherent.id%}">{{ room.adherent }}</a>{% else %} {% trans "None" %}{% endif %}</td>
|
||||||
<td>{{ room.details }}</td>
|
<td>{{ room.details }}</td>
|
||||||
<td>{% if room.adherent.is_adherent %}<i class="text-success">{% else %}<i class="text-danger">{% endif %}{% if room.adherent.end_adhesion %}{{ room.adherent.end_adhesion}}{% else %}{% trans "No member" %}{% endif %}</i></td>
|
<td>{% if room.adherent.is_adherent %}<i class="text-success">{% else %}<i class="text-danger">{% endif %}{% if room.adherent.end_adhesion %}{{ room.adherent.end_adhesion}}{% else %}{% trans "Non member" %}{% endif %}</i></td>
|
||||||
<td>
|
<td>
|
||||||
{% if room.adherent.has_access == True %}
|
{% if room.adherent.has_access == True %}
|
||||||
<i class="text-success">{% trans "Active" %}</i>
|
<i class="text-success">{% trans "Active" %}</i>
|
||||||
|
|
|
@ -1,48 +0,0 @@
|
||||||
{% extends 'machines/sidebar.html' %}
|
|
||||||
{% comment %}
|
|
||||||
Re2o est un logiciel d'administration développé initiallement au rezometz. Il
|
|
||||||
se veut agnostique au réseau considéré, de manière à être installable en
|
|
||||||
quelques clics.
|
|
||||||
|
|
||||||
Copyright © 2017 Gabriel Détraz
|
|
||||||
Copyright © 2017 Goulven Kermarec
|
|
||||||
Copyright © 2017 Augustin Lemesle
|
|
||||||
Copyright © 2017 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.
|
|
||||||
{% endcomment %}
|
|
||||||
|
|
||||||
{% load bootstrap3 %}
|
|
||||||
{% load i18n %}
|
|
||||||
|
|
||||||
{% block title %}{% trans "Ticket" %}{% endblock %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<h2> {% trans "Tickets settings modification" %}</h2>
|
|
||||||
|
|
||||||
{% for message in messages %}
|
|
||||||
<div class="{{ message| bootstrap_message_classes }} alert-dismissable">
|
|
||||||
<button type="button" class="close" data_dismiss="alert" aria-hidden="true">}</button>
|
|
||||||
{{ message | safe }}
|
|
||||||
</div>
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
<form class="form" method="post">
|
|
||||||
{% csrf_token %}
|
|
||||||
{% bootstrap_field preferencesform.publish_address %}
|
|
||||||
{% bootstrap_field preferencesform.mail_language %}
|
|
||||||
{% bootstrap_button "Editer" button_type="submit" icon='ok' button_class='btn-success' %}
|
|
||||||
</form>
|
|
||||||
{% endblock %}
|
|
|
@ -1,58 +0,0 @@
|
||||||
{% extends 'machines/sidebar.html' %}
|
|
||||||
{% comment %}
|
|
||||||
Re2o est un logiciel d'administration développé initiallement au rezometz. Il
|
|
||||||
se veut agnostique au réseau considéré, de manière à être installable en
|
|
||||||
quelques clics.
|
|
||||||
|
|
||||||
Copyright © 2017 Gabriel Détraz
|
|
||||||
Copyright © 2017 Goulven Kermarec
|
|
||||||
Copyright © 2017 Augustin Lemesle
|
|
||||||
Copyright © 2017 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.
|
|
||||||
{% endcomment %}
|
|
||||||
|
|
||||||
{% load bootstrap3 %}
|
|
||||||
{% load massive_bootstrap_form %}
|
|
||||||
{% load i18n %}
|
|
||||||
|
|
||||||
{% block title %}{% trans "Ticket" %}{% endblock %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<h2> Ouverture d'un Ticket </h2>
|
|
||||||
|
|
||||||
<form class="form" method="post">
|
|
||||||
{% csrf_token %}
|
|
||||||
{% if not user.is_authenticated %}
|
|
||||||
<p>{% trans "Vous n'êtes pas authentifié. Veuillez fournir une adresse mail afin que nous puissions vous recontacter." %}</p>
|
|
||||||
{% bootstrap_field ticketform.email %}
|
|
||||||
{% endif %}
|
|
||||||
{% bootstrap_field ticketform.title %}
|
|
||||||
<br>
|
|
||||||
<p>{% trans "Description de votre problème. Veuillez fournir le plus d'informations possible afin de faciliter la recherche de solution. Voici quelques informations dont nous pourions avoir besoin:" %}</p>
|
|
||||||
<ul class="list">
|
|
||||||
<li>
|
|
||||||
<p> {% trans "Le type de votre problème (adhesion, connexion, paiement ou autre)." %}</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p> {% trans "Les conditions dans lesquelles vous rencontrez le problème (Wifi/filaire, sur tout les apareils ou sur un seul. Est-ce une nouvelle machine ?" %}</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p> {% trans "Les endroits dans lequels le problème survient (chez vous, dans une partie commune, dans un batiment en particulier)." %}</p>
|
|
||||||
</ul>
|
|
||||||
{% bootstrap_field ticketform.description %}
|
|
||||||
{% bootstrap_button "Ouvrir le Ticket" button_type="submit" icon='ok' button_class='btn-success' %}
|
|
||||||
</form>
|
|
||||||
{% endblock %}
|
|
|
@ -1,34 +0,0 @@
|
||||||
{% extends 'users/sidebar.html' %}
|
|
||||||
{% comment %}
|
|
||||||
Re2o est un logiciel d'administration développé initiallement au rezometz. Il
|
|
||||||
se veut agnostique au réseau considéré, de manière à être installable en
|
|
||||||
quelques clics.
|
|
||||||
|
|
||||||
Copyright © 2017 Gabriel Détraz
|
|
||||||
Copyright © 2017 Goulven Kermarec
|
|
||||||
Copyright © 2017 Augustin Lemesle
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
{% endcomment %}
|
|
||||||
|
|
||||||
{% load bootstrap3 %}
|
|
||||||
{% load i18n %}
|
|
||||||
|
|
||||||
{% block title%}{% trans "Tickets" %}{% endblock %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<h2>{% trans "Tickets" %}</h2>
|
|
||||||
{% include 'tickets/aff_tickets.html' with tickets_list=tickets_list %}
|
|
||||||
{% endblock %}
|
|
|
@ -27,7 +27,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
{% load acl %}
|
{% load acl %}
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
|
|
||||||
{% block title %}{% trans "Multi Operators" %}{% endblock %}
|
{% block title %}{% trans "Multiple operators" %}{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
|
@ -35,17 +35,18 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
{% bootstrap_form_errors dormitory_form %}
|
{% bootstrap_form_errors dormitory_form %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<h2>{% trans "Rooms connections" %}</h2>
|
<h2>{% trans "Room connections" %}</h2>
|
||||||
|
|
||||||
{% if dormitory_form %}
|
{% if dormitory_form %}
|
||||||
<form class="form" method="post">
|
<form class="form" method="post">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
{% bootstrap_form dormitory_form %}
|
{% bootstrap_form dormitory_form %}
|
||||||
{% bootstrap_button "Select Dormitory" icon='ok' button_class='btn-success' %}
|
{% trans "Select dormitory" as tr_select_dorm %}
|
||||||
|
{% bootstrap_button tr_select_dorm icon='ok' button_class='btn-success' %}
|
||||||
</form>
|
</form>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% include 'multi_op/aff_room_state.html' with room_list=room_list %}
|
{% include 'multi_op/aff_room_state.html' with room_list=room_list asso_name=asso_name %}
|
||||||
<br />
|
<br />
|
||||||
<br />
|
<br />
|
||||||
<br />
|
<br />
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
<li><a href="{% url 'multi_op:aff-state-global' %}"><i class="fa fa-random"></i> {% trans "Multi Operators" %}</a></li>
|
<li><a href="{% url 'multi_op:aff-state-global' %}"><i class="fa fa-random"></i> {% trans "Manage the operators" %}</a></li>
|
||||||
|
|
|
@ -1,6 +0,0 @@
|
||||||
{% load i18n %}
|
|
||||||
<li>
|
|
||||||
<a href="{% url 'tickets:new-ticket' %}">
|
|
||||||
<i class="fa fa-ticket"></i> {% trans "Ouvrir un ticket" %}
|
|
||||||
</a>
|
|
||||||
</li>
|
|
|
@ -1,36 +0,0 @@
|
||||||
{% load i18n %}
|
|
||||||
|
|
||||||
<div class="panel panel-default" id="tickets">
|
|
||||||
<div class="panel-heading" data-toggle="collapse" href="#collapse_tickets">
|
|
||||||
<h4 class="panel-title">
|
|
||||||
<a><i class="fa fa-ticket"></i> {% trans "Tickets" %}</a>
|
|
||||||
</h4>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="collapse_tickets" class="panel-collapse panel-body collapse">
|
|
||||||
|
|
||||||
<a class="btn btn-primary btn-sm" role="button" href="{% url 'tickets:edit-preferences-tickets' %}">
|
|
||||||
<i class="fa fa-edit"></i>
|
|
||||||
{% trans "Edit" %}
|
|
||||||
</a>
|
|
||||||
<p></p>
|
|
||||||
|
|
||||||
<div class="table-responsive">
|
|
||||||
<table class="table">
|
|
||||||
<tr>
|
|
||||||
<th><p>{% trans "Publication email address"%}</p></th>
|
|
||||||
{% if preferences.publish_address %}
|
|
||||||
<td><p>{{ preferences.publish_address }}</p></td>
|
|
||||||
{% else %}
|
|
||||||
<td><p>{% trans "Pas d'adresse, les tickets ne sont pas annoncés" %}</p></td>
|
|
||||||
{% endif %}
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th><p>{% trans "Email language" %}</p></th>
|
|
||||||
<td><p>{{ language }}</p></th>
|
|
||||||
</tr>
|
|
||||||
<table class="table">
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
|
@ -28,7 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
{% block sidebar %}
|
{% block sidebar %}
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'multi_op:aff-state-global' %}">
|
<a class="list-group-item list-group-item-info" href="{% url 'multi_op:aff-state-global' %}">
|
||||||
<i class="fa fa-random"></i>
|
<i class="fa fa-random"></i>
|
||||||
{% trans "Rooms connection state" %}
|
{% trans "Room connections state" %}
|
||||||
</a>
|
</a>
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'multi_op:aff-pending-connection' %}">
|
<a class="list-group-item list-group-item-info" href="{% url 'multi_op:aff-pending-connection' %}">
|
||||||
<i class="fa fa-compress"></i>
|
<i class="fa fa-compress"></i>
|
||||||
|
|
|
@ -41,7 +41,7 @@ from re2o.base import re2o_paginator, SortTable
|
||||||
|
|
||||||
from re2o.acl import can_view, can_view_all, can_edit, can_create
|
from re2o.acl import can_view, can_view_all, can_edit, can_create
|
||||||
|
|
||||||
from preferences.models import GeneralOption
|
from preferences.models import GeneralOption, AssoOption
|
||||||
|
|
||||||
from .forms import DormitoryForm
|
from .forms import DormitoryForm
|
||||||
|
|
||||||
|
@ -67,7 +67,15 @@ def display_rooms_connection(request, dormitory=None):
|
||||||
)
|
)
|
||||||
pagination_number = GeneralOption.get_cached_value("pagination_number")
|
pagination_number = GeneralOption.get_cached_value("pagination_number")
|
||||||
room_list = re2o_paginator(request, room_list, pagination_number)
|
room_list = re2o_paginator(request, room_list, pagination_number)
|
||||||
return render(request, "multi_op/index_room_state.html", {"room_list": room_list})
|
asso_name = AssoOption.get_cached_value("pseudo")
|
||||||
|
return render(
|
||||||
|
request,
|
||||||
|
"multi_op/index_room_state.html",
|
||||||
|
{
|
||||||
|
"room_list": room_list,
|
||||||
|
"asso_name": asso_name,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
|
@ -105,10 +113,15 @@ def aff_pending_connection(request):
|
||||||
)
|
)
|
||||||
pagination_number = GeneralOption.get_cached_value("pagination_number")
|
pagination_number = GeneralOption.get_cached_value("pagination_number")
|
||||||
room_list = re2o_paginator(request, room_list, pagination_number)
|
room_list = re2o_paginator(request, room_list, pagination_number)
|
||||||
|
asso_name = AssoOption.get_cached_value("pseudo")
|
||||||
return render(
|
return render(
|
||||||
request,
|
request,
|
||||||
"multi_op/index_room_state.html",
|
"multi_op/index_room_state.html",
|
||||||
{"room_list": room_list, "dormitory_form": dormitory_form},
|
{
|
||||||
|
"room_list": room_list,
|
||||||
|
"dormitory_form": dormitory_form,
|
||||||
|
"asso_name": asso_name,
|
||||||
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -135,10 +148,15 @@ def aff_pending_disconnection(request):
|
||||||
)
|
)
|
||||||
pagination_number = GeneralOption.get_cached_value("pagination_number")
|
pagination_number = GeneralOption.get_cached_value("pagination_number")
|
||||||
room_list = re2o_paginator(request, room_list, pagination_number)
|
room_list = re2o_paginator(request, room_list, pagination_number)
|
||||||
|
asso_name = AssoOption.get_cached_value("pseudo")
|
||||||
return render(
|
return render(
|
||||||
request,
|
request,
|
||||||
"multi_op/index_room_state.html",
|
"multi_op/index_room_state.html",
|
||||||
{"room_list": room_list, "dormitory_form": dormitory_form},
|
{
|
||||||
|
"room_list": room_list,
|
||||||
|
"dormitory_form": dormitory_form,
|
||||||
|
"asso_name": asso_name,
|
||||||
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -148,7 +166,7 @@ def disconnect_room(request, room, roomid):
|
||||||
"""Action of disconnecting a room"""
|
"""Action of disconnecting a room"""
|
||||||
room.port_set.clear()
|
room.port_set.clear()
|
||||||
room.save()
|
room.save()
|
||||||
messages.success(request, "Room %s disconnected" % room)
|
messages.success(request, _("The room %s was disconnected.") % room)
|
||||||
return redirect(reverse("multi_op:aff-pending-disconnection"))
|
return redirect(reverse("multi_op:aff-pending-disconnection"))
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -41,6 +41,7 @@ def can_view(user):
|
||||||
can = user.has_module_perms("preferences")
|
can = user.has_module_perms("preferences")
|
||||||
return (
|
return (
|
||||||
can,
|
can,
|
||||||
None if can else _("You don't have the right to view this" " application."),
|
None if can else _("You don't have the right to view this"
|
||||||
|
" application."),
|
||||||
("preferences",),
|
("preferences",),
|
||||||
)
|
)
|
||||||
|
|
|
@ -81,13 +81,13 @@ class EditOptionalMachineForm(ModelForm):
|
||||||
prefix = kwargs.pop("prefix", self.Meta.model.__name__)
|
prefix = kwargs.pop("prefix", self.Meta.model.__name__)
|
||||||
super(EditOptionalMachineForm, self).__init__(*args, prefix=prefix, **kwargs)
|
super(EditOptionalMachineForm, self).__init__(*args, prefix=prefix, **kwargs)
|
||||||
self.fields["password_machine"].label = _(
|
self.fields["password_machine"].label = _(
|
||||||
"Possibility to set a" " password per machine"
|
"Possibility to set a password per machine"
|
||||||
)
|
)
|
||||||
self.fields["max_lambdauser_interfaces"].label = _(
|
self.fields["max_lambdauser_interfaces"].label = _(
|
||||||
"Maximum number of" " interfaces" " allowed for a" " standard user"
|
"Maximum number of interfaces allowed for a standard user"
|
||||||
)
|
)
|
||||||
self.fields["max_lambdauser_aliases"].label = _(
|
self.fields["max_lambdauser_aliases"].label = _(
|
||||||
"Maximum number of DNS" " aliases allowed for" " a standard user"
|
"Maximum number of DNS aliases allowed for a standard user"
|
||||||
)
|
)
|
||||||
self.fields["ipv6_mode"].label = _("IPv6 mode")
|
self.fields["ipv6_mode"].label = _("IPv6 mode")
|
||||||
self.fields["create_machine"].label = _("Can create a machine")
|
self.fields["create_machine"].label = _("Can create a machine")
|
||||||
|
@ -136,20 +136,20 @@ class EditGeneralOptionForm(ModelForm):
|
||||||
self.fields["general_message_fr"].label = _("General message in French")
|
self.fields["general_message_fr"].label = _("General message in French")
|
||||||
self.fields["general_message_en"].label = _("General message in English")
|
self.fields["general_message_en"].label = _("General message in English")
|
||||||
self.fields["search_display_page"].label = _(
|
self.fields["search_display_page"].label = _(
|
||||||
"Number of results" " displayed when" " searching"
|
"Number of results displayed when searching"
|
||||||
)
|
)
|
||||||
self.fields["pagination_number"].label = _(
|
self.fields["pagination_number"].label = _(
|
||||||
"Number of items per page," " standard size (e.g." " users)"
|
"Number of items per page, standard size (e.g. users)"
|
||||||
)
|
)
|
||||||
self.fields["pagination_large_number"].label = _(
|
self.fields["pagination_large_number"].label = _(
|
||||||
"Number of items per" " page, large size" " (e.g. machines)"
|
"Number of items per page, large size (e.g. machines)"
|
||||||
)
|
)
|
||||||
self.fields["req_expire_hrs"].label = _(
|
self.fields["req_expire_hrs"].label = _(
|
||||||
"Time before expiration of the" " reset password link (in" " hours)"
|
"Time before expiration of the reset password link (in hours)"
|
||||||
)
|
)
|
||||||
self.fields["site_name"].label = _("Website name")
|
self.fields["site_name"].label = _("Website name")
|
||||||
self.fields["email_from"].label = _("Email address for automatic" " emailing")
|
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_sum_up"].label = _("Summary of the General Terms of Use")
|
||||||
self.fields["GTU"].label = _("General Terms of Use")
|
self.fields["GTU"].label = _("General Terms of Use")
|
||||||
|
|
||||||
|
|
||||||
|
@ -171,7 +171,7 @@ class EditAssoOptionForm(ModelForm):
|
||||||
self.fields["telephone"].label = _("Telephone number")
|
self.fields["telephone"].label = _("Telephone number")
|
||||||
self.fields["pseudo"].label = _("Usual name")
|
self.fields["pseudo"].label = _("Usual name")
|
||||||
self.fields["utilisateur_asso"].label = _(
|
self.fields["utilisateur_asso"].label = _(
|
||||||
"Account used for editing" " from /admin"
|
"Account used for editing from /admin"
|
||||||
)
|
)
|
||||||
self.fields["description"].label = _("Description")
|
self.fields["description"].label = _("Description")
|
||||||
|
|
||||||
|
@ -187,10 +187,10 @@ class EditMailMessageOptionForm(ModelForm):
|
||||||
prefix = kwargs.pop("prefix", self.Meta.model.__name__)
|
prefix = kwargs.pop("prefix", self.Meta.model.__name__)
|
||||||
super(EditMailMessageOptionForm, self).__init__(*args, prefix=prefix, **kwargs)
|
super(EditMailMessageOptionForm, self).__init__(*args, prefix=prefix, **kwargs)
|
||||||
self.fields["welcome_mail_fr"].label = _(
|
self.fields["welcome_mail_fr"].label = _(
|
||||||
"Message for the French" " welcome email"
|
"Message for the French welcome email"
|
||||||
)
|
)
|
||||||
self.fields["welcome_mail_en"].label = _(
|
self.fields["welcome_mail_en"].label = _(
|
||||||
"Message for the English" " welcome email"
|
"Message for the English welcome email"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -451,7 +451,7 @@ class DelDocumentTemplateForm(FormRevMixin, Form):
|
||||||
|
|
||||||
document_templates = forms.ModelMultipleChoiceField(
|
document_templates = forms.ModelMultipleChoiceField(
|
||||||
queryset=DocumentTemplate.objects.none(),
|
queryset=DocumentTemplate.objects.none(),
|
||||||
label=_("Available document templates"),
|
label=_("Current document templates"),
|
||||||
widget=forms.CheckboxSelectMultiple,
|
widget=forms.CheckboxSelectMultiple,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load diff
289
preferences/migrations/0067_auto_20191120_0159.py
Normal file
289
preferences/migrations/0067_auto_20191120_0159.py
Normal file
|
@ -0,0 +1,289 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.11.23 on 2019-11-20 00:59
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
import preferences.models
|
||||||
|
import re2o.aes_field
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('preferences', '0066_optionalmachine_default_dns_ttl'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterModelOptions(
|
||||||
|
name='assooption',
|
||||||
|
options={'permissions': (('view_assooption', 'Can view the organisation preferences'),), 'verbose_name': 'organisation preferences'},
|
||||||
|
),
|
||||||
|
migrations.AlterModelOptions(
|
||||||
|
name='cotisationsoption',
|
||||||
|
options={'verbose_name': 'subscription preferences'},
|
||||||
|
),
|
||||||
|
migrations.AlterModelOptions(
|
||||||
|
name='generaloption',
|
||||||
|
options={'permissions': (('view_generaloption', 'Can view the general preferences'),), 'verbose_name': 'general preferences'},
|
||||||
|
),
|
||||||
|
migrations.AlterModelOptions(
|
||||||
|
name='homeoption',
|
||||||
|
options={'permissions': (('view_homeoption', 'Can view the homepage preferences'),), 'verbose_name': 'homepage preferences'},
|
||||||
|
),
|
||||||
|
migrations.AlterModelOptions(
|
||||||
|
name='mailmessageoption',
|
||||||
|
options={'permissions': (('view_mailmessageoption', 'Can view the email message preferences'),), 'verbose_name': 'email message preferences'},
|
||||||
|
),
|
||||||
|
migrations.AlterModelOptions(
|
||||||
|
name='mandate',
|
||||||
|
options={'permissions': (('view_mandate', 'Can view a mandate object'),), 'verbose_name': 'mandate', 'verbose_name_plural': 'mandates'},
|
||||||
|
),
|
||||||
|
migrations.AlterModelOptions(
|
||||||
|
name='optionalmachine',
|
||||||
|
options={'permissions': (('view_optionalmachine', 'Can view the machine preferences'),), 'verbose_name': 'machine preferences'},
|
||||||
|
),
|
||||||
|
migrations.AlterModelOptions(
|
||||||
|
name='optionaltopologie',
|
||||||
|
options={'permissions': (('view_optionaltopologie', 'Can view the topology preferences'),), 'verbose_name': 'topology preferences'},
|
||||||
|
),
|
||||||
|
migrations.AlterModelOptions(
|
||||||
|
name='optionaluser',
|
||||||
|
options={'permissions': (('view_optionaluser', 'Can view the user preferences'),), 'verbose_name': 'user preferences'},
|
||||||
|
),
|
||||||
|
migrations.AlterModelOptions(
|
||||||
|
name='service',
|
||||||
|
options={'permissions': (('view_service', 'Can view the service preferences'),), 'verbose_name': 'service', 'verbose_name_plural': 'services'},
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='cotisationsoption',
|
||||||
|
name='invoice_template',
|
||||||
|
field=models.OneToOneField(default=preferences.models.default_invoice, on_delete=django.db.models.deletion.PROTECT, related_name='invoice_template', to='preferences.DocumentTemplate', verbose_name='template for invoices'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='cotisationsoption',
|
||||||
|
name='send_voucher_mail',
|
||||||
|
field=models.BooleanField(default=False, help_text='Be careful, if no mandate is defined on the preferences page, errors will be triggered when generating vouchers.', verbose_name='send voucher by email when the invoice is controlled'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='cotisationsoption',
|
||||||
|
name='voucher_template',
|
||||||
|
field=models.OneToOneField(default=preferences.models.default_voucher, on_delete=django.db.models.deletion.PROTECT, related_name='voucher_template', to='preferences.DocumentTemplate', verbose_name='template for subscription vouchers'),
|
||||||
|
),
|
||||||
|
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='mailcontact',
|
||||||
|
name='address',
|
||||||
|
field=models.EmailField(default='contact@example.org', help_text='Contact email address.', max_length=254),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='mailmessageoption',
|
||||||
|
name='welcome_mail_en',
|
||||||
|
field=models.TextField(blank=True, default='', help_text='Welcome email in English.'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='mailmessageoption',
|
||||||
|
name='welcome_mail_fr',
|
||||||
|
field=models.TextField(blank=True, default='', help_text='Welcome email in French.'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='mandate',
|
||||||
|
name='president',
|
||||||
|
field=models.ForeignKey(blank=True, help_text='Displayed on subscription vouchers.', null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='president of the association'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='optionalmachine',
|
||||||
|
name='default_dns_ttl',
|
||||||
|
field=models.PositiveIntegerField(default=172800, verbose_name='default Time To Live (TTL) for CNAME, A and AAAA records'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='optionalmachine',
|
||||||
|
name='ipv6_mode',
|
||||||
|
field=models.CharField(choices=[('SLAAC', 'Automatic configuration by RA'), ('DHCPV6', 'IP addresses assignment by DHCPv6'), ('DISABLED', 'Disabled')], default='DISABLED', max_length=32),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='optionaltopologie',
|
||||||
|
name='sftp_login',
|
||||||
|
field=models.CharField(blank=True, help_text='SFTP login for switches.', max_length=32, null=True),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='optionaltopologie',
|
||||||
|
name='sftp_pass',
|
||||||
|
field=re2o.aes_field.AESEncryptedField(blank=True, help_text='SFTP password.', max_length=63, null=True),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='optionaltopologie',
|
||||||
|
name='switchs_ip_type',
|
||||||
|
field=models.OneToOneField(blank=True, help_text='IP range for the management of switches.', null=True, on_delete=django.db.models.deletion.PROTECT, to='machines.IpType'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='optionaltopologie',
|
||||||
|
name='switchs_provision',
|
||||||
|
field=models.CharField(choices=[('sftp', 'SFTP'), ('tftp', 'TFTP')], default='tftp', help_text='Provision of configuration mode for switches.', max_length=32),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='optionaltopologie',
|
||||||
|
name='switchs_rest_management',
|
||||||
|
field=models.BooleanField(default=False, help_text='REST management, activated in case of automatic provision.'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='optionaltopologie',
|
||||||
|
name='switchs_web_management',
|
||||||
|
field=models.BooleanField(default=False, help_text='Web management, activated in case of automatic provision.'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='optionaltopologie',
|
||||||
|
name='switchs_web_management_ssl',
|
||||||
|
field=models.BooleanField(default=False, help_text='SSL web management, make sure that a certificate is installed on the switch.'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='optionaluser',
|
||||||
|
name='local_email_domain',
|
||||||
|
field=models.CharField(default='@example.org', help_text='Domain to use for local email accounts.', max_length=32),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='radiusattribute',
|
||||||
|
name='attribute',
|
||||||
|
field=models.CharField(help_text='See https://freeradius.org/rfc/attributes.html.', max_length=255, verbose_name='attribute'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='radiusattribute',
|
||||||
|
name='comment',
|
||||||
|
field=models.TextField(blank=True, default='', help_text='Use this field to document this attribute.', verbose_name='comment'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='radiusattribute',
|
||||||
|
name='value',
|
||||||
|
field=models.CharField(max_length=255, verbose_name='value'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='radiuskey',
|
||||||
|
name='comment',
|
||||||
|
field=models.CharField(blank=True, help_text='Comment for this key.', max_length=255, null=True),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='radiuskey',
|
||||||
|
name='default_switch',
|
||||||
|
field=models.BooleanField(default=False, help_text='Default key for switches.'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='radiuskey',
|
||||||
|
name='radius_key',
|
||||||
|
field=re2o.aes_field.AESEncryptedField(help_text='RADIUS key.', max_length=255),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='radiusoption',
|
||||||
|
name='banned',
|
||||||
|
field=models.CharField(choices=[('REJECT', 'Reject the machine'), ('SET_VLAN', 'Place the machine on the VLAN')], default='REJECT', max_length=32, verbose_name='policy for banned users'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='radiusoption',
|
||||||
|
name='banned_attributes',
|
||||||
|
field=models.ManyToManyField(blank=True, help_text='Answer attributes for banned users.', related_name='banned_attribute', to='preferences.RadiusAttribute', verbose_name='banned users attributes'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='radiusoption',
|
||||||
|
name='banned_vlan',
|
||||||
|
field=models.ForeignKey(blank=True, help_text='VLAN for banned users if not rejected.', null=True, on_delete=django.db.models.deletion.PROTECT, related_name='banned_vlan', to='machines.Vlan', verbose_name='banned users VLAN'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='radiusoption',
|
||||||
|
name='non_member',
|
||||||
|
field=models.CharField(choices=[('REJECT', 'Reject the machine'), ('SET_VLAN', 'Place the machine on the VLAN')], default='REJECT', max_length=32, verbose_name='policy for non members'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='radiusoption',
|
||||||
|
name='non_member_attributes',
|
||||||
|
field=models.ManyToManyField(blank=True, help_text='Answer attributes for non members.', related_name='non_member_attribute', to='preferences.RadiusAttribute', verbose_name='non members attributes'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='radiusoption',
|
||||||
|
name='non_member_vlan',
|
||||||
|
field=models.ForeignKey(blank=True, help_text='VLAN for non members if not rejected.', null=True, on_delete=django.db.models.deletion.PROTECT, related_name='non_member_vlan', to='machines.Vlan', verbose_name='non members VLAN'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='radiusoption',
|
||||||
|
name='ok_attributes',
|
||||||
|
field=models.ManyToManyField(blank=True, help_text='Answer attributes for accepted users.', related_name='ok_attribute', to='preferences.RadiusAttribute', verbose_name='accepted users attributes'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='radiusoption',
|
||||||
|
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='radiusoption',
|
||||||
|
name='unknown_machine',
|
||||||
|
field=models.CharField(choices=[('REJECT', 'Reject the machine'), ('SET_VLAN', 'Place the machine on the VLAN')], default='REJECT', max_length=32, verbose_name='policy for unknown machines'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='radiusoption',
|
||||||
|
name='unknown_machine_attributes',
|
||||||
|
field=models.ManyToManyField(blank=True, help_text='Answer attributes for unknown machines.', related_name='unknown_machine_attribute', to='preferences.RadiusAttribute', verbose_name='unknown machines attributes'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='radiusoption',
|
||||||
|
name='unknown_machine_vlan',
|
||||||
|
field=models.ForeignKey(blank=True, help_text='VLAN for unknown machines if not rejected.', null=True, on_delete=django.db.models.deletion.PROTECT, related_name='unknown_machine_vlan', to='machines.Vlan', verbose_name='unknown machines VLAN'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='radiusoption',
|
||||||
|
name='unknown_port',
|
||||||
|
field=models.CharField(choices=[('REJECT', 'Reject the machine'), ('SET_VLAN', 'Place the machine on the VLAN')], default='REJECT', max_length=32, verbose_name='policy for unknown ports'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='radiusoption',
|
||||||
|
name='unknown_port_attributes',
|
||||||
|
field=models.ManyToManyField(blank=True, help_text='Answer attributes for unknown ports.', related_name='unknown_port_attribute', to='preferences.RadiusAttribute', verbose_name='unknown ports attributes'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='radiusoption',
|
||||||
|
name='unknown_port_vlan',
|
||||||
|
field=models.ForeignKey(blank=True, help_text='VLAN for unknown ports if not rejected.', null=True, on_delete=django.db.models.deletion.PROTECT, related_name='unknown_port_vlan', to='machines.Vlan', verbose_name='unknown ports VLAN'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='radiusoption',
|
||||||
|
name='unknown_room_attributes',
|
||||||
|
field=models.ManyToManyField(blank=True, help_text='Answer attributes for unknown rooms.', related_name='unknown_room_attribute', to='preferences.RadiusAttribute', verbose_name='unknown rooms attributes'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='radiusoption',
|
||||||
|
name='unknown_room_vlan',
|
||||||
|
field=models.ForeignKey(blank=True, help_text='VLAN for unknown rooms if not rejected.', null=True, on_delete=django.db.models.deletion.PROTECT, related_name='unknown_room_vlan', to='machines.Vlan', verbose_name='unknown rooms VLAN'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='reminder',
|
||||||
|
name='days',
|
||||||
|
field=models.IntegerField(default=7, help_text="Delay between the email and the membership's end.", unique=True),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='reminder',
|
||||||
|
name='message',
|
||||||
|
field=models.TextField(blank=True, default='', help_text='Message displayed specifically for this reminder.', null=True),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='switchmanagementcred',
|
||||||
|
name='default_switch',
|
||||||
|
field=models.BooleanField(default=True, help_text='Default credentials for switches.', unique=True),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='switchmanagementcred',
|
||||||
|
name='management_id',
|
||||||
|
field=models.CharField(help_text='Switch login.', max_length=63),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='switchmanagementcred',
|
||||||
|
name='management_pass',
|
||||||
|
field=re2o.aes_field.AESEncryptedField(help_text='Password.', max_length=63),
|
||||||
|
),
|
||||||
|
]
|
|
@ -95,16 +95,16 @@ class OptionalUser(AclMixin, PreferencesModel):
|
||||||
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 addresses for a standard" " user."),
|
help_text=_("Maximum number of local email addresses for a standard user."),
|
||||||
)
|
)
|
||||||
delete_notyetactive = models.IntegerField(
|
delete_notyetactive = models.IntegerField(
|
||||||
default=15,
|
default=15,
|
||||||
help_text=_(
|
help_text=_(
|
||||||
"Not yet active users will be deleted after this number of" " days."
|
"Not yet active users will be deleted after this number of days."
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
self_adhesion = models.BooleanField(
|
self_adhesion = models.BooleanField(
|
||||||
|
@ -122,15 +122,15 @@ class OptionalUser(AclMixin, PreferencesModel):
|
||||||
)
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
permissions = (("view_optionaluser", _("Can view the user options")),)
|
permissions = (("view_optionaluser", _("Can view the user preferences")),)
|
||||||
verbose_name = _("user options")
|
verbose_name = _("user preferences")
|
||||||
|
|
||||||
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(_("Email domain must begin with @"))
|
raise ValidationError(_("Email domain must begin with @."))
|
||||||
|
|
||||||
|
|
||||||
@receiver(post_save, sender=OptionalUser)
|
@receiver(post_save, sender=OptionalUser)
|
||||||
|
@ -148,8 +148,8 @@ class OptionalMachine(AclMixin, PreferencesModel):
|
||||||
DHCPV6 = "DHCPV6"
|
DHCPV6 = "DHCPV6"
|
||||||
DISABLED = "DISABLED"
|
DISABLED = "DISABLED"
|
||||||
CHOICE_IPV6 = (
|
CHOICE_IPV6 = (
|
||||||
(SLAAC, _("Autoconfiguration by RA")),
|
(SLAAC, _("Automatic configuration by RA")),
|
||||||
(DHCPV6, _("IP addresses assigning by DHCPv6")),
|
(DHCPV6, _("IP addresses assignment by DHCPv6")),
|
||||||
(DISABLED, _("Disabled")),
|
(DISABLED, _("Disabled")),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -159,7 +159,7 @@ class OptionalMachine(AclMixin, PreferencesModel):
|
||||||
ipv6_mode = models.CharField(max_length=32, choices=CHOICE_IPV6, default="DISABLED")
|
ipv6_mode = models.CharField(max_length=32, choices=CHOICE_IPV6, default="DISABLED")
|
||||||
create_machine = models.BooleanField(default=True)
|
create_machine = models.BooleanField(default=True)
|
||||||
default_dns_ttl = models.PositiveIntegerField(
|
default_dns_ttl = models.PositiveIntegerField(
|
||||||
verbose_name=_("Default Time To Live (TTL) for CNAME, A and AAA records."),
|
verbose_name=_("default Time To Live (TTL) for CNAME, A and AAAA records"),
|
||||||
default=172800, # 2 days
|
default=172800, # 2 days
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -169,8 +169,8 @@ class OptionalMachine(AclMixin, PreferencesModel):
|
||||||
return not self.get_cached_value("ipv6_mode") == "DISABLED"
|
return not self.get_cached_value("ipv6_mode") == "DISABLED"
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
permissions = (("view_optionalmachine", _("Can view the machine options")),)
|
permissions = (("view_optionalmachine", _("Can view the machine preferences")),)
|
||||||
verbose_name = _("machine options")
|
verbose_name = _("machine preferences")
|
||||||
|
|
||||||
|
|
||||||
@receiver(post_save, sender=OptionalMachine)
|
@receiver(post_save, sender=OptionalMachine)
|
||||||
|
@ -191,43 +191,43 @@ class OptionalTopologie(AclMixin, PreferencesModel):
|
||||||
DEFINED = "DEFINED"
|
DEFINED = "DEFINED"
|
||||||
CHOICE_RADIUS = (
|
CHOICE_RADIUS = (
|
||||||
(MACHINE, _("On the IP range's VLAN of the machine")),
|
(MACHINE, _("On the IP range's VLAN of the machine")),
|
||||||
(DEFINED, _("Preset in 'VLAN for machines accepted by RADIUS'")),
|
(DEFINED, _("Preset in \"VLAN for machines accepted by RADIUS\"")),
|
||||||
)
|
)
|
||||||
CHOICE_PROVISION = (("sftp", "sftp"), ("tftp", "tftp"))
|
CHOICE_PROVISION = (("sftp", "SFTP"), ("tftp", "TFTP"))
|
||||||
|
|
||||||
switchs_web_management = models.BooleanField(
|
switchs_web_management = models.BooleanField(
|
||||||
default=False,
|
default=False,
|
||||||
help_text=_("Web management, activated in case of automatic provision"),
|
help_text=_("Web management, activated in case of automatic provision."),
|
||||||
)
|
)
|
||||||
switchs_web_management_ssl = models.BooleanField(
|
switchs_web_management_ssl = models.BooleanField(
|
||||||
default=False,
|
default=False,
|
||||||
help_text=_(
|
help_text=_(
|
||||||
"SSL web management, make sure that a certificate is"
|
"SSL web management, make sure that a certificate is"
|
||||||
" installed on the switch"
|
" installed on the switch."
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
switchs_rest_management = models.BooleanField(
|
switchs_rest_management = models.BooleanField(
|
||||||
default=False,
|
default=False,
|
||||||
help_text=_("REST management, activated in case of automatic provision"),
|
help_text=_("REST management, activated in case of automatic provision."),
|
||||||
)
|
)
|
||||||
switchs_ip_type = models.OneToOneField(
|
switchs_ip_type = models.OneToOneField(
|
||||||
"machines.IpType",
|
"machines.IpType",
|
||||||
on_delete=models.PROTECT,
|
on_delete=models.PROTECT,
|
||||||
blank=True,
|
blank=True,
|
||||||
null=True,
|
null=True,
|
||||||
help_text=_("IP range for the management of switches"),
|
help_text=_("IP range for the management of switches."),
|
||||||
)
|
)
|
||||||
switchs_provision = models.CharField(
|
switchs_provision = models.CharField(
|
||||||
max_length=32,
|
max_length=32,
|
||||||
choices=CHOICE_PROVISION,
|
choices=CHOICE_PROVISION,
|
||||||
default="tftp",
|
default="tftp",
|
||||||
help_text=_("Provision of configuration mode for switches"),
|
help_text=_("Provision of configuration mode for switches."),
|
||||||
)
|
)
|
||||||
sftp_login = models.CharField(
|
sftp_login = models.CharField(
|
||||||
max_length=32, null=True, blank=True, help_text=_("SFTP login for switches")
|
max_length=32, null=True, blank=True, help_text=_("SFTP login for switches.")
|
||||||
)
|
)
|
||||||
sftp_pass = AESEncryptedField(
|
sftp_pass = AESEncryptedField(
|
||||||
max_length=63, null=True, blank=True, help_text=_("SFTP password")
|
max_length=63, null=True, blank=True, help_text=_("SFTP password.")
|
||||||
)
|
)
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
|
@ -331,8 +331,8 @@ class OptionalTopologie(AclMixin, PreferencesModel):
|
||||||
)
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
permissions = (("view_optionaltopologie", _("Can view the topology options")),)
|
permissions = (("view_optionaltopologie", _("Can view the topology preferences")),)
|
||||||
verbose_name = _("topology options")
|
verbose_name = _("topology preferences")
|
||||||
|
|
||||||
|
|
||||||
@receiver(post_save, sender=OptionalTopologie)
|
@receiver(post_save, sender=OptionalTopologie)
|
||||||
|
@ -345,12 +345,12 @@ def optionaltopologie_post_save(**kwargs):
|
||||||
class RadiusKey(AclMixin, models.Model):
|
class RadiusKey(AclMixin, models.Model):
|
||||||
"""Class of a radius key"""
|
"""Class of a radius key"""
|
||||||
|
|
||||||
radius_key = AESEncryptedField(max_length=255, help_text=_("RADIUS key"))
|
radius_key = AESEncryptedField(max_length=255, help_text=_("RADIUS key."))
|
||||||
comment = models.CharField(
|
comment = models.CharField(
|
||||||
max_length=255, null=True, blank=True, help_text=_("Comment for this key")
|
max_length=255, null=True, blank=True, help_text=_("Comment for this key.")
|
||||||
)
|
)
|
||||||
default_switch = models.BooleanField(
|
default_switch = models.BooleanField(
|
||||||
default=False, help_text=_("Default key for switches")
|
default=False, help_text=_("Default key for switches.")
|
||||||
)
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
@ -363,7 +363,7 @@ class RadiusKey(AclMixin, models.Model):
|
||||||
Check default switch is unique
|
Check default switch is unique
|
||||||
"""
|
"""
|
||||||
if RadiusKey.objects.filter(default_switch=True).count() > 1:
|
if RadiusKey.objects.filter(default_switch=True).count() > 1:
|
||||||
raise ValidationError(_("Default radiuskey for switchs already exist"))
|
raise ValidationError(_("Default RADIUS key for switches already exists."))
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return _("RADIUS key ") + str(self.id) + " " + str(self.comment)
|
return _("RADIUS key ") + str(self.id) + " " + str(self.comment)
|
||||||
|
@ -372,17 +372,17 @@ class RadiusKey(AclMixin, models.Model):
|
||||||
class SwitchManagementCred(AclMixin, models.Model):
|
class SwitchManagementCred(AclMixin, models.Model):
|
||||||
"""Class of a management creds of a switch, for rest management"""
|
"""Class of a management creds of a switch, for rest management"""
|
||||||
|
|
||||||
management_id = models.CharField(max_length=63, help_text=_("Switch login"))
|
management_id = models.CharField(max_length=63, help_text=_("Switch login."))
|
||||||
management_pass = AESEncryptedField(max_length=63, help_text=_("Password"))
|
management_pass = AESEncryptedField(max_length=63, help_text=_("Password."))
|
||||||
default_switch = models.BooleanField(
|
default_switch = models.BooleanField(
|
||||||
default=True, unique=True, help_text=_("Default credentials for switches")
|
default=True, unique=True, help_text=_("Default credentials for switches.")
|
||||||
)
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
permissions = (
|
permissions = (
|
||||||
(
|
(
|
||||||
"view_switchmanagementcred",
|
"view_switchmanagementcred",
|
||||||
_("Can view a switch management" " credentials object"),
|
_("Can view a switch management credentials object"),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
verbose_name = _("switch management credentials")
|
verbose_name = _("switch management credentials")
|
||||||
|
@ -400,13 +400,13 @@ class Reminder(AclMixin, models.Model):
|
||||||
days = models.IntegerField(
|
days = models.IntegerField(
|
||||||
default=7,
|
default=7,
|
||||||
unique=True,
|
unique=True,
|
||||||
help_text=_("Delay between the email and the membership's end"),
|
help_text=_("Delay between the email and the membership's end."),
|
||||||
)
|
)
|
||||||
message = models.TextField(
|
message = models.TextField(
|
||||||
default="",
|
default="",
|
||||||
null=True,
|
null=True,
|
||||||
blank=True,
|
blank=True,
|
||||||
help_text=_("Message displayed specifically for this reminder"),
|
help_text=_("Message displayed specifically for this reminder."),
|
||||||
)
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
@ -434,7 +434,7 @@ class GeneralOption(AclMixin, PreferencesModel):
|
||||||
blank=True,
|
blank=True,
|
||||||
help_text=_(
|
help_text=_(
|
||||||
"General message displayed on the French version of the"
|
"General message displayed on the French version of the"
|
||||||
" website (e.g. in case of maintenance)"
|
" website (e.g. in case of maintenance)."
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
general_message_en = models.TextField(
|
general_message_en = models.TextField(
|
||||||
|
@ -442,7 +442,7 @@ class GeneralOption(AclMixin, PreferencesModel):
|
||||||
blank=True,
|
blank=True,
|
||||||
help_text=_(
|
help_text=_(
|
||||||
"General message displayed on the English version of the"
|
"General message displayed on the English version of the"
|
||||||
" website (e.g. in case of maintenance)"
|
" website (e.g. in case of maintenance)."
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
search_display_page = models.IntegerField(default=15)
|
search_display_page = models.IntegerField(default=15)
|
||||||
|
@ -456,8 +456,8 @@ class GeneralOption(AclMixin, PreferencesModel):
|
||||||
GTU = models.FileField(upload_to="", default="", null=True, blank=True)
|
GTU = models.FileField(upload_to="", default="", null=True, blank=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
permissions = (("view_generaloption", _("Can view the general options")),)
|
permissions = (("view_generaloption", _("Can view the general preferences")),)
|
||||||
verbose_name = _("general options")
|
verbose_name = _("general preferences")
|
||||||
|
|
||||||
|
|
||||||
@receiver(post_save, sender=GeneralOption)
|
@receiver(post_save, sender=GeneralOption)
|
||||||
|
@ -477,7 +477,7 @@ class Service(AclMixin, models.Model):
|
||||||
image = models.ImageField(upload_to="logo", blank=True)
|
image = models.ImageField(upload_to="logo", blank=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
permissions = (("view_service", _("Can view the service options")),)
|
permissions = (("view_service", _("Can view the service preferences")),)
|
||||||
verbose_name = _("service")
|
verbose_name = _("service")
|
||||||
verbose_name_plural = _("services")
|
verbose_name_plural = _("services")
|
||||||
|
|
||||||
|
@ -489,7 +489,7 @@ class MailContact(AclMixin, models.Model):
|
||||||
"""Contact email adress with a commentary."""
|
"""Contact email adress with a commentary."""
|
||||||
|
|
||||||
address = models.EmailField(
|
address = models.EmailField(
|
||||||
default="contact@example.org", help_text=_("Contact email address")
|
default="contact@example.org", help_text=_("Contact email address.")
|
||||||
)
|
)
|
||||||
|
|
||||||
commentary = models.CharField(
|
commentary = models.CharField(
|
||||||
|
@ -516,17 +516,17 @@ class MailContact(AclMixin, models.Model):
|
||||||
|
|
||||||
class Mandate(RevMixin, AclMixin, models.Model):
|
class Mandate(RevMixin, AclMixin, models.Model):
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = _("Mandate")
|
verbose_name = _("mandate")
|
||||||
verbose_name_plural = _("Mandates")
|
verbose_name_plural = _("mandates")
|
||||||
permissions = (("view_mandate", _("Can view a mandate")),)
|
permissions = (("view_mandate", _("Can view a mandate object")),)
|
||||||
|
|
||||||
president = models.ForeignKey(
|
president = models.ForeignKey(
|
||||||
"users.User",
|
"users.User",
|
||||||
on_delete=models.SET_NULL,
|
on_delete=models.SET_NULL,
|
||||||
null=True,
|
null=True,
|
||||||
blank=True,
|
blank=True,
|
||||||
verbose_name=_("President of the association"),
|
verbose_name=_("president of the association"),
|
||||||
help_text=_("Displayed on subscription vouchers"),
|
help_text=_("Displayed on subscription vouchers."),
|
||||||
)
|
)
|
||||||
start_date = models.DateTimeField(verbose_name=_("start date"))
|
start_date = models.DateTimeField(verbose_name=_("start date"))
|
||||||
end_date = models.DateTimeField(verbose_name=_("end date"), blank=True, null=True)
|
end_date = models.DateTimeField(verbose_name=_("end date"), blank=True, null=True)
|
||||||
|
@ -542,7 +542,7 @@ class Mandate(RevMixin, AclMixin, models.Model):
|
||||||
)
|
)
|
||||||
if not mandate:
|
if not mandate:
|
||||||
raise cls.DoesNotExist(
|
raise cls.DoesNotExist(
|
||||||
"No mandate have been created. Please go to the preferences page to create one."
|
_("No mandates have been created. Please go to the preferences page to create one.")
|
||||||
)
|
)
|
||||||
return mandate
|
return mandate
|
||||||
|
|
||||||
|
@ -571,8 +571,8 @@ class AssoOption(AclMixin, PreferencesModel):
|
||||||
description = models.TextField(null=True, blank=True)
|
description = models.TextField(null=True, blank=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
permissions = (("view_assooption", _("Can view the organisation options")),)
|
permissions = (("view_assooption", _("Can view the organisation preferences")),)
|
||||||
verbose_name = _("organisation options")
|
verbose_name = _("organisation preferences")
|
||||||
|
|
||||||
|
|
||||||
@receiver(post_save, sender=AssoOption)
|
@receiver(post_save, sender=AssoOption)
|
||||||
|
@ -590,8 +590,8 @@ class HomeOption(AclMixin, PreferencesModel):
|
||||||
twitter_account_name = models.CharField(max_length=32, null=True, blank=True)
|
twitter_account_name = models.CharField(max_length=32, null=True, blank=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
permissions = (("view_homeoption", _("Can view the homepage options")),)
|
permissions = (("view_homeoption", _("Can view the homepage preferences")),)
|
||||||
verbose_name = _("homepage options")
|
verbose_name = _("homepage preferences")
|
||||||
|
|
||||||
|
|
||||||
@receiver(post_save, sender=HomeOption)
|
@receiver(post_save, sender=HomeOption)
|
||||||
|
@ -605,17 +605,17 @@ class MailMessageOption(AclMixin, models.Model):
|
||||||
"""Reglages, mail de bienvenue et autre"""
|
"""Reglages, mail de bienvenue et autre"""
|
||||||
|
|
||||||
welcome_mail_fr = models.TextField(
|
welcome_mail_fr = models.TextField(
|
||||||
default="", blank=True, help_text=_("Welcome email in French")
|
default="", blank=True, help_text=_("Welcome email in French.")
|
||||||
)
|
)
|
||||||
welcome_mail_en = models.TextField(
|
welcome_mail_en = models.TextField(
|
||||||
default="", blank=True, help_text=_("Welcome email in English")
|
default="", blank=True, help_text=_("Welcome email in English.")
|
||||||
)
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
permissions = (
|
permissions = (
|
||||||
("view_mailmessageoption", _("Can view the email message" " options")),
|
("view_mailmessageoption", _("Can view the email message preferences")),
|
||||||
)
|
)
|
||||||
verbose_name = _("email message options")
|
verbose_name = _("email message preferences")
|
||||||
|
|
||||||
|
|
||||||
class RadiusAttribute(RevMixin, AclMixin, models.Model):
|
class RadiusAttribute(RevMixin, AclMixin, models.Model):
|
||||||
|
@ -625,12 +625,12 @@ class RadiusAttribute(RevMixin, AclMixin, models.Model):
|
||||||
|
|
||||||
attribute = models.CharField(
|
attribute = models.CharField(
|
||||||
max_length=255,
|
max_length=255,
|
||||||
verbose_name=_("Attribute"),
|
verbose_name=_("attribute"),
|
||||||
help_text=_("See http://freeradius.org/rfc/attributes.html"),
|
help_text=_("See https://freeradius.org/rfc/attributes.html."),
|
||||||
)
|
)
|
||||||
value = models.CharField(max_length=255, verbose_name=_("Value"))
|
value = models.CharField(max_length=255, verbose_name=_("value"))
|
||||||
comment = models.TextField(
|
comment = models.TextField(
|
||||||
verbose_name=_("Comment"),
|
verbose_name=_("comment"),
|
||||||
help_text=_("Use this field to document this attribute."),
|
help_text=_("Use this field to document this attribute."),
|
||||||
blank=True,
|
blank=True,
|
||||||
default="",
|
default="",
|
||||||
|
@ -649,7 +649,7 @@ class RadiusOption(AclMixin, PreferencesModel):
|
||||||
DEFINED = "DEFINED"
|
DEFINED = "DEFINED"
|
||||||
CHOICE_RADIUS = (
|
CHOICE_RADIUS = (
|
||||||
(MACHINE, _("On the IP range's VLAN of the machine")),
|
(MACHINE, _("On the IP range's VLAN of the machine")),
|
||||||
(DEFINED, _("Preset in 'VLAN for machines accepted by RADIUS'")),
|
(DEFINED, _("Preset in \"VLAN for machines accepted by RADIUS\"")),
|
||||||
)
|
)
|
||||||
REJECT = "REJECT"
|
REJECT = "REJECT"
|
||||||
SET_VLAN = "SET_VLAN"
|
SET_VLAN = "SET_VLAN"
|
||||||
|
@ -664,7 +664,7 @@ class RadiusOption(AclMixin, PreferencesModel):
|
||||||
max_length=32,
|
max_length=32,
|
||||||
choices=CHOICE_POLICY,
|
choices=CHOICE_POLICY,
|
||||||
default=REJECT,
|
default=REJECT,
|
||||||
verbose_name=_("Policy for unknown machines"),
|
verbose_name=_("policy for unknown machines"),
|
||||||
)
|
)
|
||||||
unknown_machine_vlan = models.ForeignKey(
|
unknown_machine_vlan = models.ForeignKey(
|
||||||
"machines.Vlan",
|
"machines.Vlan",
|
||||||
|
@ -672,21 +672,21 @@ class RadiusOption(AclMixin, PreferencesModel):
|
||||||
related_name="unknown_machine_vlan",
|
related_name="unknown_machine_vlan",
|
||||||
blank=True,
|
blank=True,
|
||||||
null=True,
|
null=True,
|
||||||
verbose_name=_("Unknown machines VLAN"),
|
verbose_name=_("unknown machines VLAN"),
|
||||||
help_text=_("VLAN for unknown machines if not rejected"),
|
help_text=_("VLAN for unknown machines if not rejected."),
|
||||||
)
|
)
|
||||||
unknown_machine_attributes = models.ManyToManyField(
|
unknown_machine_attributes = models.ManyToManyField(
|
||||||
RadiusAttribute,
|
RadiusAttribute,
|
||||||
related_name="unknown_machine_attribute",
|
related_name="unknown_machine_attribute",
|
||||||
blank=True,
|
blank=True,
|
||||||
verbose_name=_("Unknown machines attributes."),
|
verbose_name=_("unknown machines attributes"),
|
||||||
help_text=_("Answer attributes for unknown machines."),
|
help_text=_("Answer attributes for unknown machines."),
|
||||||
)
|
)
|
||||||
unknown_port = models.CharField(
|
unknown_port = models.CharField(
|
||||||
max_length=32,
|
max_length=32,
|
||||||
choices=CHOICE_POLICY,
|
choices=CHOICE_POLICY,
|
||||||
default=REJECT,
|
default=REJECT,
|
||||||
verbose_name=_("Policy for unknown ports"),
|
verbose_name=_("policy for unknown ports"),
|
||||||
)
|
)
|
||||||
unknown_port_vlan = models.ForeignKey(
|
unknown_port_vlan = models.ForeignKey(
|
||||||
"machines.Vlan",
|
"machines.Vlan",
|
||||||
|
@ -694,14 +694,14 @@ class RadiusOption(AclMixin, PreferencesModel):
|
||||||
related_name="unknown_port_vlan",
|
related_name="unknown_port_vlan",
|
||||||
blank=True,
|
blank=True,
|
||||||
null=True,
|
null=True,
|
||||||
verbose_name=_("Unknown ports VLAN"),
|
verbose_name=_("unknown ports VLAN"),
|
||||||
help_text=_("VLAN for unknown ports if not rejected"),
|
help_text=_("VLAN for unknown ports if not rejected."),
|
||||||
)
|
)
|
||||||
unknown_port_attributes = models.ManyToManyField(
|
unknown_port_attributes = models.ManyToManyField(
|
||||||
RadiusAttribute,
|
RadiusAttribute,
|
||||||
related_name="unknown_port_attribute",
|
related_name="unknown_port_attribute",
|
||||||
blank=True,
|
blank=True,
|
||||||
verbose_name=_("Unknown ports attributes."),
|
verbose_name=_("unknown ports attributes"),
|
||||||
help_text=_("Answer attributes for unknown ports."),
|
help_text=_("Answer attributes for unknown ports."),
|
||||||
)
|
)
|
||||||
unknown_room = models.CharField(
|
unknown_room = models.CharField(
|
||||||
|
@ -719,21 +719,21 @@ class RadiusOption(AclMixin, PreferencesModel):
|
||||||
on_delete=models.PROTECT,
|
on_delete=models.PROTECT,
|
||||||
blank=True,
|
blank=True,
|
||||||
null=True,
|
null=True,
|
||||||
verbose_name=_("Unknown rooms VLAN"),
|
verbose_name=_("unknown rooms VLAN"),
|
||||||
help_text=_("VLAN for unknown rooms if not rejected"),
|
help_text=_("VLAN for unknown rooms if not rejected."),
|
||||||
)
|
)
|
||||||
unknown_room_attributes = models.ManyToManyField(
|
unknown_room_attributes = models.ManyToManyField(
|
||||||
RadiusAttribute,
|
RadiusAttribute,
|
||||||
related_name="unknown_room_attribute",
|
related_name="unknown_room_attribute",
|
||||||
blank=True,
|
blank=True,
|
||||||
verbose_name=_("Unknown rooms attributes."),
|
verbose_name=_("unknown rooms attributes"),
|
||||||
help_text=_("Answer attributes for unknown rooms."),
|
help_text=_("Answer attributes for unknown rooms."),
|
||||||
)
|
)
|
||||||
non_member = models.CharField(
|
non_member = models.CharField(
|
||||||
max_length=32,
|
max_length=32,
|
||||||
choices=CHOICE_POLICY,
|
choices=CHOICE_POLICY,
|
||||||
default=REJECT,
|
default=REJECT,
|
||||||
verbose_name=_("Policy for non members"),
|
verbose_name=_("policy for non members"),
|
||||||
)
|
)
|
||||||
non_member_vlan = models.ForeignKey(
|
non_member_vlan = models.ForeignKey(
|
||||||
"machines.Vlan",
|
"machines.Vlan",
|
||||||
|
@ -741,21 +741,21 @@ class RadiusOption(AclMixin, PreferencesModel):
|
||||||
on_delete=models.PROTECT,
|
on_delete=models.PROTECT,
|
||||||
blank=True,
|
blank=True,
|
||||||
null=True,
|
null=True,
|
||||||
verbose_name=_("Non members VLAN"),
|
verbose_name=_("non members VLAN"),
|
||||||
help_text=_("VLAN for non members if not rejected"),
|
help_text=_("VLAN for non members if not rejected."),
|
||||||
)
|
)
|
||||||
non_member_attributes = models.ManyToManyField(
|
non_member_attributes = models.ManyToManyField(
|
||||||
RadiusAttribute,
|
RadiusAttribute,
|
||||||
related_name="non_member_attribute",
|
related_name="non_member_attribute",
|
||||||
blank=True,
|
blank=True,
|
||||||
verbose_name=_("Non member attributes."),
|
verbose_name=_("non members attributes"),
|
||||||
help_text=_("Answer attributes for non members."),
|
help_text=_("Answer attributes for non members."),
|
||||||
)
|
)
|
||||||
banned = models.CharField(
|
banned = models.CharField(
|
||||||
max_length=32,
|
max_length=32,
|
||||||
choices=CHOICE_POLICY,
|
choices=CHOICE_POLICY,
|
||||||
default=REJECT,
|
default=REJECT,
|
||||||
verbose_name=_("Policy for banned users"),
|
verbose_name=_("policy for banned users"),
|
||||||
)
|
)
|
||||||
banned_vlan = models.ForeignKey(
|
banned_vlan = models.ForeignKey(
|
||||||
"machines.Vlan",
|
"machines.Vlan",
|
||||||
|
@ -763,14 +763,14 @@ class RadiusOption(AclMixin, PreferencesModel):
|
||||||
on_delete=models.PROTECT,
|
on_delete=models.PROTECT,
|
||||||
blank=True,
|
blank=True,
|
||||||
null=True,
|
null=True,
|
||||||
verbose_name=_("Banned users VLAN"),
|
verbose_name=_("banned users VLAN"),
|
||||||
help_text=_("VLAN for banned users if not rejected"),
|
help_text=_("VLAN for banned users if not rejected."),
|
||||||
)
|
)
|
||||||
banned_attributes = models.ManyToManyField(
|
banned_attributes = models.ManyToManyField(
|
||||||
RadiusAttribute,
|
RadiusAttribute,
|
||||||
related_name="banned_attribute",
|
related_name="banned_attribute",
|
||||||
blank=True,
|
blank=True,
|
||||||
verbose_name=_("Banned attributes."),
|
verbose_name=_("banned users attributes"),
|
||||||
help_text=_("Answer attributes for banned users."),
|
help_text=_("Answer attributes for banned users."),
|
||||||
)
|
)
|
||||||
vlan_decision_ok = models.OneToOneField(
|
vlan_decision_ok = models.OneToOneField(
|
||||||
|
@ -784,7 +784,7 @@ class RadiusOption(AclMixin, PreferencesModel):
|
||||||
RadiusAttribute,
|
RadiusAttribute,
|
||||||
related_name="ok_attribute",
|
related_name="ok_attribute",
|
||||||
blank=True,
|
blank=True,
|
||||||
verbose_name=_("Accepted users attributes."),
|
verbose_name=_("accepted users attributes"),
|
||||||
help_text=_("Answer attributes for accepted users."),
|
help_text=_("Answer attributes for accepted users."),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -812,26 +812,27 @@ def default_voucher():
|
||||||
|
|
||||||
class CotisationsOption(AclMixin, PreferencesModel):
|
class CotisationsOption(AclMixin, PreferencesModel):
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = _("cotisations options")
|
verbose_name = _("subscription preferences")
|
||||||
|
|
||||||
invoice_template = models.OneToOneField(
|
invoice_template = models.OneToOneField(
|
||||||
"preferences.DocumentTemplate",
|
"preferences.DocumentTemplate",
|
||||||
verbose_name=_("Template for invoices"),
|
verbose_name=_("template for invoices"),
|
||||||
related_name="invoice_template",
|
related_name="invoice_template",
|
||||||
on_delete=models.PROTECT,
|
on_delete=models.PROTECT,
|
||||||
default=default_invoice,
|
default=default_invoice,
|
||||||
)
|
)
|
||||||
voucher_template = models.OneToOneField(
|
voucher_template = models.OneToOneField(
|
||||||
"preferences.DocumentTemplate",
|
"preferences.DocumentTemplate",
|
||||||
verbose_name=_("Template for subscription voucher"),
|
verbose_name=_("template for subscription vouchers"),
|
||||||
related_name="voucher_template",
|
related_name="voucher_template",
|
||||||
on_delete=models.PROTECT,
|
on_delete=models.PROTECT,
|
||||||
default=default_voucher,
|
default=default_voucher,
|
||||||
)
|
)
|
||||||
send_voucher_mail = models.BooleanField(
|
send_voucher_mail = models.BooleanField(
|
||||||
verbose_name=_("Send voucher by email when the invoice is controlled."),
|
verbose_name=_("send voucher by email when the invoice is controlled"),
|
||||||
help_text=_(
|
help_text=_(
|
||||||
"Be carefull, if no mandate is defined on the preferences page, errors will be triggered when generating vouchers."
|
"Be careful, if no mandate is defined on the preferences page,"
|
||||||
|
" errors will be triggered when generating vouchers."
|
||||||
),
|
),
|
||||||
default=False,
|
default=False,
|
||||||
)
|
)
|
||||||
|
|
|
@ -35,7 +35,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
{% for mandate in mandate_list %}
|
{% for mandate in mandate_list %}
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{mandate.start_date|date:"d/m/Y"}}</td>
|
<td>{{mandate.start_date|date:"d/m/Y"}}</td>
|
||||||
<td>{% if mandate.end_date %}{{mandate.end_date|date:"d/m/Y"}}{% else %}{% trans "In progress." %}{% endif %}</td>
|
<td>{% if mandate.end_date %}{{mandate.end_date|date:"d/m/Y"}}{% else %}{% trans "In progress" %}{% endif %}</td>
|
||||||
<td><a href="{% url 'users:profil' userid=mandate.president.id %}">{{mandate.president.name}} {{mandate.president.surname}}</a></td>
|
<td><a href="{% url 'users:profil' userid=mandate.president.id %}">{{mandate.president.name}} {{mandate.president.surname}}</a></td>
|
||||||
<td class="text-right">
|
<td class="text-right">
|
||||||
{% can_edit mandate%}
|
{% can_edit mandate%}
|
||||||
|
|
|
@ -31,7 +31,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<th>{% trans "RADIUS key ID" %}</th>
|
<th>{% trans "RADIUS key ID" %}</th>
|
||||||
<th>{% trans "Comment" %}</th>
|
<th>{% trans "Comment" %}</th>
|
||||||
<th>{% trans "Default RADIUS key for switches" %}</th>
|
<th>{% trans "Default RADIUS key for switches" %}</th>
|
||||||
<th>{% trans "RADIUS key used by the swithes" %}</th>
|
<th>{% trans "Switches using the RADIUS key" %}</th>
|
||||||
<th></th>
|
<th></th>
|
||||||
<th></th>
|
<th></th>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
|
@ -27,7 +27,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<tr>
|
<tr>
|
||||||
<th>{% trans "General policy for VLAN setting" %}</th>
|
<th>{% trans "General policy for VLAN setting" %}</th>
|
||||||
<td>{{ radiusoptions.radius_general_policy }}</td>
|
<td>{{ radiusoptions.radius_general_policy }}</td>
|
||||||
<td>{% 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'" %}</td>
|
<td>{% blocktrans %}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".{% endblocktrans %}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th>{% trans "VLAN for machines accepted by RADIUS" %}</th>
|
<th>{% trans "VLAN for machines accepted by RADIUS" %}</th>
|
||||||
|
|
|
@ -42,7 +42,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<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 %}
|
||||||
{% can_delete service %}
|
{% can_delete service %}
|
||||||
|
|
|
@ -30,7 +30,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<tr>
|
<tr>
|
||||||
<th>{% trans "Switch login" %}</th>
|
<th>{% trans "Switch login" %}</th>
|
||||||
<th>{% trans "Default switch management credentials" %}</th>
|
<th>{% trans "Default switch management credentials" %}</th>
|
||||||
<th>{% trans "Management credentials used by the switches" %}</th>
|
<th>{% trans "Switches using the management credentials" %}</th>
|
||||||
<th></th>
|
<th></th>
|
||||||
<th></th>
|
<th></th>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
|
@ -125,7 +125,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<tr>
|
<tr>
|
||||||
<th>{% trans "All users are active by default" %}</th>
|
<th>{% trans "All users are active by default" %}</th>
|
||||||
<td>{{ useroptions.all_users_active|tick }}</td>
|
<td>{{ useroptions.all_users_active|tick }}</td>
|
||||||
<th>{% trans "Allow archived users to log-in" %}</th>
|
<th>{% trans "Allow archived users to log in" %}</th>
|
||||||
<td>{{ useroptions.allow_archived_connexion|tick }}</td>
|
<td>{{ useroptions.allow_archived_connexion|tick }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
@ -156,7 +156,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<div class="panel panel-default" id="machines">
|
<div class="panel panel-default" id="machines">
|
||||||
<div class="panel-heading" data-toggle="collapse" href="#collapse_machines">
|
<div class="panel-heading" data-toggle="collapse" href="#collapse_machines">
|
||||||
<h4 class ="panel-title">
|
<h4 class ="panel-title">
|
||||||
<a><i class="fa fa-desktop"></i> {% trans "Machines preferences" %}</a>
|
<a><i class="fa fa-desktop"></i> {% trans "Machine preferences" %}</a>
|
||||||
</h4>
|
</h4>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -177,7 +177,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<tr>
|
<tr>
|
||||||
<th>{% trans "Maximum number of DNS aliases allowed for a standard user" %}</th>
|
<th>{% trans "Maximum number of DNS aliases allowed for a standard user" %}</th>
|
||||||
<td>{{ machineoptions.max_lambdauser_aliases }}</td>
|
<td>{{ machineoptions.max_lambdauser_aliases }}</td>
|
||||||
<th>{% trans "Default Time To Live (TTL) for CNAME, A and AAA records." %}</th>
|
<th>{% trans "Default Time To Live (TTL) for CNAME, A and AAAA records." %}</th>
|
||||||
<td>{{ machineoptions.default_dns_ttl }}</td>
|
<td>{{ machineoptions.default_dns_ttl }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
|
@ -200,7 +200,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
|
||||||
<h4>{% trans "RADIUS keys" %}</h4>
|
<h4>{% trans "RADIUS keys" %}</h4>
|
||||||
{% can_create RadiusKey%}
|
{% can_create RadiusKey%}
|
||||||
<a class="btn btn-primary btn-sm" role="button" href="{% url 'preferences:add-radiuskey' %}"><i class="fa fa-plus"></i>{% trans " Add a RADIUS key" %}</a>
|
<a class="btn btn-primary btn-sm" role="button" href="{% url 'preferences:add-radiuskey' %}"><i class="fa fa-plus"></i>{% trans "Add a RADIUS key" %}</a>
|
||||||
{% acl_end %}
|
{% acl_end %}
|
||||||
{% include 'preferences/aff_radiuskey.html' with radiuskey_list=radiuskey_list %}
|
{% include 'preferences/aff_radiuskey.html' with radiuskey_list=radiuskey_list %}
|
||||||
|
|
||||||
|
@ -262,7 +262,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
|
||||||
<h6>{% trans "Switch management credentials" %}</h6>
|
<h6>{% trans "Switch management credentials" %}</h6>
|
||||||
{% can_create SwitchManagementCred%}
|
{% can_create SwitchManagementCred%}
|
||||||
<a class="btn btn-primary btn-sm" role="button" href="{% url 'preferences:add-switchmanagementcred' %}"><i class="fa fa-plus"></i>{% trans " Add switch management credentials" %}</a>
|
<a class="btn btn-primary btn-sm" role="button" href="{% url 'preferences:add-switchmanagementcred' %}"><i class="fa fa-plus"></i>{% trans "Add switch management credentials" %}</a>
|
||||||
{% acl_end %}
|
{% acl_end %}
|
||||||
<p>
|
<p>
|
||||||
</p>
|
</p>
|
||||||
|
@ -282,8 +282,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
{% trans "Edit" %}
|
{% trans "Edit" %}
|
||||||
</a>
|
</a>
|
||||||
{% include 'preferences/aff_radiusoptions.html' %}
|
{% include 'preferences/aff_radiusoptions.html' %}
|
||||||
<h5>{% trans "Available RADIUS attributes"%}</h5>
|
<h5>{% trans "Current RADIUS attributes"%}</h5>
|
||||||
<a class="btn btn-primary btn-sm" role="button" href="{% url 'preferences:add-radiusattribute' %}"><i class="fa fa-plus"></i>{% trans " Add an attribute" %}</a>
|
<a class="btn btn-primary btn-sm" role="button" href="{% url 'preferences:add-radiusattribute' %}"><i class="fa fa-plus"></i>{% trans "Add an attribute" %}</a>
|
||||||
{% include 'preferences/aff_radiusattributes.html' %}
|
{% include 'preferences/aff_radiusattributes.html' %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -346,7 +346,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<div id="collapse_templates" class="panel-collapse panel-body collapse">
|
<div id="collapse_templates" class="panel-collapse panel-body collapse">
|
||||||
{% can_create DocumentTemplate %}
|
{% can_create DocumentTemplate %}
|
||||||
<a class="btn btn-primary btn-sm" role="button" href="{% url 'preferences:add-document-template' %}">
|
<a class="btn btn-primary btn-sm" role="button" href="{% url 'preferences:add-document-template' %}">
|
||||||
<i class="fa fa-cart-plus"></i> {% trans "Add a document template" %}
|
<i class="fa fa-plus"></i> {% trans "Add a document template" %}
|
||||||
</a>
|
</a>
|
||||||
{% acl_end %}
|
{% acl_end %}
|
||||||
<a class="btn btn-danger btn-sm" role="button" href="{% url 'preferences:del-document-template' %}">
|
<a class="btn btn-danger btn-sm" role="button" href="{% url 'preferences:del-document-template' %}">
|
||||||
|
@ -359,7 +359,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<div class="panel panel-default" id="cotisation">
|
<div class="panel panel-default" id="cotisation">
|
||||||
<div class="panel-heading" data-toggle="collapse" href="#collapse_cotisation">
|
<div class="panel-heading" data-toggle="collapse" href="#collapse_cotisation">
|
||||||
<h4 class="panel-title">
|
<h4 class="panel-title">
|
||||||
<a><i class="fa fa-eur"></i> {% trans "Cotisation's options" %}</a>
|
<a><i class="fa fa-eur"></i> {% trans "Subscription preferences" %}</a>
|
||||||
</h4>
|
</h4>
|
||||||
</div>
|
</div>
|
||||||
<div id="collapse_cotisation" class="panel-collapse panel-body collapse">
|
<div id="collapse_cotisation" class="panel-collapse panel-body collapse">
|
||||||
|
@ -414,13 +414,13 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<div class="panel panel-default" id="rappels">
|
<div class="panel panel-default" id="rappels">
|
||||||
<div class="panel-heading" data-toggle="collapse" href="#collapse_rappels">
|
<div class="panel-heading" data-toggle="collapse" href="#collapse_rappels">
|
||||||
<h4 class="panel-title">
|
<h4 class="panel-title">
|
||||||
<a><i class="fa fa-bell"></i> {% trans "Options for the membership's end email" %}</a>
|
<a><i class="fa fa-bell"></i> {% trans "Preferences for the membership's end email" %}</a>
|
||||||
</h4>
|
</h4>
|
||||||
</div>
|
</div>
|
||||||
<div id="collapse_rappels" class="panel-collapse panel-body collapse">
|
<div id="collapse_rappels" class="panel-collapse panel-body collapse">
|
||||||
{% can_create preferences.Reminder%}
|
{% can_create preferences.Reminder%}
|
||||||
|
|
||||||
<a class="btn btn-primary btn-sm" role="button" href="{% url 'preferences:add-reminder' %}"><i class="fa fa-plus"></i>{% trans " Add a reminder" %}</a>
|
<a class="btn btn-primary btn-sm" role="button" href="{% url 'preferences:add-reminder' %}"><i class="fa fa-plus"></i>{% trans "Add a reminder" %}</a>
|
||||||
<p></p>
|
<p></p>
|
||||||
{% acl_end %}
|
{% acl_end %}
|
||||||
{% include 'preferences/aff_reminder.html' with reminder_list=reminder_list %}
|
{% include 'preferences/aff_reminder.html' with reminder_list=reminder_list %}
|
||||||
|
@ -437,7 +437,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<div id="collapse_services" class="panel-collapse panel-body collapse">
|
<div id="collapse_services" class="panel-collapse panel-body collapse">
|
||||||
{% can_create preferences.Service%}
|
{% 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>
|
<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>
|
||||||
<p></p>
|
<p></p>
|
||||||
{% acl_end %}
|
{% acl_end %}
|
||||||
{% include 'preferences/aff_service.html' with service_list=service_list %}
|
{% include 'preferences/aff_service.html' with service_list=service_list %}
|
||||||
|
@ -454,9 +454,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<div id="collapse_contact" class="panel-collapse panel-body collapse">
|
<div id="collapse_contact" class="panel-collapse panel-body collapse">
|
||||||
|
|
||||||
{% can_create preferences.MailContact %}
|
{% can_create preferences.MailContact %}
|
||||||
<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>
|
<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>
|
||||||
{% acl_end %}
|
{% 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-danger btn-sm" role="button" href="{% url 'preferences:del-mailcontact' %}"><i class="fa fa-trash"></i>{% trans "Delete one or several addresses" %}</a>
|
||||||
<p></p>
|
<p></p>
|
||||||
{% include 'preferences/aff_mailcontact.html' with mailcontact_list=mailcontact_list %}
|
{% include 'preferences/aff_mailcontact.html' with mailcontact_list=mailcontact_list %}
|
||||||
</div>
|
</div>
|
||||||
|
@ -465,7 +465,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<div class="panel panel-default" id="social">
|
<div class="panel panel-default" id="social">
|
||||||
<div class="panel-heading" data-toggle="collapse" href="#collapse_social">
|
<div class="panel-heading" data-toggle="collapse" href="#collapse_social">
|
||||||
<h4 class="panel-title">
|
<h4 class="panel-title">
|
||||||
<i class="fa fa-twitter"></i> {% trans "Social networks" %}</a>
|
<a><i class="fa fa-twitter"></i> {% trans "Social networks" %}</a>
|
||||||
</h4>
|
</h4>
|
||||||
</div>
|
</div>
|
||||||
<div id="collapse_social" class="panel-collapse panel-body collapse">
|
<div id="collapse_social" class="panel-collapse panel-body collapse">
|
||||||
|
|
|
@ -191,7 +191,7 @@ def add_service(request):
|
||||||
messages.success(request, _("The service was added."))
|
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": _("Add a service")},
|
{"preferenceform": service, "action_name": _("Add")},
|
||||||
"preferences/preferences.html",
|
"preferences/preferences.html",
|
||||||
request,
|
request,
|
||||||
)
|
)
|
||||||
|
@ -224,7 +224,7 @@ def del_service(request, service_instance, **_kwargs):
|
||||||
messages.success(request, _("The service was deleted."))
|
messages.success(request, _("The service was deleted."))
|
||||||
return redirect(reverse("preferences:display-options"))
|
return redirect(reverse("preferences:display-options"))
|
||||||
return form(
|
return form(
|
||||||
{"objet": service_instance, "objet_name": "service"},
|
{"objet": service_instance, "objet_name": _("service")},
|
||||||
"preferences/delete.html",
|
"preferences/delete.html",
|
||||||
request,
|
request,
|
||||||
)
|
)
|
||||||
|
@ -240,7 +240,7 @@ def add_reminder(request):
|
||||||
messages.success(request, _("The reminder was added."))
|
messages.success(request, _("The reminder was added."))
|
||||||
return redirect(reverse("preferences:display-options"))
|
return redirect(reverse("preferences:display-options"))
|
||||||
return form(
|
return form(
|
||||||
{"preferenceform": reminder, "action_name": _("Add a reminder")},
|
{"preferenceform": reminder, "action_name": _("Add")},
|
||||||
"preferences/preferences.html",
|
"preferences/preferences.html",
|
||||||
request,
|
request,
|
||||||
)
|
)
|
||||||
|
@ -273,7 +273,7 @@ def del_reminder(request, reminder_instance, **_kwargs):
|
||||||
messages.success(request, _("The reminder was deleted."))
|
messages.success(request, _("The reminder was deleted."))
|
||||||
return redirect(reverse("preferences:display-options"))
|
return redirect(reverse("preferences:display-options"))
|
||||||
return form(
|
return form(
|
||||||
{"objet": reminder_instance, "objet_name": "reminder"},
|
{"objet": reminder_instance, "objet_name": _("reminder")},
|
||||||
"preferences/delete.html",
|
"preferences/delete.html",
|
||||||
request,
|
request,
|
||||||
)
|
)
|
||||||
|
@ -289,7 +289,7 @@ def add_radiuskey(request):
|
||||||
messages.success(request, _("The RADIUS key was added."))
|
messages.success(request, _("The RADIUS key was added."))
|
||||||
return redirect(reverse("preferences:display-options"))
|
return redirect(reverse("preferences:display-options"))
|
||||||
return form(
|
return form(
|
||||||
{"preferenceform": radiuskey, "action_name": _("Add a RADIUS key")},
|
{"preferenceform": radiuskey, "action_name": _("Add")},
|
||||||
"preferences/preferences.html",
|
"preferences/preferences.html",
|
||||||
request,
|
request,
|
||||||
)
|
)
|
||||||
|
@ -328,7 +328,7 @@ def del_radiuskey(request, radiuskey_instance, **_kwargs):
|
||||||
)
|
)
|
||||||
return redirect(reverse("preferences:display-options"))
|
return redirect(reverse("preferences:display-options"))
|
||||||
return form(
|
return form(
|
||||||
{"objet": radiuskey_instance, "objet_name": "radiuskey"},
|
{"objet": radiuskey_instance, "objet_name": _("RADIUS key")},
|
||||||
"preferences/delete.html",
|
"preferences/delete.html",
|
||||||
request,
|
request,
|
||||||
)
|
)
|
||||||
|
@ -346,7 +346,7 @@ def add_switchmanagementcred(request):
|
||||||
return form(
|
return form(
|
||||||
{
|
{
|
||||||
"preferenceform": switchmanagementcred,
|
"preferenceform": switchmanagementcred,
|
||||||
"action_name": _("Add switch management credentials"),
|
"action_name": _("Add"),
|
||||||
},
|
},
|
||||||
"preferences/preferences.html",
|
"preferences/preferences.html",
|
||||||
request,
|
request,
|
||||||
|
@ -391,7 +391,7 @@ def del_switchmanagementcred(request, switchmanagementcred_instance, **_kwargs):
|
||||||
)
|
)
|
||||||
return redirect(reverse("preferences:display-options"))
|
return redirect(reverse("preferences:display-options"))
|
||||||
return form(
|
return form(
|
||||||
{"objet": switchmanagementcred_instance, "objet_name": "switchmanagementcred"},
|
{"objet": switchmanagementcred_instance, "objet_name": _("switch management credentials")},
|
||||||
"preferences/delete.html",
|
"preferences/delete.html",
|
||||||
request,
|
request,
|
||||||
)
|
)
|
||||||
|
@ -409,7 +409,7 @@ def add_mailcontact(request):
|
||||||
return form(
|
return form(
|
||||||
{
|
{
|
||||||
"preferenceform": mailcontact,
|
"preferenceform": mailcontact,
|
||||||
"action_name": _("Add a contact email address"),
|
"action_name": _("Add"),
|
||||||
},
|
},
|
||||||
"preferences/preferences.html",
|
"preferences/preferences.html",
|
||||||
request,
|
request,
|
||||||
|
@ -524,8 +524,8 @@ def del_document_template(request, instances):
|
||||||
messages.error(
|
messages.error(
|
||||||
request,
|
request,
|
||||||
_(
|
_(
|
||||||
"The document template %(document_template)s can't be deleted \
|
"The document template %(document_template)s can't be"
|
||||||
because it is currently being used."
|
" deleted because it is currently being used."
|
||||||
)
|
)
|
||||||
% {"document_template": document_template},
|
% {"document_template": document_template},
|
||||||
)
|
)
|
||||||
|
@ -551,7 +551,7 @@ def add_radiusattribute(request):
|
||||||
messages.success(request, _("The attribute was added."))
|
messages.success(request, _("The attribute was added."))
|
||||||
return redirect(reverse("preferences:display-options"))
|
return redirect(reverse("preferences:display-options"))
|
||||||
return form(
|
return form(
|
||||||
{"preferenceform": attribute, "action_name": _("Add a RADIUS attribute")},
|
{"preferenceform": attribute, "action_name": _("Add")},
|
||||||
"preferences/preferences.html",
|
"preferences/preferences.html",
|
||||||
request,
|
request,
|
||||||
)
|
)
|
||||||
|
@ -584,7 +584,7 @@ def del_radiusattribute(request, radiusattribute_instance, **_kwargs):
|
||||||
messages.success(request, _("The attribute was deleted."))
|
messages.success(request, _("The attribute was deleted."))
|
||||||
return redirect(reverse("preferences:display-options"))
|
return redirect(reverse("preferences:display-options"))
|
||||||
return form(
|
return form(
|
||||||
{"objet": radiusattribute_instance, "objet_name": "attribute"},
|
{"objet": radiusattribute_instance, "objet_name": _("attribute")},
|
||||||
"preferences/delete.html",
|
"preferences/delete.html",
|
||||||
request,
|
request,
|
||||||
)
|
)
|
||||||
|
@ -600,7 +600,7 @@ def add_mandate(request):
|
||||||
messages.success(request, _("The mandate was added."))
|
messages.success(request, _("The mandate was added."))
|
||||||
return redirect(reverse("preferences:display-options"))
|
return redirect(reverse("preferences:display-options"))
|
||||||
return form(
|
return form(
|
||||||
{"preferenceform": mandate, "action_name": _("Add a mandate")},
|
{"preferenceform": mandate, "action_name": _("Add")},
|
||||||
"preferences/preferences.html",
|
"preferences/preferences.html",
|
||||||
request,
|
request,
|
||||||
)
|
)
|
||||||
|
@ -631,7 +631,7 @@ def del_mandate(request, mandate_instance, **_kwargs):
|
||||||
messages.success(request, _("The mandate was deleted."))
|
messages.success(request, _("The mandate was deleted."))
|
||||||
return redirect(reverse("preferences:display-options"))
|
return redirect(reverse("preferences:display-options"))
|
||||||
return form(
|
return form(
|
||||||
{"objet": mandate_instance, "objet_name": "attribute"},
|
{"objet": mandate_instance, "objet_name": _("mandate")},
|
||||||
"preferences/delete.html",
|
"preferences/delete.html",
|
||||||
request,
|
request,
|
||||||
)
|
)
|
||||||
|
|
|
@ -44,14 +44,14 @@ def acl_error_message(msg, permissions):
|
||||||
if permissions is None:
|
if permissions is None:
|
||||||
return msg
|
return msg
|
||||||
groups = ", ".join([g.name for g in get_group_having_permission(*permissions)])
|
groups = ", ".join([g.name for g in get_group_having_permission(*permissions)])
|
||||||
message = msg or _("You don't have the right to edit" " this option.")
|
message = msg or _("You don't have the right to edit this option.")
|
||||||
if groups:
|
if groups:
|
||||||
return (
|
return (
|
||||||
message
|
message
|
||||||
+ _(" You need to be a member of one of those" " groups : %s") % groups
|
+ _("You need to be a member of one of these groups: %s.") % groups
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
return message + " No group have the %s permission(s) !" % " or ".join(
|
return message + _("No group has the %s permission(s)!") % " or ".join(
|
||||||
[",".join(permissions[:-1]), permissions[-1]]
|
[",".join(permissions[:-1]), permissions[-1]]
|
||||||
if len(permissions) > 2
|
if len(permissions) > 2
|
||||||
else permissions
|
else permissions
|
||||||
|
@ -190,7 +190,7 @@ ModelC)
|
||||||
for msg in error_messages:
|
for msg in error_messages:
|
||||||
messages.error(
|
messages.error(
|
||||||
request,
|
request,
|
||||||
msg or _("You don't have the right to access" " this menu."),
|
msg or _("You don't have the right to access this menu."),
|
||||||
)
|
)
|
||||||
if request.user.id is not None:
|
if request.user.id is not None:
|
||||||
return redirect(
|
return redirect(
|
||||||
|
|
|
@ -96,9 +96,9 @@ def convert_datetime_format(format):
|
||||||
def get_input_formats_help_text(input_formats):
|
def get_input_formats_help_text(input_formats):
|
||||||
"""Returns a help text about the possible input formats"""
|
"""Returns a help text about the possible input formats"""
|
||||||
if len(input_formats) > 1:
|
if len(input_formats) > 1:
|
||||||
help_text_template = "Format: {main} {more}"
|
help_text_template = _("Format: {main} {more}")
|
||||||
else:
|
else:
|
||||||
help_text_template = "Format: {main}"
|
help_text_template = _("Format: {main}")
|
||||||
more_text_template = '<i class="fa fa-question-circle" title="{}"></i>'
|
more_text_template = '<i class="fa fa-question-circle" title="{}"></i>'
|
||||||
help_text = help_text_template.format(
|
help_text = help_text_template.format(
|
||||||
main=convert_datetime_format(input_formats[0]),
|
main=convert_datetime_format(input_formats[0]),
|
||||||
|
|
|
@ -21,7 +21,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: 2.5\n"
|
"Project-Id-Version: 2.5\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2019-09-05 19:48+0200\n"
|
"POT-Creation-Date: 2019-11-20 01:24+0100\n"
|
||||||
"PO-Revision-Date: 2018-03-31 16:09+0002\n"
|
"PO-Revision-Date: 2018-03-31 16:09+0002\n"
|
||||||
"Last-Translator: Laouen Fernet <laouen.fernet@supelec.fr>\n"
|
"Last-Translator: Laouen Fernet <laouen.fernet@supelec.fr>\n"
|
||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
|
@ -30,15 +30,29 @@ msgstr ""
|
||||||
"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"
|
||||||
|
|
||||||
#: re2o/acl.py:142
|
#: re2o/acl.py:47
|
||||||
|
msgid "You don't have the right to edit this option."
|
||||||
|
msgstr "Vous n'avez pas le droit de modifier cette option."
|
||||||
|
|
||||||
|
#: re2o/acl.py:51
|
||||||
|
#, python-format
|
||||||
|
msgid "You need to be a member of one of these groups: %s."
|
||||||
|
msgstr "Vous devez être membre de l'un de ces groupes : %s."
|
||||||
|
|
||||||
|
#: re2o/acl.py:54
|
||||||
|
#, python-format
|
||||||
|
msgid "No group has the %s permission(s)!"
|
||||||
|
msgstr "Aucun groupe ne possède la ou les permissions %s !"
|
||||||
|
|
||||||
|
#: re2o/acl.py:167
|
||||||
msgid "Nonexistent entry."
|
msgid "Nonexistent entry."
|
||||||
msgstr "Entrée inexistante."
|
msgstr "Entrée inexistante."
|
||||||
|
|
||||||
#: re2o/acl.py:159 re2o/acl.py:229
|
#: re2o/acl.py:193 re2o/acl.py:264
|
||||||
msgid "You don't have the right to access this menu."
|
msgid "You don't have the right to access this menu."
|
||||||
msgstr "Vous n'avez pas le droit d'accéder à ce menu."
|
msgstr "Vous n'avez pas le droit d'accéder à ce menu."
|
||||||
|
|
||||||
#: re2o/acl.py:279
|
#: re2o/acl.py:314
|
||||||
msgid "You don't have the right to edit the history."
|
msgid "You don't have the right to edit the history."
|
||||||
msgstr "Vous n'avez pas le droit de modifier l'historique."
|
msgstr "Vous n'avez pas le droit de modifier l'historique."
|
||||||
|
|
||||||
|
@ -50,57 +64,94 @@ msgstr "Ce domaine est déjà pris."
|
||||||
msgid "SMTP unreachable."
|
msgid "SMTP unreachable."
|
||||||
msgstr "SMTP injoignable."
|
msgstr "SMTP injoignable."
|
||||||
|
|
||||||
#: re2o/mixins.py:111
|
#: re2o/base.py:99
|
||||||
|
#, python-brace-format
|
||||||
|
msgid "Format: {main} {more}"
|
||||||
|
msgstr "Format : {main} {more}"
|
||||||
|
|
||||||
|
#: re2o/base.py:101
|
||||||
|
#, python-brace-format
|
||||||
|
msgid "Format: {main}"
|
||||||
|
msgstr "Format : {main}"
|
||||||
|
|
||||||
|
#: re2o/mixins.py:113
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "You don't have the right to create a %s object."
|
msgid "You don't have the right to create a %s object."
|
||||||
msgstr "Vous n'avez pas le droit de créer un objet %s."
|
msgstr "Vous n'avez pas le droit de créer un objet %s."
|
||||||
|
|
||||||
#: re2o/mixins.py:125
|
#: re2o/mixins.py:129
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "You don't have the right to edit a %s object."
|
msgid "You don't have the right to edit a %s object."
|
||||||
msgstr "Vous n'avez pas le droit de modifier un objet %s."
|
msgstr "Vous n'avez pas le droit de modifier un objet %s."
|
||||||
|
|
||||||
#: re2o/mixins.py:139
|
#: re2o/mixins.py:145
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "You don't have the right to delete a %s object."
|
msgid "You don't have the right to delete a %s object."
|
||||||
msgstr "Vous n'avez pas le droit de supprimer un objet %s."
|
msgstr "Vous n'avez pas le droit de supprimer un objet %s."
|
||||||
|
|
||||||
#: re2o/mixins.py:153
|
#: re2o/mixins.py:161
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "You don't have the right to view every %s object."
|
msgid "You don't have the right to view every %s object."
|
||||||
msgstr "Vous n'avez pas le droit de voir tous les objets %s."
|
msgstr "Vous n'avez pas le droit de voir tous les objets %s."
|
||||||
|
|
||||||
#: re2o/mixins.py:167
|
#: re2o/mixins.py:177
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "You don't have the right to view a %s object."
|
msgid "You don't have the right to view a %s object."
|
||||||
msgstr "Vous n'avez pas le droit de voir un objet %s."
|
msgstr "Vous n'avez pas le droit de voir un objet %s."
|
||||||
|
|
||||||
#: re2o/settings.py:158
|
#: re2o/settings.py:150
|
||||||
msgid "English"
|
msgid "English"
|
||||||
msgstr "Anglais"
|
msgstr "Anglais"
|
||||||
|
|
||||||
#: re2o/settings.py:159
|
#: re2o/settings.py:150
|
||||||
msgid "French"
|
msgid "French"
|
||||||
msgstr "Français"
|
msgstr "Français"
|
||||||
|
|
||||||
#: re2o/templates/re2o/about.html:29 re2o/templates/re2o/about.html:35
|
#: re2o/templates/re2o/about.html:29 re2o/templates/re2o/about.html:54
|
||||||
msgid "About Re2o"
|
msgid "About Re2o"
|
||||||
msgstr "À propos de Re2o"
|
msgstr "À propos de Re2o"
|
||||||
|
|
||||||
#: re2o/templates/re2o/about.html:32
|
#: re2o/templates/re2o/about.html:32
|
||||||
#, python-format
|
msgid "Legal notes"
|
||||||
msgid "About %(AssoName)s"
|
msgstr "Mentions légales"
|
||||||
msgstr "À propos de %(AssoName)s"
|
|
||||||
|
|
||||||
#: re2o/templates/re2o/about.html:36
|
#: re2o/templates/re2o/about.html:34
|
||||||
|
msgid "Legal entity"
|
||||||
|
msgstr "Entité légale"
|
||||||
|
|
||||||
|
#: re2o/templates/re2o/about.html:37
|
||||||
|
msgid "Registered office"
|
||||||
|
msgstr "Siège enregistré"
|
||||||
|
|
||||||
|
#: re2o/templates/re2o/about.html:41
|
||||||
|
msgid "SIRET: "
|
||||||
|
msgstr "SIRET : "
|
||||||
|
|
||||||
|
#: re2o/templates/re2o/about.html:43
|
||||||
|
msgid "Publication manager"
|
||||||
|
msgstr "Gestionnaire de publication"
|
||||||
|
|
||||||
|
#: re2o/templates/re2o/about.html:44
|
||||||
|
msgid "President of "
|
||||||
|
msgstr "Président de "
|
||||||
|
|
||||||
|
#: re2o/templates/re2o/about.html:46
|
||||||
|
msgid "General Terms of Use"
|
||||||
|
msgstr "Conditions Générales d'Utilisation"
|
||||||
|
|
||||||
|
#: re2o/templates/re2o/about.html:50
|
||||||
|
msgid "Additional information"
|
||||||
|
msgstr "Informations supplémentaires"
|
||||||
|
|
||||||
|
#: re2o/templates/re2o/about.html:55
|
||||||
msgid ""
|
msgid ""
|
||||||
"Re2o is an administration tool initiated by <a href=\"https://rezometz.org/"
|
"Re2o is an administration tool initiated by <a href=\"https://rezometz.org/"
|
||||||
"\">Rezo Metz</a> and a few members of other <a href=\"https://federez.net"
|
"\">Rezo Metz</a> and a few members of other <a href=\"https://federez.net"
|
||||||
"\">FedeRez</a> associations around the summer 2016.<br /> It is intended to "
|
"\">FedeRez</a> associations around the summer 2016.<br /> It is intended to "
|
||||||
"be a tool independant from any network infrastructure so it can be setup in "
|
"be a tool independent from any network infrastructure so it can be setup in "
|
||||||
"\"a few steps\". This tool is entirely free and available under a GNU Public "
|
"\"a few steps\". This tool is entirely free and available under a GNU Public "
|
||||||
"License v2 (GPLv2) license on <a href=\"https://gitlab.federez.net/federez/"
|
"License v2 (GPLv2) license on <a href=\"https://gitlab.federez.net/federez/"
|
||||||
"re2o/\">FedeRez gitlab</a>.<br /> Re2o's mainteners are volunteers mainly "
|
"re2o/\">FedeRez gitlab</a>.<br /> Re2o's maintainers are volunteers mainly "
|
||||||
"from French schools. <br /> If you want to get involved in the development "
|
"from French schools. <br /> If you want to get involved in the development "
|
||||||
"process, we will be glad to welcome you so do not hesitate to contact us and "
|
"process, we will be glad to welcome you so do not hesitate to contact us and "
|
||||||
"come help us build the future of Re2o."
|
"come help us build the future of Re2o."
|
||||||
|
@ -109,7 +160,7 @@ msgstr ""
|
||||||
"\">Rézo Metz</a> et quelques membres d'autres associations de <a href="
|
"\">Rézo Metz</a> et quelques membres d'autres associations de <a href="
|
||||||
"\"https://federez.net\">FedeRez</a> autour de l'été 2016.<br /> Il se veut "
|
"\"https://federez.net\">FedeRez</a> autour de l'été 2016.<br /> Il se veut "
|
||||||
"être un outil indépendant de toute infrastructure réseau pour pouvoir être "
|
"être un outil indépendant de toute infrastructure réseau pour pouvoir être "
|
||||||
"installé en \"quelques étapes\". Cet outil est entièrement gratuit et est "
|
"installé en « quelques étapes ». Cet outil est entièrement gratuit et est "
|
||||||
"disponible sous licence GNU Public Licence v2 (GPLv2) sur le <a href="
|
"disponible sous licence GNU Public Licence v2 (GPLv2) sur le <a href="
|
||||||
"\"https://gitlab.federez.net/federez/re2o/\">gitlab de FedeRez</a>.<br />\n"
|
"\"https://gitlab.federez.net/federez/re2o/\">gitlab de FedeRez</a>.<br />\n"
|
||||||
"Les mainteneurs de Re2o sont de fiers bénévoles venant principalement "
|
"Les mainteneurs de Re2o sont de fiers bénévoles venant principalement "
|
||||||
|
@ -119,35 +170,35 @@ msgstr ""
|
||||||
"développement, nous serons heureux de vous accueillir donc n'hésitez pas à "
|
"développement, nous serons heureux de vous accueillir donc n'hésitez pas à "
|
||||||
"nous contacter et à venir nous aider à construire le futur de Re2o."
|
"nous contacter et à venir nous aider à construire le futur de Re2o."
|
||||||
|
|
||||||
#: re2o/templates/re2o/about.html:55
|
#: re2o/templates/re2o/about.html:74
|
||||||
msgid "Contributors list"
|
msgid "Contributors list"
|
||||||
msgstr "Liste des contributeurs"
|
msgstr "Liste des contributeurs"
|
||||||
|
|
||||||
#: re2o/templates/re2o/about.html:64
|
#: re2o/templates/re2o/about.html:83
|
||||||
msgid "Version information"
|
msgid "Version information"
|
||||||
msgstr "Informations de versions"
|
msgstr "Informations de versions"
|
||||||
|
|
||||||
#: re2o/templates/re2o/about.html:66
|
#: re2o/templates/re2o/about.html:85
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "<b>Remote URL</b>: %(git_info_remote)s"
|
msgid "<b>Remote URL</b>: %(git_info_remote)s"
|
||||||
msgstr "<b>URL distante</b> : %(git_info_remote)s"
|
msgstr "<b>URL distante</b> : %(git_info_remote)s"
|
||||||
|
|
||||||
#: re2o/templates/re2o/about.html:69
|
#: re2o/templates/re2o/about.html:88
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "<b>Branch</b>: %(git_info_branch)s"
|
msgid "<b>Branch</b>: %(git_info_branch)s"
|
||||||
msgstr "<b>Branche</b> : %(git_info_branch)s"
|
msgstr "<b>Branche</b> : %(git_info_branch)s"
|
||||||
|
|
||||||
#: re2o/templates/re2o/about.html:72
|
#: re2o/templates/re2o/about.html:91
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "<b>Commit</b>: %(git_info_commit)s"
|
msgid "<b>Commit</b>: %(git_info_commit)s"
|
||||||
msgstr "<b>Commit</b> : %(git_info_commit)s"
|
msgstr "<b>Commit</b> : %(git_info_commit)s"
|
||||||
|
|
||||||
#: re2o/templates/re2o/about.html:75
|
#: re2o/templates/re2o/about.html:94
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "<b>Commit date</b>: %(git_info_commit_date)s"
|
msgid "<b>Commit date</b>: %(git_info_commit_date)s"
|
||||||
msgstr "<b>Date du commit</b> : %(git_info_commit_date)s"
|
msgstr "<b>Date du commit</b> : %(git_info_commit_date)s"
|
||||||
|
|
||||||
#: re2o/templates/re2o/about.html:80
|
#: re2o/templates/re2o/about.html:99
|
||||||
msgid "Dependencies"
|
msgid "Dependencies"
|
||||||
msgstr "Dépendances"
|
msgstr "Dépendances"
|
||||||
|
|
||||||
|
@ -265,11 +316,9 @@ msgid "Follow @%(twitter_account_name)s"
|
||||||
msgstr "Suivre @%(twitter_account_name)s"
|
msgstr "Suivre @%(twitter_account_name)s"
|
||||||
|
|
||||||
#: re2o/urls.py:57
|
#: re2o/urls.py:57
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Home"
|
|
||||||
msgid "Homepage"
|
msgid "Homepage"
|
||||||
msgstr "Accueil"
|
msgstr "Page d'accueil"
|
||||||
|
|
||||||
#: re2o/views.py:89
|
#: re2o/views.py:96
|
||||||
msgid "Unable to get the information."
|
msgid "Unable to get the information."
|
||||||
msgstr "Impossible d'obtenir l'information."
|
msgstr "Impossible d'obtenir l'information."
|
||||||
|
|
|
@ -80,21 +80,21 @@ def hash_password_salt(hashed_password):
|
||||||
try:
|
try:
|
||||||
digest = b64decode(hashed_password[6:])
|
digest = b64decode(hashed_password[6:])
|
||||||
except TypeError as error:
|
except TypeError as error:
|
||||||
raise ValueError("b64 error for `hashed_password` : %s" % error)
|
raise ValueError("b64 error for `hashed_password`: %s." % error)
|
||||||
if len(digest) < 20:
|
if len(digest) < 20:
|
||||||
raise ValueError("`hashed_password` too short")
|
raise ValueError("`hashed_password` too short.")
|
||||||
return digest[20:]
|
return digest[20:]
|
||||||
elif hashed_password.upper().startswith("{SMD5}"):
|
elif hashed_password.upper().startswith("{SMD5}"):
|
||||||
try:
|
try:
|
||||||
digest = b64decode(hashed_password[7:])
|
digest = b64decode(hashed_password[7:])
|
||||||
except TypeError as error:
|
except TypeError as error:
|
||||||
raise ValueError("b64 error for `hashed_password` : %s" % error)
|
raise ValueError("b64 error for `hashed_password`: %s." % error)
|
||||||
if len(digest) < 16:
|
if len(digest) < 16:
|
||||||
raise ValueError("`hashed_password` too short")
|
raise ValueError("`hashed_password` too short.")
|
||||||
return digest[16:]
|
return digest[16:]
|
||||||
else:
|
else:
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
"`hashed_password` should start with '{SSHA}' or '{CRYPT}' or '{SMD5}'"
|
"`hashed_password` should start with '{SSHA}' or '{CRYPT}' or '{SMD5}'."
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -64,7 +64,7 @@ class Command(BaseCommand):
|
||||||
for item in os.popen("git shortlog -s -n").read().split("\n")
|
for item in os.popen("git shortlog -s -n").read().split("\n")
|
||||||
if "\t" in item
|
if "\t" in item
|
||||||
]
|
]
|
||||||
self.stdout.write(self.style.SUCCESS("Exportation Successful"))
|
self.stdout.write(self.style.SUCCESS("Exportation successful!"))
|
||||||
with open("re2o/contributors.py", "w") as contrib_file:
|
with open("re2o/contributors.py", "w") as contrib_file:
|
||||||
content = self._contrib_file_generator(contributors)
|
content = self._contrib_file_generator(contributors)
|
||||||
contrib_file.write(content)
|
contrib_file.write(content)
|
||||||
|
|
|
@ -61,7 +61,7 @@ class FormRevMixin(object):
|
||||||
)
|
)
|
||||||
elif self.changed_data:
|
elif self.changed_data:
|
||||||
reversion.set_comment(
|
reversion.set_comment(
|
||||||
"Field(s) altered : %s"
|
"Field(s) edited: %s"
|
||||||
% ", ".join(field for field in self.changed_data)
|
% ", ".join(field for field in self.changed_data)
|
||||||
)
|
)
|
||||||
return super(FormRevMixin, self).save(*args, **kwargs)
|
return super(FormRevMixin, self).save(*args, **kwargs)
|
||||||
|
|
|
@ -53,7 +53,7 @@ def get_user(pseudo):
|
||||||
raise CommandError("Invalid user.")
|
raise CommandError("Invalid user.")
|
||||||
if len(user) > 1:
|
if len(user) > 1:
|
||||||
raise CommandError(
|
raise CommandError(
|
||||||
"Several users match this username. This SHOULD" " NOT happen."
|
"Several users match this username. This SHOULD NOT happen."
|
||||||
)
|
)
|
||||||
return user[0]
|
return user[0]
|
||||||
|
|
||||||
|
@ -95,5 +95,5 @@ def form_cli(Form, user, action, *args, **kwargs):
|
||||||
reversion.set_comment(action)
|
reversion.set_comment(action)
|
||||||
|
|
||||||
sys.stdout.write(
|
sys.stdout.write(
|
||||||
"%s : done. The edit may take several minutes to" " apply.\n" % action
|
"%s: done. The edit may take several minutes to apply.\n" % action
|
||||||
)
|
)
|
||||||
|
|
|
@ -38,16 +38,16 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<p>{{ option.adresse1 | safe }}</p>
|
<p>{{ option.adresse1 | safe }}</p>
|
||||||
<p>{{ option.adresse2 | safe }}</p>
|
<p>{{ option.adresse2 | safe }}</p>
|
||||||
|
|
||||||
<p>SIRET : {{ option.siret | safe }}</p>
|
<p>{% trans "SIRET: " %}{{ option.siret | safe }}</p>
|
||||||
|
|
||||||
<h4>{% trans "Publication manager" %}</h4>
|
<h4>{% trans "Publication manager" %}</h4>
|
||||||
<p>{{ president }} - {% trans "President of " %} {{ option.pseudo }}</p>
|
<p>{{ president }} - {% trans "President of " %} {{ option.pseudo }}</p>
|
||||||
|
|
||||||
<h4>{% trans "General conditions of use" %}</h4>
|
<h4>{% trans "General Terms of Use" %}</h4>
|
||||||
<p><a href='{{ gtu.url }}' download='CGU'>{{ gtu }}</a></p>
|
<p><a href='{{ gtu.url }}' download='CGU'>{{ gtu }}</a></p>
|
||||||
|
|
||||||
{% if option.description %}
|
{% if option.description %}
|
||||||
<h4>Extra informations</h4>
|
<h4>{% trans "Additional information" %}</h4>
|
||||||
<p>{{ option.description | safe }}</p>
|
<p>{{ option.description | safe }}</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
@ -57,11 +57,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<a href="https://rezometz.org/">Rezo Metz</a> and a few
|
<a href="https://rezometz.org/">Rezo Metz</a> and a few
|
||||||
members of other <a href="https://federez.net">FedeRez</a> associations
|
members of other <a href="https://federez.net">FedeRez</a> associations
|
||||||
around the summer 2016.<br />
|
around the summer 2016.<br />
|
||||||
It is intended to be a tool independant from any network infrastructure
|
It is intended to be a tool independent from any network infrastructure
|
||||||
so it can be setup in "a few steps". This tool is entirely free and
|
so it can be setup in "a few steps". This tool is entirely free and
|
||||||
available under a GNU Public License v2 (GPLv2) license on
|
available under a GNU Public License v2 (GPLv2) license on
|
||||||
<a href="https://gitlab.federez.net/federez/re2o/">FedeRez gitlab</a>.<br />
|
<a href="https://gitlab.federez.net/federez/re2o/">FedeRez gitlab</a>.<br />
|
||||||
Re2o's mainteners are volunteers mainly from French schools. <br />
|
Re2o's maintainers are volunteers mainly from French schools. <br />
|
||||||
If you want to get involved in the development process, we will be glad to
|
If you want to get involved in the development process, we will be glad to
|
||||||
welcome you so do not hesitate to contact us and come help us build the
|
welcome you so do not hesitate to contact us and come help us build the
|
||||||
future of Re2o.
|
future of Re2o.
|
||||||
|
|
|
@ -88,7 +88,7 @@ def get_model(model_name):
|
||||||
app_label, name = splitted
|
app_label, name = splitted
|
||||||
except ValueError:
|
except ValueError:
|
||||||
raise template.TemplateSyntaxError(
|
raise template.TemplateSyntaxError(
|
||||||
"%r is an inconsistent model name" % model_name
|
"%r is an inconsistent model name." % model_name
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
app_label, name = None, splitted[0]
|
app_label, name = None, splitted[0]
|
||||||
|
@ -101,7 +101,7 @@ def get_model(model_name):
|
||||||
content_type = ContentType.objects.get(model=name.lower())
|
content_type = ContentType.objects.get(model=name.lower())
|
||||||
except ContentType.DoesNotExist:
|
except ContentType.DoesNotExist:
|
||||||
raise template.TemplateSyntaxError(
|
raise template.TemplateSyntaxError(
|
||||||
"%r is not a valid model for an acl tag" % model_name
|
"%r is not a valid model for an acl tag." % model_name
|
||||||
)
|
)
|
||||||
except ContentType.MultipleObjectsReturned:
|
except ContentType.MultipleObjectsReturned:
|
||||||
raise template.TemplateSyntaxError(
|
raise template.TemplateSyntaxError(
|
||||||
|
@ -178,7 +178,7 @@ def get_callback(tag_name, obj=None):
|
||||||
True,
|
True,
|
||||||
)
|
)
|
||||||
|
|
||||||
raise template.TemplateSyntaxError("%r tag is not a valid can_xxx tag" % tag_name)
|
raise template.TemplateSyntaxError("%r tag is not a valid can_xxx tag." % tag_name)
|
||||||
|
|
||||||
|
|
||||||
def acl_fct(callback, reverse):
|
def acl_fct(callback, reverse):
|
||||||
|
@ -264,7 +264,7 @@ def acl_change_filter(parser, token):
|
||||||
args = tag_content[3:]
|
args = tag_content[3:]
|
||||||
except ValueError:
|
except ValueError:
|
||||||
raise template.TemplateSyntaxError(
|
raise template.TemplateSyntaxError(
|
||||||
"%r tag require at least 2 argument: the model and the field"
|
"%r tag require at least 2 argument: the model and the field."
|
||||||
% token.contents.split()[0]
|
% token.contents.split()[0]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -306,7 +306,7 @@ def acl_model_filter(parser, token):
|
||||||
args = tag_content[2:]
|
args = tag_content[2:]
|
||||||
except ValueError:
|
except ValueError:
|
||||||
raise template.TemplateSyntaxError(
|
raise template.TemplateSyntaxError(
|
||||||
"%r tag require at least 1 argument: the model" % token.contents.split()[0]
|
"%r tag require at least 1 argument: the model." % token.contents.split()[0]
|
||||||
)
|
)
|
||||||
|
|
||||||
model = get_model(model_name)
|
model = get_model(model_name)
|
||||||
|
@ -345,7 +345,7 @@ def acl_instance_filter(parser, token):
|
||||||
args = tag_content[2:]
|
args = tag_content[2:]
|
||||||
except ValueError:
|
except ValueError:
|
||||||
raise template.TemplateSyntaxError(
|
raise template.TemplateSyntaxError(
|
||||||
"%r tag require at least 1 argument: the instance"
|
"%r tag require at least 1 argument: the instance."
|
||||||
% token.contents.split()[0]
|
% token.contents.split()[0]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,7 @@ from __future__ import unicode_literals
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.conf.urls import include, url
|
from django.conf.urls import include, url
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from django.views.generic import RedirectView
|
from django.views.generic import RedirectView
|
||||||
|
|
||||||
from .settings_local import OPTIONNAL_APPS_RE2O
|
from .settings_local import OPTIONNAL_APPS_RE2O
|
||||||
|
|
|
@ -34,7 +34,7 @@ CHOICES_USER = (
|
||||||
("1", _("Disabled")),
|
("1", _("Disabled")),
|
||||||
("2", _("Archived")),
|
("2", _("Archived")),
|
||||||
("3", _("Not yet active")),
|
("3", _("Not yet active")),
|
||||||
("4", _("Full archived")),
|
("4", _("Fully archived")),
|
||||||
)
|
)
|
||||||
|
|
||||||
CHOICES_AFF = (
|
CHOICES_AFF = (
|
||||||
|
|
|
@ -21,7 +21,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: 2.5\n"
|
"Project-Id-Version: 2.5\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2019-09-05 19:48+0200\n"
|
"POT-Creation-Date: 2019-11-19 23:43+0100\n"
|
||||||
"PO-Revision-Date: 2018-06-24 20:10+0200\n"
|
"PO-Revision-Date: 2018-06-24 20:10+0200\n"
|
||||||
"Last-Translator: Laouen Fernet <laouen.fernet@supelec.fr>\n"
|
"Last-Translator: Laouen Fernet <laouen.fernet@supelec.fr>\n"
|
||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
|
@ -47,10 +47,8 @@ msgid "Not yet active"
|
||||||
msgstr "Pas encore adhéré"
|
msgstr "Pas encore adhéré"
|
||||||
|
|
||||||
#: search/forms.py:37
|
#: search/forms.py:37
|
||||||
#, fuzzy
|
msgid "Fully archived"
|
||||||
#| msgid "Archived"
|
msgstr "Complètement archivés"
|
||||||
msgid "Full archived"
|
|
||||||
msgstr "Archivés"
|
|
||||||
|
|
||||||
#: search/forms.py:41
|
#: search/forms.py:41
|
||||||
msgid "Users"
|
msgid "Users"
|
||||||
|
@ -84,12 +82,12 @@ msgstr "Ports"
|
||||||
msgid "Switches"
|
msgid "Switches"
|
||||||
msgstr "Commutateurs réseau"
|
msgstr "Commutateurs réseau"
|
||||||
|
|
||||||
#: search/forms.py:61 search/forms.py:73 search/templates/search/search.html:29
|
#: search/forms.py:62 search/forms.py:77 search/templates/search/search.html:29
|
||||||
#: search/templates/search/search.html:48
|
#: search/templates/search/search.html:48
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "Rechercher"
|
msgstr "Rechercher"
|
||||||
|
|
||||||
#: search/forms.py:63 search/forms.py:75
|
#: search/forms.py:65 search/forms.py:80
|
||||||
msgid ""
|
msgid ""
|
||||||
"Use « » and «,» to specify distinct words, «\"query\"» for an exact search "
|
"Use « » and «,» to specify distinct words, «\"query\"» for an exact search "
|
||||||
"and «\\» to escape a character."
|
"and «\\» to escape a character."
|
||||||
|
@ -97,19 +95,19 @@ msgstr ""
|
||||||
"Utilisez « » et «,» pour spécifier différents mots, «\"query\"» pour une "
|
"Utilisez « » et «,» pour spécifier différents mots, «\"query\"» pour une "
|
||||||
"recherche exacte et «\\» pour échapper un caractère."
|
"recherche exacte et «\\» pour échapper un caractère."
|
||||||
|
|
||||||
#: search/forms.py:82
|
#: search/forms.py:88
|
||||||
msgid "Users filter"
|
msgid "Users filter"
|
||||||
msgstr "Filtre utilisateurs"
|
msgstr "Filtre utilisateurs"
|
||||||
|
|
||||||
#: search/forms.py:89
|
#: search/forms.py:95
|
||||||
msgid "Display filter"
|
msgid "Display filter"
|
||||||
msgstr "Filtre affichage"
|
msgstr "Filtre affichage"
|
||||||
|
|
||||||
#: search/forms.py:97
|
#: search/forms.py:101
|
||||||
msgid "Start date"
|
msgid "Start date"
|
||||||
msgstr "Date de début"
|
msgstr "Date de début"
|
||||||
|
|
||||||
#: search/forms.py:101
|
#: search/forms.py:102
|
||||||
msgid "End date"
|
msgid "End date"
|
||||||
msgstr "Date de fin"
|
msgstr "Date de fin"
|
||||||
|
|
||||||
|
@ -159,10 +157,10 @@ msgstr "Pas de résultat"
|
||||||
|
|
||||||
#: search/templates/search/index.html:71
|
#: search/templates/search/index.html:71
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "(Only the first %(max_result)s results are displayed in each category)"
|
msgid "Only the first %(max_result)s results are displayed in each category."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"(Seulement les %(max_result)s premiers résultats sont affichés dans chaque "
|
"Seulement les %(max_result)s premiers résultats sont affichés dans chaque "
|
||||||
"catégorie)"
|
"catégorie."
|
||||||
|
|
||||||
#: search/templates/search/sidebar.html:31
|
#: search/templates/search/sidebar.html:31
|
||||||
msgid "Simple search"
|
msgid "Simple search"
|
||||||
|
|
|
@ -68,7 +68,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
{% if not users and not machines and not factures and not whitelists and not bans and not rooms and not ports and not switches %}
|
{% if not users and not machines and not factures and not whitelists and not bans and not rooms and not ports and not switches %}
|
||||||
<h3>{% trans "No result" %}</h3>
|
<h3>{% trans "No result" %}</h3>
|
||||||
{% else %}
|
{% else %}
|
||||||
<h6>{% blocktrans %}(Only the first {{ max_result }} results are displayed in each category){% endblocktrans %}</h6>
|
<h6>{% blocktrans %}Only the first {{ max_result }} results are displayed in each category.{% endblocktrans %}</h6>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<br />
|
<br />
|
||||||
<br />
|
<br />
|
||||||
|
|
|
@ -14,8 +14,7 @@ Copyright © 2019 Alexandre Iooss
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div id="content-main">
|
<div id="content-main">
|
||||||
<p>
|
<p>
|
||||||
{% blocktrans %}You are on the operator interface. Here you will be able to manage the network and users
|
{% blocktrans %}You are on the operator interface. Here you will be able to manage the network and users from the top left menu. You can also go read the developer documentation.{% endblocktrans %}
|
||||||
from the top left menu. You can also go read the developer documentation.{% endblocktrans %}
|
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
{% blocktrans %}To go back to the main site, click "View site" button in top right menu.{% endblocktrans %}
|
{% blocktrans %}To go back to the main site, click "View site" button in top right menu.{% endblocktrans %}
|
||||||
|
@ -26,12 +25,12 @@ Copyright © 2019 Alexandre Iooss
|
||||||
{% block sidebar %}
|
{% block sidebar %}
|
||||||
<div id="content-related">
|
<div id="content-related">
|
||||||
<div class="module" id="recent-actions-module">
|
<div class="module" id="recent-actions-module">
|
||||||
<h2>{% trans 'My account' %}</h2>
|
<h2>{% trans "My account" %}</h2>
|
||||||
<h3>{% trans 'My recent actions' %}</h3>
|
<h3>{% trans "Recent actions" %}</h3>
|
||||||
{% load log %}
|
{% load log %}
|
||||||
{% get_admin_log 10 as admin_log for_user user %}
|
{% get_admin_log 10 as admin_log for_user user %}
|
||||||
{% if not admin_log %}
|
{% if not admin_log %}
|
||||||
<p>{% trans 'None available' %}</p>
|
<p>{% trans "None available" %}</p>
|
||||||
{% else %}
|
{% else %}
|
||||||
<ul class="actionlist">
|
<ul class="actionlist">
|
||||||
{% for entry in admin_log %}
|
{% for entry in admin_log %}
|
||||||
|
@ -46,7 +45,7 @@ Copyright © 2019 Alexandre Iooss
|
||||||
<span class="mini quiet">{% filter capfirst %}
|
<span class="mini quiet">{% filter capfirst %}
|
||||||
{{ entry.content_type }}{% endfilter %}</span>
|
{{ entry.content_type }}{% endfilter %}</span>
|
||||||
{% else %}
|
{% else %}
|
||||||
<span class="mini quiet">{% trans 'Unknown content' %}</span>
|
<span class="mini quiet">{% trans "Unknown content" %}</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</li>
|
</li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
|
@ -40,7 +40,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<meta property="og:image" content="{% static 'images/logo_re2o.svg' %}"/>
|
<meta property="og:image" content="{% static 'images/logo_re2o.svg' %}"/>
|
||||||
<meta property="og:image:type" content="image/svg"/>
|
<meta property="og:image:type" content="image/svg"/>
|
||||||
<meta property="og:image:alt" content="The Re2o logo"/>
|
<meta property="og:image:alt" content="The Re2o logo"/>
|
||||||
<meta property="og:description" content="{% trans "Networking managing website endorsed by FedeRez." %}" />
|
<meta property="og:description" content="Networking managing website endorsed by FedeRez." />
|
||||||
|
|
||||||
{# Preload JavaScript #}
|
{# Preload JavaScript #}
|
||||||
{% bootstrap_javascript %}
|
{% bootstrap_javascript %}
|
||||||
|
@ -142,7 +142,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<li><a href="{% url 'about' %}"><i class="fa fa-info-circle"></i> {% trans "About" %}</a></li>
|
<li><a href="{% url 'about' %}"><i class="fa fa-info-circle"></i> {% trans "About" %}</a></li>
|
||||||
<li><a href="{% url 'contact' %}"><i class="fa fa-at"></i> {% trans "Contact" %}</a></li>
|
<li><a href="{% url 'contact' %}"><i class="fa fa-at"></i> {% trans "Contact" %}</a></li>
|
||||||
{% comment %}
|
{% comment %}
|
||||||
<li><a href="{% url 'tickets:new-ticket' %}"><i class="fa fa-ticket"></i> {% trans "Ouvrir un ticket" %}</a><li>
|
<li><a href="{% url 'tickets:new-ticket' %}"><i class="fa fa-ticket"></i> {% trans "Open a ticket" %}</a><li>
|
||||||
{% endcomment %}
|
{% endcomment %}
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
@ -284,7 +284,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<p class="pull-right">
|
<p class="pull-right">
|
||||||
<a href="#">{% trans "Back to top" %}</a>
|
<a href="#">{% trans "Back to top" %}</a>
|
||||||
</p>
|
</p>
|
||||||
<p>{{ name_website }} {% trans "powered by" %} Re2o 2016–2018</p>
|
<p>{{ name_website }} {% trans "powered by" %} Re2o 2016–2019</p>
|
||||||
<p>
|
<p>
|
||||||
{% blocktrans trimmed %}
|
{% blocktrans trimmed %}
|
||||||
Brought to you with <i class="fa fa-heart text-danger"></i>.
|
Brought to you with <i class="fa fa-heart text-danger"></i>.
|
||||||
|
|
|
@ -23,7 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
{% endcomment %}
|
{% endcomment %}
|
||||||
|
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
<a {% if class%}class="btn btn-info btn-sm"{% endif %} role="button" title="{% trans 'History' %}" href="{% url 'logs:history' application name id %}">
|
<a {% if class%}class="btn btn-info btn-sm"{% endif %} role="button" title="{% trans "History" %}" href="{% url 'logs:history' application name id %}">
|
||||||
<i class="fa fa-history"></i> {% if text %}{% trans 'History' %}{% endif %}
|
<i class="fa fa-history"></i> {% if text %}{% trans "History" %}{% endif %}
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<meta property="og:image" content="{% static 'images/logo_re2o.svg' %}"/>
|
<meta property="og:image" content="{% static 'images/logo_re2o.svg' %}"/>
|
||||||
<meta property="og:image:type" content="image/svg"/>
|
<meta property="og:image:type" content="image/svg"/>
|
||||||
<meta property="og:image:alt" content="The Re2o logo"/>
|
<meta property="og:image:alt" content="The Re2o logo"/>
|
||||||
<meta property="og:description" content="{% trans "Networking managing website endorsed by FedeRez." %}" />
|
<meta property="og:description" content="Networking managing website endorsed by FedeRez." />
|
||||||
|
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<link rel="shortcut icon" type="image/svg" href="{% static 'images/logo_re2o.svg' %}">
|
<link rel="shortcut icon" type="image/svg" href="{% static 'images/logo_re2o.svg' %}">
|
||||||
|
|
|
@ -38,7 +38,7 @@
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<b>{% blocktrans trimmed %}An email has been automatically sent to the site administrators. Please avoid
|
<b>{% blocktrans trimmed %}An email has been automatically sent to the site administrators. Please avoid
|
||||||
spamming them by trigerring the same issue multiple times.{% endblocktrans %}</b>{% blocktrans trimmed %} The mail should
|
spamming them by trigerring the same issue multiple times.{% endblocktrans %}</b>{% blocktrans trimmed %} The email should
|
||||||
contains all the details necessary to understand what went wrong but if your help were
|
contains all the details necessary to understand what went wrong but if your help were
|
||||||
needed, you will probably be contacted by them.{% endblocktrans %}
|
needed, you will probably be contacted by them.{% endblocktrans %}
|
||||||
</p>
|
</p>
|
||||||
|
|
|
@ -21,7 +21,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: 2.5\n"
|
"Project-Id-Version: 2.5\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2019-09-05 19:48+0200\n"
|
"POT-Creation-Date: 2019-11-19 23:43+0100\n"
|
||||||
"PO-Revision-Date: 2018-03-31 16:09+0002\n"
|
"PO-Revision-Date: 2018-03-31 16:09+0002\n"
|
||||||
"Last-Translator: Laouen Fernet <laouen.fernet@supelec.fr>\n"
|
"Last-Translator: Laouen Fernet <laouen.fernet@supelec.fr>\n"
|
||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
|
@ -30,11 +30,11 @@ msgstr ""
|
||||||
"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"
|
||||||
|
|
||||||
#: templates/admin/base_site.html:65 templates/base.html:281
|
#: templates/admin/base_site.html:65 templates/base.html:288
|
||||||
msgid "powered by"
|
msgid "powered by"
|
||||||
msgstr "propulsé par"
|
msgstr "propulsé par"
|
||||||
|
|
||||||
#: templates/admin/base_site.html:69 templates/base.html:289
|
#: templates/admin/base_site.html:69 templates/base.html:296
|
||||||
msgid ""
|
msgid ""
|
||||||
"This software is under the terms of the <a href=\"http://www.gnu.org/"
|
"This software is under the terms of the <a href=\"http://www.gnu.org/"
|
||||||
"licenses/gpl-2.0.txt\" target=\"_blank\" rel=\"nofollow\">GPLv2</a> License."
|
"licenses/gpl-2.0.txt\" target=\"_blank\" rel=\"nofollow\">GPLv2</a> License."
|
||||||
|
@ -45,41 +45,41 @@ msgstr ""
|
||||||
#: templates/admin/custom_index.html:11
|
#: templates/admin/custom_index.html:11
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Welcome to %(name_website)s"
|
msgid "Welcome to %(name_website)s"
|
||||||
msgstr ""
|
msgstr "Bienvenue sur %(name_website)s"
|
||||||
|
|
||||||
#: templates/admin/custom_index.html:17
|
#: templates/admin/custom_index.html:17
|
||||||
msgid ""
|
msgid ""
|
||||||
"You are on the operator interface. Here you will be able to manage the "
|
"You are on the operator interface. Here you will be able to manage the "
|
||||||
"network and users\n"
|
"network and users from the top left menu. You can also go read the developer "
|
||||||
" from the top left menu. You can also go read the developer "
|
|
||||||
"documentation."
|
"documentation."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Vous êtes dans l'interface opérateur. Ici vous pourrez gérer le réseau et "
|
||||||
|
"les utilisateurs depuis le menu en haut à gauche. Vous pouvez aussi lire la "
|
||||||
|
"documentation du développeur."
|
||||||
|
|
||||||
#: templates/admin/custom_index.html:21
|
#: templates/admin/custom_index.html:20
|
||||||
msgid ""
|
msgid ""
|
||||||
"To go back to the main site, click \"View site\" button in top right menu."
|
"To go back to the main site, click \"View site\" button in top right menu."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Pour revenir au site principal, cliquez sur le bouton « Voir le site » dans "
|
||||||
|
"le menu en haut à droite."
|
||||||
|
|
||||||
|
#: templates/admin/custom_index.html:28
|
||||||
|
msgid "My account"
|
||||||
|
msgstr "Mon compte"
|
||||||
|
|
||||||
#: templates/admin/custom_index.html:29
|
#: templates/admin/custom_index.html:29
|
||||||
msgid "My account"
|
msgid "Recent actions"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/admin/custom_index.html:30
|
#: templates/admin/custom_index.html:33
|
||||||
msgid "My recent actions"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/admin/custom_index.html:34
|
|
||||||
msgid "None available"
|
msgid "None available"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/admin/custom_index.html:49
|
#: templates/admin/custom_index.html:48
|
||||||
msgid "Unknown content"
|
msgid "Unknown content"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/base.html:43 templates/errors/404.html:35
|
|
||||||
msgid "Networking managing website endorsed by FedeRez."
|
|
||||||
msgstr "Site de gestion de réseau soutenu par FedeRez."
|
|
||||||
|
|
||||||
#: templates/base.html:70 templates/registration/logged_out.html:11
|
#: templates/base.html:70 templates/registration/logged_out.html:11
|
||||||
#: templates/registration/password_change_done.html:11
|
#: templates/registration/password_change_done.html:11
|
||||||
#: templates/registration/password_change_form.html:11
|
#: templates/registration/password_change_form.html:11
|
||||||
|
@ -88,7 +88,7 @@ msgstr "Site de gestion de réseau soutenu par FedeRez."
|
||||||
#: templates/registration/password_reset_done.html:11
|
#: templates/registration/password_reset_done.html:11
|
||||||
#: templates/registration/password_reset_form.html:11
|
#: templates/registration/password_reset_form.html:11
|
||||||
msgid "Home"
|
msgid "Home"
|
||||||
msgstr "Accueil"
|
msgstr ""
|
||||||
|
|
||||||
#: templates/base.html:91
|
#: templates/base.html:91
|
||||||
msgid "Users"
|
msgid "Users"
|
||||||
|
@ -110,139 +110,139 @@ msgstr "Gérer les machines"
|
||||||
msgid "Manage the subscriptions"
|
msgid "Manage the subscriptions"
|
||||||
msgstr "Gérer les cotisations"
|
msgstr "Gérer les cotisations"
|
||||||
|
|
||||||
#: templates/base.html:112
|
#: templates/base.html:114
|
||||||
msgid "Topology"
|
msgid "Topology"
|
||||||
msgstr "Topologie"
|
msgstr "Topologie"
|
||||||
|
|
||||||
#: templates/base.html:114
|
#: templates/base.html:116
|
||||||
msgid "Switches"
|
msgid "Switches"
|
||||||
msgstr "Commutateurs réseau"
|
msgstr "Commutateurs réseau"
|
||||||
|
|
||||||
#: templates/base.html:115
|
#: templates/base.html:117
|
||||||
msgid "Access points"
|
msgid "Access points"
|
||||||
msgstr "Points d'accès sans fil"
|
msgstr "Points d'accès sans fil"
|
||||||
|
|
||||||
#: templates/base.html:116
|
#: templates/base.html:118
|
||||||
msgid "Rooms"
|
msgid "Rooms"
|
||||||
msgstr "Chambres"
|
msgstr "Chambres"
|
||||||
|
|
||||||
#: templates/base.html:121
|
#: templates/base.html:128
|
||||||
msgid "Statistics"
|
msgid "Statistics"
|
||||||
msgstr "Statistiques"
|
msgstr "Statistiques"
|
||||||
|
|
||||||
#: templates/base.html:126
|
|
||||||
msgid "Administration"
|
|
||||||
msgstr "Administration"
|
|
||||||
|
|
||||||
#: templates/base.html:133
|
#: templates/base.html:133
|
||||||
msgid "Information and contact"
|
msgid "Administration"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/base.html:135
|
#: templates/base.html:140
|
||||||
|
msgid "Information and contact"
|
||||||
|
msgstr "Informations et contact"
|
||||||
|
|
||||||
|
#: templates/base.html:142
|
||||||
msgid "About"
|
msgid "About"
|
||||||
msgstr "À propos"
|
msgstr "À propos"
|
||||||
|
|
||||||
#: templates/base.html:136
|
#: templates/base.html:143
|
||||||
msgid "Contact"
|
msgid "Contact"
|
||||||
msgstr "Contact"
|
msgstr "Contact"
|
||||||
|
|
||||||
#: templates/base.html:150
|
#: templates/base.html:157
|
||||||
msgid "Sign up"
|
msgid "Sign up"
|
||||||
msgstr "S'inscrire"
|
msgstr "S'inscrire"
|
||||||
|
|
||||||
#: templates/base.html:156 templates/registration/login.html:29
|
#: templates/base.html:163 templates/registration/login.html:29
|
||||||
#: templates/registration/login.html:36
|
#: templates/registration/login.html:36
|
||||||
msgid "Log in"
|
msgid "Log in"
|
||||||
msgstr "Se connecter"
|
msgstr ""
|
||||||
|
|
||||||
#: templates/base.html:164
|
#: templates/base.html:171
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "Rechercher"
|
msgstr ""
|
||||||
|
|
||||||
#: templates/base.html:178
|
#: templates/base.html:185
|
||||||
msgid "My profile"
|
msgid "My profile"
|
||||||
msgstr "Mon profil"
|
msgstr "Mon profil"
|
||||||
|
|
||||||
#: templates/base.html:179
|
#: templates/base.html:186
|
||||||
msgid "Log out"
|
msgid "Log out"
|
||||||
msgstr "Se déconnecter"
|
msgstr ""
|
||||||
|
|
||||||
#: templates/base.html:214
|
#: templates/base.html:221
|
||||||
msgid "Username"
|
msgid "Username"
|
||||||
msgstr "Pseudo"
|
msgstr "Pseudo"
|
||||||
|
|
||||||
#: templates/base.html:218
|
#: templates/base.html:225
|
||||||
msgid "Room"
|
msgid "Room"
|
||||||
msgstr "Chambre"
|
msgstr "Chambre"
|
||||||
|
|
||||||
#: templates/base.html:222
|
#: templates/base.html:229
|
||||||
msgid "Internet access"
|
msgid "Internet access"
|
||||||
msgstr "Accès Internet"
|
msgstr "Accès Internet"
|
||||||
|
|
||||||
#: templates/base.html:225
|
#: templates/base.html:232
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Until %(end_access_date)s"
|
msgid "Until %(end_access_date)s"
|
||||||
msgstr "Jusqu'au %(end_access_date)s"
|
msgstr "Jusqu'au %(end_access_date)s"
|
||||||
|
|
||||||
#: templates/base.html:227
|
#: templates/base.html:234
|
||||||
msgid "Disabled"
|
msgid "Disabled"
|
||||||
msgstr "Désactivé"
|
msgstr "Désactivé"
|
||||||
|
|
||||||
#: templates/base.html:232
|
#: templates/base.html:239
|
||||||
msgid "Membership"
|
msgid "Membership"
|
||||||
msgstr "Adhésion"
|
msgstr "Adhésion"
|
||||||
|
|
||||||
#: templates/base.html:235
|
#: templates/base.html:242
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Until %(end_adhesion_date)s"
|
msgid "Until %(end_adhesion_date)s"
|
||||||
msgstr "Jusqu'au %(end_adhesion_date)s"
|
msgstr "Jusqu'au %(end_adhesion_date)s"
|
||||||
|
|
||||||
#: templates/base.html:237
|
#: templates/base.html:244
|
||||||
msgid "Non member"
|
msgid "Non member"
|
||||||
msgstr "Non adhérent"
|
msgstr "Non adhérent"
|
||||||
|
|
||||||
#: templates/base.html:245
|
#: templates/base.html:252
|
||||||
msgid "View my profile"
|
msgid "View my profile"
|
||||||
msgstr "Voir mon profil"
|
msgstr "Voir mon profil"
|
||||||
|
|
||||||
#: templates/base.html:250
|
#: templates/base.html:257
|
||||||
msgid "You are not logged in."
|
msgid "You are not logged in."
|
||||||
msgstr "Vous n'êtes pas connecté."
|
msgstr "Vous n'êtes pas connecté."
|
||||||
|
|
||||||
#: templates/base.html:257
|
#: templates/base.html:264
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "%(nb)s active machine"
|
msgid "%(nb)s active machine"
|
||||||
msgid_plural "%(nb)s active machines"
|
msgid_plural "%(nb)s active machines"
|
||||||
msgstr[0] "%(nb)s machine active"
|
msgstr[0] "%(nb)s machine active"
|
||||||
msgstr[1] "%(nb)s machines actives"
|
msgstr[1] "%(nb)s machines actives"
|
||||||
|
|
||||||
#: templates/base.html:266
|
#: templates/base.html:273
|
||||||
msgid "View my machines"
|
msgid "View my machines"
|
||||||
msgstr "Voir mes machines"
|
msgstr "Voir mes machines"
|
||||||
|
|
||||||
#: templates/base.html:279
|
#: templates/base.html:286
|
||||||
msgid "Back to top"
|
msgid "Back to top"
|
||||||
msgstr "Retour en haut"
|
msgstr "Retour en haut"
|
||||||
|
|
||||||
#: templates/base.html:283
|
#: templates/base.html:290
|
||||||
msgid "Brought to you with <i class=\"fa fa-heart text-danger\"></i>."
|
msgid "Brought to you with <i class=\"fa fa-heart text-danger\"></i>."
|
||||||
msgstr "Codé avec <i class=\"fa fa-heart text-danger\"></i>."
|
msgstr "Codé avec <i class=\"fa fa-heart text-danger\"></i>."
|
||||||
|
|
||||||
#: templates/base.html:286
|
#: templates/base.html:293
|
||||||
msgid "About this website"
|
msgid "About this website"
|
||||||
msgstr "À propos de ce site"
|
msgstr "À propos de ce site"
|
||||||
|
|
||||||
#: templates/buttons/add.html:27
|
#: templates/buttons/add.html:27
|
||||||
msgid "Add"
|
msgid "Add"
|
||||||
msgstr "Ajouter"
|
msgstr ""
|
||||||
|
|
||||||
#: templates/buttons/edit.html:27 tickets/templates/tickets/preferences.html:14
|
#: templates/buttons/edit.html:27
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
msgstr "Modifier"
|
msgstr "Modifier"
|
||||||
|
|
||||||
#: templates/buttons/history.html:26 templates/buttons/history.html:27
|
#: templates/buttons/history.html:26 templates/buttons/history.html:27
|
||||||
msgid "History"
|
msgid "History"
|
||||||
msgstr "Historique"
|
msgstr ""
|
||||||
|
|
||||||
#: templates/buttons/setlang.html:34
|
#: templates/buttons/setlang.html:34
|
||||||
msgid "Translation in development"
|
msgid "Translation in development"
|
||||||
|
@ -258,7 +258,7 @@ msgstr "Tri décroissant"
|
||||||
|
|
||||||
#: templates/buttons/suppr.html:27
|
#: templates/buttons/suppr.html:27
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr "Supprimer"
|
msgstr ""
|
||||||
|
|
||||||
#: templates/errors/404.html:39
|
#: templates/errors/404.html:39
|
||||||
msgid "404 error: page not found"
|
msgid "404 error: page not found"
|
||||||
|
@ -312,7 +312,7 @@ msgstr ""
|
||||||
|
|
||||||
#: templates/errors/500.html:41
|
#: templates/errors/500.html:41
|
||||||
msgid ""
|
msgid ""
|
||||||
"The mail should contains all the details necessary to understand what went "
|
"The email should contains all the details necessary to understand what went "
|
||||||
"wrong but if your help were needed, you will probably be contacted by them."
|
"wrong but if your help were needed, you will probably be contacted by them."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
" Le courrier électronique devrait contenir tous les détails nécessaires à la "
|
" Le courrier électronique devrait contenir tous les détails nécessaires à la "
|
||||||
|
@ -360,10 +360,8 @@ msgid "Thanks for spending some quality time with the Web site today."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/logged_out.html:17
|
#: templates/registration/logged_out.html:17
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Log in"
|
|
||||||
msgid "Log in again"
|
msgid "Log in again"
|
||||||
msgstr "Se connecter"
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/login.html:40
|
#: templates/registration/login.html:40
|
||||||
msgid "Forgotten password?"
|
msgid "Forgotten password?"
|
||||||
|
@ -381,10 +379,8 @@ msgid "Password reset"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_confirm.html:11
|
#: templates/registration/password_reset_confirm.html:11
|
||||||
#, fuzzy
|
|
||||||
#| msgid "More information"
|
|
||||||
msgid "Password reset confirmation"
|
msgid "Password reset confirmation"
|
||||||
msgstr "Plus d'informations"
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_email.html:2
|
#: templates/registration/password_reset_email.html:2
|
||||||
#, python-format
|
#, python-format
|
||||||
|
@ -405,186 +401,3 @@ msgstr ""
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "The %(site_name)s team"
|
msgid "The %(site_name)s team"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: tickets/models.py:27
|
|
||||||
msgid "Title of the ticket"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: tickets/models.py:32
|
|
||||||
msgid "Description of the ticket"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: tickets/models.py:37
|
|
||||||
msgid "An email address to get back to you"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: tickets/models.py:43 tickets/templates/tickets/form_preferences.html:30
|
|
||||||
#: tickets/templates/tickets/form_ticket.html:31
|
|
||||||
msgid "Ticket"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: tickets/models.py:44 tickets/templates/tickets/aff_ticket.html:30
|
|
||||||
#: tickets/templates/tickets/aff_tickets.html:35
|
|
||||||
#: tickets/templates/tickets/index.html:29
|
|
||||||
#: tickets/templates/tickets/index.html:32
|
|
||||||
#: tickets/templates/tickets/navbar.html:2
|
|
||||||
#: tickets/templates/tickets/preferences.html:6
|
|
||||||
msgid "Tickets"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: tickets/models.py:75
|
|
||||||
msgid "You don't have the right to view other tickets than yours."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: tickets/models.py:84
|
|
||||||
msgid "You don't have the right to view the list of tickets."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: tickets/preferences/models.py:8
|
|
||||||
msgid ""
|
|
||||||
"Email address to publish the new tickets (leave empty for no publications)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: tickets/preferences/models.py:14
|
|
||||||
msgid "Français"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: tickets/preferences/models.py:15
|
|
||||||
msgid "English"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: tickets/preferences/models.py:19
|
|
||||||
msgid "Ticket's settings"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: tickets/templates/tickets/aff_ticket.html:36
|
|
||||||
msgid "Solved"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: tickets/templates/tickets/aff_ticket.html:38
|
|
||||||
msgid "Not Solved"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: tickets/templates/tickets/aff_ticket.html:44
|
|
||||||
#, fuzzy
|
|
||||||
#| msgid "powered by"
|
|
||||||
msgid "Opened by"
|
|
||||||
msgstr "propulsé par"
|
|
||||||
|
|
||||||
#: tickets/templates/tickets/aff_ticket.html:50
|
|
||||||
msgid "Anonymous User"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: tickets/templates/tickets/aff_ticket.html:54
|
|
||||||
msgid "Response address: "
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: tickets/templates/tickets/aff_ticket.html:54
|
|
||||||
msgid "Response to your ticket"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: tickets/templates/tickets/aff_ticket.html:59
|
|
||||||
msgid "Title:"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: tickets/templates/tickets/aff_ticket.html:60
|
|
||||||
msgid "Description"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: tickets/templates/tickets/aff_ticket.html:79
|
|
||||||
msgid "Tous les tickets"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: tickets/templates/tickets/aff_tickets.html:38
|
|
||||||
msgid "Not Solved Tickets"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: tickets/templates/tickets/aff_tickets.html:41
|
|
||||||
msgid "Last Ticket:"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: tickets/templates/tickets/contact.html:8
|
|
||||||
#, python-format
|
|
||||||
msgid ""
|
|
||||||
"If you are experiencing issues with the services offered by %(asso_name)s, "
|
|
||||||
"you can open a ticket that will be taken care of. If you want to contact us "
|
|
||||||
"on any other topic, please choose one address below."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: tickets/templates/tickets/contact.html:10
|
|
||||||
#: tickets/templates/tickets/navbar_logout.html:4
|
|
||||||
msgid "Ouvrir un ticket"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: tickets/templates/tickets/form_preferences.html:33
|
|
||||||
msgid "Tickets settings modification"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: tickets/templates/tickets/form_ticket.html:39
|
|
||||||
msgid ""
|
|
||||||
"Vous n'êtes pas authentifié. Veuillez fournir une adresse mail afin que nous "
|
|
||||||
"puissions vous recontacter."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: tickets/templates/tickets/form_ticket.html:44
|
|
||||||
msgid ""
|
|
||||||
"Description de votre problème. Veuillez fournir le plus d'informations "
|
|
||||||
"possible afin de faciliter la recherche de solution. Voici quelques "
|
|
||||||
"informations dont nous pourions avoir besoin:"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: tickets/templates/tickets/form_ticket.html:47
|
|
||||||
msgid "Le type de votre problème (adhesion, connexion, paiement ou autre)."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: tickets/templates/tickets/form_ticket.html:50
|
|
||||||
msgid ""
|
|
||||||
"Les conditions dans lesquelles vous rencontrez le problème (Wifi/filaire, "
|
|
||||||
"sur tout les apareils ou sur un seul. Est-ce une nouvelle machine ?"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: tickets/templates/tickets/form_ticket.html:53
|
|
||||||
msgid ""
|
|
||||||
"Les endroits dans lequels le problème survient (chez vous, dans une partie "
|
|
||||||
"commune, dans un batiment en particulier)."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: tickets/templates/tickets/preferences.html:21
|
|
||||||
msgid "Publication email address"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: tickets/templates/tickets/preferences.html:25
|
|
||||||
msgid "Pas d'adresse, les tickets ne sont pas annoncés"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: tickets/templates/tickets/preferences.html:29
|
|
||||||
msgid "Email language"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: tickets/templates/tickets/profil.html:6
|
|
||||||
msgid " Tickets"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: tickets/templates/tickets/profil.html:12
|
|
||||||
msgid " Open a Ticket"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: tickets/templates/tickets/profil.html:19
|
|
||||||
msgid "No tickets"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: tickets/views.py:83 tickets/views.py:87
|
|
||||||
msgid ""
|
|
||||||
"Your ticket has been succesfully open. We will take care of it as soon as "
|
|
||||||
"possible."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: tickets/views.py:90
|
|
||||||
msgid ""
|
|
||||||
"You are not authenticated. Please login or provide an email address so we "
|
|
||||||
"can get back to you."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: tickets/views.py:117 tickets/views.py:163
|
|
||||||
msgid "Never"
|
|
||||||
msgstr ""
|
|
||||||
|
|
|
@ -8,11 +8,11 @@ Copyright © 2019 Alexandre Iooss
|
||||||
|
|
||||||
{% block breadcrumbs %}
|
{% block breadcrumbs %}
|
||||||
<div class="breadcrumbs">
|
<div class="breadcrumbs">
|
||||||
<a href="{% url 'index' %}">{% trans 'Home' %}</a>
|
<a href="{% url 'index' %}">{% trans "Home" %}</a>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<p>{% trans "Thanks for spending some quality time with the Web site today." %}</p>
|
<p>{% trans "Thanks for spending some quality time with the Web site today." %}</p>
|
||||||
<p><a href="{% url 'login' %}">{% trans 'Log in again' %}</a></p>
|
<p><a href="{% url 'login' %}">{% trans "Log in again" %}</a></p>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -8,6 +8,6 @@ Copyright © 2019 Alexandre Iooss
|
||||||
|
|
||||||
{% block breadcrumbs %}
|
{% block breadcrumbs %}
|
||||||
<div class="breadcrumbs">
|
<div class="breadcrumbs">
|
||||||
<a href="{% url 'index' %}">{% trans 'Home' %}</a> › {% trans 'Password change' %}
|
<a href="{% url 'index' %}">{% trans "Home" %}</a> › {% trans "Password change" %}
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -8,6 +8,6 @@ Copyright © 2019 Alexandre Iooss
|
||||||
|
|
||||||
{% block breadcrumbs %}
|
{% block breadcrumbs %}
|
||||||
<div class="breadcrumbs">
|
<div class="breadcrumbs">
|
||||||
<a href="{% url 'index' %}">{% trans 'Home' %}</a> › {% trans 'Password change' %}
|
<a href="{% url 'index' %}">{% trans "Home" %}</a> › {% trans "Password change" %}
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -8,6 +8,6 @@ Copyright © 2019 Alexandre Iooss
|
||||||
|
|
||||||
{% block breadcrumbs %}
|
{% block breadcrumbs %}
|
||||||
<div class="breadcrumbs">
|
<div class="breadcrumbs">
|
||||||
<a href="{% url 'index' %}">{% trans 'Home' %}</a> › {% trans 'Password reset' %}
|
<a href="{% url 'index' %}">{% trans "Home" %}</a> › {% trans "Password reset" %}
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -8,6 +8,6 @@ Copyright © 2019 Alexandre Iooss
|
||||||
|
|
||||||
{% block breadcrumbs %}
|
{% block breadcrumbs %}
|
||||||
<div class="breadcrumbs">
|
<div class="breadcrumbs">
|
||||||
<a href="{% url 'index' %}">{% trans 'Home' %}</a> › {% trans 'Password reset confirmation' %}
|
<a href="{% url 'index' %}">{% trans "Home" %}</a> › {% trans "Password reset confirmation" %}
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -8,6 +8,6 @@ Copyright © 2019 Alexandre Iooss
|
||||||
|
|
||||||
{% block breadcrumbs %}
|
{% block breadcrumbs %}
|
||||||
<div class="breadcrumbs">
|
<div class="breadcrumbs">
|
||||||
<a href="{% url 'index' %}">{% trans 'Home' %}</a> › {% trans 'Password reset' %}
|
<a href="{% url 'index' %}">{% trans "Home" %}</a> › {% trans "Password reset" %}
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -8,6 +8,6 @@ Copyright © 2019 Alexandre Iooss
|
||||||
|
|
||||||
{% block breadcrumbs %}
|
{% block breadcrumbs %}
|
||||||
<div class="breadcrumbs">
|
<div class="breadcrumbs">
|
||||||
<a href="{% url 'index' %}">{% trans 'Home' %}</a> › {% trans 'Password reset' %}
|
<a href="{% url 'index' %}">{% trans "Home" %}</a> › {% trans "Password reset" %}
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
300
tickets/locale/fr/LC_MESSAGES/django.po
Normal file
300
tickets/locale/fr/LC_MESSAGES/django.po
Normal file
|
@ -0,0 +1,300 @@
|
||||||
|
# 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: 2019-11-20 01:24+0100\n"
|
||||||
|
"PO-Revision-Date: 2019-11-16 00:35+0100\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"
|
||||||
|
|
||||||
|
#: tickets/models.py:28
|
||||||
|
msgid "Title of the ticket."
|
||||||
|
msgstr "Titre du ticket."
|
||||||
|
|
||||||
|
#: tickets/models.py:32
|
||||||
|
msgid "Description of the ticket."
|
||||||
|
msgstr "Description du ticket."
|
||||||
|
|
||||||
|
#: tickets/models.py:38
|
||||||
|
msgid "An email address to get back to you."
|
||||||
|
msgstr "Une adresse mail pour vous recontacter."
|
||||||
|
|
||||||
|
#: tickets/models.py:43
|
||||||
|
msgid "Can view a ticket object"
|
||||||
|
msgstr "Peut voir un objet ticket"
|
||||||
|
|
||||||
|
#: tickets/models.py:44
|
||||||
|
msgid "ticket"
|
||||||
|
msgstr "ticket"
|
||||||
|
|
||||||
|
#: tickets/models.py:45
|
||||||
|
msgid "tickets"
|
||||||
|
msgstr "tickets"
|
||||||
|
|
||||||
|
#: tickets/models.py:49
|
||||||
|
#, python-format
|
||||||
|
msgid "Ticket from %(name)s. Date: %(date)s."
|
||||||
|
msgstr "Ticket de %(name)s. Date : %(date)s."
|
||||||
|
|
||||||
|
#: tickets/models.py:51
|
||||||
|
#, python-format
|
||||||
|
msgid "Anonymous ticket. Date: %s."
|
||||||
|
msgstr "Ticket anonyme. Date : %s."
|
||||||
|
|
||||||
|
#: tickets/models.py:82
|
||||||
|
msgid "You don't have the right to view other tickets than yours."
|
||||||
|
msgstr "Vous n'avez pas le droit de voir d'autres tickets que les vôtres."
|
||||||
|
|
||||||
|
#: tickets/models.py:94
|
||||||
|
msgid "You don't have the right to view the list of tickets."
|
||||||
|
msgstr "Vous n'avez pas le droit de voir la liste des tickets."
|
||||||
|
|
||||||
|
#: tickets/preferences/models.py:10
|
||||||
|
msgid ""
|
||||||
|
"Email address to publish the new tickets (leave empty for no publication)."
|
||||||
|
msgstr ""
|
||||||
|
"Adresse mail où publier les nouveaux tickets (laissez vide pour ne pas "
|
||||||
|
"publier)."
|
||||||
|
|
||||||
|
#: tickets/preferences/models.py:17
|
||||||
|
msgid "French"
|
||||||
|
msgstr "Français"
|
||||||
|
|
||||||
|
#: tickets/preferences/models.py:17
|
||||||
|
msgid "English"
|
||||||
|
msgstr "Anglais"
|
||||||
|
|
||||||
|
#: tickets/preferences/models.py:21
|
||||||
|
msgid "tickets preferences"
|
||||||
|
msgstr "préférences de tickets"
|
||||||
|
|
||||||
|
#: tickets/templates/tickets/aff_ticket.html:30
|
||||||
|
#: tickets/templates/tickets/contact.html:4
|
||||||
|
#: tickets/templates/tickets/index.html:29
|
||||||
|
#: tickets/templates/tickets/preferences.html:6
|
||||||
|
#: tickets/templates/tickets/profil.html:6
|
||||||
|
msgid "Tickets"
|
||||||
|
msgstr "Tickets"
|
||||||
|
|
||||||
|
#: tickets/templates/tickets/aff_ticket.html:34
|
||||||
|
#, python-format
|
||||||
|
msgid "Ticket #%(id)s"
|
||||||
|
msgstr "Ticket #%(id)s"
|
||||||
|
|
||||||
|
#: tickets/templates/tickets/aff_ticket.html:36
|
||||||
|
#: tickets/templates/tickets/aff_tickets.html:58
|
||||||
|
msgid "Solved"
|
||||||
|
msgstr "Résolu"
|
||||||
|
|
||||||
|
#: tickets/templates/tickets/aff_ticket.html:38
|
||||||
|
msgid "Not solved"
|
||||||
|
msgstr "Non résolu"
|
||||||
|
|
||||||
|
#: tickets/templates/tickets/aff_ticket.html:44
|
||||||
|
msgid "Opened by"
|
||||||
|
msgstr "Ouvert par"
|
||||||
|
|
||||||
|
#: tickets/templates/tickets/aff_ticket.html:50
|
||||||
|
msgid "Anonymous user"
|
||||||
|
msgstr "Utilisateur anonyme"
|
||||||
|
|
||||||
|
#: tickets/templates/tickets/aff_ticket.html:54
|
||||||
|
msgid "Response address: "
|
||||||
|
msgstr "Adresse de réponse : "
|
||||||
|
|
||||||
|
#: tickets/templates/tickets/aff_ticket.html:54
|
||||||
|
msgid "Response to your ticket"
|
||||||
|
msgstr "Réponse à votre ticket"
|
||||||
|
|
||||||
|
#: tickets/templates/tickets/aff_ticket.html:59
|
||||||
|
msgid "Title:"
|
||||||
|
msgstr "Titre :"
|
||||||
|
|
||||||
|
#: tickets/templates/tickets/aff_ticket.html:60
|
||||||
|
msgid "Description:"
|
||||||
|
msgstr "Description :"
|
||||||
|
|
||||||
|
#: tickets/templates/tickets/aff_ticket.html:68
|
||||||
|
msgid "Mark as solved"
|
||||||
|
msgstr "Marquer comme résolu"
|
||||||
|
|
||||||
|
#: tickets/templates/tickets/aff_ticket.html:71
|
||||||
|
msgid "Mark as not solved"
|
||||||
|
msgstr "Marquer comme non résolu"
|
||||||
|
|
||||||
|
#: tickets/templates/tickets/aff_ticket.html:81
|
||||||
|
msgid "All tickets"
|
||||||
|
msgstr "Tous les tickets"
|
||||||
|
|
||||||
|
#: tickets/templates/tickets/aff_tickets.html:35
|
||||||
|
#: tickets/templates/tickets/form_preferences.html:30
|
||||||
|
#: tickets/templates/tickets/form_ticket.html:31
|
||||||
|
msgid "Ticket"
|
||||||
|
msgid_plural "Tickets"
|
||||||
|
msgstr[0] "Ticket"
|
||||||
|
msgstr[1] "Tickets"
|
||||||
|
|
||||||
|
#: tickets/templates/tickets/aff_tickets.html:38
|
||||||
|
msgid "Ticket not solved"
|
||||||
|
msgid_plural "Tickets not solved"
|
||||||
|
msgstr[0] "Ticket non résolu"
|
||||||
|
msgstr[1] "Tickets non résolus"
|
||||||
|
|
||||||
|
#: tickets/templates/tickets/aff_tickets.html:41
|
||||||
|
msgid "Last ticket:"
|
||||||
|
msgstr "Dernier ticket :"
|
||||||
|
|
||||||
|
#: tickets/templates/tickets/aff_tickets.html:55
|
||||||
|
msgid "User"
|
||||||
|
msgstr "Utilisateur"
|
||||||
|
|
||||||
|
#: tickets/templates/tickets/aff_tickets.html:56
|
||||||
|
msgid "Title"
|
||||||
|
msgstr "Titre"
|
||||||
|
|
||||||
|
#: tickets/templates/tickets/aff_tickets.html:57
|
||||||
|
msgid "Date"
|
||||||
|
msgstr "Date"
|
||||||
|
|
||||||
|
#: tickets/templates/tickets/aff_tickets.html:70
|
||||||
|
msgid "Anonymous"
|
||||||
|
msgstr "Anonyme"
|
||||||
|
|
||||||
|
#: tickets/templates/tickets/contact.html:8
|
||||||
|
#, python-format
|
||||||
|
msgid ""
|
||||||
|
"If you are experiencing issues with the services offered by %(asso_name)s, "
|
||||||
|
"you can open a ticket that will be taken care of. If you want to contact us "
|
||||||
|
"on any other topic, please choose one address below."
|
||||||
|
msgstr ""
|
||||||
|
"Si vous rencontrez des problèmes avec les services proposés par "
|
||||||
|
"%(asso_name)s, vous pouvez ouvrir un ticket qui sera pris en compte. Si vous "
|
||||||
|
"voulez nous contacter pour n'importe quel autre sujet, veuillez choisir une "
|
||||||
|
"adresse ci-dessous."
|
||||||
|
|
||||||
|
#: tickets/templates/tickets/contact.html:10
|
||||||
|
#: tickets/templates/tickets/navbar_logout.html:4
|
||||||
|
#: tickets/templates/tickets/profil.html:12
|
||||||
|
msgid "Open a ticket"
|
||||||
|
msgstr "Ouvrir un ticket"
|
||||||
|
|
||||||
|
#: tickets/templates/tickets/form_preferences.html:33
|
||||||
|
msgid "Editing of tickets preferences"
|
||||||
|
msgstr "Modification des préférences de tickets"
|
||||||
|
|
||||||
|
#: tickets/templates/tickets/form_preferences.html:46
|
||||||
|
#: tickets/templates/tickets/preferences.html:14
|
||||||
|
msgid "Edit"
|
||||||
|
msgstr "Modifier"
|
||||||
|
|
||||||
|
#: tickets/templates/tickets/form_ticket.html:34
|
||||||
|
msgid "Ticket opening"
|
||||||
|
msgstr "Ouverture de ticket"
|
||||||
|
|
||||||
|
#: tickets/templates/tickets/form_ticket.html:39 tickets/views.py:88
|
||||||
|
msgid ""
|
||||||
|
"You are not authenticated. Please log in or provide an email address so we "
|
||||||
|
"can get back to you."
|
||||||
|
msgstr ""
|
||||||
|
"Vous n'êtes pas authentifié. Veuillez vous connecter ou fournir une adresse "
|
||||||
|
"mail pour que nous puissions vous recontacter."
|
||||||
|
|
||||||
|
#: tickets/templates/tickets/form_ticket.html:44
|
||||||
|
msgid ""
|
||||||
|
"Description of your problem. Please give as much information as possible to "
|
||||||
|
"help us searching for a solution. Here is some information we might need:"
|
||||||
|
msgstr ""
|
||||||
|
"Description de votre problème. Veuillez donner le plus d'informations "
|
||||||
|
"possible pour nous aider à chercher une solution. Voici quelques "
|
||||||
|
"informations dont nous pourrions avoir besoin :"
|
||||||
|
|
||||||
|
#: tickets/templates/tickets/form_ticket.html:47
|
||||||
|
msgid "The type of your problem (membership, connection, payment etc.)."
|
||||||
|
msgstr "Le type de votre problème (adhésion, connexion, paiement etc.)."
|
||||||
|
|
||||||
|
#: tickets/templates/tickets/form_ticket.html:50
|
||||||
|
msgid ""
|
||||||
|
"The conditions in which you encounter the problem (Wi-Fi/wired connection, "
|
||||||
|
"on every machines or only one, on a new machine etc.)."
|
||||||
|
msgstr ""
|
||||||
|
"Les conditions dans lesquelles vous rencontrez le problème (connexion Wi-Fi/"
|
||||||
|
"filaire, sur toutes les machines ou une seule, sur une nouvelle machine "
|
||||||
|
"etc.)."
|
||||||
|
|
||||||
|
#: tickets/templates/tickets/form_ticket.html:53
|
||||||
|
msgid ""
|
||||||
|
"The locations where you encounter the problem (in your room, in a common "
|
||||||
|
"space, in a specific building etc.)."
|
||||||
|
msgstr ""
|
||||||
|
"Les lieux où vous rencontrez le problème (dans votre chambre, dans un espace "
|
||||||
|
"commun, dans un bâtiment en particulier etc.)."
|
||||||
|
|
||||||
|
#: tickets/templates/tickets/form_ticket.html:56
|
||||||
|
msgid "Open the ticket"
|
||||||
|
msgstr "Ouvrir le ticket"
|
||||||
|
|
||||||
|
#: tickets/templates/tickets/index.html:32
|
||||||
|
msgid "List of tickets"
|
||||||
|
msgstr "Liste des tickets"
|
||||||
|
|
||||||
|
#: tickets/templates/tickets/navbar.html:2
|
||||||
|
msgid "Manage the tickets"
|
||||||
|
msgstr "Gérer les tickets"
|
||||||
|
|
||||||
|
#: tickets/templates/tickets/preferences.html:21
|
||||||
|
msgid "Publication email address"
|
||||||
|
msgstr "Adresse mail de publication"
|
||||||
|
|
||||||
|
#: tickets/templates/tickets/preferences.html:25
|
||||||
|
msgid "No email address, the tickets will not be published."
|
||||||
|
msgstr "Pas d'adresse mail, les tickets ne seront pas publiés."
|
||||||
|
|
||||||
|
#: tickets/templates/tickets/preferences.html:29
|
||||||
|
msgid "Email language"
|
||||||
|
msgstr "Langue du mail"
|
||||||
|
|
||||||
|
#: tickets/templates/tickets/profil.html:19
|
||||||
|
msgid "No tickets"
|
||||||
|
msgstr "Pas de tickets"
|
||||||
|
|
||||||
|
#: tickets/views.py:69 tickets/views.py:80
|
||||||
|
msgid ""
|
||||||
|
"Your ticket has been succesfully opened. We will take care of it as soon as "
|
||||||
|
"possible."
|
||||||
|
msgstr ""
|
||||||
|
"Votre ticket a bien été ouvert. Nous nous en occuperons dès que possible."
|
||||||
|
|
||||||
|
#: tickets/views.py:125 tickets/views.py:175
|
||||||
|
msgid "Never"
|
||||||
|
msgstr "Jamais"
|
||||||
|
|
||||||
|
#: tickets/views.py:152
|
||||||
|
msgid "The tickets preferences were edited."
|
||||||
|
msgstr "Les préférences de tickets ont été modifiées."
|
||||||
|
|
||||||
|
#: tickets/views.py:155
|
||||||
|
msgid "Invalid form."
|
||||||
|
msgstr "Formulaire invalide."
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue