YoloSwagTeam / hackeragenda

Gather events of hackerspaces/lug/numeric artists in belgium and put them in one big place. Made with love.
http://hackeragenda.be
GNU General Public License v3.0
29 stars 21 forks source link

Introduction

Hackeragenda is a website that aggregate events in Belgium that are interesting for hackers of the hackerspace community. It does that by fetching data from other website (by scraping most of the time ...) instead of asking users to submit events on it. This is my modest attemp to answer the problem "everyone is doing shitload of things and no one is aware of that and that sucks".

Installation

You need bower! You'll probably need to have a recent version of nodejs to install it.

git clone https://github.com/Psycojoker/hackeragenda.git
cd hackeragenda
virtualenv ve
source ve/bin/activate
pip install -r requirements.txt
python manage.py syncdb --noinput
python manage.py migrate
python manage.py bower_install

Usage

To update the events:

python manage.py fetch_events

In production, this command is in a crontab that run every one hour.

You can launch only one or more specific parser by passing them as args of the command:

python manage.py fetch_events urlab agenda_du_libre_be hsbxl

If you don't want any output you can use the --quiet command line option (this is very usefull if you want to use it in a crontab):

python manage.py fetch_events --quiet

How to add an organisation

Events are periodically fetched from organisations websites. Therefore, you have to write an @event_source decorated function (aka fetcher) in agendas/<your category>. The decorator allows you to specify options for your organisation. This function should yield all the events you want to add.

Write a custom event_source

You could provide a description for your organization with a python docstring. Here's a small fetcher example:

@event_source(background_color="#424242", text_color="#777", url="https://my.organisat.io/n")
def my_organisation():
    """My organization is a hackerspace in a train"""
    events = json.loads(urlopen("https://my.organisat.io/n/events").read())
    for ev in events:
        tags = ["hackerspace"]
        if "weekly meeting" in ev.name.lower():
            tags.append("meeting")
        yield {
            'title': ev.name,
            'start': ev.start_time,
            'end': ev.end_time,
            'url': ev.href,
            'tags': tags
        }

Meetup

If your organisation use Meetup to schedule its events, you just have to add this unique line at toplevel (this automagically creates an event_source):

generic_meetup("my_org_name_on_hackeragenda", "my_org_name_on_Meetup", **same options as @event_source)

Eventbrite

generic_eventbrite("my_org_name_on_hackeragenda", "my_org-1865700117", **same options as @event_source)

Facebook

Adding events from a Facebook group or page is pretty easy as well:

generic_facebook("my_org_name_on_hackeragenda", "facebook_id", **same options as @event_source)

This requires to have FACEBOOK_APP_ID and FACEBOOK_APP_SECRET defined in the settings file of your agenda with the credentials of your Facebook application.

Google Agenda

generic_google_agenda(
    "my_org_name",
    "https://www.google.com/calendar/ical/<calendar_id>/public/basic.ics",
    **same options as @event_source)

Implement the Hackeragenda API

Moreover, you can also implement the hackeragenda JSON api on your side, and add the following line at toplevel in events/management/commands/fetch_events.py:

json_api("my_org", "https://my.organisat.io/n/hackeragenda.json", **same options as @event_source)

A GET on the provided url should return something like this:

{
    "org": "my_organisation",
    "api" : 0.1,
    "events" : [
        {
           "title": "Small conf",
           "start": "2012-05-23 12:00",
           "end": "2012-05-23 18:23",
           "all_day": false,
           "url": "https://my.organisat.io/n/LearnRubyWithSinatra"
        },
        {
           "title": "Marvelous conference",
           "start": "2012-05-23 12:00",
           "all_day": true,
           "location": "123 avenue du soleil",
           "url": "https://my.organisat.io/n/PwnGoogleWithx86_64Assembly"
        }
    ]
}

The following attributes are required:

Each event could optionally provide the following attributes:

Other countries

I'm looking for volunteers to open other instance of hackeragenda in other countries. France will probably be the next one. Don't hesitate to contact me if you want to do so!(see my mail on my profile) I can provide hosting (but without giving you access to it :/) and I'd like you to be at least able to write a web parser in python using BeaufitulSoup (or learn how to) and be ready to learn a bit of Django (not that much) if you don't already know it.

My objective is to end up with Hackeragenda all over the world and meta-hackeragenda like hackeragenda.eu.

Current public instance (known to me):