#545 Packaging work to prepare deployment
Merged 6 years ago by abompard. Opened 6 years ago by abompard.
abompard/fedora-hubs feature/packaging  into  develop

file modified
+1
@@ -6,6 +6,7 @@ 

  build/

  dist/

  scratch/

+ twisted/plugins/dropin.cache

  

  npm-debug.log*

  client_secrets.json

file modified
+7 -1
@@ -2,14 +2,20 @@ 

  include hubs/alembic.ini

  graft hubs/static

  prune hubs/static/client/node_modules

+ exclude hubs/static/client/npm-debug.log.*

+ exclude hubs/static/js/build/*

+ recursive-exclude hubs/static/js/build *.js

+ include hubs/static/js/build/.gitignore

  recursive-include hubs/templates *.html

  recursive-include hubs/migrations *.py *.mako *.rst

+ recursive-include hubs/widgets/*/templates *.html

  include hubs/migrations/versions/.keep

- include hubs/actions.json

  include hubs/tests/*.cfg

  include hubs/tests/*.json

  graft hubs/tests/vcr-request-data

+ graft deploy

  graft ansible

  graft docs

  prune docs/_build

  recursive-include fedmsg.d *.py

+ recursive-exclude twisted/plugins *.pyc *.cache

@@ -4,7 +4,6 @@ 

  hubs_base_dir: "/srv/hubs"

  hubs_code_dir: "{{ hubs_base_dir }}/fedora-hubs"

  hubs_conf_dir: "{{ hubs_base_dir }}/config"

- hubs_venv_dir: "{{ hubs_base_dir }}/venv"

  hubs_var_dir: "{{ hubs_base_dir }}/var"

  hubs_db_type: sqlite

  hubs_db_password: changeme
@@ -14,3 +13,4 @@ 

  hubs_ssl_key: /etc/pki/tls/private/{{ hubs_url_hostname }}.key

  hubs_fas_username: changeme

  hubs_fas_password: changeme

+ hubs_oidc_url: iddev.fedorainfracloud.org

@@ -1,29 +1,24 @@ 

  - name: restart postgresql

    service: name=postgresql state=restarted

  

- - name: restart the hubs-specific fedmsg-hub

-   service: name=hubs-fedmsg-hub state=restarted

-   listen: "hubs configuration change"

-   when: not hubs_dev_mode

- 

  - name: restart hubs triage

-   service: name=hubs-triage@* state=restarted

+   service: name=fedora-hubs-triage@* state=restarted

    listen: "hubs configuration change"

    when: not hubs_dev_mode

  

  - name: restart hubs workers

-   service: name=hubs-worker@* state=restarted

+   service: name=fedora-hubs-worker@* state=restarted

    listen: "hubs configuration change"

    when: not hubs_dev_mode

  

  - name: restart hubs SSE server

-   service: name=hubs-sse state=restarted

+   service: name=fedora-hubs-sse state=restarted

    listen: "hubs configuration change"

    when: not hubs_dev_mode

  

  # Webserver

  - name: restart hubs webapp

-   service: name=hubs-webapp state=restarted

+   service: name=fedora-hubs-webapp state=restarted

    listen: "hubs configuration change"

    when: not hubs_dev_mode

  

@@ -41,21 +41,12 @@ 

    become: true

    become_user: postgres

  

- - name: Ease local access to the database

-   copy:

-     content: "*:*:hubs:hubs:{{ hubs_db_password }}"

-     dest: /home/{{ main_user }}/.pgpass

-     mode: 600

-     owner: "{{ main_user }}"

-     group: "{{ main_user }}"

- 

  - name: Populate the Fedora Hubs database

-   command: "{{ hubs_venv_dir }}/bin/python {{ hubs_code_dir }}/populate.py"

+   command: "python3 {{ hubs_code_dir }}/populate.py"

    args:

      chdir: "{{ hubs_code_dir }}"

    environment:

-     HUBS_CONFIG: "{{ hubs_conf_dir }}/hubs_config.py"

+     HUBS_CONFIG: "{{ hubs_conf_dir }}/hubs.py"

    become: true

    become_user: "{{ main_user }}"

-   when: db_creation|succeeded and db_creation|changed

- 

+   when: db_creation|succeeded and db_creation|changed and hubs_dev_mode

@@ -1,9 +1,9 @@ 

  - name: Create and populate the Fedora Hubs database

-   command: "{{ hubs_venv_dir }}/bin/python {{ hubs_code_dir }}/populate.py"

+   command: "python3 {{ hubs_code_dir }}/populate.py"

    args:

      creates: "{{ hubs_var_dir }}/hubs.db"

      chdir: "{{ hubs_code_dir }}"

    environment:

-     HUBS_CONFIG: "{{ hubs_conf_dir }}/hubs_config.py"

+     HUBS_CONFIG: "{{ hubs_conf_dir }}/hubs.py"

    become: true

    become_user: "{{ main_user }}"

@@ -1,17 +1,69 @@ 

- - name: Install Fedora Hubs development packages

+ # Set up the Python development environment

+ 

+ - name: Install Fedora Hubs requirements.txt into hubs virtualenv

+   pip:

+     requirements: "{{ hubs_code_dir }}/requirements.txt"

+     executable: pip3

+ 

+ - name: Install Fedora Hubs test-requirements.txt into hubs virtualenv

+   pip:

+     requirements: "{{ hubs_code_dir }}/test-requirements.txt"

+     executable: pip3

+ 

+ - name: Install other packages into hubs virtualenv

+   pip:

+     name: "{{ item }}"

+     executable: pip3

+   with_items:

+     - bleach

+ 

+ - name: Install Fedora Hubs into the virtualenv

+   command: "pip3 install -e {{ hubs_code_dir }}"

+   args:

+     creates: "/usr/lib/python3.6/site-packages/fedora-hubs.egg-link"

+ 

+ 

+ # Set up JavaScript requirements

+ 

+ - name: Install npm packages

+   command: npm install

+   become: true

+   become_user: "{{ main_user }}"

+   args:

+     creates: node_modules

+     chdir: "{{ hubs_code_dir }}/hubs/static/client"

+ 

+ - name: Build JavaScript assets

+   command: npm run build

+   become: true

+   become_user: "{{ main_user }}"

+   args:

+     chdir: "{{ hubs_code_dir }}/hubs/static/client"

+     creates: "{{ hubs_code_dir }}/hubs/static/js/build/common.js"

+ 

+ 

+ # Development tools

+ 

+ - name: Install helpful development packages

+   dnf: name={{ item }} state=present

+   with_items:

+     - git

+     - vim-enhanced

+ 

+ - name: Install Fedora Hubs development tools

    dnf: name={{ item }} state=present

    with_items:

-     - gcc

-     - gcc-c++

-     - libffi-devel

-     - openssl-devel

-     - python-sphinx

-     - python2-devel

-     - python3-devel

      - python3-honcho

      - python3-tox

-     - redhat-rpm-config

-     - sqlite-devel

+ 

+ - name: Ease local access to the database

+   copy:

+     content: "*:*:hubs:hubs:{{ hubs_db_password }}"

+     dest: /home/{{ main_user }}/.pgpass

+     mode: 600

+     owner: "{{ main_user }}"

+     group: "{{ main_user }}"

+   when: hubs_db_type == "postgresql"

  

  - name: Install a custom bashrc

    template: src=bashrc dest=/home/{{ main_user }}/.bashrc

@@ -0,0 +1,64 @@ 

+ - name: Install Fedora Hubs development packages

+   dnf: name={{ item }} state=present

+   with_items:

+     - gcc

+     - gcc-c++

+     - libffi-devel

+     - openssl-devel

+     - python-sphinx

+     - python2-devel

+     - python3-devel

+     - python3-virtualenv

+     - python3-flask-oidc

+     - python3-moksha-common

+     - redhat-rpm-config

+     - sqlite-devel

+     - npm

+     - fedmsg-hub

+ 

+ - name: Install the distribution versions of requirements.txt

+   dnf: name={{ item }} state=present

+   with_items:

+     - python3-alembic

+     - python3-arrow

+     - python3-beautifulsoup4

+     - python3-bleach

+     - python3-blinker

+     - python3-dateutil

+     - python3-decorator

+     - python3-dogpile-cache

+     - python3-fedmsg

+     - python3-fedmsg-meta-fedora-infrastructure

+     - python3-fedora

+     - python3-flask

+     - python3-flask-oidc

+     - python3-html5lib

+     - python3-humanize

+     - python3-iso3166

+     - python3-markdown

+     - python3-munch

+     - python3-pkgwat-api

+     - python3-pygments

+     - python3-pygments-markdown-lexer

+     - python3-pymongo

+     - python3-pytz

+     - python3-redis

+     - python3-requests

+     - python3-retask

+     - python3-six

+     - python3-sqlalchemy

+     - python3-twisted

+ 

+ 

+ - name: Create the directory structure

+   file:

+     path: "{{ item.path }}"

+     state: directory

+     owner: "{{ main_user }}"

+     group: "{{ main_user }}"

+     mode: "{{ item.mode }}"

+     #setype: httpd_sys_content_rw_t

+   with_items:

+     - {path: "{{ hubs_base_dir }}", mode: 755}

+     - {path: "{{ hubs_conf_dir }}", mode: 750}

+     - {path: "{{ hubs_var_dir }}", mode: 750}

@@ -1,139 +1,57 @@ 

  ---

- - name: Install helpful development packages

-   dnf: name={{ item }} state=present

-   with_items:

-     - git

-     - vim-enhanced

- 

  - name: Install external dependencies

    dnf: name={{ item }} state=present

    with_items:

-     - npm

      - redis

-     - fedmsg-hub

      - fedmsg-relay

-     - python3-virtualenv

-     - python3-flask-oidc

-     - python3-moksha-common

      - postfix

  

- - name: Install the distribution versions of requirements.txt

-   dnf: name={{ item }} state=present

-   with_items:

-     - python3-alembic

-     - python3-arrow

-     - python3-bleach

-     - python3-decorator

-     - python3-dogpile-cache

-     - python3-fedmsg-core

-     - python3-fedmsg-meta-fedora-infrastructure

-     - python3-flask

-     - python3-flask-oidc

-     - python3-html5lib

-     - python3-munch

-     - python3-pytz

-     - python3-sqlalchemy

-     - python3-markdown

-     - python3-pkgwat-api

-     - python3-six

-     - python3-pygments

-     - python3-pygments-markdown-lexer

-     - python3-retask

-     - python3-twisted

- 

- 

- # Create directory structure

- 

- - name: Create the directory structure

-   file:

-     path: "{{ item.path }}"

-     state: directory

-     owner: "{{ main_user }}"

-     group: "{{ main_user }}"

-     mode: "{{ item.mode }}"

-     #setype: httpd_sys_content_rw_t

-   with_items:

-     - {path: "{{ hubs_base_dir }}", mode: 755}

-     - {path: "{{ hubs_conf_dir }}", mode: 750}

-     - {path: "{{ hubs_var_dir }}", mode: 750}

- 

- 

- # Set up the Python development environment

- - name: Install Fedora Hubs requirements.txt into hubs virtualenv

-   become: true

-   become_user: "{{ main_user }}"

-   pip:

-     requirements: "{{ hubs_code_dir }}/requirements.txt"

-     virtualenv: "{{ hubs_venv_dir}}"

-     virtualenv_site_packages: yes

-     virtualenv_command: virtualenv-3

- 

- - name: Install Fedora Hubs test-requirements.txt into hubs virtualenv

-   become: true

-   become_user: "{{ main_user }}"

-   pip:

-     requirements: "{{ hubs_code_dir }}/test-requirements.txt"

-     virtualenv: "{{ hubs_venv_dir}}"

-     virtualenv_site_packages: yes

-     virtualenv_command: virtualenv-3

- 

- - name: Install other packages into hubs virtualenv

-   become: true

-   become_user: "{{ main_user }}"

-   pip:

-     name: "{{ item }}"

-     virtualenv: "{{ hubs_venv_dir }}"

-     virtualenv_site_packages: yes

-     virtualenv_command: virtualenv-3

-   with_items:

-     - bleach

  

- - name: Install Fedora Hubs into the virtualenv

-   become: true

-   become_user: "{{ main_user }}"

-   command: "{{ hubs_venv_dir }}/bin/pip install -e {{ hubs_code_dir }}"

-   args:

-     creates: "{{ hubs_venv_dir }}/lib/python3.6/site-packages/fedora-hubs.egg-link"

+ - include_tasks: dev_deps.yml

+   when: hubs_dev_mode

+ 

+ - include_tasks: prod_deps.yml

+   when: not hubs_dev_mode

  

- - name: Set bin file context in the virtualenv

-   become: true

-   become_user: "{{ main_user }}"

-   file:

-     path: "{{ hubs_venv_dir }}/bin"

-     state: directory

-     recurse: true

-     setype: bin_t

  

  - name: Add a basic Hubs configuration file

    template:

      src: "{{ item }}"

-     dest: "{{ hubs_conf_dir }}/hubs_config.py"

+     dest: "{{ hubs_conf_dir }}/hubs.py"

+     owner: root

+     group: "{{ main_user }}"

+     mode: 0640

    with_first_found:

      - hubs_config.{{ ansible_hostname }}

      - hubs_config

-   become: true

-   become_user: "{{ main_user }}"

    notify: "hubs configuration change"

  

+ 

  - name: Add a basic fedmsg configuration file

    template:

      src: "{{ item }}"

-     dest: "/etc/fedmsg.d/hubs_config.py"

+     dest: "/etc/fedmsg.d/hubs.py"

    with_first_found:

      - fedmsg_config.{{ ansible_hostname }}

      - fedmsg_config

    notify: "hubs configuration change"

  

+ 

  - name: Configure application to authenticate with iddev.fedorainfracloud.org

    command:

      oidc-register

      --output-file {{ hubs_conf_dir }}/client_secrets.json

-     https://iddev.fedorainfracloud.org/ {{ hubs_url }}

-   become: true

-   become_user: "{{ main_user }}"

+     https://{{ hubs_oidc_url }}/ {{ hubs_url }}

    args:

      creates: "{{ hubs_conf_dir }}/client_secrets.json"

  

+ - name: Set permissions on the oidc credentials file

+   file:

+     path: "{{ hubs_conf_dir }}/client_secrets.json"

+     owner: root

+     group: "{{ main_user }}"

+     mode: 0640

+ 

  

  - name: Start and enable the common services

    service: name={{ item }} state=started enabled=yes
@@ -145,24 +63,6 @@ 

  - include_tasks: db-{{ hubs_db_type }}.yml

  

  

- # Set up JavaScript requirements

- - name: Install npm packages

-   command: npm install

-   become: true

-   become_user: "{{ main_user }}"

-   args:

-     creates: node_modules

-     chdir: "{{ hubs_code_dir }}/hubs/static/client"

- 

- - name: Build JavaScript assets

-   command: npm run build

-   become: true

-   become_user: "{{ main_user }}"

-   args:

-     chdir: "{{ hubs_code_dir }}/hubs/static/client"

-     creates: "{{ hubs_code_dir }}/hubs/static/js/build/common.js"

- 

- 

  # Services

  - name: Disable the system-wide fedmsg daemons

    service: name={{ item }} state=stopped enabled=no

@@ -1,27 +1,19 @@ 

- - name: Install the service files

+ - name: Install the service environment file

    template:

-     src: "{{ item }}.service"

-     dest: /etc/systemd/system/{{ item }}.service

-   with_items:

-     - hubs-triage@

-     - hubs-worker@

-     - hubs-sse

-     - hubs-fedmsg-hub

-   register: service_installed

- 

- - name: reload systemd

-   command: systemctl daemon-reload

-   when: service_installed|changed

+     src: env

+     dest: /etc/sysconfig/fedora-hubs

  

  - name: Start and enable the services in prod mode

    service: name={{ item }} state=started enabled=yes

    with_items:

-     - fedmsg-relay

-     - hubs-triage@1

-     - hubs-triage@2

-     - hubs-worker@1

-     - hubs-worker@2

-     - hubs-sse

-     - hubs-fedmsg-hub

+     - fedmsg-relay-3

+     - fedmsg-hub-3

+     - fedora-hubs-triage@1

+     - fedora-hubs-triage@2

+     - fedora-hubs-worker@1

+     - fedora-hubs-worker@2

+     - fedora-hubs-worker@3

+     - fedora-hubs-worker@4

+     - fedora-hubs-sse

  

  - include_tasks: webserver.yml

@@ -0,0 +1,2 @@ 

+ - name: Install the Fedora Hubs package

+   dnf: name=fedora-hubs state=present

@@ -11,7 +11,7 @@ 

  - name: install python3-certbot-nginx

    dnf: name=python3-certbot-nginx state=present

  

- - name: get the letencrypt cert

+ - name: get the letsencrypt cert

    command: certbot certonly -n --standalone --pre-hook "systemctl stop nginx" --post-hook "systemctl start nginx" -d {{ ansible_fqdn }} --agree-tos --email admin@fedoraproject.org

    args:

      creates: /etc/letsencrypt/live/{{ ansible_fqdn }}/privkey.pem
@@ -19,16 +19,6 @@ 

      - restart nginx

  

  

- - name: Gunicorn logging configuration

-   copy:

-     src: logging.ini

-     dest: "{{ hubs_conf_dir }}/logging.ini"

-     owner: "{{ main_user }}"

-     group: "{{ main_user }}"

-   notify:

-     - restart hubs webapp

- 

- 

  - name: Nginx configuration for hubs

    template:

      src: nginx.conf
@@ -66,22 +56,8 @@ 

      persistent: yes

  

  

- - name: Install the service files

-   template:

-     src: "{{ item }}.service"

-     dest: /etc/systemd/system/{{ item }}.service

-   with_items:

-     - hubs-webapp

-   register: service_installed

- 

- 

- - name: reload systemd

-   command: systemctl daemon-reload

-   when: service_installed|changed

- 

- 

  - name: Start and enable the services

    service: name={{ item }} state=started enabled=yes

    with_items:

-     - hubs-webapp

+     - fedora-hubs-webapp

      - nginx

@@ -5,6 +5,9 @@ 

      . /etc/bashrc

  fi

  

+ alias vi=vim

+ 

+ 

  # Uncomment the following line if you don't like systemctl's auto-paging feature:

  # export SYSTEMD_PAGER=

  
@@ -17,13 +20,12 @@ 

  # https://github.com/nickstenning/honcho/issues/51

  export PYTHONIOENCODING=utf-8

  

- export HUBS_CONFIG={{ hubs_conf_dir }}/hubs_config.py

+ export HUBS_CONFIG={{ hubs_conf_dir }}/hubs.py

  export FLASK_APP={{ hubs_code_dir }}/hubs/app.py

  

  

  workon() {

      [ "$1" == "hubs" ] || ( echo "No such virtualenv."; exit 1 )

-     source {{ hubs_venv_dir }}/bin/activate

      cd {{ hubs_code_dir }}

  }

  
@@ -38,6 +40,6 @@ 

      {% endif %}

      rm {{ hubs_var_dir }}/cache.db

      pushd {{ hubs_code_dir }}

-     {{ hubs_venv_dir }}/bin/python populate.py

+     python3 populate.py

      popd

  }

@@ -0,0 +1,2 @@ 

+ HUBS_CONFIG={{ hubs_conf_dir }}/hubs.py

+ LOGGING_CONFIG={{ hubs_conf_dir }}/logging.ini

@@ -16,16 +16,12 @@ 

          },

      },

  

-     # Fedmsg hub consumer

-     'hubs.consumer.enabled': True,

-     'hubs.redis.triage-queue-name': 'fedora-hubs-triage-queue',

- 

-     # Use fedmsg-relay to publish messages

-     'active': True,

- 

      # FAS credentials

      #'fas_credentials': {

      #    'username': '{{ hubs_fas_username }}',

      #    'password': '{{ hubs_fas_password }}',

      #}

+ 

+     # Use fedmsg-relay to publish messages

+     'active': True,

  }

@@ -1,3 +1,3 @@ 

  FLASK_DEBUG=1

  FLASK_APP={{ hubs_code_dir }}/hubs/app.py

- HUBS_CONFIG={{ hubs_conf_dir }}/hubs_config.py

+ HUBS_CONFIG={{ hubs_conf_dir }}/hubs.py

@@ -1,7 +1,7 @@ 

- web: {{ hubs_venv_dir }}/bin/python /usr/bin/flask-3 run --host 0.0.0.0 --port 5000

- triage: {{ hubs_venv_dir }}/bin/fedora-hubs-triage

- worker: {{ hubs_venv_dir }}/bin/fedora-hubs-worker

- sse: {{ hubs_venv_dir }}/bin/python /usr/bin/twistd -l - --pidfile= -ny {{ hubs_code_dir }}/hubs/backend/sse_server.tac

- fedmsg_hub: {{ hubs_venv_dir }}/bin/python /usr/bin/fedmsg-hub

- fedmsg_relay: {{ hubs_venv_dir }}/bin/python /usr/bin/fedmsg-relay

+ web: /usr/bin/flask-3 run --host 0.0.0.0 --port 5000

+ triage: fedora-hubs-triage

+ worker: fedora-hubs-worker

+ sse: /usr/bin/twistd-3 -l - --pidfile= -n hubs-sse

+ fedmsg_hub: /usr/bin/fedmsg-hub-3

+ fedmsg_relay: /usr/bin/fedmsg-relay-3

  js_build: cd {{ hubs_code_dir }}/hubs/static/client && npm run dev

@@ -1,14 +0,0 @@ 

- [Unit]

- Description=Hubs-specific fedmsg processing hub

- After=network.target

- Documentation=https://fedmsg.readthedocs.org/

- 

- [Service]

- ExecStart={{ hubs_venv_dir }}/bin/python /usr/bin/fedmsg-hub

- Type=simple

- User=fedmsg

- Group=fedmsg

- Restart=on-failure

- 

- [Install]

- WantedBy=multi-user.target

@@ -1,6 +1,8 @@ 

  ---

  - hosts: all

    become_method: sudo

+   become: yes

+   become_user: root

    vars:

      main_user: vagrant

  

@@ -1,53 +0,0 @@ 

- #!/usr/bin/env python

- 

- from __future__ import unicode_literals, print_function

- 

- from argparse import ArgumentParser

- 

- from fedora.client import AppError

- 

- import hubs.app

- import hubs.database

- import hubs.models

- from hubs.utils.fedmsg import get_fedmsg_config

- from hubs.utils.fas import FASClient

- 

- 

- def create_hub(name):

-     pass

- 

- 

- def parse_args():

-     parser = ArgumentParser()

-     parser.add_argument(

-         "name", help="group to create the hub for")

-     return parser.parse_args()

- 

- 

- def main():

-     args = parse_args()

-     hub_name = args.name

-     fedmsg_config = get_fedmsg_config()

-     hubs.database.init(fedmsg_config['hubs.sqlalchemy.uri'])

-     hub = hubs.models.Hub.by_name(hub_name, "team")

-     if hub is not None:

-         print("This hub already exists.")

-         return

-     fas_client = FASClient()

-     try:

-         fas_client.group_by_name(hub_name)

-     except AppError:

-         print("Could not find this group in FAS.")

-         return

-     # Setup app context to have access to the task queue.

-     with hubs.app.app.app_context():

-         db = hubs.database.Session()

-         hubs.app.create_task_queue()

-         hubs.models.Hub.create_group_hub(hub_name, "")

-         db.commit()

-     print("Hub {} created!".format(hub_name))

-     print("It will be synced from FAS in the background.")

- 

- 

- if __name__ == "__main__":

-     main()

deploy/fedora-hubs-sse.service ansible/roles/hubs/templates/hubs-sse.service
file renamed
+4 -6
@@ -5,13 +5,11 @@ 

  

  [Service]

  ExecStart= \

-     {{ hubs_venv_dir }}/bin/python \

-     /usr/bin/twistd -l - --pidfile= \

-     -ny {{ hubs_code_dir }}/hubs/backend/sse_server.tac

- Environment=HUBS_CONFIG={{ hubs_conf_dir }}/hubs_config.py

+     /usr/bin/twistd-3 -l - --pidfile= -n hubs-sse

+ EnvironmentFile=/etc/sysconfig/fedora-hubs

  Type=simple

- User={{ main_user }}

- Group={{ main_user }}

+ User=hubs

+ Group=hubs

  Restart=on-failure

  

  [Install]

deploy/fedora-hubs-triage@.service ansible/roles/hubs/templates/hubs-triage@.service
file renamed
+4 -4
@@ -4,11 +4,11 @@ 

  Documentation=https://pagure.io/fedora-hubs/

  

  [Service]

- ExecStart={{ hubs_venv_dir }}/bin/fedora-hubs-triage

- Environment=HUBS_CONFIG={{ hubs_conf_dir }}/hubs_config.py

+ ExecStart=/usr/bin/fedora-hubs-triage

+ EnvironmentFile=/etc/sysconfig/fedora-hubs

  Type=simple

- User={{ main_user }}

- Group={{ main_user }}

+ User=hubs

+ Group=hubs

  Restart=on-failure

  

  [Install]

deploy/fedora-hubs-webapp.service ansible/roles/hubs/templates/hubs-webapp.service
file renamed
+4 -6
@@ -5,15 +5,13 @@ 

  

  [Service]

  ExecStart= \

-     {{ hubs_venv_dir }}/bin/python \

      /usr/bin/python3-gunicorn -b 127.0.0.1:8000 --threads 12 \

-     --log-config {{ hubs_conf_dir }}/logging.ini \

-     {% if hubs_dev_mode %}--reload{% endif %} \

+     --log-config ${LOGGING_CONFIG} \

      hubs.app:app

- Environment=HUBS_CONFIG={{ hubs_conf_dir }}/hubs_config.py

+ EnvironmentFile=/etc/sysconfig/fedora-hubs

  Type=simple

- User={{ main_user }}

- Group={{ main_user }}

+ User=hubs

+ Group=hubs

  Restart=on-failure

  

  [Install]

deploy/fedora-hubs-worker@.service ansible/roles/hubs/templates/hubs-worker@.service
file renamed
+4 -4
@@ -4,11 +4,11 @@ 

  Documentation=https://pagure.io/fedora-hubs/

  

  [Service]

- ExecStart={{ hubs_venv_dir }}/bin/fedora-hubs-worker

- Environment=HUBS_CONFIG={{ hubs_conf_dir }}/hubs_config.py

+ ExecStart=/usr/bin/fedora-hubs-worker

+ EnvironmentFile=/etc/sysconfig/fedora-hubs

  Type=simple

- User={{ main_user }}

- Group={{ main_user }}

+ User=hubs

+ Group=hubs

  Restart=on-failure

  

  [Install]

deploy/logging.ini ansible/roles/hubs/files/logging.ini
file renamed
file was moved with no change to the file
file added
+2
@@ -0,0 +1,2 @@ 

+ HUBS_CONFIG=/etc/fedora-hubs/config.py

+ LOGGING_CONFIG=/etc/fedora-hubs/logging.ini

file added
+219
@@ -0,0 +1,219 @@ 

+ %global username hubs

+ 

+ Name:           fedora-hubs

+ Version:        0.0.1

+ Release:        1%{?dist}

+ Summary:        Fedora Hubs

+ 

+ License:        AGPLv3

+ URL:            https://pagure.io/fedora-hubs/

+ Source0:        %{name}-%{version}.tar.gz

+ # Source1 is obtained by running Source2

+ Source1:        %{name}-node-modules.tar.xz

+ Source2:        make-node-bundle.sh

+ 

+ BuildArch:      noarch

+ 

+ BuildRequires:  python3-devel

+ BuildRequires:  python3-nose

+ BuildRequires:  python3-mock

+ BuildRequires:  python3-vcrpy

+ 

+ BuildRequires:  python3-flake8

+ BuildRequires:  python3-alembic

+ BuildRequires:  python3-arrow

+ BuildRequires:  python3-beautifulsoup4

+ BuildRequires:  python3-bleach

+ BuildRequires:  python3-blinker

+ BuildRequires:  python3-dateutil

+ BuildRequires:  python3-decorator

+ BuildRequires:  python3-dogpile-cache

+ BuildRequires:  python3-fedmsg

+ BuildRequires:  python3-fedmsg-meta-fedora-infrastructure

+ BuildRequires:  python3-fedora

+ BuildRequires:  python3-flask

+ BuildRequires:  python3-flask-oidc

+ BuildRequires:  python3-html5lib

+ BuildRequires:  python3-humanize

+ BuildRequires:  python3-iso3166

+ BuildRequires:  python3-markdown

+ BuildRequires:  python3-munch

+ BuildRequires:  python3-pkgwat-api

+ BuildRequires:  python3-psycopg2

+ BuildRequires:  python3-pygments

+ BuildRequires:  python3-pygments-markdown-lexer

+ BuildRequires:  python3-pymongo

+ BuildRequires:  python3-pytz

+ BuildRequires:  python3-redis

+ BuildRequires:  python3-requests

+ BuildRequires:  python3-retask

+ BuildRequires:  python3-six

+ BuildRequires:  python3-sqlalchemy

+ BuildRequires:  nodejs

+ BuildRequires:  npm

+ 

+ Requires:       python3-alembic

+ Requires:       python3-arrow

+ Requires:       python3-beautifulsoup4

+ Requires:       python3-bleach

+ Requires:       python3-blinker

+ Requires:       python3-dateutil

+ Requires:       python3-decorator

+ Requires:       python3-dogpile-cache

+ Requires:       python3-fedmsg

+ Requires:       python3-fedmsg-meta-fedora-infrastructure

+ Requires:       python3-fedora

+ Requires:       python3-flask

+ Requires:       python3-flask-oidc

+ Requires:       python3-gunicorn

+ Requires:       python3-html5lib

+ Requires:       python3-humanize

+ Requires:       python3-iso3166

+ Requires:       python3-markdown

+ Requires:       python3-munch

+ Requires:       python3-pkgwat-api

+ Requires:       python3-psycopg2

+ Requires:       python3-pygments

+ Requires:       python3-pygments-markdown-lexer

+ Requires:       python3-pymongo

+ Requires:       python3-pytz

+ Requires:       python3-redis

+ Requires:       python3-requests

+ Requires:       python3-retask

+ Requires:       python3-six

+ Requires:       python3-sqlalchemy

+ Requires:       python3-twisted

+ Requires:       python3-txredisapi

+ 

+ 

+ %{?systemd_requires}

+ BuildRequires:  systemd

+ Requires(pre):  shadow-utils

+ # We need the fedmsg group to exist

+ Requires(pre):  fedmsg-base

+ 

+ 

+ %description

+ Fedora Hubs!

+ 

+ 

+ %prep

+ %autosetup

+ pushd hubs/static/client

+ tar -xf %{SOURCE1}

+ popd

+ rm hubs/static/js/build/.gitignore

+ 

+ 

+ %build

+ %{__python3} setup.py build

+ pushd hubs/static/client

+ # This goes to the internet, but downloads fixed versions.

+ #npm install

+ npm run build

+ popd

+ 

+ 

+ %install

+ rm -rf $RPM_BUILD_ROOT

+ %{__python3} setup.py install -O1 --skip-build --root $RPM_BUILD_ROOT

+ 

+ # Configration file

+ mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/%{name}

+ cat > $RPM_BUILD_ROOT%{_sysconfdir}/%{name}/config.py << EOF

+ # Enter any hubs configuration here

+ SECRET_KEY = "changeme"

+ OIDC_CLIENT_SECRETS = "%{_sysconfdir}/%{name}/client_secrets.json"

+ OIDC_OPENID_REALM = "https://hubs.fedoraproject.org/oidc_callback"

+ SSE_URL = {

+     "path": "/sse",

+ }

+ EOF

+ install -m 644 -p deploy/logging.ini $RPM_BUILD_ROOT%{_sysconfdir}/%{name}/

+ 

+ # Fedmsg configration file

+ mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/fedmsg.d

+ cat > $RPM_BUILD_ROOT%{_sysconfdir}/fedmsg.d/%{name}.py << EOF

+ config = {

+     # Main database

+     'hubs.sqlalchemy.uri': 'sqlite:///%{_localstatedir}/lib/%{name}/hubs.db',

+     # Some configuration for the general hubs cache.

+     "fedora-hubs.cache": {

+         "backend": "dogpile.cache.dbm",

+         "arguments": {

+             "filename": "%{_localstatedir}/lib/%{name}/cache.db",

+         },

+     },

+ }

+ EOF

+ 

+ # Environment file

+ mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig

+ cat > $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/%{name} << EOF

+ USER=%{username}

+ GROUP=%{username}

+ HUBS_CONFIG=%{_sysconfdir}/%{name}/config.py

+ LOGGING_CONFIG=%{_sysconfdir}/%{name}/logging.ini

+ EOF

+ 

+ # Systemd unit files

+ mkdir -p $RPM_BUILD_ROOT%{_unitdir}

+ for svc in sse triage@ worker@ webapp; do

+     install -p -m 644 deploy/fedora-hubs-${svc}.service $RPM_BUILD_ROOT%{_unitdir}/

+ done

+ 

+ # Data directory

+ mkdir -p $RPM_BUILD_ROOT/%{_localstatedir}/lib/%{name}/

+ 

+ 

+ %check

+ sed -i -e "/yanc/d" setup.cfg

+ export HUBS_CONFIG=`pwd`/hubs/tests/hubs_test.cfg

+ export FEDMSG_CONFIG=`pwd`/hubs/tests/fedmsg_test.cfg

+ export PYTHONPATH=.

+ nosetests-3 hubs

+ pushd hubs/static/client

+ npm run test

+ popd

+ 

+ 

+ %pre

+ getent group %{username} >/dev/null || groupadd -r %{username}

+ getent passwd %{username} >/dev/null || \

+     useradd -r -g %{username} -d %{_localstatedir}/lib/%{name} -s /sbin/nologin \

+     -G fedmsg -c "Fedora Hubs" %{username}

+ exit 0

+ 

+ %post

+ for svc in sse triage@ worker@ webapp; do

+     %systemd_post fedora-hubs-${svc}.service

+ done

+ 

+ %preun

+ for svc in sse triage@ worker@ webapp; do

+     %systemd_preun fedora-hubs-${svc}.service

+ done

+ 

+ %postun

+ for svc in sse triage@ worker@ webapp; do

+     %systemd_postun_with_restart fedora-hubs-${svc}.service

+ done

+ 

+ 

+ %files

+ %license LICENSE

+ %doc README.rst

+ %{python3_sitelib}/*

+ %{_unitdir}/*.service

+ %{_bindir}/fedora-hubs-*

+ %dir %{_sysconfdir}/%{name}

+ %config(noreplace) %attr(640,root,%{username}) %{_sysconfdir}/%{name}/config.py

+ %config(noreplace) %{_sysconfdir}/%{name}/logging.ini

+ %config(noreplace) %attr(640,root,fedmsg) %{_sysconfdir}/fedmsg.d/%{name}.py

+ %config(noreplace) %{_sysconfdir}/sysconfig/%{name}

+ %dir %attr(770,%{username},fedmsg) %{_localstatedir}/lib/%{name}/

+ 

+ 

+ %changelog

+ * Mon Jan 29 2018 Aurelien Bompard <abompard@fedoraproject.org> - 0.0.1-1

+ - Initial package

file removed
-2446
@@ -1,2446 +0,0 @@ 

- [{

-     "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on ticket fedora-hubs#245: \"Mockup for web IRC chat interface for waartaa\"",

-     "usernames": [

-         "atelic"

-     ],

-     "human_time": "in 3 hours",

-     "subtitle": "atelic commented on ticket fedora-hubs#245: \"Mockup for web IRC chat interface for waartaa\"",

-     "timestamp": 1470681231,

-     "start_time": 1470681231,

-     "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-     "subjective": "atelic commented on ticket fedora-hubs#245: \"Mockup for web IRC chat interface for waartaa\"",

-     "dom_id": "dd5e0f8b-d263-42fd-9923-bdbbcba8b2fa",

-     "msg_ids": {

-         "2016-9baa7dab-d34c-4485-84b2-6d1187608c28": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on ticket fedora-hubs#245: \"Mockup for web IRC chat interface for waartaa\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on ticket fedora-hubs#245: \"Mockup for web IRC chat interface for waartaa\"",

-             "long_form": "atelic commented on ticket fedora-hubs#245: \"Mockup for web IRC chat interface for waartaa\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "issue/245"

-             ],

-             "link": "https://pagure.io/fedora-hubs/issue/245#comment-3926",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.issue.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on ticket fedora-hubs#245: \"Mockup for web IRC chat interface for waartaa\"",

-             "lexer": null

-         }

-     },

-     "link": "https://pagure.io/fedora-hubs/issue/245#comment-3926",

-     "end_time": 1470681231,

-     "packages": [],

-     "topics": [

-         "io.pagure.prod.pagure.issue.comment.added"

-     ],

-     "categories": [

-         "pagure"

-     ],

-     "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png"

- }, {

-     "subtitle": "atelic interacted with issue #154 of project \"fedora-hubs\" 3 times",

-     "timestamp": 1470679960,

-     "start_time": 1470679956,

-     "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-     "subjective": "atelic interacted with issue #154 of project \"fedora-hubs\" 3 times",

-     "msg_ids": {

-         "2016-01d790b6-a5f3-452d-8224-29df39704467": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on ticket fedora-hubs#154: \"Small amount of horizontal scroll\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on ticket fedora-hubs#154: \"Small amount of horizontal scroll\"",

-             "long_form": "atelic commented on ticket fedora-hubs#154: \"Small amount of horizontal scroll\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "issue/154"

-             ],

-             "link": "https://pagure.io/fedora-hubs/issue/154#comment-3924",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.issue.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on ticket fedora-hubs#154: \"Small amount of horizontal scroll\""

-         },

-         "2016-2f10418b-3cbf-4bd3-b28c-2ca0c759b2d8": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic set the status of ticket fedora-hubs#154 to: Fixed",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic set the status of ticket fedora-hubs#154 to: Fixed",

-             "long_form": "atelic set the status of ticket fedora-hubs#154 to: Fixed",

-             "objects": [

-                 "project/fedora-hubs",

-                 "issue/154"

-             ],

-             "link": "https://pagure.io/fedora-hubs/issue/154",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.issue.edit",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> set the status of ticket fedora-hubs#154 to: Fixed"

-         },

-         "2016-4e164500-62ba-43ab-9195-99c58c98f7fa": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on ticket fedora-hubs#154: \"Small amount of horizontal scroll\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on ticket fedora-hubs#154: \"Small amount of horizontal scroll\"",

-             "long_form": "atelic commented on ticket fedora-hubs#154: \"Small amount of horizontal scroll\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "issue/154"

-             ],

-             "link": "https://pagure.io/fedora-hubs/issue/154#comment-3925",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.issue.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on ticket fedora-hubs#154: \"Small amount of horizontal scroll\""

-         }

-     },

-     "link": "https://pagure.io/fedora-hubs/issue/154",

-     "packages": [],

-     "categories": [

-         "pagure"

-     ],

-     "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-     "usernames": [

-         "atelic"

-     ],

-     "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> interacted with issue #154 of project \"fedora-hubs\" 3 times",

-     "dom_id": "91f1d5ec-e373-4de0-b4c1-4c9266df2f2a",

-     "end_time": 1470679962,

-     "human_time": "in 3 hours",

-     "topics": [

-         "io.pagure.prod.pagure.issue.edit",

-         "io.pagure.prod.pagure.issue.comment.added"

-     ]

- }, {

-     "subtitle": "atelic interacted with issue #171 of project \"fedora-hubs\" 4 times",

-     "timestamp": 1470679257.25,

-     "start_time": 1470679253,

-     "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-     "subjective": "atelic interacted with issue #171 of project \"fedora-hubs\" 4 times",

-     "msg_ids": {

-         "2016-30d12db3-bc4a-4fd5-914d-0a567c8574f3": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on ticket fedora-hubs#171: \"Make a decision on JS framework\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on ticket fedora-hubs#171: \"Make a decision on JS framework\"",

-             "long_form": "atelic commented on ticket fedora-hubs#171: \"Make a decision on JS framework\"",

-             "objects": [

-                 "issue/171",

-                 "project/fedora-hubs"

-             ],

-             "link": "https://pagure.io/fedora-hubs/issue/171#comment-3923",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.issue.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on ticket fedora-hubs#171: \"Make a decision on JS framework\""

-         },

-         "2016-d4643f66-6944-43f5-8f62-731f18f5470b": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic edited the priority fields of ticket fedora-hubs#171",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic edited the priority fields of ticket fedora-hubs#171",

-             "long_form": "atelic edited the priority fields of ticket fedora-hubs#171",

-             "objects": [

-                 "issue/171",

-                 "project/fedora-hubs"

-             ],

-             "link": "https://pagure.io/fedora-hubs/issue/171",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.issue.edit",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> edited the priority fields of ticket fedora-hubs#171"

-         },

-         "2016-4aefc797-5521-481d-9ee3-90edf036b3a2": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on ticket fedora-hubs#171: \"Make a decision on JS framework\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on ticket fedora-hubs#171: \"Make a decision on JS framework\"",

-             "long_form": "atelic commented on ticket fedora-hubs#171: \"Make a decision on JS framework\"",

-             "objects": [

-                 "issue/171",

-                 "project/fedora-hubs"

-             ],

-             "link": "https://pagure.io/fedora-hubs/issue/171#comment-3922",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.issue.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on ticket fedora-hubs#171: \"Make a decision on JS framework\""

-         },

-         "2016-a81dcaa0-77b6-44f3-9ae5-c710c2ee540d": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic set the status of ticket fedora-hubs#171 to: Fixed",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic set the status of ticket fedora-hubs#171 to: Fixed",

-             "long_form": "atelic set the status of ticket fedora-hubs#171 to: Fixed",

-             "objects": [

-                 "issue/171",

-                 "project/fedora-hubs"

-             ],

-             "link": "https://pagure.io/fedora-hubs/issue/171",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.issue.edit",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> set the status of ticket fedora-hubs#171 to: Fixed"

-         }

-     },

-     "link": "https://pagure.io/fedora-hubs/issue/171",

-     "packages": [],

-     "categories": [

-         "pagure"

-     ],

-     "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-     "usernames": [

-         "atelic"

-     ],

-     "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> interacted with issue #171 of project \"fedora-hubs\" 4 times",

-     "dom_id": "c3484845-2fd0-4019-a6a0-7f2f7a931011",

-     "end_time": 1470679261,

-     "human_time": "in 3 hours",

-     "topics": [

-         "io.pagure.prod.pagure.issue.edit",

-         "io.pagure.prod.pagure.issue.comment.added"

-     ]

- }, {

-     "subtitle": "atelic interacted with issue #234 of project \"fedora-hubs\" 3 times",

-     "timestamp": 1470678655,

-     "start_time": 1470678643,

-     "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-     "subjective": "atelic interacted with issue #234 of project \"fedora-hubs\" 3 times",

-     "msg_ids": {

-         "2016-636f4fb2-9378-4181-8d3b-c0566e3171e1": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on ticket fedora-hubs#234: \"Subscribers widget has floating dot and subscribe button\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on ticket fedora-hubs#234: \"Subscribers widget has floating dot and subscribe button\"",

-             "long_form": "atelic commented on ticket fedora-hubs#234: \"Subscribers widget has floating dot and subscribe button\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "issue/234"

-             ],

-             "link": "https://pagure.io/fedora-hubs/issue/234#comment-3921",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.issue.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on ticket fedora-hubs#234: \"Subscribers widget has floating dot and subscribe button\""

-         },

-         "2016-1cb62ec3-9e49-4d07-bb27-ee7255c20115": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic set the status of ticket fedora-hubs#234 to: Fixed",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic set the status of ticket fedora-hubs#234 to: Fixed",

-             "long_form": "atelic set the status of ticket fedora-hubs#234 to: Fixed",

-             "objects": [

-                 "project/fedora-hubs",

-                 "issue/234"

-             ],

-             "link": "https://pagure.io/fedora-hubs/issue/234",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.issue.edit",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> set the status of ticket fedora-hubs#234 to: Fixed"

-         },

-         "2016-98893984-1624-4142-a890-2791e52f5aad": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on ticket fedora-hubs#234: \"Subscribers widget has floating dot and subscribe button\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on ticket fedora-hubs#234: \"Subscribers widget has floating dot and subscribe button\"",

-             "long_form": "atelic commented on ticket fedora-hubs#234: \"Subscribers widget has floating dot and subscribe button\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "issue/234"

-             ],

-             "link": "https://pagure.io/fedora-hubs/issue/234#comment-3920",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.issue.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on ticket fedora-hubs#234: \"Subscribers widget has floating dot and subscribe button\""

-         }

-     },

-     "link": "https://pagure.io/fedora-hubs/issue/234",

-     "packages": [],

-     "categories": [

-         "pagure"

-     ],

-     "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-     "usernames": [

-         "atelic"

-     ],

-     "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> interacted with issue #234 of project \"fedora-hubs\" 3 times",

-     "dom_id": "5bfbc86e-3167-4aad-b43e-8714c8669f8d",

-     "end_time": 1470678661,

-     "human_time": "in 3 hours",

-     "topics": [

-         "io.pagure.prod.pagure.issue.edit",

-         "io.pagure.prod.pagure.issue.comment.added"

-     ]

- }, {

-     "subtitle": "atelic interacted with pull-request #239 of project \"fedora-hubs\" 7 times",

-     "timestamp": 1470356286.142857,

-     "start_time": 1470263110,

-     "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-     "subjective": "atelic interacted with pull-request #239 of project \"fedora-hubs\" 7 times",

-     "msg_ids": {

-         "2016-d3a27251-f4a6-4ce9-8b04-15d4f930cf50": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic opened pull-request#239: \"Add tests for React front end\" on project \"fedora-hubs\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic opened pull-request#239: \"Add tests for React front end\" on project \"fedora-hubs\"",

-             "long_form": "atelic opened pull-request#239: \"Add tests for React front end\" on project \"fedora-hubs\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "pull-request/239"

-             ],

-             "link": "https://pagure.io/fedora-hubs/pull-request/239",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.new",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> opened pull-request#239: \"Add tests for React front end\" on project \"fedora-hubs\""

-         },

-         "2016-22379cd4-6375-4720-b62d-3b9e05b9b100": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#239 of project \"fedora-hubs\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#239 of project \"fedora-hubs\"",

-             "long_form": "atelic commented on pull-request#239 of project \"fedora-hubs\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "pull-request/239"

-             ],

-             "link": "https://pagure.io/fedora-hubs/pull-request/239#comment-8241",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#239 of project \"fedora-hubs\""

-         },

-         "2016-857d6d95-0a12-4f45-9ca3-755a9733534c": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#239 of project \"fedora-hubs\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#239 of project \"fedora-hubs\"",

-             "long_form": "atelic commented on pull-request#239 of project \"fedora-hubs\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "pull-request/239"

-             ],

-             "link": "https://pagure.io/fedora-hubs/pull-request/239#comment-8181",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#239 of project \"fedora-hubs\""

-         },

-         "2016-682cbdb7-e4d2-43da-9cc1-67e439809b02": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#239 of project \"fedora-hubs\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#239 of project \"fedora-hubs\"",

-             "long_form": "atelic commented on pull-request#239 of project \"fedora-hubs\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "pull-request/239"

-             ],

-             "link": "https://pagure.io/fedora-hubs/pull-request/239#comment-8202",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#239 of project \"fedora-hubs\""

-         },

-         "2016-9361ad7c-f696-4470-8f96-a93d9387c162": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#239 of project \"fedora-hubs\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#239 of project \"fedora-hubs\"",

-             "long_form": "atelic commented on pull-request#239 of project \"fedora-hubs\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "pull-request/239"

-             ],

-             "link": "https://pagure.io/fedora-hubs/pull-request/239#comment-8253",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#239 of project \"fedora-hubs\""

-         },

-         "2016-0e6ec94c-763c-4864-a150-07e96eeeac32": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#239 of project \"fedora-hubs\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#239 of project \"fedora-hubs\"",

-             "long_form": "atelic commented on pull-request#239 of project \"fedora-hubs\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "pull-request/239"

-             ],

-             "link": "https://pagure.io/fedora-hubs/pull-request/239#comment-8227",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#239 of project \"fedora-hubs\""

-         },

-         "2016-d9877a21-df96-49a6-a440-9c2d8e5844bb": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#239 of project \"fedora-hubs\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#239 of project \"fedora-hubs\"",

-             "long_form": "atelic commented on pull-request#239 of project \"fedora-hubs\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "pull-request/239"

-             ],

-             "link": "https://pagure.io/fedora-hubs/pull-request/239#comment-8251",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#239 of project \"fedora-hubs\""

-         }

-     },

-     "link": "https://pagure.io/fedora-hubs/pull-request/239",

-     "packages": [],

-     "categories": [

-         "pagure"

-     ],

-     "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-     "usernames": [

-         "atelic"

-     ],

-     "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> interacted with pull-request #239 of project \"fedora-hubs\" 7 times",

-     "dom_id": "e062ee4b-8757-4e8c-ad50-cf2355a5e366",

-     "end_time": 1470431562,

-     "human_time": "3 days ago",

-     "topics": [

-         "io.pagure.prod.pagure.pull-request.comment.added",

-         "io.pagure.prod.pagure.pull-request.new"

-     ]

- }, {

-     "subtitle": "atelic interacted with pull-request #231 of project \"fedora-hubs\" 17 times",

-     "timestamp": 1470174598.9411764,

-     "start_time": 1469837470,

-     "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-     "subjective": "atelic interacted with pull-request #231 of project \"fedora-hubs\" 17 times",

-     "msg_ids": {

-         "2016-8b0221db-e924-4c90-aab1-6d0d79534470": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "long_form": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "pull-request/231"

-             ],

-             "link": "https://pagure.io/fedora-hubs/pull-request/231#comment-8136",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#231 of project \"fedora-hubs\""

-         },

-         "2016-f8a4f5ba-26f3-4acf-93bc-63ca9e0dc07d": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "long_form": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "pull-request/231"

-             ],

-             "link": "https://pagure.io/fedora-hubs/pull-request/231#comment-8235",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#231 of project \"fedora-hubs\""

-         },

-         "2016-b4ecafdc-c463-416e-ac8d-db23040a4672": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "long_form": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "pull-request/231"

-             ],

-             "link": "https://pagure.io/fedora-hubs/pull-request/231#comment-8130",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#231 of project \"fedora-hubs\""

-         },

-         "2016-c6023fd0-8424-43f5-be4c-24f582441eea": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "long_form": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "pull-request/231"

-             ],

-             "link": "https://pagure.io/fedora-hubs/pull-request/231#comment-8132",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#231 of project \"fedora-hubs\""

-         },

-         "2016-f42a24d4-db3c-4036-aa53-03df6efd9215": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "long_form": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "pull-request/231"

-             ],

-             "link": "https://pagure.io/fedora-hubs/pull-request/231#comment-8252",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#231 of project \"fedora-hubs\""

-         },

-         "2016-510603d6-8bad-4131-a45a-ad6b475687a0": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "long_form": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "pull-request/231"

-             ],

-             "link": "https://pagure.io/fedora-hubs/pull-request/231#comment-8138",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#231 of project \"fedora-hubs\""

-         },

-         "2016-e63ad5d2-c44f-44d9-80c4-f01910c2385a": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "long_form": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "pull-request/231"

-             ],

-             "link": "https://pagure.io/fedora-hubs/pull-request/231#comment-8238",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#231 of project \"fedora-hubs\""

-         },

-         "2016-a2418776-4589-4041-a3ad-d7f84492d2c6": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "long_form": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "pull-request/231"

-             ],

-             "link": "https://pagure.io/fedora-hubs/pull-request/231#comment-8142",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#231 of project \"fedora-hubs\""

-         },

-         "2016-89d6e37b-9a06-49a3-b1c7-d8bb53c8bbc9": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "long_form": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "pull-request/231"

-             ],

-             "link": "https://pagure.io/fedora-hubs/pull-request/231#comment-8139",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#231 of project \"fedora-hubs\""

-         },

-         "2016-d585ecd3-05e4-479b-bdf2-64fe03270ea0": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "long_form": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "pull-request/231"

-             ],

-             "link": "https://pagure.io/fedora-hubs/pull-request/231#comment-8096",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#231 of project \"fedora-hubs\""

-         },

-         "2016-437f7764-12e2-4c51-bd0b-f6a25c86f782": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "long_form": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "pull-request/231"

-             ],

-             "link": "https://pagure.io/fedora-hubs/pull-request/231#comment-8133",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#231 of project \"fedora-hubs\""

-         },

-         "2016-7ded95aa-b340-4c8b-85d7-8d6bc0d415c9": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "long_form": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "pull-request/231"

-             ],

-             "link": "https://pagure.io/fedora-hubs/pull-request/231#comment-8120",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#231 of project \"fedora-hubs\""

-         },

-         "2016-fa2cb020-eb03-45f7-81b0-a629e2f8dbab": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "long_form": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "pull-request/231"

-             ],

-             "link": "https://pagure.io/fedora-hubs/pull-request/231#comment-8121",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#231 of project \"fedora-hubs\""

-         },

-         "2016-e34c9a7d-89be-488b-8dbe-071199e9196b": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "long_form": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "pull-request/231"

-             ],

-             "link": "https://pagure.io/fedora-hubs/pull-request/231#comment-8026",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#231 of project \"fedora-hubs\""

-         },

-         "2016-87f98c74-dfdb-4261-8536-3a32011f6112": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "long_form": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "pull-request/231"

-             ],

-             "link": "https://pagure.io/fedora-hubs/pull-request/231#comment-8140",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#231 of project \"fedora-hubs\""

-         },

-         "2016-2c743fe3-b0ba-40fc-ac58-9f32a23714b7": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "long_form": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "pull-request/231"

-             ],

-             "link": "https://pagure.io/fedora-hubs/pull-request/231#comment-8135",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#231 of project \"fedora-hubs\""

-         },

-         "2016-9fcef2e4-fd16-41c5-b198-824b60dc0dde": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "long_form": "atelic commented on pull-request#231 of project \"fedora-hubs\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "pull-request/231"

-             ],

-             "link": "https://pagure.io/fedora-hubs/pull-request/231#comment-8022",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#231 of project \"fedora-hubs\""

-         }

-     },

-     "link": "https://pagure.io/fedora-hubs/pull-request/231",

-     "packages": [],

-     "categories": [

-         "pagure"

-     ],

-     "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-     "usernames": [

-         "atelic"

-     ],

-     "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> interacted with pull-request #231 of project \"fedora-hubs\" 17 times",

-     "dom_id": "dd953aea-1553-4455-a6af-cc9b2128d357",

-     "end_time": 1470420897,

-     "human_time": "5 days ago",

-     "topics": [

-         "io.pagure.prod.pagure.pull-request.comment.added"

-     ]

- }, {

-     "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#246 of project \"fedora-hubs\"",

-     "usernames": [

-         "atelic"

-     ],

-     "human_time": "2 days ago",

-     "subtitle": "atelic commented on pull-request#246 of project \"fedora-hubs\"",

-     "timestamp": 1470418821,

-     "start_time": 1470418821,

-     "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-     "subjective": "atelic commented on pull-request#246 of project \"fedora-hubs\"",

-     "dom_id": "685e8109-f19f-42c6-83df-065ba7378351",

-     "msg_ids": {

-         "2016-92ae6f5c-1f4c-4303-a631-fc5584b51579": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#246 of project \"fedora-hubs\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#246 of project \"fedora-hubs\"",

-             "long_form": "atelic commented on pull-request#246 of project \"fedora-hubs\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "pull-request/246"

-             ],

-             "link": "https://pagure.io/fedora-hubs/pull-request/246#comment-8244",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#246 of project \"fedora-hubs\"",

-             "lexer": null

-         }

-     },

-     "link": "https://pagure.io/fedora-hubs/pull-request/246#comment-8244",

-     "end_time": 1470418821,

-     "packages": [],

-     "topics": [

-         "io.pagure.prod.pagure.pull-request.comment.added"

-     ],

-     "categories": [

-         "pagure"

-     ],

-     "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png"

- }, {

-     "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#241 of project \"fedora-hubs\"",

-     "usernames": [

-         "atelic"

-     ],

-     "human_time": "3 days ago",

-     "subtitle": "atelic commented on pull-request#241 of project \"fedora-hubs\"",

-     "timestamp": 1470358933,

-     "start_time": 1470358933,

-     "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-     "subjective": "atelic commented on pull-request#241 of project \"fedora-hubs\"",

-     "dom_id": "f18a101b-90af-4a20-bca2-bed8ba88e544",

-     "msg_ids": {

-         "2016-6d486c9c-519b-489e-a9dc-27b5b458ceff": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#241 of project \"fedora-hubs\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#241 of project \"fedora-hubs\"",

-             "long_form": "atelic commented on pull-request#241 of project \"fedora-hubs\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "pull-request/241"

-             ],

-             "link": "https://pagure.io/fedora-hubs/pull-request/241#comment-8219",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#241 of project \"fedora-hubs\"",

-             "lexer": null

-         }

-     },

-     "link": "https://pagure.io/fedora-hubs/pull-request/241#comment-8219",

-     "end_time": 1470358933,

-     "packages": [],

-     "topics": [

-         "io.pagure.prod.pagure.pull-request.comment.added"

-     ],

-     "categories": [

-         "pagure"

-     ],

-     "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png"

- }, {

-     "subtitle": "atelic interacted with pull-request #2 of project \"internexpo\" 5 times",

-     "timestamp": 1470335760.6,

-     "start_time": 1470267969,

-     "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-     "subjective": "atelic interacted with pull-request #2 of project \"internexpo\" 5 times",

-     "msg_ids": {

-         "2016-ac36fb61-3b6a-47f3-97ac-986c17296d26": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#2 of project \"internexpo\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#2 of project \"internexpo\"",

-             "long_form": "atelic commented on pull-request#2 of project \"internexpo\"",

-             "objects": [

-                 "pull-request/2",

-                 "project/internexpo"

-             ],

-             "link": "https://pagure.io/internexpo/pull-request/2#comment-8210",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#2 of project \"internexpo\""

-         },

-         "2016-3f48dc8b-319c-43be-b37b-a77e2be7b341": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic opened pull-request#2: \"Add code to this repo\" on project \"internexpo\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic opened pull-request#2: \"Add code to this repo\" on project \"internexpo\"",

-             "long_form": "atelic opened pull-request#2: \"Add code to this repo\" on project \"internexpo\"",

-             "objects": [

-                 "pull-request/2",

-                 "project/internexpo"

-             ],

-             "link": "https://pagure.io/internexpo/pull-request/2",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.new",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> opened pull-request#2: \"Add code to this repo\" on project \"internexpo\""

-         },

-         "2016-92954af1-b34a-4ca7-9b9a-c2c12143ce19": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#2 of project \"internexpo\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#2 of project \"internexpo\"",

-             "long_form": "atelic commented on pull-request#2 of project \"internexpo\"",

-             "objects": [

-                 "pull-request/2",

-                 "project/internexpo"

-             ],

-             "link": "https://pagure.io/internexpo/pull-request/2#comment-8214",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#2 of project \"internexpo\""

-         },

-         "2016-c4707879-ac60-4a35-8af0-fa0d9cc94576": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic edited a comment on pull-request#2 of project \"internexpo\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic edited a comment on pull-request#2 of project \"internexpo\"",

-             "long_form": "atelic edited a comment on pull-request#2 of project \"internexpo\"",

-             "objects": [

-                 "pull-request/2",

-                 "project/internexpo"

-             ],

-             "link": "https://pagure.io/internexpo/pull-request/2#comment-8210",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.edited",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> edited a comment on pull-request#2 of project \"internexpo\""

-         },

-         "2016-1c878b0a-849f-4f97-b501-b4cdf2bbcee0": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#2 of project \"internexpo\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#2 of project \"internexpo\"",

-             "long_form": "atelic commented on pull-request#2 of project \"internexpo\"",

-             "objects": [

-                 "pull-request/2",

-                 "project/internexpo"

-             ],

-             "link": "https://pagure.io/internexpo/pull-request/2#comment-8211",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#2 of project \"internexpo\""

-         }

-     },

-     "link": "https://pagure.io/internexpo/pull-request/2",

-     "packages": [],

-     "categories": [

-         "pagure"

-     ],

-     "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-     "usernames": [

-         "atelic"

-     ],

-     "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> interacted with pull-request #2 of project \"internexpo\" 5 times",

-     "dom_id": "60838fc2-a020-4ef2-803e-6bf35af6170c",

-     "end_time": 1470356477,

-     "human_time": "3 days ago",

-     "topics": [

-         "io.pagure.prod.pagure.pull-request.comment.added",

-         "io.pagure.prod.pagure.pull-request.new",

-         "io.pagure.prod.pagure.pull-request.comment.edited"

-     ]

- }, {

-     "subtitle": "atelic interacted with pull-request #240 of project \"fedora-hubs\" 3 times",

-     "timestamp": 1470312049.3333333,

-     "start_time": 1470268764,

-     "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-     "subjective": "atelic interacted with pull-request #240 of project \"fedora-hubs\" 3 times",

-     "msg_ids": {

-         "2016-bc365882-7666-4728-87e0-0413c1d63800": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic opened pull-request#240: \"Stop populate-from-fas.py from crashing on run\" on project \"fedora-hubs\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic opened pull-request#240: \"Stop populate-from-fas.py from crashing on run\" on project \"fedora-hubs\"",

-             "long_form": "atelic opened pull-request#240: \"Stop populate-from-fas.py from crashing on run\" on project \"fedora-hubs\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "pull-request/240"

-             ],

-             "link": "https://pagure.io/fedora-hubs/pull-request/240",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.new",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> opened pull-request#240: \"Stop populate-from-fas.py from crashing on run\" on project \"fedora-hubs\""

-         },

-         "2016-783b44a7-80f4-41fe-8676-e577164d7327": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#240 of project \"fedora-hubs\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#240 of project \"fedora-hubs\"",

-             "long_form": "atelic commented on pull-request#240 of project \"fedora-hubs\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "pull-request/240"

-             ],

-             "link": "https://pagure.io/fedora-hubs/pull-request/240#comment-8185",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#240 of project \"fedora-hubs\""

-         },

-         "2016-8cf4dbea-4fcd-468f-a24a-2dd3ed656e72": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic merged pull-request#240 of project \"fedora-hubs\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic merged pull-request#240 of project \"fedora-hubs\"",

-             "long_form": "atelic merged pull-request#240 of project \"fedora-hubs\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "pull-request/240"

-             ],

-             "link": "https://pagure.io/fedora-hubs/pull-request/240",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.closed",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> merged pull-request#240 of project \"fedora-hubs\""

-         }

-     },

-     "link": "https://pagure.io/fedora-hubs/pull-request/240",

-     "packages": [],

-     "categories": [

-         "pagure"

-     ],

-     "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-     "usernames": [

-         "atelic"

-     ],

-     "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> interacted with pull-request #240 of project \"fedora-hubs\" 3 times",

-     "dom_id": "d077be97-905b-4b50-bd2e-bb48f5cf4b2b",

-     "end_time": 1470333692,

-     "human_time": "4 days ago",

-     "topics": [

-         "io.pagure.prod.pagure.pull-request.closed",

-         "io.pagure.prod.pagure.pull-request.comment.added",

-         "io.pagure.prod.pagure.pull-request.new"

-     ]

- }, {

-     "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> opened a new ticket internexpo#1: \"This repo is empty\"",

-     "usernames": [

-         "atelic"

-     ],

-     "human_time": "4 days ago",

-     "subtitle": "atelic opened a new ticket internexpo#1: \"This repo is empty\"",

-     "timestamp": 1470267815,

-     "start_time": 1470267815,

-     "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-     "subjective": "atelic opened a new ticket internexpo#1: \"This repo is empty\"",

-     "dom_id": "32e00222-c13b-4fb7-b06d-64c85aedc937",

-     "msg_ids": {

-         "2016-8b96b2bd-2925-469a-a437-0054d2146c33": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic opened a new ticket internexpo#1: \"This repo is empty\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic opened a new ticket internexpo#1: \"This repo is empty\"",

-             "long_form": "atelic opened a new ticket internexpo#1: \"This repo is empty\"",

-             "objects": [

-                 "issue/1",

-                 "project/internexpo"

-             ],

-             "link": "https://pagure.io/internexpo/issue/1",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.issue.new",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> opened a new ticket internexpo#1: \"This repo is empty\"",

-             "lexer": null

-         }

-     },

-     "link": "https://pagure.io/internexpo/issue/1",

-     "end_time": 1470267815,

-     "packages": [],

-     "topics": [

-         "io.pagure.prod.pagure.issue.new"

-     ],

-     "categories": [

-         "pagure"

-     ],

-     "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png"

- }, {

-     "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> created a new project \"internexpo\"",

-     "usernames": [

-         "atelic"

-     ],

-     "human_time": "4 days ago",

-     "subtitle": "atelic created a new project \"internexpo\"",

-     "timestamp": 1470267721,

-     "start_time": 1470267721,

-     "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-     "subjective": "atelic created a new project \"internexpo\"",

-     "dom_id": "3697fedc-2186-432a-af88-990c9b941ce7",

-     "msg_ids": {

-         "2016-1465dd21-7c2e-4ecb-92f3-de5c70bc8cc1": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic created a new project \"internexpo\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic created a new project \"internexpo\"",

-             "long_form": "atelic created a new project \"internexpo\"",

-             "objects": [

-                 "project/internexpo"

-             ],

-             "link": "https://pagure.io/internexpo",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.project.new",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> created a new project \"internexpo\"",

-             "lexer": null

-         }

-     },

-     "link": "https://pagure.io/internexpo",

-     "end_time": 1470267721,

-     "packages": [],

-     "topics": [

-         "io.pagure.prod.pagure.project.new"

-     ],

-     "categories": [

-         "pagure"

-     ],

-     "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png"

- }, {

-     "subtitle": "atelic interacted with issue #164 of project \"fedora-hubs\" 3 times",

-     "timestamp": 1470251976,

-     "start_time": 1470251872,

-     "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-     "subjective": "atelic interacted with issue #164 of project \"fedora-hubs\" 3 times",

-     "msg_ids": {

-         "2016-3884c7cb-bf9f-455c-895c-9de153dc9494": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic set the status of ticket fedora-hubs#164 to: Fixed",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic set the status of ticket fedora-hubs#164 to: Fixed",

-             "long_form": "atelic set the status of ticket fedora-hubs#164 to: Fixed",

-             "objects": [

-                 "project/fedora-hubs",

-                 "issue/164"

-             ],

-             "link": "https://pagure.io/fedora-hubs/issue/164",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.issue.edit",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> set the status of ticket fedora-hubs#164 to: Fixed"

-         },

-         "2016-a8ef33a1-c1c9-44dd-afaf-ff9fcabb74a2": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on ticket fedora-hubs#164: \"Team Hub Member List Widget\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on ticket fedora-hubs#164: \"Team Hub Member List Widget\"",

-             "long_form": "atelic commented on ticket fedora-hubs#164: \"Team Hub Member List Widget\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "issue/164"

-             ],

-             "link": "https://pagure.io/fedora-hubs/issue/164#comment-3832",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.issue.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on ticket fedora-hubs#164: \"Team Hub Member List Widget\""

-         },

-         "2016-da268efb-b7c8-4a75-88a3-369518d9eeee": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on ticket fedora-hubs#164: \"Team Hub Member List Widget\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on ticket fedora-hubs#164: \"Team Hub Member List Widget\"",

-             "long_form": "atelic commented on ticket fedora-hubs#164: \"Team Hub Member List Widget\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "issue/164"

-             ],

-             "link": "https://pagure.io/fedora-hubs/issue/164#comment-3834",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.issue.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on ticket fedora-hubs#164: \"Team Hub Member List Widget\""

-         }

-     },

-     "link": "https://pagure.io/fedora-hubs/issue/164",

-     "packages": [],

-     "categories": [

-         "pagure"

-     ],

-     "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-     "usernames": [

-         "atelic"

-     ],

-     "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> interacted with issue #164 of project \"fedora-hubs\" 3 times",

-     "dom_id": "7988a9a4-d6a8-4180-9b5b-0f3bc5631fff",

-     "end_time": 1470252028,

-     "human_time": "4 days ago",

-     "topics": [

-         "io.pagure.prod.pagure.issue.edit",

-         "io.pagure.prod.pagure.issue.comment.added"

-     ]

- }, {

-     "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> gave <a href=\"/abompard/\" rel=\"nofollow\">@abompard</a>(25) a karma cookie in #fedora-hubs.  \"<a href=\"/abompard/\" rel=\"nofollow\">@abompard</a>++\"",

-     "usernames": [

-         "atelic",

-         "abompard"

-     ],

-     "human_time": "4 days ago",

-     "subtitle": "atelic gave abompard(25) a karma cookie in #fedora-hubs.  \"abompard++\"",

-     "timestamp": 1470249514,

-     "start_time": 1470249514,

-     "secondary_icon": "https://seccdn.libravatar.org/avatar/f0c54afccefcf4bc888e0d37618a8598602a668e4ffc2e433b551ca19fc164d8?s=64&d=retro",

-     "subjective": "atelic gave abompard(25) a karma cookie in #fedora-hubs.  \"abompard++\"",

-     "dom_id": "d381d76b-d052-4f2b-8a5d-cb46c026ae0e",

-     "msg_ids": {

-         "2016-dea24f20-dd28-45c5-aab4-e96815b41110": {

-             "__icon__": "https://apps.fedoraproject.org/img/icons/meetbot.png",

-             "subtitle": "atelic gave abompard(25) a karma cookie in #fedora-hubs.  \"abompard++\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/f0c54afccefcf4bc888e0d37618a8598602a668e4ffc2e433b551ca19fc164d8?s=64&d=retro",

-             "subjective": "atelic gave abompard(25) a karma cookie in #fedora-hubs.  \"abompard++\"",

-             "long_form": "atelic gave abompard(25) a karma cookie in #fedora-hubs.  \"abompard++\"",

-             "objects": [

-                 "karma/abompard"

-             ],

-             "link": "https://badges.fedoraproject.org/user/abompard",

-             "packages": [],

-             "icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "usernames": [

-                 "atelic",

-                 "abompard"

-             ],

-             "title": "irc.karma",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> gave <a href=\"/abompard/\" rel=\"nofollow\">@abompard</a>(25) a karma cookie in #fedora-hubs.  \"<a href=\"/abompard/\" rel=\"nofollow\">@abompard</a>++\"",

-             "lexer": null

-         }

-     },

-     "link": "https://badges.fedoraproject.org/user/abompard",

-     "end_time": 1470249514,

-     "packages": [],

-     "topics": [

-         "org.fedoraproject.prod.irc.karma"

-     ],

-     "categories": [

-         "irc"

-     ],

-     "icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro"

- }, {

-     "subtitle": "atelic interacted with pull-request #236 of project \"fedora-hubs\" 2 times",

-     "timestamp": 1470162363.5,

-     "start_time": 1470161171,

-     "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-     "subjective": "atelic interacted with pull-request #236 of project \"fedora-hubs\" 2 times",

-     "msg_ids": {

-         "2016-c482de19-046f-4e0a-baf8-db8a1b173b75": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#236 of project \"fedora-hubs\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#236 of project \"fedora-hubs\"",

-             "long_form": "atelic commented on pull-request#236 of project \"fedora-hubs\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "pull-request/236"

-             ],

-             "link": "https://pagure.io/fedora-hubs/pull-request/236#comment-8114",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#236 of project \"fedora-hubs\""

-         },

-         "2016-bdbb082e-a651-41d6-9be6-7a21a2c9fd23": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#236 of project \"fedora-hubs\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#236 of project \"fedora-hubs\"",

-             "long_form": "atelic commented on pull-request#236 of project \"fedora-hubs\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "pull-request/236"

-             ],

-             "link": "https://pagure.io/fedora-hubs/pull-request/236#comment-8123",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#236 of project \"fedora-hubs\""

-         }

-     },

-     "link": "https://pagure.io/fedora-hubs/pull-request/236",

-     "packages": [],

-     "categories": [

-         "pagure"

-     ],

-     "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-     "usernames": [

-         "atelic"

-     ],

-     "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> interacted with pull-request #236 of project \"fedora-hubs\" 2 times",

-     "dom_id": "b4ee44b3-0860-469b-99bf-e2d9ae8be3cf",

-     "end_time": 1470163556,

-     "human_time": "5 days ago",

-     "topics": [

-         "io.pagure.prod.pagure.pull-request.comment.added"

-     ]

- }, {

-     "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> opened a new ticket <a href=\"/atelic/\" rel=\"nofollow\">@atelic</a>/test#1: \"test &amp; &gt; 1.2 &lt;img src=\"https://pingoured.fr/random\" alt=\"foo\"/&gt; &lt;script&gt; alert('hi')&lt;/script&gt;\"",

-     "usernames": [

-         "atelic"

-     ],

-     "human_time": "5 days ago",

-     "subtitle": "atelic opened a new ticket atelic/test#1: \"test &amp; &gt; 1.2 &lt;img src=\"https://pingoured.fr/random\" alt=\"foo\"/&gt; &lt;script&gt; alert('hi')&lt;/script&gt;\"",

-     "timestamp": 1470161866,

-     "start_time": 1470161866,

-     "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-     "subjective": "atelic opened a new ticket atelic/test#1: \"test &amp; &gt; 1.2 &lt;img src=\"https://pingoured.fr/random\" alt=\"foo\"/&gt; &lt;script&gt; alert('hi')&lt;/script&gt;\"",

-     "dom_id": "865a4b73-5b7b-423a-a075-fc41c2faa5cb",

-     "msg_ids": {

-         "2016-95fa6450-e838-40f3-b3fc-8bef1d7637dc": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic opened a new ticket atelic/test#1: \"test &amp; &gt; 1.2 &lt;img src=\"https://pingoured.fr/random\" alt=\"foo\"/&gt; &lt;script&gt; alert('hi')&lt;/script&gt;\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic opened a new ticket atelic/test#1: \"test &amp; &gt; 1.2 &lt;img src=\"https://pingoured.fr/random\" alt=\"foo\"/&gt; &lt;script&gt; alert('hi')&lt;/script&gt;\"",

-             "long_form": "atelic opened a new ticket atelic/test#1: \"test &amp; &gt; 1.2 &lt;img src=\"https://pingoured.fr/random\" alt=\"foo\"/&gt; &lt;script&gt; alert('hi')&lt;/script&gt;\"",

-             "objects": [

-                 "issue/1",

-                 "project/atelic/test"

-             ],

-             "link": "https://pagure.io/fork/atelic/test/issue/1",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.issue.new",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> opened a new ticket <a href=\"/atelic/\" rel=\"nofollow\">@atelic</a>/test#1: \"test &amp; &gt; 1.2 &lt;img src=\"https://pingoured.fr/random\" alt=\"foo\"/&gt; &lt;script&gt; alert('hi')&lt;/script&gt;\"",

-             "lexer": null

-         }

-     },

-     "link": "https://pagure.io/fork/atelic/test/issue/1",

-     "end_time": 1470161866,

-     "packages": [],

-     "topics": [

-         "io.pagure.prod.pagure.issue.new"

-     ],

-     "categories": [

-         "pagure"

-     ],

-     "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png"

- }, {

-     "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#237 of project \"fedora-hubs\"",

-     "usernames": [

-         "atelic"

-     ],

-     "human_time": "5 days ago",

-     "subtitle": "atelic commented on pull-request#237 of project \"fedora-hubs\"",

-     "timestamp": 1470160881,

-     "start_time": 1470160881,

-     "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-     "subjective": "atelic commented on pull-request#237 of project \"fedora-hubs\"",

-     "dom_id": "0d87b48d-4f7d-4ab0-a6b8-1b6112d451c3",

-     "msg_ids": {

-         "2016-fb2099d7-0557-42ae-84e4-bb9ed1b8c320": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#237 of project \"fedora-hubs\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#237 of project \"fedora-hubs\"",

-             "long_form": "atelic commented on pull-request#237 of project \"fedora-hubs\"",

-             "objects": [

-                 "project/fedora-hubs",

-                 "pull-request/237"

-             ],

-             "link": "https://pagure.io/fedora-hubs/pull-request/237#comment-8110",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#237 of project \"fedora-hubs\"",

-             "lexer": null

-         }

-     },

-     "link": "https://pagure.io/fedora-hubs/pull-request/237#comment-8110",

-     "end_time": 1470160881,

-     "packages": [],

-     "topics": [

-         "io.pagure.prod.pagure.pull-request.comment.added"

-     ],

-     "categories": [

-         "pagure"

-     ],

-     "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png"

- }, {

-     "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> edited the Enforce_signed-off_commits_in_pull-request, Minimum_score_to_merge_pull-request, and 6 others fields of project <a href=\"/atelic/\" rel=\"nofollow\">@atelic</a>/test",

-     "usernames": [

-         "atelic"

-     ],

-     "human_time": "a month ago",

-     "subtitle": "atelic edited the Enforce_signed-off_commits_in_pull-request, Minimum_score_to_merge_pull-request, and 6 others fields of project atelic/test",

-     "timestamp": 1467917437,

-     "start_time": 1467917437,

-     "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-     "subjective": "atelic edited the Enforce_signed-off_commits_in_pull-request, Minimum_score_to_merge_pull-request, and 6 others fields of project atelic/test",

-     "dom_id": "2c69bf0c-e6bd-4cb6-afc2-7b5733b8bfdd",

-     "msg_ids": {

-         "2016-c1659952-34fe-463c-ac59-b6dfbbda1359": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic edited the Enforce_signed-off_commits_in_pull-request, Minimum_score_to_merge_pull-request, and 6 others fields of project atelic/test",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic edited the Enforce_signed-off_commits_in_pull-request, Minimum_score_to_merge_pull-request, and 6 others fields of project atelic/test",

-             "long_form": "atelic edited the Enforce_signed-off_commits_in_pull-request, Minimum_score_to_merge_pull-request, and 6 others fields of project atelic/test",

-             "objects": [

-                 "project/atelic/test"

-             ],

-             "link": "https://pagure.io/fork/atelic/test",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.project.edit",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> edited the Enforce_signed-off_commits_in_pull-request, Minimum_score_to_merge_pull-request, and 6 others fields of project <a href=\"/atelic/\" rel=\"nofollow\">@atelic</a>/test",

-             "lexer": null

-         }

-     },

-     "link": "https://pagure.io/fork/atelic/test",

-     "end_time": 1467917437,

-     "packages": [],

-     "topics": [

-         "io.pagure.prod.pagure.project.edit"

-     ],

-     "categories": [

-         "pagure"

-     ],

-     "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png"

- }, {

-     "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> forked project \"test\" to \"<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a>/test\"",

-     "usernames": [

-         "atelic"

-     ],

-     "human_time": "a month ago",

-     "subtitle": "atelic forked project \"test\" to \"atelic/test\"",

-     "timestamp": 1467917378,

-     "start_time": 1467917378,

-     "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-     "subjective": "atelic forked project \"test\" to \"atelic/test\"",

-     "dom_id": "14c16b53-5f1d-4b9c-ad7e-beb5785495b6",

-     "msg_ids": {

-         "2016-4363f65e-705d-4f93-afc4-f675f309af0f": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic forked project \"test\" to \"atelic/test\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic forked project \"test\" to \"atelic/test\"",

-             "long_form": "atelic forked project \"test\" to \"atelic/test\"",

-             "objects": [

-                 "project/atelic/test"

-             ],

-             "link": "https://pagure.io/fork/atelic/test",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.project.forked",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> forked project \"test\" to \"<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a>/test\"",

-             "lexer": null

-         }

-     },

-     "link": "https://pagure.io/fork/atelic/test",

-     "end_time": 1467917378,

-     "packages": [],

-     "topics": [

-         "io.pagure.prod.pagure.project.forked"

-     ],

-     "categories": [

-         "pagure"

-     ],

-     "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png"

- }, {

-     "subtitle": "atelic interacted with pull-request #1101 of project \"pagure\" 14 times",

-     "timestamp": 1467451273,

-     "start_time": 1467319877,

-     "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-     "subjective": "atelic interacted with pull-request #1101 of project \"pagure\" 14 times",

-     "msg_ids": {

-         "2016-b8a93b19-e3d8-42a6-9aed-f6ebb61fe7e1": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#1101 of project \"pagure\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#1101 of project \"pagure\"",

-             "long_form": "atelic commented on pull-request#1101 of project \"pagure\"",

-             "objects": [

-                 "project/pagure",

-                 "pull-request/1101"

-             ],

-             "link": "https://pagure.io/pagure/pull-request/1101#comment-6768",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#1101 of project \"pagure\""

-         },

-         "2016-e913fda8-8488-457f-a6fd-f67a9e930bae": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#1101 of project \"pagure\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#1101 of project \"pagure\"",

-             "long_form": "atelic commented on pull-request#1101 of project \"pagure\"",

-             "objects": [

-                 "project/pagure",

-                 "pull-request/1101"

-             ],

-             "link": "https://pagure.io/pagure/pull-request/1101#comment-6762",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#1101 of project \"pagure\""

-         },

-         "2016-fb3f93c0-bcfb-4bfb-97fd-8746ee6b368e": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#1101 of project \"pagure\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#1101 of project \"pagure\"",

-             "long_form": "atelic commented on pull-request#1101 of project \"pagure\"",

-             "objects": [

-                 "project/pagure",

-                 "pull-request/1101"

-             ],

-             "link": "https://pagure.io/pagure/pull-request/1101#comment-6863",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#1101 of project \"pagure\""

-         },

-         "2016-bbcd7cf5-21a4-4c4f-8581-33a1b86948ed": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic opened pull-request#1101: \"Add dropdown select for # issue tag\" on project \"pagure\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic opened pull-request#1101: \"Add dropdown select for # issue tag\" on project \"pagure\"",

-             "long_form": "atelic opened pull-request#1101: \"Add dropdown select for # issue tag\" on project \"pagure\"",

-             "objects": [

-                 "project/pagure",

-                 "pull-request/1101"

-             ],

-             "link": "https://pagure.io/pagure/pull-request/1101",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.new",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> opened pull-request#1101: \"Add dropdown select for # issue tag\" on project \"pagure\""

-         },

-         "2016-4b437ae8-fac6-4f27-97a4-b96bad9a9fea": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#1101 of project \"pagure\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#1101 of project \"pagure\"",

-             "long_form": "atelic commented on pull-request#1101 of project \"pagure\"",

-             "objects": [

-                 "project/pagure",

-                 "pull-request/1101"

-             ],

-             "link": "https://pagure.io/pagure/pull-request/1101#comment-6865",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#1101 of project \"pagure\""

-         },

-         "2016-28a959ab-4de4-47b6-87f9-ba785a8d5d89": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic edited a comment on pull-request#1101 of project \"pagure\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic edited a comment on pull-request#1101 of project \"pagure\"",

-             "long_form": "atelic edited a comment on pull-request#1101 of project \"pagure\"",

-             "objects": [

-                 "project/pagure",

-                 "pull-request/1101"

-             ],

-             "link": "https://pagure.io/pagure/pull-request/1101#comment-6861",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.edited",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> edited a comment on pull-request#1101 of project \"pagure\""

-         },

-         "2016-eb3ccad2-6138-43a6-baf2-950ba7fba070": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#1101 of project \"pagure\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#1101 of project \"pagure\"",

-             "long_form": "atelic commented on pull-request#1101 of project \"pagure\"",

-             "objects": [

-                 "project/pagure",

-                 "pull-request/1101"

-             ],

-             "link": "https://pagure.io/pagure/pull-request/1101#comment-6802",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#1101 of project \"pagure\""

-         },

-         "2016-bd253eae-8e04-402a-b977-78097fc58d7b": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#1101 of project \"pagure\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#1101 of project \"pagure\"",

-             "long_form": "atelic commented on pull-request#1101 of project \"pagure\"",

-             "objects": [

-                 "project/pagure",

-                 "pull-request/1101"

-             ],

-             "link": "https://pagure.io/pagure/pull-request/1101#comment-6861",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#1101 of project \"pagure\""

-         },

-         "2016-b9769ced-94ad-4e2f-aea3-c0c4b33a8b9c": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#1101 of project \"pagure\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#1101 of project \"pagure\"",

-             "long_form": "atelic commented on pull-request#1101 of project \"pagure\"",

-             "objects": [

-                 "project/pagure",

-                 "pull-request/1101"

-             ],

-             "link": "https://pagure.io/pagure/pull-request/1101#comment-6763",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#1101 of project \"pagure\""

-         },

-         "2016-8d7af750-206b-4aa2-9f83-aaae05047564": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#1101 of project \"pagure\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#1101 of project \"pagure\"",

-             "long_form": "atelic commented on pull-request#1101 of project \"pagure\"",

-             "objects": [

-                 "project/pagure",

-                 "pull-request/1101"

-             ],

-             "link": "https://pagure.io/pagure/pull-request/1101#comment-6790",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#1101 of project \"pagure\""

-         },

-         "2016-0c38b714-1c1e-4842-a493-eab62a241bcd": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic edited a comment on pull-request#1101 of project \"pagure\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic edited a comment on pull-request#1101 of project \"pagure\"",

-             "long_form": "atelic edited a comment on pull-request#1101 of project \"pagure\"",

-             "objects": [

-                 "project/pagure",

-                 "pull-request/1101"

-             ],

-             "link": "https://pagure.io/pagure/pull-request/1101#comment-6767",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.edited",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> edited a comment on pull-request#1101 of project \"pagure\""

-         },

-         "2016-d13cf049-13a4-4e6a-ad59-65da3eada965": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#1101 of project \"pagure\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#1101 of project \"pagure\"",

-             "long_form": "atelic commented on pull-request#1101 of project \"pagure\"",

-             "objects": [

-                 "project/pagure",

-                 "pull-request/1101"

-             ],

-             "link": "https://pagure.io/pagure/pull-request/1101#comment-6769",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#1101 of project \"pagure\""

-         },

-         "2016-4fbe1729-d38e-480d-b524-a77c0506f546": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic edited a comment on pull-request#1101 of project \"pagure\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic edited a comment on pull-request#1101 of project \"pagure\"",

-             "long_form": "atelic edited a comment on pull-request#1101 of project \"pagure\"",

-             "objects": [

-                 "project/pagure",

-                 "pull-request/1101"

-             ],

-             "link": "https://pagure.io/pagure/pull-request/1101#comment-6767",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.edited",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> edited a comment on pull-request#1101 of project \"pagure\""

-         },

-         "2016-e9b83f54-31e0-46df-85c0-0d83e6fa0c07": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#1101 of project \"pagure\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#1101 of project \"pagure\"",

-             "long_form": "atelic commented on pull-request#1101 of project \"pagure\"",

-             "objects": [

-                 "project/pagure",

-                 "pull-request/1101"

-             ],

-             "link": "https://pagure.io/pagure/pull-request/1101#comment-6767",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#1101 of project \"pagure\""

-         }

-     },

-     "link": "https://pagure.io/pagure/pull-request/1101",

-     "packages": [],

-     "categories": [

-         "pagure"

-     ],

-     "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-     "usernames": [

-         "atelic"

-     ],

-     "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> interacted with pull-request #1101 of project \"pagure\" 14 times",

-     "dom_id": "ea29ebe1-603b-4dcc-a7ac-8944bb3adc13",

-     "end_time": 1467747435,

-     "human_time": "a month ago",

-     "topics": [

-         "io.pagure.prod.pagure.pull-request.comment.added",

-         "io.pagure.prod.pagure.pull-request.new",

-         "io.pagure.prod.pagure.pull-request.comment.edited"

-     ]

- }, {

-     "subtitle": "atelic, devyani7_, and 4 others participated in fedora-hubs in #fedora-hubs",

-     "timestamp": 1467743322.6,

-     "start_time": 1467742586,

-     "secondary_icon": "https://seccdn.libravatar.org/avatar/01fe73d687f4db328da1183f2a1b5b22962ca9d9c50f0728aafeac974856311c?s=64&d=retro",

-     "subjective": "atelic, devyani7_, and 4 others participated in fedora-hubs in #fedora-hubs",

-     "msg_ids": {

-         "2016-125dc31b-3c19-40be-beaf-1df93bff1e39": {

-             "__icon__": "https://apps.fedoraproject.org/img/icons/meetbot.png",

-             "subtitle": "pingou's meeting titled \"fedora-hubs\" ended in #fedora-hubs",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/01fe73d687f4db328da1183f2a1b5b22962ca9d9c50f0728aafeac974856311c?s=64&d=retro",

-             "subjective": "pingou's meeting titled \"fedora-hubs\" ended in #fedora-hubs",

-             "long_form": "<h5>=========================\n#fedora-hubs: fedora-hubs\n=========================\n\n\nMeeting started by pingou at 14:12:44 UTC. The full logs are available\nat\nhttps://meetbot.fedoraproject.org/fedora-hubs/2016-07-05/fedora-hubs.2016-07-05-14.12.log.html\n.\n\n\n\nMeeting summary\n---------------\n* rollcall  (pingou, 14:12:54)\n\n* status updates  (pingou, 14:16:26)\n  * LINK: https://pagure.io/fedora-bootstrap looks like only Ryan has\n    commit there  (pingou, 14:18:40)\n  * LINK: https://pagure.io/fedora-hubs/issue/33   (pingou, 14:28:18)\n\n* open-floor  (pingou, 14:38:50)\n\nMeeting ended at 14:41:19 UTC.\n\n\n\n\nAction Items\n------------\n\n\n\n\n\nAction Items, by person\n-----------------------\n* **UNASSIGNED**\n  * (none)\n\n\n\n\nPeople Present (lines said)\n---------------------------\n* pingou (50)\n* atelic (10)\n* radhikak (7)\n* zodbot (7)\n* devyani7_ (6)\n* stickster (4)\n\n\n\n\nGenerated by `MeetBot`_ 0.1.4\n\n.. _`MeetBot`: http://wiki.debian.org/MeetBot\n</h5>",

-             "objects": [

-                 "attendees/devyani7_",

-                 "titles/fedora-hubs",

-                 "attendees/stickster",

-                 "topics/open-floor",

-                 "channels/#fedora-hubs",

-                 "attendees/pingou",

-                 "attendees/radhikak",

-                 "attendees/atelic"

-             ],

-             "link": "https://meetbot.fedoraproject.org/fedora-hubs/2016-07-05/fedora-hubs.2016-07-05-14.12.html",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/img/icons/meetbot.png",

-             "usernames": [

-                 "atelic",

-                 "radhikak",

-                 "stickster",

-                 "pingou",

-                 "devyani7_"

-             ],

-             "title": "meetbot.meeting.complete",

-             "markup": "<a href=\"/pingou/\" rel=\"nofollow\">@pingou</a>'s meeting titled \"fedora-hubs\" ended in #fedora-hubs"

-         },

-         "2016-a6dab4e9-3ab8-4668-a2cb-c3aec2fd3b9c": {

-             "__icon__": "https://apps.fedoraproject.org/img/icons/meetbot.png",

-             "subtitle": "pingou linked to more information in the \"fedora-hubs\" meeting in #fedora-hubs: \"https://pagure.io/fedora-bootstrap looks like only Ryan has commit there\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/01fe73d687f4db328da1183f2a1b5b22962ca9d9c50f0728aafeac974856311c?s=64&d=retro",

-             "subjective": "pingou linked to more information in the \"fedora-hubs\" meeting in #fedora-hubs: \"https://pagure.io/fedora-bootstrap looks like only Ryan has commit there\"",

-             "long_form": "pingou linked to more information in the \"fedora-hubs\" meeting in #fedora-hubs: \"https://pagure.io/fedora-bootstrap looks like only Ryan has commit there\"",

-             "objects": [

-                 "attendees/devyani7_",

-                 "titles/fedora-hubs",

-                 "attendees/stickster",

-                 "channels/#fedora-hubs",

-                 "attendees/pingou",

-                 "attendees/radhikak",

-                 "attendees/atelic",

-                 "topics/status updates"

-             ],

-             "link": "https://pagure.io/fedora-bootstrap",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/img/icons/meetbot.png",

-             "usernames": [

-                 "atelic",

-                 "radhikak",

-                 "stickster",

-                 "pingou",

-                 "devyani7_"

-             ],

-             "title": "meetbot.meeting.item.link",

-             "markup": "<a href=\"/pingou/\" rel=\"nofollow\">@pingou</a> linked to more information in the \"fedora-hubs\" meeting in #fedora-hubs: \"https://pagure.io/fedora-bootstrap looks like only Ryan has commit there\""

-         },

-         "2016-5d644757-f50d-4b53-a813-9382afb747fd": {

-             "__icon__": "https://apps.fedoraproject.org/img/icons/meetbot.png",

-             "subtitle": "The topic of pingou's \"fedora-hubs\" meeting changed to \"status updates\" in #fedora-hubs",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/01fe73d687f4db328da1183f2a1b5b22962ca9d9c50f0728aafeac974856311c?s=64&d=retro",

-             "subjective": "The topic of pingou's \"fedora-hubs\" meeting changed to \"status updates\" in #fedora-hubs",

-             "long_form": "The topic of pingou's \"fedora-hubs\" meeting changed to \"status updates\" in #fedora-hubs",

-             "objects": [

-                 "attendees/devyani7_",

-                 "titles/fedora-hubs",

-                 "attendees/stickster",

-                 "channels/#fedora-hubs",

-                 "attendees/pingou",

-                 "attendees/radhikak",

-                 "attendees/atelic",

-                 "topics/status updates"

-             ],

-             "link": null,

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/img/icons/meetbot.png",

-             "usernames": [

-                 "atelic",

-                 "radhikak",

-                 "stickster",

-                 "pingou",

-                 "devyani7_"

-             ],

-             "title": "meetbot.meeting.topic.update",

-             "markup": "The topic of <a href=\"/pingou/\" rel=\"nofollow\">@pingou</a>'s \"fedora-hubs\" meeting changed to \"status updates\" in #fedora-hubs"

-         },

-         "2016-ff66aff5-bb8a-462b-9bfb-58f7fe79ab6d": {

-             "__icon__": "https://apps.fedoraproject.org/img/icons/meetbot.png",

-             "subtitle": "pingou linked to more information in the \"fedora-hubs\" meeting in #fedora-hubs: \"https://pagure.io/fedora-hubs/issue/33\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/01fe73d687f4db328da1183f2a1b5b22962ca9d9c50f0728aafeac974856311c?s=64&d=retro",

-             "subjective": "pingou linked to more information in the \"fedora-hubs\" meeting in #fedora-hubs: \"https://pagure.io/fedora-hubs/issue/33\"",

-             "long_form": "pingou linked to more information in the \"fedora-hubs\" meeting in #fedora-hubs: \"https://pagure.io/fedora-hubs/issue/33\"",

-             "objects": [

-                 "attendees/devyani7_",

-                 "titles/fedora-hubs",

-                 "attendees/stickster",

-                 "channels/#fedora-hubs",

-                 "attendees/pingou",

-                 "attendees/radhikak",

-                 "attendees/atelic",

-                 "topics/status updates"

-             ],

-             "link": null,

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/img/icons/meetbot.png",

-             "usernames": [

-                 "atelic",

-                 "radhikak",

-                 "stickster",

-                 "pingou",

-                 "devyani7_"

-             ],

-             "title": "meetbot.meeting.item.link",

-             "markup": "<a href=\"/pingou/\" rel=\"nofollow\">@pingou</a> linked to more information in the \"fedora-hubs\" meeting in #fedora-hubs: \"https://pagure.io/fedora-hubs/issue/33\""

-         },

-         "2016-6e626d88-14e8-42b7-be6d-29ea97e4fa30": {

-             "__icon__": "https://apps.fedoraproject.org/img/icons/meetbot.png",

-             "subtitle": "The topic of pingou's \"fedora-hubs\" meeting changed to \"open-floor\" in #fedora-hubs",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/01fe73d687f4db328da1183f2a1b5b22962ca9d9c50f0728aafeac974856311c?s=64&d=retro",

-             "subjective": "The topic of pingou's \"fedora-hubs\" meeting changed to \"open-floor\" in #fedora-hubs",

-             "long_form": "The topic of pingou's \"fedora-hubs\" meeting changed to \"open-floor\" in #fedora-hubs",

-             "objects": [

-                 "attendees/devyani7_",

-                 "titles/fedora-hubs",

-                 "attendees/stickster",

-                 "topics/open-floor",

-                 "channels/#fedora-hubs",

-                 "attendees/pingou",

-                 "attendees/radhikak",

-                 "attendees/atelic"

-             ],

-             "link": null,

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/img/icons/meetbot.png",

-             "usernames": [

-                 "atelic",

-                 "radhikak",

-                 "stickster",

-                 "pingou",

-                 "devyani7_"

-             ],

-             "title": "meetbot.meeting.topic.update",

-             "markup": "The topic of <a href=\"/pingou/\" rel=\"nofollow\">@pingou</a>'s \"fedora-hubs\" meeting changed to \"open-floor\" in #fedora-hubs"

-         }

-     },

-     "link": "https://meetbot.fedoraproject.org/fedora-hubs/2016-07-05/fedora-hubs.2016-07-05-14.12",

-     "packages": [],

-     "categories": [

-         "meetbot"

-     ],

-     "icon": "https://apps.fedoraproject.org/img/icons/meetbot.png",

-     "usernames": [

-         "atelic",

-         "radhikak",

-         "stickster",

-         "pingou",

-         "devyani7_"

-     ],

-     "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a>, <a href=\"/devyani7_/\" rel=\"nofollow\">@devyani7_</a>, and 4 others participated in fedora-hubs in #fedora-hubs",

-     "dom_id": "0270822e-fd91-4184-b38d-818ea99b8e0a",

-     "end_time": 1467744079,

-     "human_time": "a month ago",

-     "topics": [

-         "org.fedoraproject.prod.meetbot.meeting.complete",

-         "org.fedoraproject.prod.meetbot.meeting.item.link",

-         "org.fedoraproject.prod.meetbot.meeting.topic.update"

-     ]

- }, {

-     "subtitle": "atelic interacted with pull-request #206 of project \"fedora-hubs\" 2 times",

-     "timestamp": 1467268038.5,

-     "start_time": 1467228169,

-     "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-     "subjective": "atelic interacted with pull-request #206 of project \"fedora-hubs\" 2 times",

-     "msg_ids": {

-         "2016-23d3bb2f-431a-43f4-bc5b-a3774791e304": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#206 of project \"fedora-hubs\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#206 of project \"fedora-hubs\"",

-             "long_form": "atelic commented on pull-request#206 of project \"fedora-hubs\"",

-             "objects": [

-                 "pull-request/206",

-                 "project/fedora-hubs"

-             ],

-             "link": "https://pagure.io/fedora-hubs/pull-request/206#comment-6746",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#206 of project \"fedora-hubs\""

-         },

-         "2016-75011179-c035-421c-b76e-ac18af8a6dcb": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic opened pull-request#206: \"Fix issue with Feed elements not rendering\" on project \"fedora-hubs\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic opened pull-request#206: \"Fix issue with Feed elements not rendering\" on project \"fedora-hubs\"",

-             "long_form": "atelic opened pull-request#206: \"Fix issue with Feed elements not rendering\" on project \"fedora-hubs\"",

-             "objects": [

-                 "pull-request/206",

-                 "project/fedora-hubs"

-             ],

-             "link": "https://pagure.io/fedora-hubs/pull-request/206",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.new",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> opened pull-request#206: \"Fix issue with Feed elements not rendering\" on project \"fedora-hubs\""

-         }

-     },

-     "link": "https://pagure.io/fedora-hubs/pull-request/206",

-     "packages": [],

-     "categories": [

-         "pagure"

-     ],

-     "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-     "usernames": [

-         "atelic"

-     ],

-     "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> interacted with pull-request #206 of project \"fedora-hubs\" 2 times",

-     "dom_id": "c782076a-b8d5-4115-a375-3dcb57990454",

-     "end_time": 1467307908,

-     "human_time": "a month ago",

-     "topics": [

-         "io.pagure.prod.pagure.pull-request.comment.added",

-         "io.pagure.prod.pagure.pull-request.new"

-     ]

- }, {

-     "subtitle": "atelic interacted with pull-request #207 of project \"fedora-hubs\" 4 times",

-     "timestamp": 1467233522.75,

-     "start_time": 1467228942,

-     "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-     "subjective": "atelic interacted with pull-request #207 of project \"fedora-hubs\" 4 times",

-     "msg_ids": {

-         "2016-90a67858-c666-43aa-9a97-1580e479a0c4": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#207 of project \"fedora-hubs\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#207 of project \"fedora-hubs\"",

-             "long_form": "atelic commented on pull-request#207 of project \"fedora-hubs\"",

-             "objects": [

-                 "pull-request/207",

-                 "project/fedora-hubs"

-             ],

-             "link": "https://pagure.io/fedora-hubs/pull-request/207#comment-6680",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#207 of project \"fedora-hubs\""

-         },

-         "2016-e805a4ad-26e8-4cf3-86a1-697158736e77": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic opened pull-request#207: \"Move 4 spaces to 2 in JSX files\" on project \"fedora-hubs\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic opened pull-request#207: \"Move 4 spaces to 2 in JSX files\" on project \"fedora-hubs\"",

-             "long_form": "atelic opened pull-request#207: \"Move 4 spaces to 2 in JSX files\" on project \"fedora-hubs\"",

-             "objects": [

-                 "pull-request/207",

-                 "project/fedora-hubs"

-             ],

-             "link": "https://pagure.io/fedora-hubs/pull-request/207",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.new",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> opened pull-request#207: \"Move 4 spaces to 2 in JSX files\" on project \"fedora-hubs\""

-         },

-         "2016-f94132c3-6a07-4e06-9b0b-18ce93e03f19": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#207 of project \"fedora-hubs\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#207 of project \"fedora-hubs\"",

-             "long_form": "atelic commented on pull-request#207 of project \"fedora-hubs\"",

-             "objects": [

-                 "pull-request/207",

-                 "project/fedora-hubs"

-             ],

-             "link": "https://pagure.io/fedora-hubs/pull-request/207#comment-6688",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#207 of project \"fedora-hubs\""

-         },

-         "2016-54b4e842-73cb-4b7d-8b53-5a27a433ac22": {

-             "__icon__": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "subtitle": "atelic commented on pull-request#207 of project \"fedora-hubs\"",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic commented on pull-request#207 of project \"fedora-hubs\"",

-             "long_form": "atelic commented on pull-request#207 of project \"fedora-hubs\"",

-             "objects": [

-                 "pull-request/207",

-                 "project/fedora-hubs"

-             ],

-             "link": "https://pagure.io/fedora-hubs/pull-request/207#comment-6681",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "pagure.pull-request.comment.added",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> commented on pull-request#207 of project \"fedora-hubs\""

-         }

-     },

-     "link": "https://pagure.io/fedora-hubs/pull-request/207",

-     "packages": [],

-     "categories": [

-         "pagure"

-     ],

-     "icon": "https://apps.fedoraproject.org/packages/images/icons/package_128x128.png",

-     "usernames": [

-         "atelic"

-     ],

-     "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> interacted with pull-request #207 of project \"fedora-hubs\" 4 times",

-     "dom_id": "16c799c2-d090-441e-a422-a2b6d7c8d062",

-     "end_time": 1467246314,

-     "human_time": "a month ago",

-     "topics": [

-         "io.pagure.prod.pagure.pull-request.comment.added",

-         "io.pagure.prod.pagure.pull-request.new"

-     ]

- }, {

-     "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> updated their irc filters",

-     "usernames": [

-         "atelic"

-     ],

-     "human_time": "a month ago",

-     "subtitle": "atelic updated their irc filters",

-     "timestamp": 1467236930,

-     "start_time": 1467236930,

-     "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-     "subjective": "atelic updated their irc filters",

-     "dom_id": "9b57a8fc-ddde-4cfc-bff8-69759ace8d39",

-     "msg_ids": {

-         "2016-a32a2741-63dc-451f-af31-b67f986844af": {

-             "__icon__": "https://apps.fedoraproject.org/img/icons/fedmsg.png",

-             "subtitle": "atelic updated their irc filters",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic updated their irc filters",

-             "long_form": "atelic updated their irc filters",

-             "objects": [

-                 "atelic/irc/preference/filters"

-             ],

-             "link": "https://apps.fedoraproject.org/notifications/",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/img/icons/fedmsg.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "fmn.preference.update",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> updated their irc filters",

-             "lexer": null

-         }

-     },

-     "link": "https://apps.fedoraproject.org/notifications/",

-     "end_time": 1467236930,

-     "packages": [],

-     "topics": [

-         "org.fedoraproject.prod.fmn.preference.update"

-     ],

-     "categories": [

-         "fmn"

-     ],

-     "icon": "https://apps.fedoraproject.org/img/icons/fedmsg.png"

- }, {

-     "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> updated their irc filters",

-     "usernames": [

-         "atelic"

-     ],

-     "human_time": "a month ago",

-     "subtitle": "atelic updated their irc filters",

-     "timestamp": 1467236926,

-     "start_time": 1467236926,

-     "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-     "subjective": "atelic updated their irc filters",

-     "dom_id": "d4a17d44-bebb-439b-8b42-027a6c46ec51",

-     "msg_ids": {

-         "2016-bfb5661b-1f74-4fe9-a6b6-c02494846ba9": {

-             "__icon__": "https://apps.fedoraproject.org/img/icons/fedmsg.png",

-             "subtitle": "atelic updated their irc filters",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic updated their irc filters",

-             "long_form": "atelic updated their irc filters",

-             "objects": [

-                 "atelic/irc/preference/filters"

-             ],

-             "link": "https://apps.fedoraproject.org/notifications/",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/img/icons/fedmsg.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "fmn.preference.update",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> updated their irc filters",

-             "lexer": null

-         }

-     },

-     "link": "https://apps.fedoraproject.org/notifications/",

-     "end_time": 1467236926,

-     "packages": [],

-     "topics": [

-         "org.fedoraproject.prod.fmn.preference.update"

-     ],

-     "categories": [

-         "fmn"

-     ],

-     "icon": "https://apps.fedoraproject.org/img/icons/fedmsg.png"

- }, {

-     "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> updated their irc filters",

-     "usernames": [

-         "atelic"

-     ],

-     "human_time": "a month ago",

-     "subtitle": "atelic updated their irc filters",

-     "timestamp": 1467236923,

-     "start_time": 1467236923,

-     "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-     "subjective": "atelic updated their irc filters",

-     "dom_id": "a058f25c-4513-4b0c-a591-5bf8ba397d87",

-     "msg_ids": {

-         "2016-dc33fbb0-a733-46a8-8254-1611d0b20393": {

-             "__icon__": "https://apps.fedoraproject.org/img/icons/fedmsg.png",

-             "subtitle": "atelic updated their irc filters",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic updated their irc filters",

-             "long_form": "atelic updated their irc filters",

-             "objects": [

-                 "atelic/irc/preference/filters"

-             ],

-             "link": "https://apps.fedoraproject.org/notifications/",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/img/icons/fedmsg.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "fmn.preference.update",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> updated their irc filters",

-             "lexer": null

-         }

-     },

-     "link": "https://apps.fedoraproject.org/notifications/",

-     "end_time": 1467236923,

-     "packages": [],

-     "topics": [

-         "org.fedoraproject.prod.fmn.preference.update"

-     ],

-     "categories": [

-         "fmn"

-     ],

-     "icon": "https://apps.fedoraproject.org/img/icons/fedmsg.png"

- }, {

-     "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> updated the rules on a fmn irc filter",

-     "usernames": [

-         "atelic"

-     ],

-     "human_time": "a month ago",

-     "subtitle": "atelic updated the rules on a fmn irc filter",

-     "timestamp": 1467226515,

-     "start_time": 1467226515,

-     "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-     "subjective": "atelic updated the rules on a fmn irc filter",

-     "dom_id": "e6372a10-148e-4967-99c7-c6780742be67",

-     "msg_ids": {

-         "2016-425ad1ce-4c10-4c12-8f9c-7460ae4fe351": {

-             "__icon__": "https://apps.fedoraproject.org/img/icons/fedmsg.png",

-             "subtitle": "atelic updated the rules on a fmn irc filter",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic updated the rules on a fmn irc filter",

-             "long_form": "atelic updated the rules on a fmn irc filter",

-             "objects": [

-                 "atelic/irc/filter/rules"

-             ],

-             "link": "https://apps.fedoraproject.org/notifications/",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/img/icons/fedmsg.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "fmn.filter.update",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> updated the rules on a fmn irc filter",

-             "lexer": null

-         }

-     },

-     "link": "https://apps.fedoraproject.org/notifications/",

-     "end_time": 1467226515,

-     "packages": [],

-     "topics": [

-         "org.fedoraproject.prod.fmn.filter.update"

-     ],

-     "categories": [

-         "fmn"

-     ],

-     "icon": "https://apps.fedoraproject.org/img/icons/fedmsg.png"

- }, {

-     "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> updated their irc filters",

-     "usernames": [

-         "atelic"

-     ],

-     "human_time": "a month ago",

-     "subtitle": "atelic updated their irc filters",

-     "timestamp": 1467226439,

-     "start_time": 1467226439,

-     "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-     "subjective": "atelic updated their irc filters",

-     "dom_id": "4153a81c-b44d-44a7-8240-4b0820835768",

-     "msg_ids": {

-         "2016-45d90281-40ee-4f22-9901-4ef849c49810": {

-             "__icon__": "https://apps.fedoraproject.org/img/icons/fedmsg.png",

-             "subtitle": "atelic updated their irc filters",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic updated their irc filters",

-             "long_form": "atelic updated their irc filters",

-             "objects": [

-                 "atelic/irc/preference/filters"

-             ],

-             "link": "https://apps.fedoraproject.org/notifications/",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/img/icons/fedmsg.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "fmn.preference.update",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> updated their irc filters",

-             "lexer": null

-         }

-     },

-     "link": "https://apps.fedoraproject.org/notifications/",

-     "end_time": 1467226439,

-     "packages": [],

-     "topics": [

-         "org.fedoraproject.prod.fmn.preference.update"

-     ],

-     "categories": [

-         "fmn"

-     ],

-     "icon": "https://apps.fedoraproject.org/img/icons/fedmsg.png"

- }, {

-     "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> updated their irc filters",

-     "usernames": [

-         "atelic"

-     ],

-     "human_time": "a month ago",

-     "subtitle": "atelic updated their irc filters",

-     "timestamp": 1467226437,

-     "start_time": 1467226437,

-     "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-     "subjective": "atelic updated their irc filters",

-     "dom_id": "487b1807-b798-4b98-ae35-c5819ffc5db0",

-     "msg_ids": {

-         "2016-06917565-a0ac-4c2a-bb7f-fefe98df903d": {

-             "__icon__": "https://apps.fedoraproject.org/img/icons/fedmsg.png",

-             "subtitle": "atelic updated their irc filters",

-             "secondary_icon": "https://seccdn.libravatar.org/avatar/ba1882fd5522d16213b0535934f77b796f0b89f76edd65460078099fe97c20ea?s=64&d=retro",

-             "subjective": "atelic updated their irc filters",

-             "long_form": "atelic updated their irc filters",

-             "objects": [

-                 "atelic/irc/preference/filters"

-             ],

-             "link": "https://apps.fedoraproject.org/notifications/",

-             "packages": [],

-             "icon": "https://apps.fedoraproject.org/img/icons/fedmsg.png",

-             "usernames": [

-                 "atelic"

-             ],

-             "title": "fmn.preference.update",

-             "markup": "<a href=\"/atelic/\" rel=\"nofollow\">@atelic</a> updated their irc filters",

-             "lexer": null

-         }

-     },

-     "link": "https://apps.fedoraproject.org/notifications/",

-     "end_time": 1467226437,

-     "packages": [],

-     "topics": [

-         "org.fedoraproject.prod.fmn.preference.update"

-     ],

-     "categories": [

-         "fmn"

-     ],

-     "icon": "https://apps.fedoraproject.org/img/icons/fedmsg.png"

- }]

file modified
+19 -24
@@ -1,4 +1,3 @@ 

- #!/usr/bin/env python

  # coding: utf-8

  

  from __future__ import unicode_literals, print_function
@@ -7,12 +6,10 @@ 

  

  import txredisapi as redis

  

- from twisted.application import service

+ from twisted.application import service, internet

  from twisted.web import server, resource

  from twisted.internet import reactor, defer, task

- from twisted.logger import (

-     Logger, globalLogBeginner, ILogObserver, formatEvent)

- from zope.interface import provider

+ from twisted.logger import Logger

  

  import hubs.app

  
@@ -191,26 +188,24 @@ 

          return self.queue.disconnect()

  

  

- def main():

-     @provider(ILogObserver)

-     def printingObserver(event):

-         print(formatEvent(event))

-     globalLogBeginner.beginLoggingTo(

-         [printingObserver], redirectStandardIO=False)

-     # Web service

-     sub = Subscribe()

-     site = server.Site(sub)

-     port = int(hubs.app.app.config.get("SSE_URL", {}).get("port", 8080))

-     reactor.listenTCP(port, site)

+ def get_multiservice(port=0):

+     if port == 0:

+         port = int(hubs.app.app.config.get("SSE_URL", {}).get("port", 8080))

+ 

+     top_service = service.MultiService()

+ 

+     # Web server

+     broadcaster = Subscribe()

+     site = server.Site(broadcaster)

+     web_service = internet.TCPServer(port, site)

+     top_service.addService(web_service)

+ 

      # Redis client

-     redisclient = RedisClientService(sub)

-     redisclient.startService()

+     redis_service = RedisClientService(broadcaster)

+     top_service.addService(redis_service)

+ 

      # Keepalive ping

-     keepalive = task.LoopingCall(sub.keepalive)

+     keepalive = task.LoopingCall(broadcaster.keepalive)

      keepalive.start(30)

-     # Start the reactor

-     reactor.run()

- 

  

- if __name__ == "__main__":

-     main()

+     return top_service

@@ -1,43 +0,0 @@ 

- # You can run this .tac file directly with:

- #    twistd -ny hubs/backend/sse_server.tac

- 

- """

- This is an example .tac file which starts a webserver on port 8080 and

- serves files from the current working directory.

- 

- The important part of this, the part that makes it a .tac file, is

- the final root-level section, which sets up the object called 'application'

- which twistd will look for

- """

- 

- from __future__ import unicode_literals

- 

- from twisted.application import service, internet

- from twisted.internet import reactor, task

- from twisted.web import server

- 

- import hubs.app

- from hubs.backend.sse_server import Subscribe, RedisClientService

- 

- 

- sse_config = hubs.app.app.config.get("SSE_URL", {})

- WEB_PORT = int(sse_config.get("port", 8080))

- 

- 

- # this is the core part of any tac file, the creation of the root-level

- # application object

- application = service.Application("Hubs SSE Server")

- 

- # Web server

- broadcaster = Subscribe()

- site = server.Site(broadcaster)

- web_service = internet.TCPServer(WEB_PORT, site)

- web_service.setServiceParent(application)

- 

- # Redis client

- redis_service = RedisClientService(broadcaster)

- redis_service.setServiceParent(application)

- 

- # Keepalive ping

- keepalive = task.LoopingCall(broadcaster.keepalive)

- keepalive.start(30)

file modified
-5
@@ -1,4 +1,3 @@ 

- #!/usr/bin/env python

  """ hubs backend triage process.

  

  This is step 2 of the backend cascading pipeline.
@@ -220,7 +219,3 @@ 

          pass

  

      return 0

- 

- 

- if __name__ == '__main__':

-     sys.exit(main(sys.argv))

file modified
+1 -6
@@ -1,4 +1,3 @@ 

- #!/usr/bin/env python

  """ hubs backend worker process.

  

  This is step 3 of the backend cascading pipeline.
@@ -40,7 +39,7 @@ 

  import hubs.feed

  import hubs.models

  import hubs.widgets.base

- from hubs.utils import fas

+ from hubs.fas import api as fas

  

  

  log = logging.getLogger('hubs.backend.worker')
@@ -204,7 +203,3 @@ 

          pass

  

      return 0

- 

- 

- if __name__ == '__main__':

-     sys.exit(main(sys.argv))

@@ -11,6 +11,9 @@ 

      'hubs.redis.work-queue-name': 'fedora-hubs-work-queue',

      'hubs.sse.redis-queue-name': 'fedora-hubs-sse-queue',

  

+     # Use fedmsg-relay to publish messages

+     'active': True,

+ 

      # Junk junk junk.. that we don't care about.  Drop it!

      'hubs.junk_suffixes': [

          'buildsys.tag',

empty or binary file added
file added
+146
@@ -0,0 +1,146 @@ 

+ from __future__ import unicode_literals

+ 

+ import logging

+ import smtplib

+ 

+ import flask

+ from six.moves.email_mime_text import MIMEText

+ 

+ from hubs.models import Hub, User

+ 

+ from .fasclient import FASClient

+ 

+ 

+ log = logging.getLogger(__name__)

+ 

+ 

+ # The functions below will be called by the backend (worker)

+ 

+ 

+ def sync_team_hub(hub_id, created=False):

+     hub = Hub.query.get(hub_id)

+     if hub is None:

+         return []

+     log.debug("Syncing team hub %s with FAS", hub.name)

+     fas_client = FASClient()

+     try:

+         # Sync group config and roles

+         fas_group = fas_client.sync_team_hub(hub)

+         if created:

+             # Only set the description on creation because we want to allow hub

+             # admins to later change it to a different content from what's in

+             # FAS.

+             hub.config["description"] = fas_group["apply_rules"]

+             # Sync roles on creation

+             affected_users = fas_client.sync_team_hub_roles(hub, fas_group)

+         else:

+             affected_users = []

+         fas_client.db.commit()

+     except Exception:

+         fas_client.db.rollback()

+         raise

+     log.info("Synced team hub %s with FAS (%d affected users)",

+              hub.name, len(affected_users))

+     return affected_users

+ 

+ 

+ def sync_team_hub_roles(hub_id):

+     hub = Hub.query.get(hub_id)

+     if hub is None:

+         return []

+     log.debug("Syncing team hub %s's roles with FAS", hub.name)

+     fas_client = FASClient()

+     try:

+         # Sync group config and roles

+         affected_users = fas_client.sync_team_hub_roles(hub)

+         fas_client.db.commit()

+     except Exception:

+         fas_client.db.rollback()

+         raise

+     log.info("Synced team hub %s's roles with FAS (%d affected users)",

+              hub.name, len(affected_users))

+     return affected_users

+ 

+ 

+ def sync_user(username, created=False):

+     user = User.query.get(username)

+     if user is None:

+         return []

+     log.debug("Syncing user %s with FAS", username)

+     fas_client = FASClient()

+     affected_hubs = []

+     try:

+         fas_client.sync_user(user)

+         if created:

+             # Sync roles on creation

+             affected_hubs = fas_client.sync_user_roles(user)

+         fas_client.db.commit()

+     except Exception:

+         fas_client.db.rollback()

+         raise

+     log.info("Synced user %s with FAS (%d affected hubs)",

+              username, len(affected_hubs))

+     return affected_hubs

+ 

+ 

+ def sync_user_roles(username, hub_id):

+     user = User.query.get(username)

+     if user is None:

+         return []

+     if hub_id is None:

+         hub = None

+         log.debug("Syncing user %s's roles with FAS", username)

+     else:

+         hub = Hub.query.get(hub_id)

+         if hub is None:

+             return []

+         log.debug("Syncing user %s's roles on hub %s with FAS",

+                   username, hub.name)

+     fas_client = FASClient()

+     try:

+         # Sync user roles

+         affected_hubs = fas_client.sync_user_roles(user, hub)

+         fas_client.db.commit()

+     except Exception:

+         fas_client.db.rollback()

+         raise

+     log.info("Synced user %s's roles with FAS (%d affected hubs)",

+              username, len(affected_hubs))

+     return affected_hubs

+ 

+ 

+ # Send an email when there's a new membership request

+ 

+ def notify_membership_request(user, hub, role):

+     if not role.startswith("pending-"):

+         return  # Don't notify for subscriptions and stargazing.

+     content = """

+ Fedora user {username} ({realname}) would like to join {groupname}, a Fedora group that you admin.

+ The request was made via Fedora Hubs.

+ 

+ To accept {username}'s membership request, please visit the following URL and enter

+ their Fedora Account System ID (FAS ID) into the "Add User" box and submit it:

+ 

+ https://admin.fedoraproject.org/accounts/group/view/{groupname}

+ 

+ FAS ID: {username}

+ 

+ Thanks for serving as a group administrator in the Fedora community!

+ 

+ Cheers,

+ The Fedora Hubs Team

+ """.format(  # noqa:E501

+         username=user.username, realname=user.fullname, groupname=hub.name,

+     )

+     # Create a text/plain message

+     msg = MIMEText(content)

+     msg['Subject'] = "New Recruit for your Fedora team ({})!".format(hub.name)

+     email_from = "hubs@fedoraproject.org"

+     email_to = "{}-administrators@fedoraproject.org".format(hub.name)

+     msg['From'] = email_from

+     msg['To'] = email_to

+     # Send the message via the local SMTP server.

+     app_config = flask.current_app.config

+     s = smtplib.SMTP(app_config["EMAIL_HOST"], app_config["EMAIL_PORT"])

+     s.sendmail(email_from, [email_to], msg.as_string())

+     s.quit()

hubs/fas/fasclient.py hubs/utils/fas.py
file renamed
+2 -137
@@ -2,13 +2,10 @@ 

  

  import datetime

  import logging

- import smtplib

  

  import fedora

- import flask

- import pycountry

+ from iso3166 import countries

  from pytz import timezone

- from six.moves.email_mime_text import MIMEText

  

  from hubs.database import Session

  from hubs.models import Hub, User, Association
@@ -121,7 +118,7 @@ 

                  continue

              hub.config[hub_attr] = fas_user[fas_attr]

          if fas_user.get("country_code") is not None:

-             country = pycountry.countries.get(alpha_2=fas_user["country_code"])

+             country = countries.get(fas_user["country_code"])

              hub.config["country"] = country.name

          if fas_user.get("timezone") is not None:

              now = datetime.datetime.now()  # does not really matter, legacy API
@@ -186,135 +183,3 @@ 

              hub.subscribe(user, role)

              affected_hubs.add(hub.id)

          return list(affected_hubs)

- 

- 

- # The functions below will be called by the backend (worker)

- 

- 

- def sync_team_hub(hub_id, created=False):

-     hub = Hub.query.get(hub_id)

-     if hub is None:

-         return []

-     log.debug("Syncing team hub %s with FAS", hub.name)

-     fas_client = FASClient()

-     try:

-         # Sync group config and roles

-         fas_group = fas_client.sync_team_hub(hub)

-         if created:

-             # Only set the description on creation because we want to allow hub

-             # admins to later change it to a different content from what's in

-             # FAS.

-             hub.config["description"] = fas_group["apply_rules"]

-             # Sync roles on creation

-             affected_users = fas_client.sync_team_hub_roles(hub, fas_group)

-         else:

-             affected_users = []

-         fas_client.db.commit()

-     except Exception:

-         fas_client.db.rollback()

-         raise

-     log.info("Synced team hub %s with FAS (%d affected users)",

-              hub.name, len(affected_users))

-     return affected_users

- 

- 

- def sync_team_hub_roles(hub_id):

-     hub = Hub.query.get(hub_id)

-     if hub is None:

-         return []

-     log.debug("Syncing team hub %s's roles with FAS", hub.name)

-     fas_client = FASClient()

-     try:

-         # Sync group config and roles

-         affected_users = fas_client.sync_team_hub_roles(hub)

-         fas_client.db.commit()

-     except Exception:

-         fas_client.db.rollback()

-         raise

-     log.info("Synced team hub %s's roles with FAS (%d affected users)",

-              hub.name, len(affected_users))

-     return affected_users

- 

- 

- def sync_user(username, created=False):

-     user = User.query.get(username)

-     if user is None:

-         return []

-     log.debug("Syncing user %s with FAS", username)

-     fas_client = FASClient()

-     affected_hubs = []

-     try:

-         fas_client.sync_user(user)

-         if created:

-             # Sync roles on creation

-             affected_hubs = fas_client.sync_user_roles(user)

-         fas_client.db.commit()

-     except Exception:

-         fas_client.db.rollback()

-         raise

-     log.info("Synced user %s with FAS (%d affected hubs)",

-              username, len(affected_hubs))

-     return affected_hubs

- 

- 

- def sync_user_roles(username, hub_id):

-     user = User.query.get(username)

-     if user is None:

-         return []

-     if hub_id is None:

-         hub = None

-         log.debug("Syncing user %s's roles with FAS", username)

-     else:

-         hub = Hub.query.get(hub_id)

-         if hub is None:

-             return []

-         log.debug("Syncing user %s's roles on hub %s with FAS",

-                   username, hub.name)

-     fas_client = FASClient()

-     try:

-         # Sync user roles

-         affected_hubs = fas_client.sync_user_roles(user, hub)

-         fas_client.db.commit()

-     except Exception:

-         fas_client.db.rollback()

-         raise

-     log.info("Synced user %s's roles with FAS (%d affected hubs)",

-              username, len(affected_hubs))

-     return affected_hubs

- 

- 

- # Send an email when there's a new membership request

- 

- def notify_membership_request(user, hub, role):

-     if not role.startswith("pending-"):

-         return  # Don't notify for subscriptions and stargazing.

-     content = """

- Fedora user {username} ({realname}) would like to join {groupname}, a Fedora group that you admin.

- The request was made via Fedora Hubs.

- 

- To accept {username}'s membership request, please visit the following URL and enter

- their Fedora Account System ID (FAS ID) into the "Add User" box and submit it:

- 

- https://admin.fedoraproject.org/accounts/group/view/{groupname}

- 

- FAS ID: {username}

- 

- Thanks for serving as a group administrator in the Fedora community!

- 

- Cheers,

- The Fedora Hubs Team

- """.format(  # noqa:E501

-         username=user.username, realname=user.fullname, groupname=hub.name,

-     )

-     # Create a text/plain message

-     msg = MIMEText(content)

-     msg['Subject'] = "New Recruit for your Fedora team ({})!".format(hub.name)

-     email_from = "hubs@fedoraproject.org"

-     email_to = "{}-administrators@fedoraproject.org".format(hub.name)

-     msg['From'] = email_from

-     msg['To'] = email_to

-     # Send the message via the local SMTP server.

-     app_config = flask.current_app.config

-     s = smtplib.SMTP(app_config["EMAIL_HOST"], app_config["EMAIL_PORT"])

-     s.sendmail(email_from, [email_to], msg.as_string())

-     s.quit()

hubs/fas/scripts.py sync-group-from-fas.py
file renamed
+35 -14
@@ -1,29 +1,54 @@ 

- #!/usr/bin/env python

- 

  from __future__ import unicode_literals, print_function

  

- import sys

+ 

  from argparse import ArgumentParser

+ 

  from fedora.client import AppError

  

  import hubs.app

  import hubs.database

  from hubs.models import Hub

  from hubs.utils.fedmsg import get_fedmsg_config

- from hubs.utils.fas import sync_team_hub, sync_team_hub_roles

+ 

+ from .fasclient import FASClient

+ from .api import sync_team_hub, sync_team_hub_roles

+ 

+ 

+ def create_group_from_fas():

+     parser = ArgumentParser()

+     parser.add_argument(

+         "name", help="group to create the hub for")

+     args = parser.parse_args()

+     hub_name = args.name

+     fedmsg_config = get_fedmsg_config()

+     hubs.database.init(fedmsg_config['hubs.sqlalchemy.uri'])

+     hub = Hub.by_name(hub_name, "team")

+     if hub is not None:

+         print("This hub already exists.")

+         return

+     fas_client = FASClient()

+     try:

+         fas_client.group_by_name(hub_name)

+     except AppError:

+         print("Could not find this group in FAS.")

+         return

+     # Setup app context to have access to the task queue.

+     with hubs.app.app.app_context():

+         db = hubs.database.Session()

+         hubs.app.create_task_queue()

+         Hub.create_group_hub(hub_name, "")

+         db.commit()

+     print("Hub {} created!".format(hub_name))

+     print("It will be synced from FAS in the background.")

  

  

- def parse_args():

+ def sync_group_from_fas():

      parser = ArgumentParser()

      parser.add_argument(

          "name", nargs="*", help="team hub to sync")

      parser.add_argument(

          "--no-roles", action="store_true", help="do not sync roles")

-     return parser.parse_args()

- 

- 

- def main():

-     args = parse_args()

+     args = parser.parse_args()

      fedmsg_config = get_fedmsg_config()

      hubs.database.init(fedmsg_config['hubs.sqlalchemy.uri'])

      if not args.name:
@@ -50,7 +75,3 @@ 

              db.commit()

              print("Hub {} synced! {} affected users".format(

                  hub.name, len(affected_users)))

- 

- 

- if __name__ == "__main__":

-     sys.exit(main() or 0)

file added
+47
@@ -0,0 +1,47 @@ 

+ from __future__ import unicode_literals

+ 

+ import logging

+ import smtplib

+ 

+ import flask

+ from six.moves.email_mime_text import MIMEText

+ 

+ 

+ log = logging.getLogger(__name__)

+ 

+ 

+ # Send an email when there's a new membership request

+ 

+ def notify_membership_request(user, hub, role):

+     if not role.startswith("pending-"):

+         return  # Don't notify for subscriptions and stargazing.

+     content = """

+ Fedora user {username} ({realname}) would like to join {groupname}, a Fedora group that you admin.

+ The request was made via Fedora Hubs.

+ 

+ To accept {username}'s membership request, please visit the following URL and enter

+ their Fedora Account System ID (FAS ID) into the "Add User" box and submit it:

+ 

+ https://admin.fedoraproject.org/accounts/group/view/{groupname}

+ 

+ FAS ID: {username}

+ 

+ Thanks for serving as a group administrator in the Fedora community!

+ 

+ Cheers,

+ The Fedora Hubs Team

+ """.format(  # noqa:E501

+         username=user.username, realname=user.fullname, groupname=hub.name,

+     )

+     # Create a text/plain message

+     msg = MIMEText(content)

+     msg['Subject'] = "New Recruit for your Fedora team ({})!".format(hub.name)

+     email_from = "hubs@fedoraproject.org"

+     email_to = "{}-administrators@fedoraproject.org".format(hub.name)

+     msg['From'] = email_from

+     msg['To'] = email_to

+     # Send the message via the local SMTP server.

+     app_config = flask.current_app.config

+     s = smtplib.SMTP(app_config["EMAIL_HOST"], app_config["EMAIL_PORT"])

+     s.sendmail(email_from, [email_to], msg.as_string())

+     s.quit()

file modified
-14
@@ -2,7 +2,6 @@ 

  

  import hashlib

  import logging

- import os

  import re

  

  import fedmsg.meta
@@ -280,16 +279,3 @@ 

  

      # We leave a no-op implementation of_preprocess_msg because we want

      # raw messages in the DB to conglomerate and format them later.

- 

- 

- def _load_json(username):

-     """This loads dummy data in the feeds."""

-     here = os.path.dirname(os.path.abspath(__file__))

-     with open(os.path.join(here, 'actions.json')) as fp:

-         msgs = loads(fp.read())

-     for feed_class in (Notifications, Activity):

-         feed = feed_class(username)

-         if feed.db is None:

-             feed.connect()

-         for msg in msgs:

-             feed.db.rpush(feed.key, dumps(msg))

@@ -49,7 +49,7 @@ 

            className="EditModeButton btn btn-sm btn-outline-primary ml-1"

            onClick={this.handleClicked}

            >

-           <i className="fa fa-pencil" aria-hidden="true"></i>

+           <i className="fa fa-pencil-square-o" aria-hidden="true"></i>

            {/*<FormattedMessage {...messages.edit} />*/}

          </button>

        );

@@ -18,7 +18,7 @@ 

    return (dispatch, getState) => {

      const state = getState();

      const url = state.urls.heartbeat;

-     const heartbeatConnected = state.ui.heartbeat === "connected";

+     const heartbeat = state.ui.heartbeat;

      return backendCall(url).then(

        (response) => {

          dispatch({
@@ -26,7 +26,7 @@ 

          })

        },

        (error) => {

-         if (error.httpStatus === 401 && heartbeatConnected) {

+         if (error.httpStatus === 401 && heartbeat !== "forbidden") {

            dispatch(addFlashMessage("Your session timed out, please reload the page", "error"));

          }

          return dispatch(heartbeatFailure(error.httpStatus));

@@ -9,7 +9,11 @@ 

      case HEARTBEAT_SUCCESS:

        return "connected";

      case HEARTBEAT_FAILURE:

-       return "disconnected";

+       if (action.code === 401) {

+         return "forbidden";

+       } else {

+         return "disconnected";

+       }

      default:

        return state

    }

The added file is too large to be shown here, see it at: hubs/static/client/npm-shrinkwrap.json
@@ -158,7 +158,7 @@ 

          self.assertDictEqual(props, {

              'config': {'text': 'Testing.'},

              'contentUrl': '/widgets/sticky/{}/'.format(widget.idx),

-             'cssClass': None,

+             'cssClass': "card-info",

              'hiddenIfEmpty': False,

              'hub_types': HUB_TYPES,

              'idx': widget.idx,

@@ -80,7 +80,7 @@ 

              h = hubs.models.Hub.by_name('infra', "team")

              self.assertNotIn(self.user.nickname, usernames(h.members))

  

-     @patch("hubs.utils.fas.smtplib")

+     @patch("hubs.fas.signals.smtplib")

      def test_join_pending(self, smtplib):

          SMTP = Mock()

          smtplib.SMTP.return_value = SMTP

@@ -8,7 +8,7 @@ 

  from hubs.utils.views import (

      get_hub_by_id, require_hub_access, authenticated, get_user_permissions

      )

- from hubs.utils.fas import notify_membership_request

+ from hubs.fas.signals import notify_membership_request

  

  

  log = logging.getLogger(__name__)

file modified
+1 -1
@@ -12,7 +12,7 @@ 

  import hubs.database

  import hubs.models

  from hubs.utils.fedmsg import get_fedmsg_config

- from hubs.utils.fas import FASClient

+ from hubs.fas.fasclient import FASClient

  

  

  fedmsg_config = get_fedmsg_config()

file modified
+8 -13
@@ -1,35 +1,30 @@ 

  alembic

  arrow

  beautifulsoup4

- bleach<2.0.0

+ bleach

  blinker

  python-dateutil

  decorator

  dogpile.cache

- enum34

  fedmsg

  fedmsg_meta_fedora_infrastructure

  python-fedora

  flask

  flask-oidc>=1.0.3

- gunicorn

- html5lib==0.9999999

+ html5lib

  humanize

  iso3166

  markdown

  munch

- psycopg2

- pycountry

- pymongo

- pytz

- requests

- setuptools

- sqlalchemy

- markdown

  pkgwat.api

- six

  pygments

  pygments-markdown-lexer

+ pymongo

+ pytz

  redis

+ requests

  retask

+ setuptools

+ six

+ sqlalchemy

  txredisapi

file modified
+8 -2
@@ -2,6 +2,7 @@ 

  

  from __future__ import unicode_literals

  

+ import sys

  from setuptools import setup, find_packages

  

  
@@ -12,7 +13,10 @@ 

  

  def get_requirements():

      with open('requirements.txt', 'r') as f:

-         return [l.strip() for l in f.readlines() if l.strip()]

+         reqs = [l.strip() for l in f.readlines() if l.strip()]

+     if sys.version_info < (3, 4):

+         reqs.append("enum34")

+     return reqs

  

  

  setup(
@@ -28,7 +32,7 @@ 

      install_requires=get_requirements(),

      # tests_require=tests_require,

      # test_suite='nose.collector',

-     packages=find_packages(),

+     packages=find_packages() + ["twisted"],

      include_package_data=True,

      zip_safe=False,

      classifiers=[
@@ -45,6 +49,8 @@ 

          'console_scripts': [

              "fedora-hubs-triage = hubs.backend.triage:main",

              "fedora-hubs-worker = hubs.backend.worker:main",

+             "fedora-hubs-create-group-from-fas = hubs.fas.scripts:create_group_from_fas",  # noqa: E501

+             "fedora-hubs-sync-group-from-fas = hubs.fas.scripts:sync_group_from_fas",  # noqa: E501

          ],

      },

  )

file modified
+1 -1
@@ -63,4 +63,4 @@ 

  

  [flake8]

  show-source = True

- exclude = .git,.tox,dist,*egg,doc,node_modules

+ exclude = .git,.tox,dist,build,*egg,doc,node_modules

@@ -0,0 +1,24 @@ 

+ from zope.interface import implementer

+ 

+ from twisted.python import usage

+ from twisted.plugin import IPlugin

+ from twisted.application.service import IServiceMaker

+ 

+ from hubs.backend.sse_server import get_multiservice

+ 

+ 

+ class Options(usage.Options):

+     optParameters = [["port", "p", 0, "The port number to listen on."]]

+ 

+ 

+ @implementer(IServiceMaker, IPlugin)

+ class HubsServiceMaker(object):

+     tapname = "hubs-sse"

+     description = "The Fedora Hubs SSE server"

+     options = Options

+ 

+     def makeService(self, options):

+         return get_multiservice(int(options["port"]))

+ 

+ 

+ hubs_service_maker = HubsServiceMaker()

Lots of changes here, basically the ansible playbooks are reworked to support the Vagrant dev mode and a future production mode where everything is installed via RPMs.

The other changes are mainly there to support this change. As always, the individual commits should be easier to read than the whole diff.

rebased onto 3c0b413

6 years ago

Pull-Request has been merged by abompard

6 years ago
Metadata
Changes Summary 51
+1 -0
file changed
.gitignore
+7 -1
file changed
MANIFEST.in
+1 -1
file changed
ansible/roles/hubs/defaults/main.yml
+4 -9
file changed
ansible/roles/hubs/handlers/main.yml
+3 -12
file changed
ansible/roles/hubs/tasks/db-postgresql.yml
+2 -2
file changed
ansible/roles/hubs/tasks/db-sqlite.yml
+62 -10
file changed
ansible/roles/hubs/tasks/dev.yml
+64
file added
ansible/roles/hubs/tasks/dev_deps.yml
+20 -120
file changed
ansible/roles/hubs/tasks/main.yml
+12 -20
file changed
ansible/roles/hubs/tasks/prod.yml
+2
file added
ansible/roles/hubs/tasks/prod_deps.yml
+2 -26
file changed
ansible/roles/hubs/tasks/webserver.yml
+5 -3
file changed
ansible/roles/hubs/templates/bashrc
+2
file added
ansible/roles/hubs/templates/env
+3 -7
file changed
ansible/roles/hubs/templates/fedmsg_config
+1 -1
file changed
ansible/roles/hubs/templates/honcho-env
+6 -6
file changed
ansible/roles/hubs/templates/honcho-procfile
-14
file removed
ansible/roles/hubs/templates/hubs-fedmsg-hub.service
+2 -0
file changed
ansible/vagrant-playbook.yml
-53
file removed
create-group-from-fas.py
+4 -6
file renamed
ansible/roles/hubs/templates/hubs-sse.service
deploy/fedora-hubs-sse.service
+4 -4
file renamed
ansible/roles/hubs/templates/hubs-triage@.service
deploy/fedora-hubs-triage@.service
+4 -6
file renamed
ansible/roles/hubs/templates/hubs-webapp.service
deploy/fedora-hubs-webapp.service
+4 -4
file renamed
ansible/roles/hubs/templates/hubs-worker@.service
deploy/fedora-hubs-worker@.service
+0 -0
file renamed
ansible/roles/hubs/files/logging.ini
deploy/logging.ini
+2
file added
deploy/sysconfig
+219
file added
fedora-hubs.spec
-2446
file removed
hubs/actions.json
+19 -24
file changed
hubs/backend/sse_server.py
-43
file removed
hubs/backend/sse_server.tac
+0 -5
file changed
hubs/backend/triage.py
+1 -6
file changed
hubs/backend/worker.py
+3 -0
file changed
hubs/default_fedmsg_config.py
+0
file added
hubs/fas/__init__.py
+146
file added
hubs/fas/api.py
+2 -137
file renamed
hubs/utils/fas.py
hubs/fas/fasclient.py
+35 -14
file renamed
sync-group-from-fas.py
hubs/fas/scripts.py
+47
file added
hubs/fas/signals.py
+0 -14
file changed
hubs/feed.py
+1 -1
file changed
hubs/static/client/app/components/HubHeader/EditModeButton.js
+2 -2
file changed
hubs/static/client/app/core/actions/heartbeat.js
+5 -1
file changed
hubs/static/client/app/core/reducers/heartbeat.js
+8724
file added
hubs/static/client/npm-shrinkwrap.json
+1 -1
file changed
hubs/tests/test_widget_base.py
+1 -1
file changed
hubs/tests/views/test_api_association.py
+1 -1
file changed
hubs/views/api/hub_association.py
+1 -1
file changed
populate-from-fas.py
+8 -13
file changed
requirements.txt
+8 -2
file changed
setup.py
+1 -1
file changed
tox.ini
+24
file added
twisted/plugins/hubs_plugin.py