def _filter_parse_expression(lexer, user_id): ''' Filter parser. Returns a BoundFilter, that is a filter reader to apply, that includes parameters. user_id is there only to check security priviledges. ''' try: lexem = next(lexer) except StopIteration: return EmptyBoundFilter() if lexem.type == FilterLexer.Lexem.Type.WORD and lexem.str == 'and': lexem = next(lexer) if lexem.type != FilterLexer.Lexem.Type.LPARENTHESIS: raise FilterSyntaxError( "Unexpected {!r}. Expected '('.".format(lexem)) subfilters = [] while True: subfilters.append(_filter_parse_expression(lexer, user_id)) lexem = next(lexer) if lexem.type == FilterLexer.Lexem.Type.RPARENTHESIS: break if lexem.type == FilterLexer.Lexem.Type.COMMA: continue raise FilterSyntaxError( "Unexpected {!r}. Expected ',' or ')'.".format(lexem)) return AndBoundFilter(*subfilters) if lexem.type == FilterLexer.Lexem.Type.WORD and lexem.str == 'or': lexem = next(lexer) if lexem.type != FilterLexer.Lexem.Type.LPARENTHESIS: raise FilterSyntaxError( "Unexpected {!r}. Expected '('.".format(lexem)) subfilters = [] while True: subfilters.append(_filter_parse_expression(lexer, user_id)) lexem = next(lexer) if lexem.type == FilterLexer.Lexem.Type.RPARENTHESIS: break if lexem.type == FilterLexer.Lexem.Type.COMMA: continue raise FilterSyntaxError( "Unexpected {!r}. Expected ',' or ')'.".format(lexem)) return OrBoundFilter(*subfilters) if lexem.type == FilterLexer.Lexem.Type.WORD and lexem.str == 'ffilter': lexem = next(lexer) if lexem.type != FilterLexer.Lexem.Type.LPARENTHESIS: raise FilterSyntaxError( "Unexpected {!r}. Expected '('.".format(lexem)) lexem = next(lexer) if lexem.type != FilterLexer.Lexem.Type.INT: raise FilterSyntaxError( "Unexpected {!r}. Expected INT.".format(lexem)) field_id = int(lexem.str) lexem = next(lexer) if lexem.type != FilterLexer.Lexem.Type.COMMA: raise FilterSyntaxError( "Unexpected {!r}. Expected ','.".format(lexem)) lexem = next(lexer) if lexem.type != FilterLexer.Lexem.Type.WORD: raise FilterSyntaxError( "Unexpected {!r}. Expected word.".format(lexem)) field_filter_name = lexem.str params = [] while True: lexem = next(lexer) if lexem.type == FilterLexer.Lexem.Type.RPARENTHESIS: break if lexem.type != FilterLexer.Lexem.Type.COMMA: raise FilterSyntaxError( "Unexpected {!r}. Expected ','.".format(lexem)) lexem = next(lexer) if lexem.type == FilterLexer.Lexem.Type.STRING: params.append(lexem.str) elif lexem.type == FilterLexer.Lexem.Type.INT: params.append(int(lexem.str)) field = ContactField.objects.get(pk=field_id) # Security check: user must have read access that field if not perms.c_can_view_fields_cg(user_id, field.contact_group_id): raise PermissionDenied filter = field.get_filter_by_name(field_filter_name) return filter.bind(*params) elif lexem.type == FilterLexer.Lexem.Type.WORD and lexem.str == 'gfilter': lexem = next(lexer) if lexem.type != FilterLexer.Lexem.Type.LPARENTHESIS: raise FilterSyntaxError( "Unexpected {!r}. Expected '('.".format(lexem)) lexem = next(lexer) if lexem.type != FilterLexer.Lexem.Type.INT: raise FilterSyntaxError( "Unexpected {!r}. Expected INT.".format(lexem)) group_id = int(lexem.str) lexem = next(lexer) if lexem.type != FilterLexer.Lexem.Type.COMMA: raise FilterSyntaxError( "Unexpected {!r}. Expected ','.".format(lexem)) lexem = next(lexer) if lexem.type != FilterLexer.Lexem.Type.WORD: raise FilterSyntaxError( "Unexpected {!r}. Expected word.".format(lexem)) group_filter_name = lexem.str params = [] while True: lexem = next(lexer) if lexem.type == FilterLexer.Lexem.Type.RPARENTHESIS: break if lexem.type != FilterLexer.Lexem.Type.COMMA: raise FilterSyntaxError( "Unexpected {!r}. Expected ','.".format(lexem)) lexem = next(lexer) if lexem.type == FilterLexer.Lexem.Type.STRING: params.append(lexem.str) elif lexem.type == FilterLexer.Lexem.Type.INT: params.append(int(lexem.str)) # Security check: user must have access to members list of that group if not perms.c_can_see_members_cg(user_id, group_id): raise PermissionDenied filter = (ContactGroup.objects.get(pk=group_id) .get_filter_by_name(group_filter_name)) return filter.bind(*params) elif lexem.type == FilterLexer.Lexem.Type.WORD and lexem.str == 'nfilter': lexem = next(lexer) if lexem.type != FilterLexer.Lexem.Type.LPARENTHESIS: raise FilterSyntaxError( "Unexpected {!r}. Expected '('.".format(lexem)) lexem = next(lexer) if lexem.type != FilterLexer.Lexem.Type.WORD: raise FilterSyntaxError( "Unexpected {!r}. Expected word.".format(lexem)) name_filter_name = lexem.str params = [] while True: lexem = next(lexer) if lexem.type == FilterLexer.Lexem.Type.RPARENTHESIS: break if lexem.type != FilterLexer.Lexem.Type.COMMA: raise FilterSyntaxError( "Unexpected {!r}. Expected ','.".format(lexem)) lexem = next(lexer) if lexem.type == FilterLexer.Lexem.Type.STRING: params.append(lexem.str) elif lexem.type == FilterLexer.Lexem.Type.INT: params.append(int(lexem.str)) filter = ContactNameMetaField.get_filter_by_name(name_filter_name) return filter.bind(*params) elif (lexem.type == FilterLexer.Lexem.Type.WORD and lexem.str == 'allevents'): lexem = next(lexer) if lexem.type != FilterLexer.Lexem.Type.LPARENTHESIS: raise FilterSyntaxError( "Unexpected {!r}. Expected '('.".format(lexem)) lexem = next(lexer) if lexem.type != FilterLexer.Lexem.Type.WORD: raise FilterSyntaxError( "Unexpected {!r}. Expected word.".format(lexem)) allevents_filter_name = lexem.str params = [] while True: lexem = next(lexer) if lexem.type == FilterLexer.Lexem.Type.RPARENTHESIS: break if lexem.type != FilterLexer.Lexem.Type.COMMA: raise FilterSyntaxError( "Unexpected {!r}. Expected ','.".format(lexem)) lexem = next(lexer) if lexem.type == FilterLexer.Lexem.Type.STRING: params.append(lexem.str) elif lexem.type == FilterLexer.Lexem.Type.INT: params.append(int(lexem.str)) filter = AllEventsMetaField.get_filter_by_name(allevents_filter_name) return filter.bind(*params) else: raise FilterSyntaxError("Unexpected {!r}.".format(lexem))
def visible_member_count(self, group): # This is totally ineficient if perms.c_can_see_members_cg(self.request.user.id, group.id): return group.get_members_count() else: return _('Not available')