""" markov/views.py --- manipulate markov data """ import logging from django.contrib.auth.decorators import permission_required from django.http import HttpResponse from django.shortcuts import render from markov.forms import LogUploadForm from markov.models import MarkovContext, MarkovTarget, MarkovState log = logging.getLogger('dr_botzo.markov') def index(request): """Display nothing, for the moment.""" return HttpResponse() @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'].split(',') whos = [] for line in log_file: (timestamp, who, what) = line.split('\t') if who in ('-->', '<--', '--', ' *'): continue if who in ignores: continue whos.append(who) # this is a line we probably care about now _learn_line(what.rstrip(), context) log.debug(set(whos)) else: form = LogUploadForm() return render(request, 'markov/import_file.html', {'form': form}) def _learn_line(line, context): """Create a bunch of MarkovStates for a given line of text.""" log.debug(u"learning {0:.40s}...".format(line)) words = line.split() words = [MarkovState._start1, MarkovState._start2] + words + [MarkovState._stop] for word in words: if len(word) > MarkovState._meta.get_field('k1').max_length: return for i, word in enumerate(words): log.debug(u"'{0:s}','{1:s}' -> '{2:s}'".format(words[i], words[i+1], words[i+2])) state, created = MarkovState.objects.get_or_create(context=context, k1=words[i], k2=words[i+1], v=words[i+2]) state.count += 1 state.save() if i > len(words) - 4: break # vi:tabstop=4:expandtab:autoindent