"""Manage Markov models and administrative commands.""" import logging from django.contrib import admin from django.contrib.auth.decorators import permission_required from django.shortcuts import render from markov.forms import LogUploadForm, TeachLineForm import markov.lib as markovlib from markov.models import MarkovContext, MarkovTarget, MarkovState log = logging.getLogger('markov.admin') admin.site.register(MarkovContext) admin.site.register(MarkovTarget) admin.site.register(MarkovState) @permission_required('import_log_file', raise_exception=True) def import_file(request): """Accept a file upload and turn it into markov stuff. Current file formats supported: * weechat """ if request.method == 'POST': form = LogUploadForm(request.POST, request.FILES) if form.is_valid(): log_file = request.FILES['log_file'] context = form.cleaned_data['context'] ignores = form.cleaned_data['ignore_nicks'].split(',') strips = form.cleaned_data['strip_prefixes'].split(' ') whos = [] for line in log_file: log.debug(line) (timestamp, who, what) = line.decode('utf-8').split('\t', 2) if who in ('-->', '<--', '--', ' *'): continue if who in ignores: continue whos.append(who) # this is a line we probably care about now what = [x for x in what.rstrip().split(' ') if x not in strips] markovlib.learn_line(' '.join(what), context) log.debug("learned") log.debug(set(whos)) form = LogUploadForm() else: form = LogUploadForm() return render(request, 'import_file.html', {'form': form}) @permission_required('teach_line', raise_exception=True) def teach_line(request): """Teach one line directly.""" if request.method == 'POST': form = TeachLineForm(request.POST) if form.is_valid(): line = form.cleaned_data['line'] context = form.cleaned_data['context'] strips = form.cleaned_data['strip_prefixes'].split(' ') what = [x for x in line.rstrip().split(' ') if x not in strips] markovlib.learn_line(' '.join(what), context) form = TeachLineForm() else: form = TeachLineForm() return render(request, 'teach_line.html', {'form': form}) admin.site.register_view('markov/importfile/', "Markov - Import log file", view=import_file, urlname='markov_import_file') admin.site.register_view('markov/teach/', "Markov - Teach line", view=teach_line, urlname='markov_teach_line')