Iterating lists and updating dictionary for corresponding match logic improvement
Considering DRY principal, this

if not conflicts.get(user):
    conflicts[user] = [
                (
                    contribution.title,
                    contribution.url,
                )
                for person in contribution.person_links
                if user.affiliation in person.affiliation
            ]
else:
    conflicts[user] += [
                (
                    contribution.title,
                    contribution.url,
                )
                for person in contribution.person_links
                if user.affiliation in person.affiliation
            ]


can and should be replaced with a defaultdict:

from collections import defaultdict

conflicts = defaultdict(list)
...
for contribution in contributions:
    conflicts[user].extend((contribution.title, contribution.url)
                           for person in contribution.person_links
                           if user.affiliation in person.affiliation)


Or at least take advantage of dict.setdefault (while preferring a dict literal over a call to dict to save method look-up time):

conflicts = {}
...
for contribution in contributions:
    conflicts.setdefault(user, []).extend((contribution.title, contribution.url)
                                          for person in contribution.person_links
                                          if user.affiliation in person.affiliation)