예제 #1
0
    def ProcessFormData(self, mr, post_data):
        """Validate and store the contents of the issues tracker admin page.

    Args:
      mr: commonly used info parsed from the request.
      post_data: HTML form data from the request.

    Returns:
      String URL to redirect the user to, or None if response was already sent.
    """

        config = self.services.config.GetProjectConfig(mr.cnxn, mr.project_id)
        parsed = template_helpers.ParseTemplateRequest(post_data, config)
        field_helpers.ShiftEnumFieldsIntoLabels(parsed.labels, [],
                                                parsed.field_val_strs, [],
                                                config)
        template = self.services.template.GetTemplateByName(
            mr.cnxn, parsed.name, mr.project_id)
        allow_edit = permissions.CanEditTemplate(mr.auth.effective_ids,
                                                 mr.perms, mr.project,
                                                 template)
        if not allow_edit:
            raise permissions.PermissionException(
                'User is not allowed edit this issue template.')

        if 'deletetemplate' in post_data:
            self.services.template.DeleteIssueTemplateDef(
                mr.cnxn, mr.project_id, template.template_id)
            return framework_helpers.FormatAbsoluteURL(mr,
                                                       urls.ADMIN_TEMPLATES,
                                                       deleted=1,
                                                       ts=int(time.time()))

        (admin_ids, owner_id, component_ids, field_values, phases,
         approvals) = template_helpers.GetTemplateInfoFromParsed(
             mr, self.services, parsed, config)

        if mr.errors.AnyErrors():
            field_views = tracker_views.MakeAllFieldValueViews(
                config, [], [], field_values, {})

            prechecked_approvals = template_helpers.GetCheckedApprovalsFromParsed(
                parsed.approvals_to_phase_idx)

            self.PleaseCorrect(
                mr,
                initial_members_only=ezt.boolean(parsed.members_only),
                template_name=parsed.name,
                initial_summary=parsed.summary,
                initial_must_edit_summary=ezt.boolean(
                    parsed.summary_must_be_edited),
                initial_content=parsed.content,
                initial_status=parsed.status,
                initial_owner=parsed.owner_str,
                initial_owner_defaults_to_member=ezt.boolean(
                    parsed.owner_defaults_to_member),
                initial_components=', '.join(parsed.component_paths),
                initial_component_required=ezt.boolean(
                    parsed.component_required),
                initial_admins=parsed.admin_str,
                labels=parsed.labels,
                fields=[
                    view for view in field_views
                    if view.field_def.type_name is not 'APPROVAL_TYPE'
                ],
                initial_add_approvals=ezt.boolean(parsed.add_approvals),
                initial_phases=[
                    tracker_pb2.Phase(name=name) for name in parsed.phase_names
                ],
                approvals=[
                    view for view in field_views
                    if view.field_def.type_name is 'APPROVAL_TYPE'
                ],
                prechecked_approvals=prechecked_approvals,
                required_approval_ids=parsed.required_approval_ids)
            return

        labels = [label for label in parsed.labels if label]
        self.services.template.UpdateIssueTemplateDef(
            mr.cnxn,
            mr.project_id,
            template.template_id,
            name=parsed.name,
            content=parsed.content,
            summary=parsed.summary,
            summary_must_be_edited=parsed.summary_must_be_edited,
            status=parsed.status,
            members_only=parsed.members_only,
            owner_defaults_to_member=parsed.owner_defaults_to_member,
            component_required=parsed.component_required,
            owner_id=owner_id,
            labels=labels,
            component_ids=component_ids,
            admin_ids=admin_ids,
            field_values=field_values,
            phases=phases,
            approval_values=approvals)

        return framework_helpers.FormatAbsoluteURL(mr,
                                                   urls.TEMPLATE_DETAIL,
                                                   template=template.name,
                                                   saved=1,
                                                   ts=int(time.time()))
예제 #2
0
    def GatherPageData(self, mr):
        """Build up a dictionary of data values to use when rendering the page.

    Args:
      mr: commonly used info parsed from the request.

    Returns:
      Dict of values used by EZT for rendering the page.
    """

        config = self.services.config.GetProjectConfig(mr.cnxn, mr.project_id)
        template = self.services.template.GetTemplateByName(
            mr.cnxn, mr.template_name, mr.project_id)
        template_view = tracker_views.IssueTemplateView(
            mr, template, self.services.user, config)
        with mr.profiler.Phase('making user views'):
            users_involved = tracker_bizobj.UsersInvolvedInTemplate(template)
            users_by_id = framework_views.MakeAllUserViews(
                mr.cnxn, self.services.user, users_involved)
            framework_views.RevealAllEmailsToMembers(mr.auth, mr.project,
                                                     users_by_id)
        field_name_set = {
            fd.field_name.lower()
            for fd in config.field_defs
            if fd.field_type is tracker_pb2.FieldTypes.ENUM_TYPE
            and not fd.is_deleted
        }
        non_masked_labels = tracker_bizobj.NonMaskedLabels(
            template.labels, field_name_set)

        field_views = tracker_views.MakeAllFieldValueViews(
            config,
            template.labels, [],
            template.field_values,
            users_by_id,
            phases=template.phases)

        (prechecked_approvals, required_approval_ids,
         initial_phases) = template_helpers.GatherApprovalsPageData(
             template.approval_values, template.phases, config)

        allow_edit = permissions.CanEditTemplate(mr.auth.effective_ids,
                                                 mr.perms, mr.project,
                                                 template)

        return {
            'admin_tab_mode':
            self._PROCESS_SUBTAB,
            'allow_edit':
            ezt.boolean(allow_edit),
            'new_template_form':
            ezt.boolean(False),
            'initial_members_only':
            template_view.members_only,
            'template_name':
            template_view.name,
            'initial_summary':
            template_view.summary,
            'initial_must_edit_summary':
            template_view.summary_must_be_edited,
            'initial_content':
            template_view.content,
            'initial_status':
            template_view.status,
            'initial_owner':
            template_view.ownername,
            'initial_owner_defaults_to_member':
            template_view.owner_defaults_to_member,
            'initial_components':
            template_view.components,
            'initial_component_required':
            template_view.component_required,
            'fields': [
                view for view in field_views
                if view.field_def.type_name is not 'APPROVAL_TYPE'
            ],
            'initial_add_approvals':
            ezt.boolean(prechecked_approvals),
            'initial_phases':
            initial_phases,
            'approvals': [
                view for view in field_views
                if view.field_def.type_name is 'APPROVAL_TYPE'
            ],
            'prechecked_approvals':
            prechecked_approvals,
            'required_approval_ids':
            required_approval_ids,
            'labels':
            non_masked_labels,
            'initial_admins':
            template_view.admin_names,
        }
예제 #3
0
    def __init__(self, mr, template, user_service, config):
        super(IssueTemplateView, self).__init__(template)

        self.ownername = ''
        try:
            self.owner_view = framework_views.MakeUserView(
                mr.cnxn, user_service, template.owner_id)
        except exceptions.NoSuchUserException:
            self.owner_view = None
        if self.owner_view:
            self.ownername = self.owner_view.email

        self.admin_views = list(
            framework_views.MakeAllUserViews(mr.cnxn, user_service,
                                             template.admin_ids).values())
        self.admin_names = ', '.join(
            sorted([admin_view.email for admin_view in self.admin_views]))

        self.summary_must_be_edited = ezt.boolean(
            template.summary_must_be_edited)
        self.members_only = ezt.boolean(template.members_only)
        self.owner_defaults_to_member = ezt.boolean(
            template.owner_defaults_to_member)
        self.component_required = ezt.boolean(template.component_required)

        component_paths = []
        for component_id in template.component_ids:
            component_paths.append(
                tracker_bizobj.FindComponentDefByID(component_id, config).path)
        self.components = ', '.join(component_paths)

        self.can_view = ezt.boolean(
            permissions.CanViewTemplate(mr.auth.effective_ids, mr.perms,
                                        mr.project, template))
        self.can_edit = ezt.boolean(
            permissions.CanEditTemplate(mr.auth.effective_ids, mr.perms,
                                        mr.project, template))

        field_name_set = {
            fd.field_name.lower()
            for fd in config.field_defs
            if fd.field_type is tracker_pb2.FieldTypes.ENUM_TYPE
            and not fd.is_deleted
        }  # TODO(jrobbins): restrictions
        non_masked_labels = [
            lab for lab in template.labels
            if not tracker_bizobj.LabelIsMaskedByField(lab, field_name_set)
        ]

        for i, label in enumerate(non_masked_labels):
            setattr(self, 'label%d' % i, label)
        for i in range(len(non_masked_labels), framework_constants.MAX_LABELS):
            setattr(self, 'label%d' % i, '')

        field_user_views = MakeFieldUserViews(mr.cnxn, template, user_service)

        self.field_values = []
        for fv in template.field_values:
            self.field_values.append(
                template_helpers.EZTItem(field_id=fv.field_id,
                                         val=tracker_bizobj.GetFieldValue(
                                             fv, field_user_views),
                                         idx=len(self.field_values)))

        self.complete_field_values = MakeAllFieldValueViews(
            config, template.labels, [], template.field_values,
            field_user_views)

        # Templates only display and edit the first value of multi-valued fields, so
        # expose a single value, if any.
        # TODO(jrobbins): Fully support multi-valued fields in templates.
        for idx, field_value_view in enumerate(self.complete_field_values):
            field_value_view.idx = idx
            if field_value_view.values:
                field_value_view.val = field_value_view.values[0].val
            else:
                field_value_view.val = None