Selaa lähdekoodia

HUE-8530 [organization] Support creating a new group

Romain 6 vuotta sitten
vanhempi
commit
39af21b5ef

+ 30 - 16
apps/useradmin/src/useradmin/forms.py

@@ -328,8 +328,7 @@ class AddLdapGroupsForm(forms.Form):
   )
   dn = forms.BooleanField(
       label=_t("Distinguished name"),
-      help_text=_t("Whether or not the group should be imported by "
-                "distinguished name."),
+      help_text=_t("Whether or not the group should be imported by distinguished name."),
       initial=False,
       required=False
   )
@@ -383,14 +382,9 @@ class GroupEditForm(forms.ModelForm):
 
   class Meta(object):
     model = Group
-    fields = ("name",)
-
-  def clean_name(self):
-    # Note that the superclass doesn't have a clean_name method.
-    data = self.cleaned_data["name"]
-    if not self.GROUPNAME.match(data):
-      raise forms.ValidationError(_("Group name may only contain letters, numbers, hyphens or underscores."))
-    return data
+    fields = ["name"]
+    if ENABLE_ORGANIZATIONS.get():
+      fields.append("organization")
 
   def __init__(self, *args, **kwargs):
     super(GroupEditForm, self).__init__(*args, **kwargs)
@@ -400,13 +394,15 @@ class GroupEditForm(forms.ModelForm):
     if self.instance.id:
       self.fields['name'].widget.attrs['readonly'] = True
       initial_members = User.objects.filter(groups=self.instance).order_by(ordering_field)
-      initial_perms = HuePermission.objects.filter(grouppermission__group=self.instance).order_by('app','description')
+      initial_perms = HuePermission.objects.filter(grouppermission__group=self.instance).order_by('app', 'description')
     else:
       initial_members = []
       initial_perms = []
 
     self.fields["members"] = _make_model_field(_("members"), initial_members, User.objects.order_by(ordering_field))
-    self.fields["permissions"] = _make_model_field(_("permissions"), initial_perms, HuePermission.objects.order_by('app','description'))
+    self.fields["permissions"] = _make_model_field(_("permissions"), initial_perms, HuePermission.objects.order_by('app', 'description'))
+    if 'organization' in self.fields:
+      self.fields['organization'] = forms.ChoiceField(choices=((default_organization().id, default_organization()),), initial=default_organization())
 
   def _compute_diff(self, field_name):
     current = set(self.fields[field_name].initial_objs)
@@ -420,6 +416,20 @@ class GroupEditForm(forms.ModelForm):
     self._save_members()
     self._save_permissions()
 
+  def clean_name(self):
+    # Note that the superclass doesn't have a clean_name method.
+    data = self.cleaned_data["name"]
+    if not self.GROUPNAME.match(data):
+      raise forms.ValidationError(_("Group name may only contain letters, numbers, hyphens or underscores."))
+    return data
+
+  def clean_organization(self):
+    try:
+      return Organization.objects.get(id=int(self.cleaned_data.get('organization')))
+    except:
+      LOG.exception('The organization does not exist.')
+      return None
+
   def _save_members(self):
     delete_membership, add_membership = self._compute_diff("members")
     for user in delete_membership:
@@ -488,11 +498,15 @@ def _make_model_field(label, initial, choices, multi=True):
       field.initial = initial.pk
   return field
 
+
 class SyncLdapUsersGroupsForm(forms.Form):
-  ensure_home_directory = forms.BooleanField(label=_t("Create Home Directories"),
-                                            help_text=_t("Create home directory for every user, if one doesn't already exist."),
-                                            initial=True,
-                                            required=False)
+  ensure_home_directory = forms.BooleanField(
+      label=_t("Create Home Directories"),
+      help_text=_t("Create home directory for every user, if one doesn't already exist."),
+      initial=True,
+      required=False
+  )
+
   def __init__(self, *args, **kwargs):
     super(SyncLdapUsersGroupsForm, self).__init__(*args, **kwargs)
     if get_server_choices():

+ 12 - 11
apps/useradmin/src/useradmin/templates/edit_group.mako

@@ -17,36 +17,37 @@
 import urllib
 
 from django.utils.translation import ugettext as _
+
 from desktop.lib.django_util import extract_field_data
 from desktop.views import commonheader, commonfooter
 %>
 
 <%namespace name="layout" file="layout.mako" />
 
-%if not is_embeddable:
+% if not is_embeddable:
 ${ commonheader(_('Hue Groups'), "useradmin", user, request) | n,unicode }
-%endif
-${layout.menubar(section='groups')}
+% endif
+${ layout.menubar(section='groups') }
 
 <%def name="render_field(field)">
-  %if not field.is_hidden:
+  % if not field.is_hidden:
     <% group_class = len(field.errors) and "error" or "" %>
     <div class="control-group ${group_class}">
       <label class="control-label" for="id_${field.html_name}">${field.label}</label>
     <div class="controls">
     ${unicode(field) | n}
     % if len(field.errors):
-        <span class="help-inline">${unicode(field.errors) | n}</span>
+      <span class="help-inline">${unicode(field.errors) | n}</span>
     % endif
     </div>
     </div>
-  %endif
+  % endif
 </%def>
 
 <div id="editGroupComponents" class="useradmin container-fluid">
   <div class="card card-small">
     % if name:
-        <h1 class="card-heading simple">${_('Hue Groups - Edit group: %(name)s') % dict(name=name)}</h1>
+        <h1 class="card-heading simple">${ _('Hue Groups - Edit group: %(name)s') % {'name': name} }</h1>
     % else:
       % if ldap:
           <h1 class="card-heading simple">${_('Hue Groups - Add/Sync LDAP group')}</h1>
@@ -61,7 +62,7 @@ ${layout.menubar(section='groups')}
       ${ csrf_token(request) | n,unicode }
       <fieldset>
         % for field in form:
-          ${render_field(field)}
+          ${ render_field(field) }
         % endfor
       </fieldset>
       <br/>
@@ -123,8 +124,8 @@ ${layout.menubar(section='groups')}
   });
 </script>
 
-${layout.commons()}
+${ layout.commons() }
 
-%if not is_embeddable:
+% if not is_embeddable:
 ${ commonfooter(request, messages) | n,unicode }
-%endif
+% endif

+ 12 - 6
apps/useradmin/src/useradmin/views.py

@@ -455,19 +455,23 @@ def edit_group(request, name=None):
 
   if request.method == 'POST':
     form = GroupEditForm(request.POST, instance=instance)
+
     if form.is_valid():
       form.save()
 
-      # Audit log
+      value_field = 'email' if ENABLE_ORGANIZATIONS.get() else 'username'
+
       if name is not None:
-        usernames = instance.user_set.all().values_list('username', flat=True)
+        usernames = instance.user_set.all().values_list(value_field, flat=True)
         request.audit = {
           'operation': 'EDIT_GROUP',
-          'operationText': 'Edited Group: %s, with member(s): %s' % (name, ', '.join([user.username for diffs in form._compute_diff("members") for user in diffs]) )
+          'operationText': 'Edited Group: %s, with member(s): %s' % (
+            name, ', '.join([user.username for diffs in form._compute_diff("members") for user in diffs])
+          )
         }
       else:
         user_ids = request.POST.getlist('members', [])
-        usernames = User.objects.filter(pk__in=user_ids).values_list('username', flat=True)
+        usernames = User.objects.filter(pk__in=user_ids).values_list(value_field, flat=True)
         request.audit = {
           'operation': 'CREATE_GROUP',
           'operationText': 'Created Group: %s, with member(s): %s' % (request.POST.get('name', ''), ', '.join(usernames))
@@ -482,8 +486,10 @@ def edit_group(request, name=None):
     form = GroupEditForm(instance=instance)
 
   if request.method == 'POST' and is_embeddable:
-    return JsonResponse(
-      {'status': -1, 'errors': [{'id': f.id_for_label, 'message': f.errors} for f in form if f.errors]})
+    return JsonResponse({
+      'status': -1,
+      'errors': [{'id': f.id_for_label, 'message': f.errors} for f in form if f.errors]
+    })
   else:
     return render('edit_group.mako', request, {
       'form': form,