Beispiel #1
0
def projects_morelab_collaborations(request):
    G = nx.Graph()

    projects = Project.objects.all()
    pr_role = Role.objects.get(slug='principal-researcher')
    for project in projects:
        person_ids = AssignedPerson.objects.filter(project_id=project.id).exclude(role_id=pr_role.id).values('person_id')
        if person_ids:
            _list = [person_id['person_id'] for person_id in person_ids]
            for pos, person_id in enumerate(_list):
                for i in range(pos+1, len(_list)):
                    person1 = Person.objects.get(id=person_id)
                    person2 = Person.objects.get(id=_list[i])
                    if person1.is_active and person2.is_active:
                        G.add_edge(person1.id, person2.id)
                        try:
                            G[person1.id][person2.id]['weight'] += 1
                        except:
                            G[person1.id][person2.id]['weight'] = 1
                        G.node[person1.id]['name'] = person1.full_name
                        G.node[person2.id]['name'] = person2.full_name

    G = nx_graph.analyze(G)

    data = json_graph.node_link_data(G)

    # dictionary to be returned in render_to_response()
    return_dict = {
        'web_title': u'Group collaborations',
        'data': json.dumps(data),
    }

    return render_to_response("charts/projects/collaboration_morelab.html", return_dict, context_instance=RequestContext(request))
Beispiel #2
0
def project_collaborations(request, exclude_leaders=False, within_group=False):

    G = nx.Graph()

    projects = Project.objects.all()
    names = set()

    for project in projects:
        if exclude_leaders:
            person_ids = AssignedPerson.objects.filter(
                    project=project
                ).exclude(
                    role__exclude_from_charts=True
                ).values_list('person_id', flat=True)
        else:
            person_ids = AssignedPerson.objects.filter(
                    project=project
                ).values_list('person_id', flat=True)

        if person_ids:
            for pos, person_id in enumerate(person_ids):
                for i in range(pos+1, len(person_ids)):
                    person1 = Person.objects.get(id=person_id)
                    person2 = Person.objects.get(id=person_ids[i])

                    names.add(person1.full_name)
                    names.add(person2.full_name)

                    add_node = True

                    if within_group and (not person1.is_active or not person2.is_active):
                        add_node = False

                    if add_node:
                        G.add_edge(person1.id, person2.id)

                        try:
                            G[person1.id][person2.id]['weight'] += 1
                        except:
                            G[person1.id][person2.id]['weight'] = 1

                        G.node[person1.id]['name'] = person1.full_name
                        G.node[person2.id]['name'] = person2.full_name

    G = nx_graph.analyze(G)

    data = json_graph.node_link_data(G)

    return_dict = {
        'data': json.dumps(data),
        'names': list(names),
        'web_title': u'Group collaborations',
        'within_group': within_group,
    }

    return render(request, "charts/projects/collaboration.html", return_dict)
Beispiel #3
0
def publication_coauthorships(request, max_position=None, within_group=False):

    G = nx.Graph()

    if max_position and int(max_position) > 1:
        pub_authors = PublicationAuthor.objects.exclude(position__gt=max_position)

    else:
        pub_authors = PublicationAuthor.objects.all()

    pub_authors = pub_authors.values("publication_id", "author_id", "author_id__full_name")

    # 'publication_id': [ pub_author1, pub_author2, pub_author3 ]
    authors_per_publication = defaultdict(list)

    if within_group:
        people = Person.objects.all().values("is_active", "id")
        active_by_id = {}

        for person in people:
            active_by_id[person['id']] = person['is_active']

    for pub_author in pub_authors:
        check_coauthorship = True

        if within_group and not active_by_id[pub_author['author_id']]:
            check_coauthorship = False

        if check_coauthorship:
            entry = (pub_author['author_id'], pub_author['author_id__full_name'])
            authors_per_publication[pub_author['publication_id']].append(entry)

    for relations in authors_per_publication.values():
        for (author_id1, name1), (author_id2, name2) in combinations(relations, 2):
            G.add_edge(author_id1, author_id2)

            try:
                G[author_id1][author_id2]['weight'] += 1

            except:
                G[author_id1][author_id2]['weight'] = 1

            G.node[author_id1]['name'] = name1
            G.node[author_id2]['name'] = name2

    G = nx_graph.analyze(G)

    data = json_graph.node_link_data(G)

    return_dict = {
        'data': json.dumps(data),
        'web_title': u'Publications co-authorship',
        'within_group': within_group,
    }

    return render(request, "charts/publications/co_authorship.html", return_dict)
Beispiel #4
0
def publications_egonetwork(request, author_slug):
    author = get_object_or_404(Person, slug=author_slug)

    G = nx.Graph()

    pub_authors = PublicationAuthor.objects.all().values(
        "publication_id", "author_id", "author_id__full_name")

    authors_per_publication = defaultdict(
        list)  # 'publication_id': [ pub_author1, pub_author2, pub_author3 ]

    for pub_author in pub_authors:
        entry = (pub_author['author_id'], pub_author['author_id__full_name'])
        authors_per_publication[pub_author['publication_id']].append(entry)

    for relations in authors_per_publication.values():
        for (author_id1, name1), (author_id2,
                                  name2) in combinations(relations, 2):
            G.add_edge(author_id1, author_id2)

            try:
                G[author_id1][author_id2]['weight'] += 1
            except:
                G[author_id1][author_id2]['weight'] = 1

            G.node[author_id1]['name'] = name1
            G.node[author_id2]['name'] = name2

    try:
        G = nx_graph.analyze(G)
        ego_g = nx.ego_graph(G, author.id)
        data = json_graph.node_link_data(ego_g)
    except:
        data = {}

    # dictionary to be returned in render(request, )
    return_dict = {
        # 'publication_tags_per_year': publication_tags_per_year,
        'web_title': u'%s - Egonetwork' % author.full_name,
        'data': json.dumps(data),
        'author': author,
    }

    return render(request, "charts/publications/egonetwork.html", return_dict)
Beispiel #5
0
def publications_morelab_coauthorship(request, max_position=None):
    G = nx.Graph()

    if max_position and int(max_position) > 1:
        pub_authors = PublicationAuthor.objects.exclude(position__gt=max_position).values("publication_id", "author_id", "author_id__full_name")
    else:
        pub_authors = PublicationAuthor.objects.all().values("publication_id", "author_id", "author_id__full_name")

    people = Person.objects.all().values("is_active", "id")
    active_by_id = {}
    for person in people:
        active_by_id[person['id']] = person['is_active']

    authors_per_publication = defaultdict(list)  # 'publication_id': [ pub_author1, pub_author2, pub_author3 ]

    for pub_author in pub_authors:
        if active_by_id[pub_author['author_id']]:
            entry = (pub_author['author_id'], pub_author['author_id__full_name'])
            authors_per_publication[pub_author['publication_id']].append(entry)

    for relations in authors_per_publication.values():
        for (author_id1, name1), (author_id2, name2) in combinations(relations, 2):
            G.add_edge(author_id1, author_id2)

            try:
                G[author_id1][author_id2]['weight'] += 1
            except:
                G[author_id1][author_id2]['weight'] = 1

            G.node[author_id1]['name'] = name1
            G.node[author_id2]['name'] = name2

    G = nx_graph.analyze(G)

    data = json_graph.node_link_data(G)

    # dictionary to be returned in render_to_response()
    return_dict = {
        'web_title': u'Group publications co-authorship',
        'data': json.dumps(data),
    }

    return render_to_response("charts/publications/co_authorship.html", return_dict, context_instance=RequestContext(request))
Beispiel #6
0
def publications_egonetwork(request, author_slug):
    author = get_object_or_404(Person, slug=author_slug)

    G = nx.Graph()

    pub_authors = PublicationAuthor.objects.all().values("publication_id", "author_id", "author_id__full_name")

    authors_per_publication = defaultdict(list)  # 'publication_id': [ pub_author1, pub_author2, pub_author3 ]

    for pub_author in pub_authors:
        entry = (pub_author['author_id'], pub_author['author_id__full_name'])
        authors_per_publication[pub_author['publication_id']].append(entry)

    for relations in authors_per_publication.values():
        for (author_id1, name1), (author_id2, name2) in combinations(relations, 2):
            G.add_edge(author_id1, author_id2)

            try:
                G[author_id1][author_id2]['weight'] += 1
            except:
                G[author_id1][author_id2]['weight'] = 1

            G.node[author_id1]['name'] = name1
            G.node[author_id2]['name'] = name2

    try:
        G = nx_graph.analyze(G)
        ego_g = nx.ego_graph(G, author.id)
        data = json_graph.node_link_data(ego_g)
    except:
        data = {}

    # dictionary to be returned in render(request, )
    return_dict = {
        # 'publication_tags_per_year': publication_tags_per_year,
        'web_title': u'%s - Egonetwork' % author.full_name,
        'data': json.dumps(data),
        'author': author,
    }

    return render(request, "charts/publications/egonetwork.html", return_dict)
Beispiel #7
0
def publication_coauthorships(request, max_position=None, within_group=False):

    G = nx.Graph()

    if max_position and int(max_position) > 1:
        pub_authors = PublicationAuthor.objects.exclude(
            position__gt=max_position)

    else:
        pub_authors = PublicationAuthor.objects.all()

    pub_authors = pub_authors.values("publication_id", "author_id",
                                     "author_id__full_name")

    # 'publication_id': [ pub_author1, pub_author2, pub_author3 ]
    authors_per_publication = defaultdict(list)

    names = set()

    if within_group:
        people = Person.objects.all().values("is_active", "id")
        active_by_id = {}

        for person in people:
            active_by_id[person['id']] = person['is_active']

    for pub_author in pub_authors:
        check_coauthorship = True

        if within_group and not active_by_id[pub_author['author_id']]:
            check_coauthorship = False

        if check_coauthorship:
            entry = (pub_author['author_id'],
                     pub_author['author_id__full_name'])
            authors_per_publication[pub_author['publication_id']].append(entry)

    for relations in authors_per_publication.values():
        for (author_id1, name1), (author_id2,
                                  name2) in combinations(relations, 2):
            G.add_edge(author_id1, author_id2)

            try:
                G[author_id1][author_id2]['weight'] += 1

            except:
                G[author_id1][author_id2]['weight'] = 1

            G.node[author_id1]['name'] = name1
            G.node[author_id2]['name'] = name2

            names.add(name1)
            names.add(name2)

    try:
        G = nx_graph.analyze(G)

    except:
        # Avoid networkx's "power iteration failed to converge" error
        pass

    data = json_graph.node_link_data(G)

    return_dict = {
        'data': json.dumps(data),
        'names': list(names),
        'web_title': u'Publications co-authorship',
        'within_group': within_group,
    }

    return render(request, "charts/publications/co_authorship.html",
                  return_dict)