def listing(self, page=1, direction='dsc', order_by='timestamp', format=None): "message listing" filters = session.get('filter_by', None) num_items = session.get('msgs_num_items', 50) if direction == 'dsc': sort = desc(order_by) else: sort = order_by messages = get_messages().order_by(sort) query = UserFilter(Session, c.user, messages) messages = query.filter() if filters: msgcount = get_msg_count() countquery = UserFilter(Session, c.user, msgcount) msgcount = countquery.filter() dynq = DynaQuery(Message, messages, filters) dynmsgq = DynaQuery(Message, msgcount, filters) messages = dynq.generate() msgcount = dynmsgq.generate() msgcount = msgcount.count() else: countquery = MsgCount(Session, c.user) msgcount = countquery.count() c.list_all = True c.order_by = order_by c.direction = direction pages = paginate.Page(messages, page=int(page), items_per_page=num_items, item_count=msgcount) if format == 'json': response.headers['Content-Type'] = 'application/json' data = convert_to_json(pages, direction=direction, order_by=order_by, section=None) return data c.page = pages return self.render('/messages/listing.html')
def search(self, format=None): "Search for messages" qry = request.GET.get('q', None) if qry is None: redirect(url(controller='messages', action='listing')) index = 'messages, messagesdelta, messages_rt' action = request.GET.get('a', 'listing') if action not in ['listing', 'quarantine', 'archive']: action = 'listing' if action == 'archive': index = 'archive archivedelta' try: page = int(request.GET.get('page', 1)) except ValueError: page = 1 num_items = session.get('msgs_search_num_results', 50) conn = SphinxClient() sphinxopts = extract_sphinx_opts(config['sphinx.url']) conn.SetServer(sphinxopts.get('host', '127.0.0.1')) conn.SetMatchMode(SPH_MATCH_EXTENDED2) if action == 'quarantine': conn.SetFilter('isquarantined', [ True, ]) if page == 1: conn.SetLimits(0, num_items, 500) else: offset = (page - 1) * num_items conn.SetLimits(offset, num_items, 500) if not c.user.is_superadmin: filter_sphinx(Session, c.user, conn) else: conn.SetSelect('timestamp') qry = clean_sphinx_q(qry) try: results = conn.Query(qry, index) except (socket.timeout, struct.error): redirect(request.path_qs) qry = restore_sphinx_q(qry) if results and results['matches']: ids = [hit['id'] for hit in results['matches']] filters = session.get('filter_by', None) if action == 'archive': messages = get_archived().filter(Archive.id.in_(ids)) query = UserFilter(Session, c.user, messages, True) messages = query.filter() if filters: dynq = DynaQuery(Message, messages, filters) messages = dynq.generate() else: messages = get_messages().filter(Message.id.in_(ids)) query = UserFilter(Session, c.user, messages) messages = query.filter() if filters: dynq = DynaQuery(Message, messages, filters) messages = dynq.generate() total_found = results['total'] search_time = results['time'] messages = messages.order_by(desc('timestamp')) else: messages = [] results = dict(matches=[], total=0) total_found = 0 search_time = 0 pages = paginator( dict(page=page, results_per_page=num_items, total=results['total'], items=len(results['matches']), q=qry)) if format == 'json': response.headers['Content-Type'] = 'application/json' data = dict(action=action, total_found=total_found, search_time=search_time, paginator=pages, items=[jsonify_msg_list(msg) for msg in messages]) return json.dumps(data) c.messages = messages c.action = action c.total_found = total_found c.search_time = search_time c.page = pages return self.render('/messages/searchresults.html')
def quarantine(self, page=1, direction='dsc', order_by='timestamp', section=None, format=None): "quarantined messages" filters = session.get('filter_by', None) num_items = session.get('msgs_num_items', 50) if direction == 'dsc': sort = desc(order_by) else: sort = order_by messages = get_messages().filter( Message.isquarantined == 1).order_by(sort) msgcount = get_msg_count().filter(Message.isquarantined == 1) query = UserFilter(Session, c.user, messages) countquery = UserFilter(Session, c.user, msgcount) messages = query.filter() msgcount = countquery.filter() if section: if section == 'spam': messages = messages.filter(Message.spam == 1) msgcount = messages.filter(Message.spam == 1) else: messages = messages.filter(Message.spam == 0) msgcount = messages.filter(Message.spam == 0) if filters: dynq = DynaQuery(Message, messages, filters) dynmsgq = DynaQuery(Message, msgcount, filters) messages = dynq.generate() msgcount = dynmsgq.generate() c.order_by = order_by c.direction = direction c.section = section msgcount = msgcount.count() c.form = BulkReleaseForm(request.POST, csrf_context=session) if request.method == 'POST': choices = session.get('bulk_items', []) else: pages = paginate.Page(messages, page=int(page), items_per_page=num_items, item_count=msgcount) choices = [(str(message.id), message.id) for message in pages.items] session['bulk_items'] = choices session.save() c.form.message_id.choices = choices if request.method == 'POST' and c.form.validate() and choices: msgs = Session.query(Message.id, Message.messageid, Message.from_address, Message.timestamp, Message.to_address, Message.hostname, Message.msgfiles)\ .filter(Message.id.in_(c.form.message_id.data)) query = UserFilter(Session, c.user, msgs) msgs = query.filter() localtmz = config.get('baruwa.timezone', 'Africa/Johannesburg') formvals = (dict(release=c.form.release.data, learn=c.form.learn.data, salearn_as=c.form.learnas.data, todelete=c.form.delete.data, use_alt=c.form.usealt.data, altrecipients=c.form.altrecipients.data, message_id=msg.messageid, from_address=msg.from_address, date=convert_date(msg.timestamp, localtmz).strftime('%Y%m%d'), msgfiles=msg.msgfiles, to_address=msg.to_address, hostname=msg.hostname, mid=msg.id, num=num_items) for msg in msgs) if formvals: try: subtasks = [ process_quarantined_msg.subtask( args=[formval], options=dict( routing_key=system_hostname() if asbool( config.get('ms.quarantine.shared', 'false') ) else formval['hostname'])) for formval in formvals ] task = group(subtasks).apply_async() task.save(backend=RBACKEND) session['bulk_items'] = [] if 'taskids' not in session: session['taskids'] = [] session['taskids'].append(task.id) session['bulkprocess-count'] = 1 session.save() redirect(url('messages-bulk-process', taskid=task.id)) except (QueueNotFound, OperationalError, IndexError): flash_alert( _('The messages could not processed' ', try again later')) elif request.method == 'POST' and not c.form.validate(): try: flash_alert( _(u', '.join([ unicode(c.form.errors[err][0]) for err in c.form.errors ]))) except IndexError: flash_alert( _('The messages could not processed' ', an Unknown error occured.')) pages = paginate.Page(messages, page=int(page), items_per_page=num_items, item_count=msgcount) if format == 'json': response.headers['Content-Type'] = 'application/json' data = convert_to_json(pages, direction=direction, order_by=order_by, section=section) return data c.page = pages return self.render('/messages/quarantine.html')
def search(self, format=None): "Search for messages" qry = request.GET.get('q', None) if qry is None: redirect(url(controller='messages', action='listing')) index = 'messages, messagesdelta, messages_rt' action = request.GET.get('a', 'listing') if action not in ['listing', 'quarantine', 'archive']: action = 'listing' if action == 'archive': index = 'archive archivedelta' try: page = int(request.GET.get('page', 1)) except ValueError: page = 1 num_items = session.get('msgs_search_num_results', 50) conn = SphinxClient() sphinxopts = extract_sphinx_opts(config['sphinx.url']) conn.SetServer(sphinxopts.get('host', '127.0.0.1')) conn.SetMatchMode(SPH_MATCH_EXTENDED2) if action == 'quarantine': conn.SetFilter('isquarantined', [True, ]) if page == 1: conn.SetLimits(0, num_items, 500) else: offset = (page - 1) * num_items conn.SetLimits(offset, num_items, 500) if not c.user.is_superadmin: filter_sphinx(Session, c.user, conn) else: conn.SetSelect('timestamp') qry = clean_sphinx_q(qry) try: results = conn.Query(qry, index) except (socket.timeout, struct.error): redirect(request.path_qs) qry = restore_sphinx_q(qry) if results and results['matches']: ids = [hit['id'] for hit in results['matches']] filters = session.get('filter_by', None) if action == 'archive': messages = get_archived().filter( Archive.id.in_(ids)) query = UserFilter(Session, c.user, messages, True) messages = query.filter() if filters: dynq = DynaQuery(Message, messages, filters) messages = dynq.generate() else: messages = get_messages().filter( Message.id.in_(ids)) query = UserFilter(Session, c.user, messages) messages = query.filter() if filters: dynq = DynaQuery(Message, messages, filters) messages = dynq.generate() total_found = results['total'] search_time = results['time'] messages = messages.order_by(desc('timestamp')) else: messages = [] results = dict(matches=[], total=0) total_found = 0 search_time = 0 pages = paginator(dict(page=page, results_per_page=num_items, total=results['total'], items=len(results['matches']), q=qry)) if format == 'json': response.headers['Content-Type'] = 'application/json' data = dict(action=action, total_found=total_found, search_time=search_time, paginator=pages, items=[jsonify_msg_list(msg) for msg in messages]) return json.dumps(data) c.messages = messages c.action = action c.total_found = total_found c.search_time = search_time c.page = pages return self.render('/messages/searchresults.html')
def quarantine(self, page=1, direction='dsc', order_by='timestamp', section=None, format=None): "quarantined messages" filters = session.get('filter_by', None) num_items = session.get('msgs_num_items', 50) if direction == 'dsc': sort = desc(order_by) else: sort = order_by messages = get_messages().filter( Message.isquarantined == 1).order_by(sort) msgcount = get_msg_count().filter( Message.isquarantined == 1) query = UserFilter(Session, c.user, messages) countquery = UserFilter(Session, c.user, msgcount) messages = query.filter() msgcount = countquery.filter() if section: if section == 'spam': messages = messages.filter(Message.spam == 1) msgcount = messages.filter(Message.spam == 1) else: messages = messages.filter(Message.spam == 0) msgcount = messages.filter(Message.spam == 0) if filters: dynq = DynaQuery(Message, messages, filters) dynmsgq = DynaQuery(Message, msgcount, filters) messages = dynq.generate() msgcount = dynmsgq.generate() c.order_by = order_by c.direction = direction c.section = section msgcount = msgcount.count() c.form = BulkReleaseForm(request.POST, csrf_context=session) if request.method == 'POST': choices = session.get('bulk_items', []) else: pages = paginate.Page(messages, page=int(page), items_per_page=num_items, item_count=msgcount) choices = [(str(message.id), message.id) for message in pages.items] session['bulk_items'] = choices session.save() c.form.message_id.choices = choices if request.method == 'POST' and c.form.validate() and choices: msgs = Session.query(Message.id, Message.messageid, Message.from_address, Message.timestamp, Message.to_address, Message.hostname, Message.msgfiles)\ .filter(Message.id.in_(c.form.message_id.data)) query = UserFilter(Session, c.user, msgs) msgs = query.filter() localtmz = config.get('baruwa.timezone', 'Africa/Johannesburg') formvals = (dict(release=c.form.release.data, learn=c.form.learn.data, salearn_as=c.form.learnas.data, todelete=c.form.delete.data, use_alt=c.form.usealt.data, altrecipients=c.form.altrecipients.data, message_id=msg.messageid, from_address=msg.from_address, date=convert_date(msg.timestamp, localtmz) .strftime('%Y%m%d'), msgfiles=msg.msgfiles, to_address=msg.to_address, hostname=msg.hostname, mid=msg.id, num=num_items) for msg in msgs) if formvals: try: subtasks = [process_quarantined_msg.subtask(args=[formval], options=dict(routing_key=system_hostname() if asbool(config.get( 'ms.quarantine.shared', 'false')) else formval['hostname'])) for formval in formvals] task = group(subtasks).apply_async() task.save(backend=RBACKEND) session['bulk_items'] = [] if 'taskids' not in session: session['taskids'] = [] session['taskids'].append(task.id) session['bulkprocess-count'] = 1 session.save() redirect(url('messages-bulk-process', taskid=task.id)) except (QueueNotFound, OperationalError, IndexError): flash_alert(_('The messages could not processed' ', try again later')) elif request.method == 'POST' and not c.form.validate(): try: flash_alert(_(u', '.join([unicode(c.form.errors[err][0]) for err in c.form.errors]))) except IndexError: flash_alert(_('The messages could not processed' ', an Unknown error occured.')) pages = paginate.Page(messages, page=int(page), items_per_page=num_items, item_count=msgcount) if format == 'json': response.headers['Content-Type'] = 'application/json' data = convert_to_json(pages, direction=direction, order_by=order_by, section=section) return data c.page = pages return self.render('/messages/quarantine.html')