-
Notifications
You must be signed in to change notification settings - Fork 0
/
tasks.py
68 lines (58 loc) · 2.07 KB
/
tasks.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# -*- coding: utf-8 -*-
from google.appengine.api import memcache
from google.appengine.ext import db
from google.appengine.api import taskqueue
from google.appengine.api import urlfetch
from os.path import splitext
from jinja2 import Environment
from imgur import ImgurExtension
from models import Entry
from utils import build_url
import yaml
import logging
jinja2 = Environment(extensions=[ImgurExtension])
def insert_or_update_entry(filename):
basename, extension = splitext(filename)
if extension in ['.markdown', '.meta']:
result = urlfetch.fetch(url = build_url(filename))
if result.status_code == 200:
entry = Entry.get_or_insert(basename)
if extension.endswith('.markdown'):
entry.content = jinja2.from_string(result.content.decode('utf-8')).render()
else:
try:
meta = yaml.load(result.content)
except Exception as e:
logging.error('Failed to parse YAML: %s' % e)
else:
entry.title = meta['title']
entry.tags = meta['tags']
entry.published = meta['published']
entry.slug = basename
entry.put()
else:
logging.error('failed to fetch %s' % filename)
def delete_entry(filename):
basename, extension = splitext(filename)
entry = Entry.get_by_key_name(basename)
if entry:
entry.delete()
def github_postreceive(data):
import json
import yaml
try:
payload = json.loads(data)
except:
logging.error('Failed to parse JSON')
else:
commits = payload['commits']
if commits:
memcache.flush_all()
for commit in commits:
for action, files in commit.iteritems():
if action in ['added', 'modified']:
for filename in files:
insert_or_update_entry(filename)
elif action in ['removed']:
for filename in files:
delete_entry(filename)