8
0
Fork 0
mirror of https://gitlab2.federez.net/re2o/re2o synced 2024-12-23 07:23:46 +00:00

Merge branch 'fix_multiop' into 'dev'

Fix multiop

See merge request re2o/re2o!558
This commit is contained in:
klafyvel 2020-09-04 21:16:30 +02:00
commit 2176ad973b
13 changed files with 242 additions and 12 deletions

View file

@ -34,12 +34,13 @@ from django.utils.translation import ugettext_lazy as _
from topologie.models import Dormitory from topologie.models import Dormitory
from .preferences.models import MultiopOption
class DormitoryForm(FormRevMixin, Form): class DormitoryForm(FormRevMixin, Form):
"""Form used to select dormitories.""" """Form used to select dormitories."""
dormitory = forms.ModelMultipleChoiceField( dormitory = forms.ModelMultipleChoiceField(
queryset=Dormitory.objects.all(), queryset=MultiopOption.get_cached_value("enabled_dorm").all(),
label=_("Dormitory"), label=_("Dormitory"),
widget=forms.CheckboxSelectMultiple, widget=forms.CheckboxSelectMultiple,
required=False, required=False,

View file

@ -0,0 +1,27 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.29 on 2020-09-04 12:50
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
('topologie', '0074_auto_20200419_1640'),
]
operations = [
migrations.CreateModel(
name='Preferences',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('enabled_dorm', models.ManyToManyField(blank=True, related_name='vlan_tagged', to='topologie.Dormitory', verbose_name='enabled dorm')),
],
options={
'verbose_name': 'dormitories preferences',
},
),
]

View file

@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.29 on 2020-09-04 17:05
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('multi_op', '0001_initial'),
]
operations = [
migrations.RenameModel(
old_name='Preferences',
new_name='MultiopOption',
),
]

View file

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.29 on 2020-09-04 17:38
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('multi_op', '0002_auto_20200904_1905'),
]
operations = [
migrations.AlterField(
model_name='multiopoption',
name='enabled_dorm',
field=models.ManyToManyField(blank=True, related_name='enabled_dorm_multiop', to='topologie.Dormitory', verbose_name='enabled dorm'),
),
]

View file

45
multi_op/models.py Normal file
View file

@ -0,0 +1,45 @@
# -*- mode: python; coding: utf-8 -*-
# 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 © 2019 Arthur Grisel-Davy
# Copyright © 2020 Gabriel Détraz
#
# 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.
"""
Multi_op model
"""
from __future__ import absolute_import
from django.db import models
from django.utils.translation import ugettext_lazy as _
from django.template import loader
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.utils.functional import cached_property
from reversion.models import Version
from re2o.mixins import AclMixin
from re2o.mail_utils import send_mail_object
from django.core.mail import EmailMessage
from preferences.models import GeneralOption
import users.models
from .preferences.models import MultiopOption

View file

@ -0,0 +1,24 @@
# -*- mode: python; coding: utf-8 -*-
# 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 © 2020 Gabriel Détraz
# Copyright © 2019 Arthur Grisel-Davy
#
# 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.
"""multi_op
The app in charge of managing the operator of the dormitories
"""

View file

@ -30,12 +30,12 @@ from django import forms
from django.forms import ModelForm, Form from django.forms import ModelForm, Form
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from .models import Preferences from .models import MultiopOption
class EditPreferencesForm(ModelForm): class EditMultiopOptionForm(ModelForm):
"""Form used to edit the settings of multi_op.""" """Form used to edit the settings of multi_op."""
class Meta: class Meta:
model = Preferences model = MultiopOption
fields = "__all__" fields = "__all__"

View file

@ -27,13 +27,16 @@ with multiple operators.
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from re2o.mixins import AclMixin, RevMixin
from preferences.models import PreferencesModel
class Preferences(models.Model):
class MultiopOption(AclMixin, PreferencesModel):
"""Definition of the settings of multi_op.""" """Definition of the settings of multi_op."""
enabled_dorm = models.ManyToManyField( enabled_dorm = models.ManyToManyField(
"topologie.Dormitory", "topologie.Dormitory",
related_name="vlan_tagged", related_name="enabled_dorm_multiop",
blank=True, blank=True,
verbose_name=_("enabled dorm"), verbose_name=_("enabled dorm"),
) )

View file

@ -0,0 +1,58 @@
# -*- mode: python; coding: utf-8 -*-
# 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 © 2020 Gabriel Détraz
# Copyright © 2019 Arthur Grisel-Davy
#
# 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.
# App de gestion des users pour re2o
# Lara Kermarec, Gabriel Détraz, Lemesle Augustin
# Gplv2
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.shortcuts import render, redirect
from django.template.loader import render_to_string
from django.utils.translation import ugettext as _
from django.urls import reverse
from re2o.base import re2o_paginator
from re2o.acl import can_view, can_view_all, can_edit, can_create
from preferences.views import edit_options_template_function
from . import forms
from . import models
def aff_preferences(request):
"""View used to display the settings of multi_op in the preferences page."""
pref, created = models.MultiopOption.objects.get_or_create()
context = {
"preferences": pref,
}
return render_to_string(
"multi_op/preferences.html", context=context, request=request, using=None
)
@login_required
def edit_options(request, section):
return edit_options_template_function(request, section, forms, models)

View file

@ -0,0 +1,27 @@
{% load design %}
{% load i18n %}
<div class="panel panel-default" id="multiop">
<div class="panel-heading" data-toggle="collapse" href="#collapse_multiop">
<h4 class="panel-title">
<a><i class="fa fa-plug"></i> {% trans "Multi Op" %}</a>
</h4>
</div>
<div id="collapse_multiop" class="panel-collapse panel-body collapse">
<a class="btn btn-primary btn-sm" role="button" href="{% url 'multi_op:edit-options' 'MultiopOption' %}">
<i class="fa fa-edit"></i>
{% trans "Edit" %}
</a>
<p></p>
<div class="table-responsive">
<table class="table">
<tr>
<th><p>{% trans "Enabled Dorm" %}</p></th>
<td><p>{{ preferences.enabled_dorm.all|join:", " }}</p></td>
</tr>
</table>
</div>
</div>
</div>

View file

@ -28,6 +28,7 @@ each.
from django.conf.urls import url from django.conf.urls import url
from . import views from . import views
from .preferences.views import edit_options
urlpatterns = [ urlpatterns = [
url(r"^$", views.aff_state_global, name="aff-state-global"), url(r"^$", views.aff_state_global, name="aff-state-global"),
@ -36,6 +37,11 @@ urlpatterns = [
views.aff_state_dormitory, views.aff_state_dormitory,
name="aff-state-dormitory", name="aff-state-dormitory",
), ),
url(
r"^edit_options/(?P<section>MultiopOption)$",
edit_options,
name="edit-options",
),
url( url(
r"^pending-connection$", r"^pending-connection$",
views.aff_pending_connection, views.aff_pending_connection,

View file

@ -45,12 +45,10 @@ from preferences.models import GeneralOption, AssoOption
from .forms import DormitoryForm from .forms import DormitoryForm
from .preferences.models import Preferences from .preferences.models import MultiopOption
from topologie.models import Room, Dormitory from topologie.models import Room, Dormitory
from .preferences.forms import EditPreferencesForm
def display_rooms_connection(request, dormitory=None): def display_rooms_connection(request, dormitory=None):
"""View used to display an overview of the rooms' connection state. """View used to display an overview of the rooms' connection state.
@ -60,9 +58,9 @@ def display_rooms_connection(request, dormitory=None):
dormitory: Dormitory, the dormitory used to filter rooms. If no dormitory: Dormitory, the dormitory used to filter rooms. If no
dormitory is given, all rooms are displayed (default: None). dormitory is given, all rooms are displayed (default: None).
""" """
room_list = Room.objects.select_related("building__dormitory").order_by( room_list = Room.objects.select_related("building__dormitory").filter(
"building_dormitory", "port" building__dormitory__in=MultiopOption.get_cached_value("enabled_dorm").all()
) ).order_by("building_dormitory", "port")
if dormitory: if dormitory:
room_list = room_list.filter(building__dormitory=dormitory) room_list = room_list.filter(building__dormitory=dormitory)
room_list = SortTable.sort( room_list = SortTable.sort(
@ -115,6 +113,7 @@ def aff_pending_connection(request):
Room.objects.select_related("building__dormitory") Room.objects.select_related("building__dormitory")
.filter(port__isnull=True) .filter(port__isnull=True)
.filter(adherent__in=all_has_access()) .filter(adherent__in=all_has_access())
.filter(building__dormitory__in=MultiopOption.get_cached_value("enabled_dorm").all())
.order_by("building_dormitory", "port") .order_by("building_dormitory", "port")
) )
dormitory_form = DormitoryForm(request.POST or None) dormitory_form = DormitoryForm(request.POST or None)
@ -152,6 +151,7 @@ def aff_pending_disconnection(request):
Room.objects.select_related("building__dormitory") Room.objects.select_related("building__dormitory")
.filter(port__isnull=False) .filter(port__isnull=False)
.exclude(Q(adherent__in=all_has_access()) | Q(adherent__in=all_adherent())) .exclude(Q(adherent__in=all_has_access()) | Q(adherent__in=all_adherent()))
.filter(building__dormitory__in=MultiopOption.get_cached_value("enabled_dorm").all())
.order_by("building_dormitory", "port") .order_by("building_dormitory", "port")
) )
dormitory_form = DormitoryForm(request.POST or None) dormitory_form = DormitoryForm(request.POST or None)