From e27e035869dbc3a06050bbbc32f5f289d88e2c5b Mon Sep 17 00:00:00 2001 From: wlorenzetti Date: Tue, 30 Jan 2024 14:47:57 +0100 Subject: [PATCH 1/7] Basic filter bar for group list. --- g3w-admin/core/forms.py | 23 +++++++++++++- g3w-admin/core/templates/core/group_list.html | 21 ++++++++++++- g3w-admin/core/views.py | 30 ++++++++++++++++++- 3 files changed, 71 insertions(+), 3 deletions(-) diff --git a/g3w-admin/core/forms.py b/g3w-admin/core/forms.py index 7616ae9d8..9f65899dc 100644 --- a/g3w-admin/core/forms.py +++ b/g3w-admin/core/forms.py @@ -1,7 +1,7 @@ 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, ugettext_lazy as _ from core.models import Group, GeneralSuiteData, MacroGroup @@ -461,3 +461,24 @@ def save(self, commit=True): return instance +class GroupFilterForm(G3WFormMixin, Form): + """Group filter form.""" + + macrogroup = ModelChoiceField(queryset=MacroGroup.objects.all(), required=False) + + def __init__(self, *args, **kwargs): + super(GroupFilterForm, self).__init__(*args, **kwargs) + self.helper = FormHelper(self) + self.helper.form_tag = False + self.helper.layout = Layout( + Div( + Div( + 'macrogroup', + css_class='col-md-12' + ), + css_class='row' + ) + ) + + class Meta: + fields = '__all__' diff --git a/g3w-admin/core/templates/core/group_list.html b/g3w-admin/core/templates/core/group_list.html index 8b8084221..f3a406fc1 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..c467f4129 100644 --- a/g3w-admin/core/views.py +++ b/g3w-admin/core/views.py @@ -20,7 +20,7 @@ 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 .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 +105,45 @@ def get_context_data(self, **kwargs): class GroupListView(ListView): """List group view.""" + def setup(self, request, *args, **kwargs): + super(GroupListView, self).setup(request, *args, **kwargs) + + # Set filter parameters + self.filter_parameters = {} + if 'macrogroup' in self.request.GET and self.request.GET['macrogroup']: + self.filter_parameters['macrogroup'] = { + 'value': self.request.GET['macrogroup'], + 'qs_filter': {'macrogroups__id': self.request.GET['macrogroup']} + } + 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(): + 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) + + # Set filter form + context['filter_form'] = GroupFilterForm(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""" From 86efa12d2640c2fad223b05d7e6514842f730a0c Mon Sep 17 00:00:00 2001 From: wlorenzetti Date: Wed, 10 Apr 2024 15:35:40 +0200 Subject: [PATCH 2/7] Change style of filter box. --- g3w-admin/core/templates/core/group_list.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/g3w-admin/core/templates/core/group_list.html b/g3w-admin/core/templates/core/group_list.html index f3a406fc1..280bcc401 100644 --- a/g3w-admin/core/templates/core/group_list.html +++ b/g3w-admin/core/templates/core/group_list.html @@ -45,12 +45,12 @@

{% trans 'Cartographic groups' %}

-
+

{% trans 'Filter by' %}

-
From d9b8ebc06af3cf121061c0637b9a37d6b1e198e8 Mon Sep 17 00:00:00 2001 From: wlorenzetti Date: Fri, 12 Apr 2024 12:30:14 +0200 Subject: [PATCH 3/7] Add `Epsg` to group filter. --- g3w-admin/core/forms.py | 6 +++++- g3w-admin/core/views.py | 5 +++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/g3w-admin/core/forms.py b/g3w-admin/core/forms.py index 996001f4b..8d752b6d0 100644 --- a/g3w-admin/core/forms.py +++ b/g3w-admin/core/forms.py @@ -18,6 +18,7 @@ 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,10 +462,12 @@ def save(self, commit=True): return instance + class GroupFilterForm(G3WFormMixin, Form): """Group filter form.""" macrogroup = ModelChoiceField(queryset=MacroGroup.objects.all(), required=False) + epsg = ModelChoiceField(queryset=G3WSpatialRefSys.objects.all(), required=False) def __init__(self, *args, **kwargs): super(GroupFilterForm, self).__init__(*args, **kwargs) @@ -473,7 +476,8 @@ def __init__(self, *args, **kwargs): self.helper.layout = Layout( Div( Div( - 'macrogroup', + Field('macrogroup', css_class='select2', style='width:100%;'), + Field('epsg', css_class='select2', style='width:100%;'), css_class='col-md-12' ), css_class='row' diff --git a/g3w-admin/core/views.py b/g3w-admin/core/views.py index c467f4129..e62decbc7 100644 --- a/g3w-admin/core/views.py +++ b/g3w-admin/core/views.py @@ -115,6 +115,11 @@ def setup(self, request, *args, **kwargs): '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'] = { + 'value': self.request.GET['epsg'], + 'qs_filter': {'srid_id': self.request.GET['epsg']} + } def _is_active(self, qs): """ Add a filter fo is_active property """ From f777a2b260c14835f19cc37107ae35dd05b4736e Mon Sep 17 00:00:00 2001 From: wlorenzetti Date: Fri, 26 Apr 2024 09:09:41 +0200 Subject: [PATCH 4/7] Get Macrogroups list by user. --- g3w-admin/core/forms.py | 7 ++++++- g3w-admin/core/views.py | 3 ++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/g3w-admin/core/forms.py b/g3w-admin/core/forms.py index 8d752b6d0..91a4bbd4a 100644 --- a/g3w-admin/core/forms.py +++ b/g3w-admin/core/forms.py @@ -463,7 +463,7 @@ def save(self, commit=True): return instance -class GroupFilterForm(G3WFormMixin, Form): +class GroupFilterForm(G3WFormMixin, G3WRequestFormMixin, Form): """Group filter form.""" macrogroup = ModelChoiceField(queryset=MacroGroup.objects.all(), required=False) @@ -471,6 +471,11 @@ class GroupFilterForm(G3WFormMixin, Form): def __init__(self, *args, **kwargs): super(GroupFilterForm, self).__init__(*args, **kwargs) + + # For Editor Level 1 users + self.fields['macrogroup'].queryset = get_objects_for_user(self.request.user, 'view_macrogroup', + MacroGroup) + self.helper = FormHelper(self) self.helper.form_tag = False self.helper.layout = Layout( diff --git a/g3w-admin/core/views.py b/g3w-admin/core/views.py index e62decbc7..93773576e 100644 --- a/g3w-admin/core/views.py +++ b/g3w-admin/core/views.py @@ -142,7 +142,8 @@ def get_context_data(self, *, object_list=None, **kwargs): context = super(GroupListView, self).get_context_data(object_list=object_list, **kwargs) # Set filter form - context['filter_form'] = GroupFilterForm(initial={k: f['value'] for k, f in self.filter_parameters.items()}) + 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 From 9e38f4297ef8f59cb17b010beda2a86e70900b35 Mon Sep 17 00:00:00 2001 From: wlorenzetti Date: Wed, 22 May 2024 10:58:46 +0200 Subject: [PATCH 5/7] Filter EPSG on every groups user can view. --- g3w-admin/core/forms.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/g3w-admin/core/forms.py b/g3w-admin/core/forms.py index 91a4bbd4a..c61d39e76 100644 --- a/g3w-admin/core/forms.py +++ b/g3w-admin/core/forms.py @@ -476,6 +476,16 @@ def __init__(self, *args, **kwargs): self.fields['macrogroup'].queryset = get_objects_for_user(self.request.user, 'view_macrogroup', MacroGroup) + # Filter EPSG: only where available in current groups + self.fields['epsg'].queryset = (G3WSpatialRefSys.objects.filter( + srid__in=get_objects_for_user(self.request.user, 'view_group', Group).values('srid')) + .order_by('srid')) + + + + + + self.helper = FormHelper(self) self.helper.form_tag = False self.helper.layout = Layout( From f5fd8a2aba5505834a5aa47204ea8744efb13dbb Mon Sep 17 00:00:00 2001 From: wlorenzetti Date: Fri, 24 May 2024 14:27:31 +0200 Subject: [PATCH 6/7] Add map groups filter by ACL --- g3w-admin/core/forms.py | 75 +++++++++++++++++++++++++++++++++++------ g3w-admin/core/views.py | 73 ++++++++++++++++++++++++++++++++++----- 2 files changed, 128 insertions(+), 20 deletions(-) diff --git a/g3w-admin/core/forms.py b/g3w-admin/core/forms.py index c61d39e76..8bc1dbf0e 100644 --- a/g3w-admin/core/forms.py +++ b/g3w-admin/core/forms.py @@ -6,7 +6,7 @@ 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,7 +14,13 @@ 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 * @@ -468,32 +474,79 @@ class GroupFilterForm(G3WFormMixin, G3WRequestFormMixin, Form): macrogroup = ModelChoiceField(queryset=MacroGroup.objects.all(), required=False) epsg = ModelChoiceField(queryset=G3WSpatialRefSys.objects.all(), required=False) + editor1 = ModelChoiceField(queryset=User.objects.all(), required=False) + editor2 = ModelChoiceField(queryset=User.objects.all(), required=False) + editorgroup = ModelChoiceField(queryset=AuthGroup.objects.all(), required=False) + viewergroup = ModelChoiceField(queryset=AuthGroup.objects.all(), required=False) def __init__(self, *args, **kwargs): super(GroupFilterForm, self).__init__(*args, **kwargs) - # For Editor Level 1 users - self.fields['macrogroup'].queryset = get_objects_for_user(self.request.user, 'view_macrogroup', - MacroGroup) + # 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: - # Filter EPSG: only where available in current groups - self.fields['epsg'].queryset = (G3WSpatialRefSys.objects.filter( - srid__in=get_objects_for_user(self.request.user, 'view_group', Group).values('srid')) - .order_by('srid')) + 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( + Div( Field('macrogroup', css_class='select2', style='width:100%;'), Field('epsg', css_class='select2', style='width:100%;'), - css_class='col-md-12' + 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' ) diff --git a/g3w-admin/core/views.py b/g3w-admin/core/views.py index 93773576e..68a4114b4 100644 --- a/g3w-admin/core/views.py +++ b/g3w-admin/core/views.py @@ -15,11 +15,16 @@ 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 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 @@ -105,22 +110,67 @@ def get_context_data(self, **kwargs): class GroupListView(ListView): """List group view.""" - def setup(self, request, *args, **kwargs): - super(GroupListView, self).setup(request, *args, **kwargs) + def set_filters(self): + """ Set filters by URL GET parameters """ - # Set filter parameters self.filter_parameters = {} if 'macrogroup' in self.request.GET and self.request.GET['macrogroup']: self.filter_parameters['macrogroup'] = { - 'value': self.request.GET['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'] = { - 'value': self.request.GET['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) @@ -134,13 +184,18 @@ def get_queryset(self): # Check for filter GET parameters for k, f in self.filter_parameters.items(): - qs = qs.filter(**f['qs_filter']) + 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()}) From 4fa166bb2699300ba59649d08bf64116b410dfa3 Mon Sep 17 00:00:00 2001 From: wlorenzetti Date: Mon, 27 May 2024 10:30:09 +0200 Subject: [PATCH 7/7] Update i18n --- g3w-admin/core/forms.py | 10 +- .../core/locale/it/LC_MESSAGES/django.mo | Bin 8684 -> 8317 bytes .../core/locale/it/LC_MESSAGES/django.po | 495 +++++++++++------- g3w-admin/core/templates/core/group_list.html | 2 +- .../locale/it/LC_MESSAGES/django.mo | Bin 6218 -> 6286 bytes .../locale/it/LC_MESSAGES/django.po | 2 +- 6 files changed, 302 insertions(+), 207 deletions(-) diff --git a/g3w-admin/core/forms.py b/g3w-admin/core/forms.py index 8bc1dbf0e..388825fd3 100644 --- a/g3w-admin/core/forms.py +++ b/g3w-admin/core/forms.py @@ -472,12 +472,12 @@ def save(self, commit=True): class GroupFilterForm(G3WFormMixin, G3WRequestFormMixin, Form): """Group filter form.""" - macrogroup = ModelChoiceField(queryset=MacroGroup.objects.all(), required=False) + macrogroup = ModelChoiceField(label=_('Macro cartographic group'), queryset=MacroGroup.objects.all(), required=False) epsg = ModelChoiceField(queryset=G3WSpatialRefSys.objects.all(), required=False) - editor1 = ModelChoiceField(queryset=User.objects.all(), required=False) - editor2 = ModelChoiceField(queryset=User.objects.all(), required=False) - editorgroup = ModelChoiceField(queryset=AuthGroup.objects.all(), required=False) - viewergroup = ModelChoiceField(queryset=AuthGroup.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) diff --git a/g3w-admin/core/locale/it/LC_MESSAGES/django.mo b/g3w-admin/core/locale/it/LC_MESSAGES/django.mo index e116f1ac92e4a74bf091eaf1d7475eb82e59ca7f..fc8aa6d02fdec9d5a5215e699dccaa5ee4cd3db8 100644 GIT binary patch delta 2925 zcmY+_4NR3)9LMoL^5Bn;(EPYu8~|HE-1RZw%n{N zOYhvWwen@N=~`{xS-QDq>FnL5t(nEtMs01m(F?8Ca`ye*d)(^T^M5|)oclcIoacYe z1J~!@sEu67N!e>Swh&{9!DM6J#LtIt;b>1YCLe=XiQ91~p2Q41gV}fi)3F~p&48`{ zZB6Az-JgTQ(McFF6%;s4Ete74fVW{QzKCt82L`biQ-&FniKVFfXW|%aK+U<${=Ob{ z|5KQQ2Qd|oBVCzOm}Mfyd`uyQhRdi9uULOWJ($Y0DVi}@gcETz)}u1!#XE4TZGROt z&@qf>3f1o!%)?8let%Ir@;$k zbGH3!%%$Fk>gRXNLZwsvWMf2y5(*k%7EZzj)Xc-EiEKr-h1r4XXeVmTUqPkvC~D2$ zMLqWc>b}pc-=OaM5tV^oZ9Pr-XHq7YY0+j%P&ZbgI+%;y;%^V7P@K3D9RHjYQ)F5*+%TNyn zQK^2$w!eU-)b}HOn@>?|d=0fkKcP0;AnLgcD%uOVsI@P~k^25C?GN>+4ws|e=xLmc zuUkLC3DgHsdm)cm=}ihzFEAO$<1EzPX+gb!ALALr+0=KUCiD?z===YY0;jpcMQ`#K zs-sNur-3T0)u;|@Y<($Cq`ne$|2Aa*nuDkb#Zdizh+4Wn)cpgfeslS&6;Yvpf@WNd znrS(5np!T(#A;OPdQtc7u=U-j&G&}&EhIVSBx>M`Sb*1Udm5c-A``4L#*%+^Tu*~K zT8{eM)}q!hi2543u^696Ex|jeHT(+o#{H<24%+$+RHiZ+UF}6!iDg)ht*GZ-Dj@&* ztoGBO&2t!)fwyrEo<>c?j7zi+L%rcR)F!RA^+x-909Vl7i^}Xp>t*CL*SI)%6ZK+F zq%cvaLOrk;@5LtDz6-UMhp-8cVG^b|iA)T^66$5hvYIB;n{}WEm9@phRN^5*hx&V% z;N7(Ujd_BYO{^hUD)S(rqmAI}G2N=zW5cZiE+uM-7D9(ou65UvY9p^Dbm)JIzLW+7uZaZB|3p(7&e zDQR18w7)c48}Ke$7SnB6JM2zE-(Z<-tHVWvOH3mkAtn;q{&R^QLPsybXBR&zxGqrY z@1{_mXp3KCSJN(fq9=w;jV5Kd(Onte4i9#O{jRBt7vB#-C_UwaL~@g{J$|Vnb--Z((^BNx-6Rj delta 3338 zcmZA1ZERFk9>?)Br7i-kmQthz3#V0l04bF!DAq~^1rb48l!aX%E;F~&3)8v7y>}`F z+1b@-B>3F=fWDDLsfm)^WR%8e42c-C1~Qt1yN$sPHD9hR5+i{0Mo$Y_BoqT-=Rk z;IsG#{5$Hs!`OuHpeFP=YAz{yRsAWb_ZzXE{>_z~sDT@iKFlVp!!)X)1WAf{2-U%` za}?{jehulv{0m$01kS>rPy;xNUguy3>iz~)J6UX`f3uqtH8kQLjA8@Vui+AW4^PKQ zOkW+ivkC$P`8+n^6P1m;A1rY~o91cf zOSqovH&7kbG7UKcwHcdGd!xhMUxQ1yUXQ$D{)TFJ1iSG7YNtY9K6J5u_;vG2NF=`?sNL6zXwJBdm&GR_Tmtdr*7hQB>*=xci4u4If3#^gp-&r!hUb z6wg5qHIaL<1xHYO=`haF_kV;FrS5&a0>3~Fpp_k^0W3t?HkYGj(2Hs)KyAK#&c{$0 z+3&6op)&F^s{RS&12Lyi13H6Im(*}GCtAa0s2A3v8s6dDi5hVUHPF3C8|E40XT~^a zpzovVed?}HqBi3X&dJS{i8LTT)7DJ>mHKsDX#l=+C#u1Hs0Q|5Z&6D%b8cm(^HDQjipuC8-F*+0sc0_w*Ms}GaS1+*ZFtmG{2sMgs^?Wc!y43e zJzj*fQ5ji{SK(&V0QbB5&!Z+dhT6REx$7_8b5pX6iU;+mly7%NNZ)1%`I)CU==rPI ziAPWwIECY13DdlZ>lUoS7?qJhoR3c<+sYh4?ST`R!qNpC))9+|8wnMq@Mc0IRtbqK z37^oQ))Ok*2sL^q(MSBg^m5~B;#R^E8ZcX7e87C&rl0%v2&rtRl7(TCPomiZ=6x@iYE0QGaM!hNYUn)^mXPGck$S zLM$gH%4$y561ygDpgvob>xh8RTHj8n=+jiWp3vH#rwdBHg1N>i)c>y~;!Iz|kh`{L1bD=LqrH9a_JB?UGsH`EXh=jP9XdxC5jl@b~C!w;Nn5X{##K{ukTH;coo%pqM zZtdz$5?cW(&BxY@d^_mnf{YFGxgpyZMs~m}*lZLQ3$eX3 zNct-e!n|*9@X}GZT2D;3^`nTov0sj-zMZPhr~TaUvYPfexgfpW@?cfuWo=)O^KBB^ zn+v(n%MAN9Nza^u>t!;_%YD}e5Q~sDnB+DD1>q1>1kl&FdtSDLya&O+JYb1)lsof2y7-$j_87e7m?iY z*S(A_=J^Hba3WLG4oz=h-+aLi`ce6Attention! 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 280bcc401..34222398d 100644 --- a/g3w-admin/core/templates/core/group_list.html +++ b/g3w-admin/core/templates/core/group_list.html @@ -57,7 +57,7 @@

{% trans 'Filter by' %}

{% crispy filter_form %} - +
diff --git a/g3w-admin/usersmanage/locale/it/LC_MESSAGES/django.mo b/g3w-admin/usersmanage/locale/it/LC_MESSAGES/django.mo index 187011d8f31b12c212c14b094f412f544f4f172b..18f0e255020ab75ee3ca0b6380eebf738b7c5886 100644 GIT binary patch delta 1733 zcmXxlOKeP09LMp0(VC*I4#ul!tEL`p8KvIORv(nH=z<0zsYi*lT9b&R83a*_Nu;q+ zBK7KyN-d-kK}eBU5D_cHYe5&4P9z=)-{0+-lm6#(?!D)p$N!v}KA#s0Mc?^{oj1xx zB8xaV#B4A24da7yCdF(&w&G2UV;Wu^ZWhGbn2K+mACW)n<6|tw(T}ME`MnZ%7+)Qb_+*e$3RPatF3c~l1%-SaE%c_)tIevh*ki@AP{3}8NHr}xI7t|y`< zoabFf&5GQEC8&YRa12(VX1X0`;91m)x=<5-f|}q59ESr~hN+B_ftxUZJ5c>bP!l$*G7|5gGVlNk@hNKHpGe=9MI)^=h?B7x)o~c7VU2r!7?*Q>9M|G~XA&>x zab1S$uO6dXK{FM`u+vCeJBPY|38!NhX5wqq-hV}{B#vtL8~L*|9%{vta2tkDnT(+( zdIclciE1|`o&7JMvLKxUkz}?D4{&{w{B>bJ($+dgo6W^rsENKut>7E#Y{XGp@CUU; znao!0g18Jr?)o6+aD4>z-i1u^ubFjlLo>aB+JYX};1P0;>=};7SI8XgoAVbg<=RIY z)K4j@<4R;M7Dn~A6Llu`x%)>@?OT<9r6Pt)@H%Rx?~%SOgIQ^BbC6rM26ev%YjBUd zzK5FN3)I$paehbj_XBm7a!8NfuRvuex|K=^l{%b>?WnzcjB5B2C*UX4%KoCx#8C3B zOyuJxEWyoq3d8sYLl|UrI#XLv{nVi{(=uq(V(!6Z%;&*fRH{Cp2Ixl({13Il6h3r+ zDyqXm+>YhQn05`-z6THCLsYwBKGtA0a@4#slk?}5d4qUg8x5|abgO8!jBV?P1%!Sj zRmukO4%BMuO0y2@L}DtjlF)=!5S7G6Vj-b}yPoih#@7K-QCgI$a$*jlgOeyFRJ3ZH zkvyV`PK>ZLcarvqHkQ#T|{%KtRkim+V4auq@n|&qHjR8S7YCC z7C}~xe-+-L0xKePP_qf8Uny5vMCjK}Tg%b$iVkQo!FKq)uYta!`bDcCHgq3M8Awjs rT~~j&p(%TBQ$wV&xx04M=hU{|fZx|_6-|-G#)h`dfyv#qf&Qfb=C_f7 delta 1683 zcmYk-OGs2v9LMp$Hkyu;rPX9U@{w8AXqu^++QZb!vDC|Y8zyr*}0aVA6NSo%Nl4cr>37CLtxDb=E#C=|eC6v!%8TPwQVLIgi zji|jN7^H2hCBrj2jhay_uEpyZgAY-AK8%{d7^>cTz@|FQbn7cFcrTc`o{ zp|<9Q>nN(dH>fi-i+VqiWzvddV*v(>$ZR0fjM~c{RK-GI#AfqMfMK$~w)!{H|X0P1)Ur;YjVLgWO zkUs1rs(u@`UX@%sL=$mpjL%bZDM6G~b|CGEFPdn%DmXmyx_lalG*4!8x4I)~6QYmfF3dBh%~ zfS6CLyzM3QjnAhHH?wH|2I_Cb{sm