blob: 9ac2d1542790f8aef3f64a89f6facdd83e826f09 [file] [log] [blame]
# Copyright 2016 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""A page for site admins to create a new user group."""
from __future__ import print_function
from __future__ import division
from __future__ import absolute_import
import logging
import re
from framework import exceptions
from framework import framework_helpers
from framework import permissions
from framework import servlet
from mrproto import usergroup_pb2
from sitewide import group_helpers
class GroupCreate(servlet.Servlet):
"""Shows a page with a simple form to create a user group."""
_PAGE_TEMPLATE = 'sitewide/group-create-page.ezt'
def AssertBasePermission(self, mr):
"""Assert that the user has the permissions needed to view this page."""
super(GroupCreate, self).AssertBasePermission(mr)
if not permissions.CanCreateGroup(mr.perms):
raise permissions.PermissionException(
'User is not allowed to create a user group')
def GatherPageData(self, _mr):
"""Build up a dictionary of data values to use when rendering the page."""
visibility_levels = group_helpers.BuildUserGroupVisibilityOptions()
initial_visibility = group_helpers.GroupVisibilityView(
usergroup_pb2.MemberVisibility.ANYONE)
group_types = group_helpers.BuildUserGroupTypeOptions()
return {
'groupadmin': '',
'group_types': group_types,
'import_group': '',
'initial_friendprojects': '',
'initial_group_type': '',
'initial_name': '',
'initial_visibility': initial_visibility,
'visibility_levels': visibility_levels,
}
def ProcessFormData(self, mr, post_data):
"""Process the posted form."""
# 1. Gather data from the request.
group_name = post_data.get('groupname')
try:
existing_group_id = self.services.user.LookupUserID(mr.cnxn, group_name)
existing_settings = self.services.usergroup.GetGroupSettings(
mr.cnxn, existing_group_id)
if existing_settings:
mr.errors.groupname = 'That user group already exists'
except exceptions.NoSuchUserException:
pass
if post_data.get('import_group'):
vis = usergroup_pb2.MemberVisibility.OWNERS
ext_group_type = post_data.get('group_type')
friend_projects = ''
if not ext_group_type:
mr.errors.groupimport = 'Please provide external group type'
else:
ext_group_type = str(
usergroup_pb2.GroupType(int(ext_group_type))).lower()
if (ext_group_type == 'computed' and
not group_name.startswith('everyone@')):
mr.errors.groupimport = 'Computed groups must be named everyone@'
else:
vis = usergroup_pb2.MemberVisibility(int(post_data['visibility']))
ext_group_type = None
friend_projects = post_data.get('friendprojects', '')
who_can_view_members = str(vis).lower()
if not mr.errors.AnyErrors():
project_ids, error = self.services.usergroup.ValidateFriendProjects(
mr.cnxn, self.services, friend_projects)
if error:
mr.errors.friendprojects = error
# 2. Call services layer to save changes.
if not mr.errors.AnyErrors():
group_id = self.services.usergroup.CreateGroup(
mr.cnxn, self.services, group_name, who_can_view_members,
ext_group_type, project_ids)
# 3. Determine the next page in the UI flow.
if mr.errors.AnyErrors():
self.PleaseCorrect(mr, initial_name=group_name)
else:
# Go to the new user group's detail page.
return framework_helpers.FormatAbsoluteURL(
mr, '/g/%s/' % group_id, include_project=False)
def GetGroupCreate(self, **kwargs):
return self.handler(**kwargs)
def PostGroupCreate(self, **kwargs):
return self.handler(**kwargs)