def merge(request, word, clade=None): form = MergeCognateForm( request.POST or None, prefix='merge', queryset=CognateSet.objects.all( ) # needed as we've explicitly set None in the form. ) if request.POST and form.is_valid(): old = form.cleaned_data['old'] new = form.cleaned_data['new'] messages.add_message(request, messages.INFO, 'Moving cognate set %r to %r' % (old, new), extra_tags='warning') # get the lexical items already in this cognateset already = [lex for lex in new.lexicon.all()] with reversion.create_revision(): for cog in old.cognate_set.all(): if cog.lexicon in already: cog.delete( ) # already got it in this cognate set. Delete the cognate else: cog.cognateset = new cog.save() old.delete() url = reverse('cognacy:do', kwargs={'word': word, 'clade': clade}) return redirect(url)
def merge(request, word, clade=None): form = MergeCognateForm(request.POST or None, prefix='merge', queryset=CognateSet.objects.all() # needed as we've explicitly set None in the form. ) if request.POST and form.is_valid(): old = form.cleaned_data['old'] new = form.cleaned_data['new'] messages.add_message(request, messages.INFO, 'Moving cognate set %r to %r' % (old, new), extra_tags='warning' ) # get the lexical items already in this cognateset already = [lex for lex in new.lexicon.all()] with reversion.create_revision(): for cog in old.cognate_set.all(): if cog.lexicon in already: cog.delete() # already got it in this cognate set. Delete the cognate else: cog.cognateset = new cog.save() old.delete() url = reverse('cognacy:do', kwargs={'word': word, 'clade': clade}) return redirect(url)
def test_error_on_identical_cognate_sets(self): cogset_1 = CognateSet.objects.create(protoform='test-1', editor=self.editor) form_data = { 'old': cogset_1.id, 'new': cogset_1.id, } f = MergeCognateForm(form_data, queryset=CognateSet.objects.all()) assert not f.is_valid()
def test_ok(self): cogset_1 = CognateSet.objects.create(protoform='test-1', editor=self.editor) cogset_2 = CognateSet.objects.create(protoform='test-2', editor=self.editor) form_data = { 'old': cogset_1.id, 'new': cogset_2.id, } f = MergeCognateForm(form_data, queryset=CognateSet.objects.all()) assert f.is_valid()
def do(request, word, clade=None): """Do cognacy""" w = get_object_or_404(Word, slug=word) lex_ids, entries = [], [] lexica = w.lexicon_set.all() if clade: lexica = lexica.filter(language__classification__startswith=clade) for e in lexica.select_related('source', 'word', 'language'): lex_ids.append(e.id) entries.append(e) # save us from one query for each cognateset -- select_related doesn't help us here so # we do a rather ungainly merge. # 1. get a list of (lexicon.id, cognateset.id) queryset = Cognate.objects.filter(lexicon_id__in=lex_ids).select_related( 'lexicon', 'cognateset', 'cognateset__source') cogs = [(c.lexicon_id, c.cognateset_id, c.cognateset) for c in queryset] # 2. get notes notes = CognateNote.objects.filter( Q(word=w) | Q(cognateset__in=[c[2] for c in cogs])) # 3. go through entries and attach a list of cognateset ids if needed, else empty list entries_and_cogs = [] inplay = {} for e in entries: e.cognacy = [c[1] for c in cogs if c[0] == e.id] e.edit = True # dummy value so django-tables2 passes to render_edit() e.classification = e.language.classification entries_and_cogs.append(e) cogobjs = [_[2] for _ in cogs if _[1] in e.cognacy] for o in cogobjs: inplay[o] = inplay.get(o, set()) inplay[o].add(e.entry) inplay = dict([(k, ", ".join(sorted(v)[0:20])) for (k, v) in inplay.items()]) inplay = sorted([(k.id, k, v) for (k, v) in inplay.items()]) inplay = [(_[1], _[2]) for _ in inplay] form = DoCognateForm(initial={ 'word': w.id, 'clade': clade }, is_hidden=True, clades=get_clades()) CSQ = CognateSet.cache_all_method.filter( id__in=[c[1] for c in cogs]).order_by('id') mergeform = MergeCognateForm(request.POST or None, prefix='merge', queryset=CSQ) commentform = CognateNoteForm(request.POST or None, prefix='comment', queryset=CSQ, initial={ 'word': w, }) table = CognacyTable(entries_and_cogs) RequestConfig(request, paginate=False).configure(table) return render( request, 'cognacy/do_detail.html', { 'word': w, 'clade': clade, 'lexicon': table, 'inplay': inplay, 'form': form, 'mergeform': mergeform, 'next_cognates': get_missing_cogids(limit=10), 'notes': notes, 'commentform': commentform, })