Ejemplo n.º 1
0
class BaseDetail(div):
    editable = False
    nperm_names = ['read']

    def __init__(self,
                 data,
                 history,
                 label_suffix=':',
                 display_only=None,
                 sections=None,
                 layout_class=SectionDetailLayout,
                 is_nested=False,
                 all_no_access=False,
                 *content,
                 **kwd):
        super(BaseDetail, self).__init__(*content, **kwd)
        self.tag = u''
        self.media_files.append('/css/details.css')

        self.history = history
        self.data = data or {}
        if data is not None:
            if not isinstance(data,
                              types.DictType):  # data is some corba object
                self.data = data.__dict__
            else:  # data is dict
                self.data = data

        self.label_suffix = label_suffix
        self.layout_class = layout_class
        self.is_nested = is_nested
        self.all_no_access = all_no_access

        # check if display_only contains correct field names
        if display_only:
            for field_name in display_only:
                if self.base_fields.get(field_name) is None:
                    raise RuntimeError(
                        _('Incorrect field name "%s" specified in %s. display_only list!'
                          ) % (field_name, repr(self)))

        self.display_only = display_only

        # Sections can be defined as class attribute of detail, so take care
        # to create attribute but not override it, if it already exists.
        if getattr(self, 'sections', None) is None:
            self.sections = None
        if sections is not None:
            self.sections = sections

        self.fields = None
        self.filter_base_fields()
        self.build_fields()
        self.set_fields_values()

        # if self.section is None, create one default section with all fields:
        if self.sections is None or sections == 'all_in_one':
            self.sections = [[None, self.fields.keys()]]

    def filter_base_fields(self):
        """ Filters base fields against user negative permissions,
            so if user has nperm on field we delete it from base_fields.
        """
        user = cherrypy.session.get('user', None)
        if user is None:
            self.base_fields = SortedDict({})
        else:
            self.base_fields = SortedDict([
                (name, field) for name, field in self.base_fields.items()
                if not self.display_only or field.name in self.display_only
            ])

    def build_fields(self):
        user = cherrypy.session.get('user', None)
        if user is None:
            self.fields = SortedDict({})
        else:
            self.fields = self.base_fields.deepcopy()
            object_name = self.get_object_name()
            for field in self.fields.values():
                field_nperm = field.get_nperm()
                if self.all_no_access or user.check_nperms(
                    ['%s.%s.%s' % (nperm_name, object_name, field_nperm) for \
                        nperm_name in self.nperm_names], 'one'):
                    field.access = False
                field.owner_detail = self

    def set_fields_values(self):
        for field in self.fields.values():
            field.value = field.value_from_data(self.data)

    @classmethod
    def get_object_name(cls):
        return cls.__name__[:-len('Detail')].lower()

    def add_to_bottom(self):
        ''' Usualy used for filterpanel and/or edit link. '''
        if self.editable:
            self.add(
                p(
                    a(
                        attr(href=u'../edit/?id=' +
                             unicode(self.data.get('id'))), _('Edit'))))

    def render(self, indent_level=0):
        self.content = [
        ]  # empty previous content (if render would be called moretimes, there would be multiple forms instead one )
        self.add(self.layout_class(self))
        if self.check_nperms():
            # TODO: render error!
            return div("ERROR NO PERMS").render()
            pass
        if not self.is_nested:
            self.add_to_bottom()
        return super(BaseDetail, self).render(indent_level)

    def check_nperms(self):
        return False

    @classmethod
    def get_nperms(cls):
        nperms = []
        for field in cls.base_fields.values():
            field_nperm = field.get_nperm()
            field_nperms = [
                '%s.%s.%s' % (nperm_name, cls.get_object_name(), field_nperm)
                for nperm_name in cls.nperm_names
            ]
            nperms.extend(field_nperms)
        return nperms
Ejemplo n.º 2
0
class BaseDetail(div):
    editable = False
    nperm_names = ['read']
    
    def __init__(self, data, history, label_suffix=':', display_only = None, 
                 sections = None, layout_class=SectionDetailLayout,
                 is_nested = False, all_no_access=False, *content, **kwd):
        super(BaseDetail, self).__init__(*content, **kwd)
        self.tag = u''
        self.media_files.append('/css/details.css')

        self.history = history
        self.data = data or {}
        if data is not None:
            if not isinstance(data, types.DictType): # data is some corba object
                self.data = data.__dict__
            else: # data is dict
                self.data = data
            
        self.label_suffix = label_suffix
        self.layout_class = layout_class
        self.is_nested = is_nested
        self.all_no_access = all_no_access
        
        # check if display_only contains correct field names
        if display_only:
            for field_name in display_only:
                if self.base_fields.get(field_name) is None:
                    raise RuntimeError(_('Incorrect field name "%s" specified in %s. display_only list!') % (field_name, repr(self)))
             
        self.display_only = display_only
        
        # Sections can be defined as class attribute of detail, so take care
        # to create attribute but not override it, if it already exists.
        if getattr(self, 'sections', None) is None: 
            self.sections = None
        if sections is not None:
            self.sections = sections

        self.fields = None
        self.filter_base_fields()
        self.build_fields()
        self.set_fields_values()

        # if self.section is None, create one default section with all fields:
        if self.sections is None or sections == 'all_in_one':
            self.sections = [[None, self.fields.keys()]]

    def filter_base_fields(self):
        """ Filters base fields against user negative permissions, 
            so if user has nperm on field we delete it from base_fields.
        """
        user = cherrypy.session.get('user', None)
        if user is None:
            self.base_fields = SortedDict({})
        else:
            self.base_fields = SortedDict(
                [(name, field) for name, field in self.base_fields.items() 
                    if not self.display_only or field.name in self.display_only])
    
    def build_fields(self):
        user = cherrypy.session.get('user', None)
        if user is None:
            self.fields = SortedDict({})
        else:
            self.fields = self.base_fields.deepcopy()
            object_name = self.get_object_name()
            for field in self.fields.values():
                field_nperm = field.get_nperm()
                if self.all_no_access or user.check_nperms(
                    ['%s.%s.%s' % (nperm_name, object_name, field_nperm) for \
                        nperm_name in self.nperm_names], 'one'):
                            field.access = False
                field.owner_detail = self
        
    def set_fields_values(self):
        for field in self.fields.values():
            if field.access:
                field.value = field.value_from_data(self.data)
            else:
                field.value = field.value_from_data({}) # emtpy dict as there are no data
                field.make_content_no_access()
    
    @classmethod
    def get_object_name(cls):
        return cls.__name__[:-len('Detail')].lower()
    
    def add_to_bottom(self):
        ''' Usualy used for filterpanel and/or edit link. '''
        if self.editable:
            self.add(p(a(attr(href=u'../edit/?id=' + unicode(self.data.get('id'))), _('Edit'))))
    
    def render(self, indent_level=0):
        self.content = [] # empty previous content (if render would be called moretimes, there would be multiple forms instead one )
        self.add(self.layout_class(self))
        if self.check_nperms():
            # TODO: render error!
            return div("ERROR NO PERMS").render()
            pass
        if not self.is_nested:
            self.add_to_bottom()
        return super(BaseDetail, self).render(indent_level)        

    def check_nperms(self):
        return False
    
    @classmethod
    def get_nperms(cls):
        nperms = []
        for field in cls.base_fields.values():
            field_nperm = field.get_nperm()
            field_nperms = ['%s.%s.%s' % (nperm_name, cls.get_object_name(), field_nperm) for nperm_name in cls.nperm_names]
            nperms.extend(field_nperms)
        return nperms