Пример #1
0
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)
Пример #2
0
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)
Пример #3
0
 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()
Пример #4
0
 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()
Пример #5
0
 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()
Пример #6
0
 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()
Пример #7
0
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,
        })