diff --git a/g3w-admin/core/forms.py b/g3w-admin/core/forms.py index 7e92b3754..388825fd3 100644 --- a/g3w-admin/core/forms.py +++ b/g3w-admin/core/forms.py @@ -1,12 +1,12 @@ from django_file_form.forms import FileFormMixin, UploadedFileField from django.forms import Form, ModelForm, ValidationError from django.forms.fields import CharField, HiddenInput -from django.forms.models import ModelMultipleChoiceField +from django.forms.models import ModelMultipleChoiceField, ModelChoiceField from django.db.models import Q from django.utils.translation import ugettext, gettext_lazy as _ from core.models import Group, GeneralSuiteData, MacroGroup from django_file_form.forms import FileFormMixin -from django.contrib.auth.models import User +from django.contrib.auth.models import User, Group as AuthGroup from crispy_forms.helper import FormHelper from crispy_forms.layout import Layout, Div, Submit, HTML, Button, Row, Field from crispy_forms.bootstrap import AppendedText, PrependedText @@ -14,10 +14,17 @@ from guardian.shortcuts import get_objects_for_user from django_bleach.forms import BleachField from .utils.forms import crispyBoxMacroGroups -from usersmanage.utils import get_fields_by_user, crispyBoxACL, userHasGroups, get_users_for_object +from usersmanage.utils import ( + crispyBoxACL, + userHasGroups, + get_users_for_object, + get_groups_for_object, + get_roles +) from usersmanage.forms import G3WACLForm, UsersChoiceField from qdjango.models import Project from core.mixins.forms import * +from core.models import G3WSpatialRefSys from usersmanage.configs import * @@ -461,3 +468,89 @@ def save(self, commit=True): return instance + +class GroupFilterForm(G3WFormMixin, G3WRequestFormMixin, Form): + """Group filter form.""" + + macrogroup = ModelChoiceField(label=_('Macro cartographic group'), queryset=MacroGroup.objects.all(), required=False) + epsg = ModelChoiceField(queryset=G3WSpatialRefSys.objects.all(), required=False) + editor1 = ModelChoiceField(label=_('Editor level 1'), queryset=User.objects.all(), required=False) + editor2 = ModelChoiceField(label=_('Editor level 2'), queryset=User.objects.all(), required=False) + editorgroup = ModelChoiceField(label=_('User editor group'), queryset=AuthGroup.objects.all(), required=False) + viewergroup = ModelChoiceField(label=_('User viewer group'), queryset=AuthGroup.objects.all(), required=False) + + def __init__(self, *args, **kwargs): + super(GroupFilterForm, self).__init__(*args, **kwargs) + + # Filter fields by user role + # Filter form colum + ffc = (4, 4, 4) + if not self.request.user.is_superuser: + user_roles = [r.name for r in get_roles(self.request.user)] + if not G3W_EDITOR1 in user_roles: + if not G3W_EDITOR2 in user_roles: + + ffc = (12, 0, 0) + # Remove filter for viewer level 1 + for f in ('editor1', 'editor2', 'editorgroup', 'viewergroup'): + del self.fields[f] + else: + ffc = (12, 0, 0) + for f in ('editor1', 'editor2', 'editorgroup', 'viewergroup'): + del self.fields[f] + + else: + + # Remove filter for editor level 1 + del self.fields['editor1'] + + + # For Editor Level 1 users + self.fields['macrogroup'].queryset = get_objects_for_user(self.request.user, 'view_macrogroup', + MacroGroup) + + # Filter EPSG: only where available in current groups + groups_by_user = get_objects_for_user(self.request.user, 'view_group', Group) + self.fields['epsg'].queryset = (G3WSpatialRefSys.objects.filter( + srid__in=groups_by_user.values('srid')).order_by('srid')) + + # Fit queryset for user role + aclfparams = { + 'editor1': (User, G3W_EDITOR1, 'view_group', get_users_for_object), + 'editor2': (User, G3W_EDITOR2, 'view_group', get_users_for_object), + 'editorgroup': (AuthGroup, 'editor', 'view_group', get_groups_for_object), + 'viewergroup': (AuthGroup, 'viewer', 'view_group', get_groups_for_object) + } + + for fp, dt in aclfparams.items(): + if fp in self.fields: + eqs = set() + for g in groups_by_user: + eqs = eqs.union(set(dt[3](g, dt[2], dt[1]))) + self.fields[fp].queryset = dt[0].objects.filter(pk__in=[u.pk for u in eqs]) + + self.helper = FormHelper(self) + self.helper.form_tag = False + self.helper.layout = Layout( + Div( + Div( + Field('macrogroup', css_class='select2', style='width:100%;'), + Field('epsg', css_class='select2', style='width:100%;'), + css_class=f'col-md-{ffc[0]}' + ), + Div( + Field('editor1', css_class='select2', style='width:100%;'), + Field('editor2', css_class='select2', style='width:100%;'), + css_class=f'col-md-{ffc[1]}' + ), + Div( + Field('editorgroup', css_class='select2', style='width:100%;'), + Field('viewergroup', css_class='select2', style='width:100%;'), + css_class=f'col-md-{ffc[2]}' + ), + css_class='row' + ) + ) + + class Meta: + fields = '__all__' diff --git a/g3w-admin/core/locale/it/LC_MESSAGES/django.mo b/g3w-admin/core/locale/it/LC_MESSAGES/django.mo index e116f1ac9..fc8aa6d02 100644 Binary files a/g3w-admin/core/locale/it/LC_MESSAGES/django.mo and b/g3w-admin/core/locale/it/LC_MESSAGES/django.mo differ diff --git a/g3w-admin/core/locale/it/LC_MESSAGES/django.po b/g3w-admin/core/locale/it/LC_MESSAGES/django.po index 2e7efafc0..8a4212fed 100644 --- a/g3w-admin/core/locale/it/LC_MESSAGES/django.po +++ b/g3w-admin/core/locale/it/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-02 05:55+0000\n" +"POT-Creation-Date: 2024-05-27 08:03+0000\n" "PO-Revision-Date: 2023-11-30 12:06+0100\n" "Last-Translator: \n" "Language-Team: \n" @@ -18,194 +18,233 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.4.1\n" -#: core/admin.py:16 +#: admin.py:25 msgid "Basic settings" msgstr "Configurazioni di base" -#: core/admin.py:19 +#: admin.py:28 msgid "Access settings" msgstr "Accesso configurazioni" -#: core/admin.py:23 +#: admin.py:32 msgid "Display settings" msgstr "Mostra le configurazioni" -#: core/admin.py:27 +#: admin.py:36 msgid "Additional settings" msgstr "Configurazioni accessorie" -#: core/api/base/views.py:143 +#: api/base/views.py:144 msgid "Data are not correct or insufficent!" msgstr "I dati non sono corretti o insufficienti!" -#: core/api/base/views.py:149 +#: api/base/views.py:150 msgid "A error server is occured!" msgstr "Si è verificato un errore server!" -#: core/api/base/views.py:157 +#: api/base/views.py:158 msgid "Not found" msgstr "Non trovato" -#: core/api/base/views.py:163 +#: api/base/views.py:164 msgid "Permission denied" msgstr "Permesso negato" -#: core/api/views.py:39 +#: api/views.py:47 msgid "Expression evaluation error." msgstr "Errore nella valutazione dell'espressione." -#: core/api/views.py:44 +#: api/views.py:52 msgid "Expression parse error." msgstr "Errore di analisi dell'espressione." -#: core/api/views.py:50 +#: api/views.py:58 msgid "Expression empty error." msgstr "Errore di espressione vuota." -#: core/api/views.py:56 +#: api/views.py:64 msgid "Expression form data error." msgstr "Errore nei dati del modulo di espressione." -#: core/api/views.py:62 +#: api/views.py:70 msgid "Layer error." msgstr "Errore sul layer." -#: core/configs.py:11 +#: configs.py:11 msgid "Search" msgstr "Ricerca" -#: core/configs.py:28 +#: configs.py:28 msgid "Law" msgstr "Normativa" -#: core/forms.py:42 core/forms.py:364 +#: forms.py:55 forms.py:425 msgid "General data" msgstr "Dati generali" -#: core/forms.py:65 +#: forms.py:80 msgid "GEO data" msgstr "GEO dati" -#: core/forms.py:86 +#: forms.py:101 msgid "Base Layers and Map default features" msgstr "Layers di base e caratteristiche di default della mappa" -#: core/forms.py:113 +#: forms.py:128 msgid "Logo/Picture" msgstr "Logo/Immagine" -#: core/forms.py:141 +#: forms.py:155 msgid "Copyright" msgstr "" -#: core/forms.py:195 +#: forms.py:201 +#, python-brace-format +msgid "" +"SRID EPSG:{srid} is not equal to current projects srid EPSG:{layer_srid}" +msgstr "" + +#: forms.py:236 msgid "Frontend home data" msgstr "Dati home" -#: core/forms.py:220 +#: forms.py:261 msgid "Frontend about data" msgstr "Dati chi siamo" -#: core/forms.py:241 +#: forms.py:282 msgid "Frontend groups map data" msgstr "Dati gruppi di mappa del frontend" -#: core/forms.py:257 +#: forms.py:298 msgid "Frontend login data" msgstr "Dati login frontend" -#: core/forms.py:275 +#: forms.py:316 msgid "Frontend social data" msgstr "Dati social media" -#: core/forms.py:297 +#: forms.py:338 msgid "Map client data" msgstr "Dati del client di mappa" -#: core/forms.py:323 +#: forms.py:356 +#, fuzzy +#| msgid "Description" +msgid "Registration" +msgstr "Descrizione" + +#: forms.py:382 msgid "Editor users" msgstr "Utenti Editor" -#: core/forms.py:341 +#: forms.py:402 msgid "ACL Users" msgstr "ACL Utenti" -#: core/forms.py:371 +#: forms.py:434 +#, fuzzy +#| msgid "" +#| "Attention! This settigns are valid only for map groups with only " +#| "one MacroGroup" msgid "" -"Attention! This settigns are valid only for map groups with only one " +"Attention! These settings are valid only for map groups with only one " "MacroGroup" msgstr "" "Attenzione! Le seguenti impostazioni sono valide solo per Gruppi di " "mappe appartenenti ad un unico MacroGruppo" -#: core/models.py:84 +#: forms.py:475 +msgid "Macro cartographic group" +msgstr "Macrogruppo cartografico" + +#: forms.py:477 +#, fuzzy +#| msgid "Editor level 1 user" +msgid "Editor level 1" +msgstr "Utente Editor" + +#: forms.py:478 +#, fuzzy +#| msgid "Editor level 2 user" +msgid "Editor level 2" +msgstr "Utente Editor 2" + +#: forms.py:479 +msgid "User editor group" +msgstr "Gruppo utenti editor" + +#: forms.py:480 +msgid "User viewer group" +msgstr "Gruppo utenti viewer" + +#: models.py:85 msgid "Map control" msgstr "Controllo di mappa" -#: core/models.py:85 +#: models.py:86 msgid "Map controls" msgstr "Controlli di mappa" -#: core/models.py:93 +#: models.py:94 msgid "Identification name" msgstr "Identificativo" -#: core/models.py:94 +#: models.py:95 msgid "Internal identification Macrogroup name" msgstr "Identificativo interno del Macrogruppo" -#: core/models.py:95 core/models.py:132 core/models.py:409 -#: core/templates/core/ajax/macrogroup_detail.html:7 -#: core/templates/core/macrogroup_list_table.html:28 +#: models.py:96 models.py:132 models.py:416 +#: templates/core/ajax/macrogroup_detail.html:7 +#: templates/core/macrogroup_list_table.html:28 msgid "Title" msgstr "Titolo" -#: core/models.py:96 core/models.py:133 -#: core/templates/core/ajax/macrogroup_detail.html:9 +#: models.py:97 models.py:133 templates/core/ajax/macrogroup_detail.html:9 msgid "Description" msgstr "Descrizione" -#: core/models.py:97 core/models.py:140 +#: models.py:98 models.py:140 msgid "Logo image" msgstr "Immagine logo" -#: core/models.py:98 core/models.py:141 +#: models.py:99 models.py:142 msgid "Logo link" msgstr "Link logo" -#: core/models.py:99 core/models.py:142 +#: models.py:100 models.py:143 msgid "Enter link with http:// or https//" msgstr "Il link deve contenere http:// or https//" -#: core/models.py:100 +#: models.py:101 msgid "Use title for client" msgstr "Utilizza il titolo per il client" -#: core/models.py:101 core/models.py:166 +#: models.py:102 models.py:167 msgid "Use logo image for client" msgstr "Utilizza il logo per il client" -#: core/models.py:104 core/models.py:135 +#: models.py:105 models.py:135 msgid "Slug" msgstr "" -#: core/models.py:131 +#: models.py:131 msgid "Name" msgstr "Nome" -#: core/models.py:137 +#: models.py:137 msgid "Is active" msgstr "Attivo" -#: core/models.py:158 +#: models.py:159 msgid "Terms of use text" msgstr "Termi di utilizzo" -#: core/models.py:161 +#: models.py:162 msgid "Terms of use link" msgstr "Link termini di utilizzo" -#: core/models.py:167 +#: models.py:168 msgid "" "As for MacroGroup options is possible to use current logo group as client " "logo, if MacroGroup option is active this options takes precendence" @@ -214,340 +253,375 @@ msgstr "" "del gruppo corrente come logo del client, se l'opzione MacroGruppo è attiva " "questa opzione ha la precedenza" -#: core/models.py:400 core/templates/core/group_form.html:11 +#: models.py:407 templates/core/group_form.html:11 msgid "Group" msgstr "Gruppo" -#: core/models.py:401 +#: models.py:408 msgid "Project type" msgstr "Tipo di progetto" -#: core/models.py:402 +#: models.py:409 msgid "Project type id" msgstr "Id tipo di progetto" -#: core/models.py:410 +#: models.py:417 msgid "Subtitle" msgstr "Sottotitolo" -#: core/models.py:411 +#: models.py:418 msgid "Home description" msgstr "Descrizione home" -#: core/models.py:412 +#: models.py:419 msgid "About title" msgstr "Titolo sezione 'Il progetto'" -#: core/models.py:413 +#: models.py:420 msgid "About description" msgstr "Descrizione pagina 'Il progetto'" -#: core/models.py:414 +#: models.py:421 msgid "About name" msgstr "Nome del progetto" -#: core/models.py:415 +#: models.py:422 msgid "About phone" msgstr "Telefono del progetto" -#: core/models.py:416 +#: models.py:423 msgid "About email" msgstr "Email del progetto" -#: core/models.py:417 +#: models.py:424 msgid "About address" msgstr "Indirizzo del progetto" -#: core/models.py:418 +#: models.py:425 msgid "Groups title" msgstr "Titolo pagina gruppi cartografici" -#: core/models.py:419 +#: models.py:426 msgid "Groups map description" msgstr "Descrizione pagina gruppi cartografici" -#: core/models.py:420 +#: models.py:427 msgid "Login title" msgstr "Titolo sezione 'Il progetto'" -#: core/models.py:421 +#: models.py:428 msgid "Login description" msgstr "Descrizione pagina di login" -#: core/models.py:422 +#: models.py:429 msgid "Suite logo" msgstr "Logo del progetto" -#: core/models.py:423 +#: models.py:430 msgid "Suite logo URL" msgstr "URL del logo della suite" -#: core/models.py:426 +#: models.py:431 +msgid "Registration introductory message" +msgstr "" + +#: models.py:434 msgid "Credits" msgstr "" -#: core/models.py:429 +#: models.py:437 msgid "Main map title" msgstr "Titolo principale della mappa" -#: core/models.py:431 +#: models.py:439 msgid "Facebook link" msgstr "" -#: core/models.py:432 +#: models.py:440 msgid "Twitter link" msgstr "" -#: core/models.py:433 +#: models.py:441 msgid "Google+ link" msgstr "" -#: core/models.py:434 +#: models.py:442 msgid "Youtube link" msgstr "" -#: core/models.py:435 +#: models.py:443 msgid "Instagram link" msgstr "" -#: core/models.py:436 +#: models.py:444 msgid "Flickr link" msgstr "" -#: core/models.py:437 +#: models.py:445 msgid "Tripadvisor link" msgstr "" -#: core/templates/core/403_MGC.html:7 core/templates/core/403_MPC.html:7 +#: models.py:459 +msgid "NotSet" +msgstr "" + +#: models.py:460 +msgid "Info" +msgstr "" + +#: models.py:461 +msgid "Warning" +msgstr "" + +#: models.py:462 +msgid "Debug" +msgstr "" + +#: models.py:463 +msgid "Error" +msgstr "" + +#: models.py:464 +msgid "Fatal" +msgstr "" + +#: templates/core/403_MGC.html:7 templates/core/403_MPC.html:7 msgid "error page" msgstr "Pagine di errore" -#: core/templates/core/403_MGC.html:15 core/templates/core/403_MPC.html:15 +#: templates/core/403_MGC.html:15 templates/core/403_MPC.html:15 msgid "Access denied" msgstr "Accesso negato" -#: core/templates/core/403_MGC.html:17 +#: templates/core/403_MGC.html:17 msgid "You can't add new Group" msgstr "Non puoi aggiungere un nuovo Gruppo" -#: core/templates/core/403_MPC.html:17 +#: templates/core/403_MPC.html:17 msgid "You can't add new Project" msgstr "Non puoi aggiungere un nuovo Progetto" -#: core/templates/core/ajax/group_detail.html:5 +#: templates/core/ajax/group_detail.html:5 msgid "Geografic component" msgstr "Componente geografica" -#: core/templates/core/ajax/group_detail.html:7 +#: templates/core/ajax/group_detail.html:7 msgid "Geographic coordinate system" msgstr "Sistema di coordinate geografiche" -#: core/templates/core/ajax/group_detail.html:8 +#: templates/core/ajax/group_detail.html:8 msgid "SRID" msgstr "" -#: core/templates/core/ajax/group_detail.html:9 +#: templates/core/ajax/group_detail.html:9 msgid "Units" msgstr "Unità" -#: core/templates/core/ajax/group_detail.html:10 +#: templates/core/ajax/group_detail.html:10 msgid "Principal map" msgstr "Mappa principale" -#: core/templates/core/ajax/group_detail.html:11 +#: templates/core/ajax/group_detail.html:11 msgid "Max scale" msgstr "Massima scala" -#: core/templates/core/ajax/group_detail.html:12 +#: templates/core/ajax/group_detail.html:12 msgid "Min scale" msgstr "Minima scala" -#: core/templates/core/ajax/group_detail.html:13 +#: templates/core/ajax/group_detail.html:13 msgid "Overview Map" msgstr "Mappa di riferimento" -#: core/templates/core/ajax/group_detail.html:14 +#: templates/core/ajax/group_detail.html:14 msgid "Panoramic max scale" msgstr "Scala massima della mappa panoramica" -#: core/templates/core/ajax/group_detail.html:15 +#: templates/core/ajax/group_detail.html:15 msgid "Panoramic min scale" msgstr "Scala minima della mappa panoramica" -#: core/templates/core/ajax/group_detail.html:18 +#: templates/core/ajax/group_detail.html:18 msgid "Users" msgstr "Utenti" -#: core/templates/core/ajax/group_detail.html:21 +#: templates/core/ajax/group_detail.html:21 msgid "Editor level 1 user" msgstr "Utente Editor" -#: core/templates/core/ajax/group_detail.html:25 +#: templates/core/ajax/group_detail.html:25 msgid "Editor level 2 user" msgstr "Utente Editor 2" -#: core/templates/core/ajax/group_detail.html:26 +#: templates/core/ajax/group_detail.html:26 msgid "Viewer users" msgstr "Utenti Viewers" -#: core/templates/core/ajax/group_detail.html:27 +#: templates/core/ajax/group_detail.html:27 msgid "Editor user groups" msgstr "Gruppi utenti editor" -#: core/templates/core/ajax/group_detail.html:28 +#: templates/core/ajax/group_detail.html:28 msgid "Viewer user groups" msgstr "Gruppi utenti viewer" -#: core/templates/core/ajax/group_detail.html:35 +#: templates/core/ajax/group_detail.html:35 msgid "Interface component" msgstr "Componente di interfaccia" -#: core/templates/core/ajax/group_detail.html:37 +#: templates/core/ajax/group_detail.html:37 msgid "Interface language" msgstr "Lingua interfaccia" -#: core/templates/core/ajax/group_detail.html:38 +#: templates/core/ajax/group_detail.html:38 msgid "Language" msgstr "Lingua" -#: core/templates/core/ajax/group_detail.html:39 +#: templates/core/ajax/group_detail.html:39 msgid "Associated logo" msgstr "Logo associato" -#: core/templates/core/ajax/group_detail.html:40 +#: templates/core/ajax/group_detail.html:40 msgid "HeaderLogoImg" msgstr "" -#: core/templates/core/ajax/group_detail.html:48 +#: templates/core/ajax/group_detail.html:48 msgid "HeaderLogoHeight" msgstr "" -#: core/templates/core/ajax/group_detail.html:49 +#: templates/core/ajax/group_detail.html:49 msgid "HeaderLogoLink" msgstr "" -#: core/templates/core/ajax/group_detail.html:50 +#: templates/core/ajax/group_detail.html:50 msgid "Terms of use" msgstr "Condizioni di utilizzo" -#: core/templates/core/ajax/group_detail.html:51 +#: templates/core/ajax/group_detail.html:51 msgid "HeaderTermsOfUseText" msgstr "" -#: core/templates/core/ajax/group_detail.html:52 +#: templates/core/ajax/group_detail.html:52 msgid "HeaderTermsOfUseLink" msgstr "" -#: core/templates/core/ajax/macrogroup_detail.html:5 +#: templates/core/ajax/macrogroup_detail.html:5 msgid "Data" msgstr "" -#: core/templates/core/ajax/macrogroup_detail.html:11 -#: core/templates/core/macrogroup_list_table.html:29 +#: templates/core/ajax/macrogroup_detail.html:11 +#: templates/core/macrogroup_list_table.html:29 msgid "Groups" msgstr "Gruppi" -#: core/templates/core/django_file_form/upload_template.html:5 -msgid "Drop files here to upload" -msgstr "Rilascia i files qui per caricarli" - -#: core/templates/core/django_file_form/upload_template.html:8 -msgid "Click or Drag file to Upload" -msgstr "Clicca o trascina i file per caricarlo" - -#: core/templates/core/django_file_form/upload_template.html:11 -msgid "Processing dropped files..." -msgstr "Processamento dei file inviati..." - -#: core/templates/core/django_file_form/upload_template.html:24 -msgid "Cancel" -msgstr "Annulla" - -#: core/templates/core/django_file_form/upload_template.html:25 -msgid "Retry" -msgstr "Riprova" - -#: core/templates/core/django_file_form/upload_template.html:26 -#: core/templates/core/group_list.html:103 -#: core/templates/core/macrogroup_list.html:83 -#: core/templates/core/macrogroup_list_table.html:43 -#: core/templates/core/project_list.html:71 -msgid "Delete" -msgstr "Elimina" - -#: core/templates/core/generalsuitedata_form.html:11 +#: templates/core/generalsuitedata_form.html:11 msgid "General suite data" msgstr "Dati generali della suite" -#: core/templates/core/generalsuitedata_form.html:24 -#: core/templates/core/group_form.html:45 -#: core/templates/core/macrogroup_form.html:51 +#: templates/core/generalsuitedata_form.html:24 +#: templates/core/group_form.html:45 templates/core/macrogroup_form.html:51 msgid "Alert" msgstr "Attenzione" -#: core/templates/core/generalsuitedata_form.html:25 -#: core/templates/core/group_form.html:46 -#: core/templates/core/macrogroup_form.html:52 +#: templates/core/generalsuitedata_form.html:25 +#: templates/core/group_form.html:46 templates/core/macrogroup_form.html:52 msgid "Some errors on form. Check it and send again." msgstr "Si sono verificati alcuni errori sul form. Controlla e reinvia." -#: core/templates/core/group_form.html:33 -msgid "Current" -msgstr "Corrente" +#: templates/core/group_deactive_list.html:10 +#, fuzzy +#| msgid "Cartographic groups" +msgid "Cartographic groups deactivated" +msgstr "Gruppi cartografici" -#: core/templates/core/group_form.html:33 -#: core/templates/core/group_list.html:78 -#: core/templates/core/project_list.html:11 +#: templates/core/group_deactive_list.html:34 templates/core/group_list.html:97 +#: templates/core/search/group.html:25 +msgid "Group projects" +msgstr "Progetti del gruppo" + +#: templates/core/group_deactive_list.html:34 templates/core/group_form.html:33 +#: templates/core/group_list.html:97 templates/core/project_list.html:11 msgid "Projects" msgstr "Progetti" -#: core/templates/core/group_list.html:10 -#: core/templates/core/search/group.html:9 +#: templates/core/group_deactive_list.html:41 +#: templates/core/group_list.html:104 templates/core/macrogroup_list.html:66 +#: templates/core/macrogroup_list_table.html:37 +#: templates/core/project_list.html:75 templates/core/project_list.html:77 +#: templates/core/search/group.html:24 templates/core/search/macrogroup.html:22 +msgid "Show detail" +msgstr "Mostra i dettagli" + +#: templates/core/group_deactive_list.html:50 +#, fuzzy +#| msgid "Redo/Back" +msgid "Redo/Active" +msgstr "Annulla/indietro" + +#: templates/core/group_deactive_list.html:59 +#: templates/core/macrogroup_list.html:83 +#: templates/core/macrogroup_list_table.html:43 +msgid "Delete" +msgstr "Elimina" + +#: templates/core/group_deactive_list.html:62 +msgid "Warning: deleting the group will delete the projects it contains!" +msgstr "" +"Attenzione: cancellando il gruppo cancellerai anche i progetti in esso " +"contenuti!" + +#: templates/core/group_form.html:33 +msgid "Current" +msgstr "Corrente" + +#: templates/core/group_list.html:10 templates/core/search/group.html:9 msgid "Cartographic groups" msgstr "Gruppi cartografici" -#: core/templates/core/group_list.html:66 -msgid "Add new project" -msgstr "Aggiungi un nuovo progetto" +#: templates/core/group_list.html:51 +msgid "Filter by" +msgstr "Filtra per" -#: core/templates/core/group_list.html:78 -#: core/templates/core/search/group.html:25 -msgid "Group projects" -msgstr "Progetti del gruppo" +#: templates/core/group_list.html:60 +msgid "Filter" +msgstr "Filtra" -#: core/templates/core/group_list.html:85 -#: core/templates/core/macrogroup_list.html:66 -#: core/templates/core/macrogroup_list_table.html:37 -#: core/templates/core/project_list.html:65 -#: core/templates/core/search/group.html:24 -#: core/templates/core/search/macrogroup.html:22 -msgid "Show detail" -msgstr "Mostra i dettagli" +#: templates/core/group_list.html:85 +msgid "Add new project" +msgstr "Aggiungi un nuovo progetto" -#: core/templates/core/group_list.html:94 -#: core/templates/core/macrogroup_list.html:74 -#: core/templates/core/macrogroup_list_table.html:40 -#: core/templates/core/project_list.html:68 -#: core/templates/core/search/group.html:28 -#: core/templates/core/search/macrogroup.html:24 +#: templates/core/group_list.html:113 templates/core/macrogroup_list.html:74 +#: templates/core/macrogroup_list_table.html:40 +#: templates/core/project_list.html:82 templates/core/project_list.html:84 +#: templates/core/search/group.html:28 templates/core/search/macrogroup.html:24 msgid "Edit" msgstr "Modifica" -#: core/templates/core/group_list.html:106 -msgid "Warning: deleting the group will delete the projects it contains!" +#: templates/core/group_list.html:122 +msgid "Delete/Deactivate" +msgstr "" + +#: templates/core/group_list.html:125 +#, fuzzy +#| msgid "Warning: deleting the group will delete the projects it contains!" +msgid "" +"Warning: deleting the group (move to bucket) will delete " +"the projects it contains (move to the bucket)!" msgstr "" "Attenzione: cancellando il gruppo cancellerai anche i progetti in esso " "contenuti!" -#: core/templates/core/include/add_project.html:4 +#: templates/core/include/add_project.html:4 msgid "Add project" msgstr "Aggiungi un nuovo progetto" -#: core/templates/core/include/add_project.html:10 -msgid "Select project type do add:" +#: templates/core/include/add_project.html:10 +#, fuzzy +#| msgid "Select project type do add:" +msgid "Select project type to add:" msgstr "Selezione il tipo di progetto da aggiungere:" -#: core/templates/core/include/cookieconsent.html:11 +#: templates/core/include/cookieconsent.html:11 msgid "" "This website uses cookies to ensure you get the best experience on our " "website" @@ -555,80 +629,101 @@ msgstr "" "Questo sito utilizza i cookie per garantire una buona usabilità " "all'utilizzatore finale" -#: core/templates/core/include/cookieconsent.html:12 +#: templates/core/include/cookieconsent.html:12 msgid "Got it" msgstr "Capito" -#: core/templates/core/include/form_buttons.html:7 +#: templates/core/include/form_buttons.html:7 msgid "Save" msgstr "Salva" -#: core/templates/core/include/form_buttons.html:13 +#: templates/core/include/form_buttons.html:13 msgid "Redo/Back" msgstr "Annulla/indietro" -#: core/templates/core/macrogroup_form.html:10 +#: templates/core/macrogroup_form.html:10 msgid "Macro Group" msgstr "Macro Gruppo" -#: core/templates/core/macrogroup_form.html:24 +#: templates/core/macrogroup_form.html:24 msgid "Current groups" msgstr "Gruppi cartografici" -#: core/templates/core/macrogroup_list.html:10 -#: core/templates/core/macrogroup_list_table.html:10 -#: core/templates/core/search/macrogroup.html:8 +#: templates/core/macrogroup_list.html:10 +#: templates/core/macrogroup_list_table.html:10 +#: templates/core/search/macrogroup.html:8 msgid "Cartographic macro groups" msgstr "Macro Gruppi cartografici" -#: core/templates/core/macrogroup_list_table.html:21 +#: templates/core/macrogroup_list_table.html:21 msgid "Macro group" msgstr "Macro Gruppo cartografico" -#: core/templates/core/tags/add_layer.html:3 +#: templates/core/tags/add_layer.html:3 msgid "Layer" msgstr "" -#: core/templates/core/tags/add_project.html:7 +#: templates/core/tags/add_project.html:7 msgid "Project" msgstr "Progetto" -#: core/utils/data.py:24 +#: utils/data.py:24 msgid "[{} error on {}({})]-- {}" msgstr "[{} errore su {}({})]-- {}" -#: core/utils/forms.py:23 +#: utils/forms.py:23 msgid "Default base layer" msgstr "Layer base di default" -#: core/utils/forms.py:50 +#: utils/forms.py:50 msgid "MACRO Groups" msgstr "Macro Gruppi" -#: core/utils/qgisapi.py:458 +#: utils/qgisapi.py:511 msgid "Function \"{}\" is not allowed for security reasons!" msgstr "La funzione \"{}\" non è consentita per motivi di sicurezza!" -#: core/utils/qgisapi.py:463 +#: utils/qgisapi.py:516 msgid "Variable \"{}\" is not allowed for security reasons!" msgstr "La variabile \"{}\" non è consentita per motivi di sicurezza!" -#: core/utils/qgisapi.py:475 +#: utils/qgisapi.py:528 utils/qgisapi.py:545 msgid "QGIS layer with id \"{}\" could not be found!" msgstr "Impossibile trovare il layer QGIS con ID \"{}\"!" -#: core/utils/qgisapi.py:487 +#: utils/qgisapi.py:551 msgid "QDjango project with id \"{}\" could not be found!" msgstr "Impossibile trovare il progetto QDjango con ID \"{}\"!" -#: core/utils/qgisapi.py:497 +#: utils/qgisapi.py:561 msgid "A valid QGIS layer is required to process form data!" msgstr "Per elaborare i dati del modulo è necessario un layer QGIS valido!" -#: core/utils/structure.py:183 +#: utils/qgisapi.py:575 +#, fuzzy +#| msgid "A valid QGIS layer is required to process form data!" +msgid "A valid QGIS layer (parent layer) is required to process form data!" +msgstr "Per elaborare i dati del modulo è necessario un layer QGIS valido!" + +#: utils/structure.py:187 msgid "Yes" msgstr "Si" +#~ msgid "Drop files here to upload" +#~ msgstr "Rilascia i files qui per caricarli" + +#~ msgid "Click or Drag file to Upload" +#~ msgstr "Clicca o trascina i file per caricarlo" + +#~ msgid "Processing dropped files..." +#~ msgstr "Processamento dei file inviati..." + +#~ msgid "Cancel" +#~ msgstr "Annulla" + +#~ msgid "Retry" +#~ msgstr "Riprova" + #~ msgid "lang" #~ msgstr "Lunguaggio" diff --git a/g3w-admin/core/templates/core/group_list.html b/g3w-admin/core/templates/core/group_list.html index 8b8084221..34222398d 100644 --- a/g3w-admin/core/templates/core/group_list.html +++ b/g3w-admin/core/templates/core/group_list.html @@ -43,7 +43,26 @@

{% trans 'Cartographic groups' %}

{% block main_content %} - +
+
+
+
+ +

{% trans 'Filter by' %}

+
+ +
+
+
+
+ {% crispy filter_form %} + +
+
+
+
+
{% for object in object_list %} {% get_obj_perms user for object as "userObj_perms" %} diff --git a/g3w-admin/core/views.py b/g3w-admin/core/views.py index 273588561..68a4114b4 100644 --- a/g3w-admin/core/views.py +++ b/g3w-admin/core/views.py @@ -15,12 +15,17 @@ from django.utils.decorators import method_decorator from django.views.decorators.csrf import csrf_exempt from guardian.decorators import permission_required -from guardian.shortcuts import get_objects_for_user, get_anonymous_user +from guardian.shortcuts import ( + get_objects_for_user, + get_anonymous_user, + get_objects_for_group +) from usersmanage.mixins.views import G3WACLViewMixin from usersmanage.decorators import user_passes_test_or_403 -from usersmanage.utils import get_users_for_object -from usersmanage.configs import G3W_EDITOR1 -from .forms import GroupForm, GeneralSuiteDataForm, MacroGroupForm +from usersmanage.utils import get_users_for_object, userHasGroups +from usersmanage.configs import G3W_EDITOR1, G3W_EDITOR2 +from usersmanage.models import User, Group as AuthGroup +from .forms import GroupForm, GeneralSuiteDataForm, MacroGroupForm, GroupFilterForm from .models import Group, GroupProjectPanoramic, MapControl, GeneralSuiteData, MacroGroup from .mixins.views import G3WRequestViewMixin, G3WAjaxDeleteViewMixin, G3WAjaxSetOrderViewMixin from .signals import after_update_group, execute_search_on_models @@ -105,17 +110,101 @@ def get_context_data(self, **kwargs): class GroupListView(ListView): """List group view.""" + def set_filters(self): + """ Set filters by URL GET parameters """ + + self.filter_parameters = {} + if 'macrogroup' in self.request.GET and self.request.GET['macrogroup']: + self.filter_parameters['macrogroup'] = { + 'use': True, + 'value': self.request.GET['macrogroup'], + 'qs_filter': {'macrogroups__id': self.request.GET['macrogroup']} + } + + if 'epsg' in self.request.GET and self.request.GET['epsg']: + self.filter_parameters['epsg'] = { + 'use': True, + 'value': self.request.GET['epsg'], + 'qs_filter': {'srid_id': self.request.GET['epsg']} + } + + # Filter for Users role + aclfparams = { + 'editor1': (User, G3W_EDITOR1, 'change_group', get_objects_for_user), + 'editor2': (User, G3W_EDITOR2, 'view_group', get_objects_for_user), + 'editorgroup': (AuthGroup, 'editor', 'view_group', get_objects_for_group), + 'viewergroup': (AuthGroup, 'viewer', 'view_group', get_objects_for_group), + } + + gspk = set() + for fp, dt in aclfparams.items(): + if fp in self.request.GET and self.request.GET[fp]: + + # Add to self.fitler_params for to use after in initials form values + self.filter_parameters[fp] = { + 'use': False, + 'value': self.request.GET[fp] + } + + try: + eu = dt[0].objects.get(pk=self.request.GET[fp]) + + if (dt[3] == get_objects_for_user and isinstance(eu, User) and userHasGroups(eu, [dt[1]]) or + dt[3] == get_objects_for_group and isinstance(eu, AuthGroup) and eu.grouprole.role == dt[1]): + gbeu = dt[3](eu, dt[2], Group) + gspk = gspk.union(set([g.pk for g in gbeu])) + except Exception as e: + print(e) + pass + + + if gspk: + self.filter_parameters['users'] = { + 'use': True, + 'value': gspk, + 'qs_filter': {'pk__in': list(gspk)} + } + + def setup(self, request, *args, **kwargs): + super(GroupListView, self).setup(request, *args, **kwargs) + + # Set filter parameters + self.set_filters() + def _is_active(self, qs): """ Add a filter fo is_active property """ return qs.filter(is_active=1) + def get_queryset(self): qs = get_objects_for_user(self.request.user, 'core.view_group', Group) #| get_objects_for_user(get_anonymous_user(), 'core.view_group', Group) qs = self._is_active(qs) qs = qs.order_by('order') + + # Check for filter GET parameters + for k, f in self.filter_parameters.items(): + if f['use']: + qs = qs.filter(**f['qs_filter']) + return qs + def get_context_data(self, *, object_list=None, **kwargs): + context = super(GroupListView, self).get_context_data(object_list=object_list, **kwargs) + + # Initial forms data + initials = {k: f['value'] for k, f in self.filter_parameters.items()} + + + # Set filter form + context['filter_form'] = GroupFilterForm(request=self.request, + initial={k: f['value'] for k, f in self.filter_parameters.items()}) + + context['collapsed_filter_form'] = False if self.filter_parameters else True + + return context + + class GroupDeactiveListView(GroupListView): """ ListView to show map groups with is_active=0""" diff --git a/g3w-admin/usersmanage/locale/it/LC_MESSAGES/django.mo b/g3w-admin/usersmanage/locale/it/LC_MESSAGES/django.mo index 187011d8f..18f0e2550 100644 Binary files a/g3w-admin/usersmanage/locale/it/LC_MESSAGES/django.mo and b/g3w-admin/usersmanage/locale/it/LC_MESSAGES/django.mo differ diff --git a/g3w-admin/usersmanage/locale/it/LC_MESSAGES/django.po b/g3w-admin/usersmanage/locale/it/LC_MESSAGES/django.po index ba0032b76..338f9c553 100644 --- a/g3w-admin/usersmanage/locale/it/LC_MESSAGES/django.po +++ b/g3w-admin/usersmanage/locale/it/LC_MESSAGES/django.po @@ -69,7 +69,7 @@ msgstr "" #: forms.py:311 msgid "User editor groups" -msgstr "" +msgstr "Gruppi di utenti Viewers" #: forms.py:318 #, fuzzy